* limitations under the License.
*/
-#define CU_BTN_PADDING_LR 13
-#define CU_BTN_WH 54
-#define CU_BTN_FULL_WH 480
+#define CU_ACCEPT_REJECT_ICON_SIZE 54 54
+#define CU_ACCEPT_REJECT_ICON_BG_SIZE 130 130
+#define CU_ACCEPT_REJECT_FINGER_TRACER_BG_SIZE 65 65
+#define CU_BEZEL_CUE_ICON_DIM 24
-#define CU_BTN_HIDE_ANIM_TIME 0.2
+#define CU_BEZEL_CUE1_ACCEPT_X 68
+#define CU_BEZEL_CUE2_ACCEPT_X 49
+#define CU_BEZEL_CUE3_ACCEPT_X 35
+#define CU_BEZEL_CUE4_ACCEPT_X 25
-#define CU_ARROW_WH 24
+#define CU_BEZEL_CUE1_REJECT_X 268
+#define CU_BEZEL_CUE2_REJECT_X 287
+#define CU_BEZEL_CUE3_REJECT_X 301
+#define CU_BEZEL_CUE4_REJECT_X 311
-#define CU_ARROW1_LR 68
-#define CU_ARROW1_T 57
-#define CU_ARROW1_TIME 0.23
+#define CU_BEZEL_CUE1_Y 57
+#define CU_BEZEL_CUE2_Y 75
+#define CU_BEZEL_CUE3_Y 96
+#define CU_BEZEL_CUE4_Y 119
-#define CU_ARROW2_LR 49
-#define CU_ARROW2_T 75
-#define CU_ARROW2_TIME 0.26
+#define CU_BEZEL_CUE1_ACCEPT_REL1 CU_REL_W(CU_BEZEL_CUE1_ACCEPT_X) CU_REL_H(CU_BEZEL_CUE1_Y)
+#define CU_BEZEL_CUE1_ACCEPT_REL2 CU_REL_W((CU_BEZEL_CUE1_ACCEPT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE1_Y+CU_BEZEL_CUE_ICON_DIM))
-#define CU_ARROW3_LR 35
-#define CU_ARROW3_T 96
-#define CU_ARROW3_TIME 0.30
+#define CU_BEZEL_CUE2_ACCEPT_REL1 CU_REL_W(CU_BEZEL_CUE2_ACCEPT_X) CU_REL_H(CU_BEZEL_CUE2_Y)
+#define CU_BEZEL_CUE2_ACCEPT_REL2 CU_REL_W((CU_BEZEL_CUE2_ACCEPT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE2_Y+CU_BEZEL_CUE_ICON_DIM))
-#define CU_ARROW4_LR 25
-#define CU_ARROW4_T 119
-#define CU_ARROW4_TIME 0.16
+#define CU_BEZEL_CUE3_ACCEPT_REL1 CU_REL_W(CU_BEZEL_CUE3_ACCEPT_X) CU_REL_H(CU_BEZEL_CUE3_Y)
+#define CU_BEZEL_CUE3_ACCEPT_REL2 CU_REL_W((CU_BEZEL_CUE3_ACCEPT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE3_Y+CU_BEZEL_CUE_ICON_DIM))
-#define CU_INCOMING_CALL_IMG_DIR "Incoming/"
+#define CU_BEZEL_CUE4_ACCEPT_REL1 CU_REL_W(CU_BEZEL_CUE4_ACCEPT_X) CU_REL_H(CU_BEZEL_CUE4_Y)
+#define CU_BEZEL_CUE4_ACCEPT_REL2 CU_REL_W((CU_BEZEL_CUE4_ACCEPT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE4_Y+CU_BEZEL_CUE_ICON_DIM))
-#define CU_BEZELCUE_ANIMATE_COUNT_MAX 3
-#define CU_BEZELCUE_HIDE_DURATION 0.5
+#define CU_BEZEL_CUE1_REJECT_REL1 CU_REL_W(CU_BEZEL_CUE1_REJECT_X) CU_REL_H(CU_BEZEL_CUE1_Y)
+#define CU_BEZEL_CUE1_REJECT_REL2 CU_REL_W((CU_BEZEL_CUE1_REJECT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE1_Y+CU_BEZEL_CUE_ICON_DIM))
-#define CU_PATH_ICON_ARROW1_L CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_l_01.png"
-#define CU_PATH_ICON_ARROW2_L CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_l_02.png"
-#define CU_PATH_ICON_ARROW3_L CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_l_03.png"
-#define CU_PATH_ICON_ARROW4_L CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_l_04.png"
+#define CU_BEZEL_CUE2_REJECT_REL1 CU_REL_W(CU_BEZEL_CUE2_REJECT_X) CU_REL_H(CU_BEZEL_CUE2_Y)
+#define CU_BEZEL_CUE2_REJECT_REL2 CU_REL_W((CU_BEZEL_CUE2_REJECT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE2_Y+CU_BEZEL_CUE_ICON_DIM))
-#define CU_PATH_ICON_ARROW1_R CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_r_01.png"
-#define CU_PATH_ICON_ARROW2_R CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_r_02.png"
-#define CU_PATH_ICON_ARROW3_R CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_r_03.png"
-#define CU_PATH_ICON_ARROW4_R CU_INCOMING_CALL_IMG_DIR"w_alert_interaction_cue_r_04.png"
+#define CU_BEZEL_CUE3_REJECT_REL1 CU_REL_W(CU_BEZEL_CUE3_REJECT_X) CU_REL_H(CU_BEZEL_CUE3_Y)
+#define CU_BEZEL_CUE3_REJECT_REL2 CU_REL_W((CU_BEZEL_CUE3_REJECT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE3_Y+CU_BEZEL_CUE_ICON_DIM))
-#define CU_ARROW_PARTS(NAME, SIDE, ICON_PATH, POS_X, POS_Y, ALIGN_X) \
- spacer { "spacer."NAME"."SIDE"_top"; \
- scale; \
- desc { "default"; \
- fixed: 1 1; \
- min: POS_X POS_Y; \
- align: ALIGN_X 0.0; \
- rel1 { relative: ALIGN_X 0.0; to_x: "spacer."SIDE; } \
- rel2 { relative: ALIGN_X 0.0; to_x: "spacer."SIDE; } \
- } \
- } \
- image { "image."NAME"_"SIDE; \
- scale; \
- images.image: ICON_PATH COMP; \
- clip: "rect.arrows_"SIDE".clipper"; \
- desc { "default"; \
- fixed: 1 1; \
- min: CU_ARROW_WH CU_ARROW_WH; \
- align: ALIGN_X 0.0; \
- rel1 { relative: (1.0-ALIGN_X) 1.0; to: "spacer."NAME"."SIDE"_top"; } \
- rel2 { relative: (1.0-ALIGN_X) 1.0; to: "spacer."NAME"."SIDE"_top"; } \
- image.normal: ICON_PATH; \
- color: 255 255 255 64; \
- } \
- desc { "active"; \
- inherit: "default"; \
- color: 255 255 255 255; \
- } \
- }
+#define CU_BEZEL_CUE4_REJECT_REL1 CU_REL_W(CU_BEZEL_CUE4_REJECT_X) CU_REL_H(CU_BEZEL_CUE4_Y)
+#define CU_BEZEL_CUE4_REJECT_REL2 CU_REL_W((CU_BEZEL_CUE4_REJECT_X+CU_BEZEL_CUE_ICON_DIM)) CU_REL_H((CU_BEZEL_CUE4_Y+CU_BEZEL_CUE_ICON_DIM))
-//"image.arrow1_left" "image.arrow2_left" "image.arrow3_left" "image.arrow4_left" "image.arrow1_right" "image.arrow2_right" "image.arrow3_right" "image.arrow4_right"
+#define CU_ACCEPT_COMPONENT_X 40
+#define CU_ACCEPT_COMPONENT_Y 180
+#define CU_ACCEPT_COMPONENT_REL CU_REL_W(CU_ACCEPT_COMPONENT_X) CU_REL_H(CU_ACCEPT_COMPONENT_Y)
-#define CU_ARROW_PROGRAMS(ARROW_NAME, NEXT_ARROW_NAME, DURATION_IN, DURATION_OUT) \
- program { \
- name: "activate_"ARROW_NAME; \
- action: STATE_SET "active"; \
- targets: "image."ARROW_NAME"_left" "image."ARROW_NAME"_right"; \
- transition: LINEAR DURATION_IN; \
- after: "deactivate_"ARROW_NAME; \
- after: "activate_"NEXT_ARROW_NAME; \
- } \
- program { \
- name: "deactivate_"ARROW_NAME; \
- action: STATE_SET "default"; \
- targets: "image."ARROW_NAME"_left" "image."ARROW_NAME"_right"; \
- transition: LINEAR DURATION_OUT; \
- }
+#define CU_REJECT_COMPONENT_X 320
+#define CU_REJECT_COMPONENT_Y 180
+
+#define CU_REJECT_COMPONENT_REL CU_REL_W(CU_REJECT_COMPONENT_X) CU_REL_H(CU_REJECT_COMPONENT_Y)
-group { "elm/layout/callui/accept_reject";
+group { "elm/layout/callui/event_accept_reject";
parts {
- CU_ARROW_PARTS("arrow1", "left", CU_PATH_ICON_ARROW1_L, CU_ARROW1_LR, CU_ARROW1_T, 0.0)
- CU_ARROW_PARTS("arrow2", "left", CU_PATH_ICON_ARROW2_L, CU_ARROW2_LR, CU_ARROW2_T, 0.0)
- CU_ARROW_PARTS("arrow3", "left", CU_PATH_ICON_ARROW3_L, CU_ARROW3_LR, CU_ARROW3_T, 0.0)
- CU_ARROW_PARTS("arrow4", "left", CU_PATH_ICON_ARROW4_L, CU_ARROW4_LR, CU_ARROW4_T, 0.0)
- CU_ARROW_PARTS("arrow1", "right", CU_PATH_ICON_ARROW1_R, CU_ARROW1_LR, CU_ARROW1_T, 1.0)
- CU_ARROW_PARTS("arrow2", "right", CU_PATH_ICON_ARROW2_R, CU_ARROW2_LR, CU_ARROW2_T, 1.0)
- CU_ARROW_PARTS("arrow3", "right", CU_PATH_ICON_ARROW3_R, CU_ARROW3_LR, CU_ARROW3_T, 1.0)
- CU_ARROW_PARTS("arrow4", "right", CU_PATH_ICON_ARROW4_R, CU_ARROW4_LR, CU_ARROW4_T, 1.0)
- rect { "rect.arrows_left.clipper";
+ rect { "bg";
+ scale;
+ mouse;
+ repeat;
desc { "default";
- rel1 { to_x: "image.arrow4_left"; to_y: "image.arrow1_left"; }
- rel2 { to_x: "image.arrow1_left"; to_y: "image.arrow4_left"; }
- color_class: "TRANSPARENT";
- }
- desc { "visible";
- inherit: "default";
- color_class: "AO0113";
+ min: CU_ACCEPT_REJECT_ICON_BG_SIZE;
+ fixed: 1 1;
+ color: 0 0 0 0;
}
}
- rect { "rect.arrows_right.clipper";
+ }
+}
+
+group { "elm/layout/callui/accept_reject_main";
+ parts {
+ spacer { "bg";
+ scale;
desc { "default";
- rel1.to: "image.arrow1_right";
- rel2.to: "image.arrow4_right";
- color_class: "TRANSPARENT";
- }
- desc { "visible";
- inherit: "default";
- color_class: "AO0115";
+ min: CU_WIN_W CU_WIN_H;
+ fixed: 1 1;
}
}
- spacer { "spacer.left";
+
+ // Bezel Cue
+
+ swallow { "swl.accept.bezel.1";
scale;
desc { "default";
- fixed: 1 0;
- align: 1.0 0.5;
- rel2.relative: 0.0 1.0;
- }
- desc { "hidden";
- inherit: "default";
- min: (CU_BTN_PADDING_LR+CU_BTN_WH) 0;
+ fixed: 1 1;
+ rel1 { relative: CU_BEZEL_CUE1_ACCEPT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE1_ACCEPT_REL2; to: "bg"; }
}
}
- spacer { "spacer.right";
+ swallow { "swl.accept.bezel.2";
scale;
desc { "default";
- fixed: 1 0;
- align: 0.0 0.5;
- rel1.relative: 1.0 0.0;
- }
- desc { "hidden";
- inherit: "default";
- min: (CU_BTN_PADDING_LR+CU_BTN_WH) 0;
+ fixed: 1 1;
+ rel1 { relative: CU_BEZEL_CUE2_ACCEPT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE2_ACCEPT_REL2; to: "bg"; }
}
}
- spacer { "spacer.reject.left";
+ swallow { "swl.accept.bezel.3";
scale;
desc { "default";
- fixed: 1 0;
- min: (CU_BTN_PADDING_LR+CU_BTN_WH/2) 0;
- align: 0.0 0.5;
- rel1 { relative: 0.0 0.0; to_x: "spacer.left"; }
- rel2 { relative: 0.0 1.0; to_x: "spacer.left"; }
+ fixed: 1 1;
+ rel1 { relative: CU_BEZEL_CUE3_ACCEPT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE3_ACCEPT_REL2; to: "bg"; }
}
}
- swallow { "swl.button_accept";
+ swallow { "swl.accept.bezel.4";
scale;
desc { "default";
fixed: 1 1;
- min: CU_BTN_FULL_WH CU_BTN_FULL_WH;
- rel1 { relative: 1.0 0.5; to_x: "spacer.reject.left"; }
- rel2 { relative: 1.0 0.5; to_x: "spacer.reject.left"; }
+ rel1 { relative: CU_BEZEL_CUE4_ACCEPT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE4_ACCEPT_REL2; to: "bg"; }
}
}
- spacer { "spacer.accept.right";
+ swallow { "swl.reject.bezel.1";
scale;
desc { "default";
- fixed: 1 0;
- min: (CU_BTN_PADDING_LR+CU_BTN_WH/2) 0;
- align: 1.0 0.5;
- rel1 { relative: 1.0 0.0; to_x: "spacer.right"; }
- rel2 { relative: 1.0 1.0; to_x: "spacer.right"; }
+ fixed: 1 1;
+ rel1 { relative: CU_BEZEL_CUE1_REJECT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE1_REJECT_REL2; to: "bg"; }
}
}
- swallow { "swl.button_reject";
+ swallow { "swl.reject.bezel.2";
scale;
desc { "default";
fixed: 1 1;
- min: CU_BTN_FULL_WH CU_BTN_FULL_WH;
- rel1 { relative: 0.0 0.5; to_x: "spacer.accept.right"; }
- rel2 { relative: 0.0 0.5; to_x: "spacer.accept.right"; }
+ rel1 { relative: CU_BEZEL_CUE2_REJECT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE2_REJECT_REL2; to: "bg"; }
}
}
- }
- programs {
- script {
- public arrow_anim_counter;
- public is_arrow_anim;
- }
- program {
- signal: "arrows,show";
- source: "*";
- after: "start_arrow_anim";
- }
- program { "start_arrow_anim";
- script {
- if (get_int(is_arrow_anim) == 0) {
- set_int(is_arrow_anim, 1);
- set_int(arrow_anim_counter, get_int(arrow_anim_counter) + 1);
- run_program(PROGRAM:"show_arrows");
- run_program(PROGRAM:"activate_arrow4");
- }
+ swallow { "swl.reject.bezel.3";
+ scale;
+ desc { "default";
+ fixed: 1 1;
+ rel1 { relative: CU_BEZEL_CUE3_REJECT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE3_REJECT_REL2; to: "bg"; }
}
}
- program { "activate_check";
- script {
- if (get_int(is_arrow_anim) == 1) {
- if (get_int(arrow_anim_counter) < CU_BEZELCUE_ANIMATE_COUNT_MAX) {
- set_int(is_arrow_anim, 1);
- set_int(arrow_anim_counter, get_int(arrow_anim_counter) + 1);
- run_program(PROGRAM:"activate_arrow4");
- } else {
- set_int(is_arrow_anim, 0);
- set_int(arrow_anim_counter, 0);
- run_program(PROGRAM:"hide_arrows_anim");
- }
- }
+ swallow { "swl.reject.bezel.4";
+ scale;
+ desc { "default";
+ fixed: 1 1;
+ rel1 { relative: CU_BEZEL_CUE4_REJECT_REL1; to: "bg"; }
+ rel2 { relative: CU_BEZEL_CUE4_REJECT_REL2; to: "bg"; }
}
}
- CU_ARROW_PROGRAMS("arrow4", "arrow3", CU_ARROW4_TIME, CU_ARROW3_TIME)
- CU_ARROW_PROGRAMS("arrow3", "arrow2", CU_ARROW3_TIME, CU_ARROW2_TIME)
- CU_ARROW_PROGRAMS("arrow2", "arrow1", CU_ARROW2_TIME, CU_ARROW1_TIME)
- CU_ARROW_PROGRAMS("arrow1", "check", CU_ARROW1_TIME, CU_ARROW4_TIME)
- program {
- signal: "accept,show";
- source: "*";
- action: STATE_SET "default";
- target: "spacer.left";
- transition: TRANSITION_GLIDE(CU_BTN_HIDE_ANIM_TIME);
- after: "try_show_arrows";
- }
- program {
- signal: "accept,hide";
- source: "*";
- after: "hide_arrows";
- after: "accept,hide,anim";
- }
- program { "accept,hide,anim";
- action: STATE_SET "hidden";
- target: "spacer.left";
- transition: TRANSITION_GLIDE(CU_BTN_HIDE_ANIM_TIME);
- }
- program {
- signal: "reject,show";
- source: "*";
- action: STATE_SET "default";
- target: "spacer.right";
- transition: TRANSITION_GLIDE(CU_BTN_HIDE_ANIM_TIME);
- after: "try_show_arrows";
+
+ // Control parts
+
+ swallow { "swl.accept.finger.event";
+ scale;
+ mouse;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_ICON_BG_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ }
}
- program {
- signal: "reject,hide";
- source: "*";
- after: "hide_arrows";
- after: "reject,hide,anim";
+ swallow { "swl.accept.finger.guide.bg";
+ scale;
+ mouse;
+ repeat;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_ICON_BG_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ }
}
- program { "reject,hide,anim";
- action: STATE_SET "hidden";
- target: "spacer.right";
- transition: TRANSITION_GLIDE(CU_BTN_HIDE_ANIM_TIME);
+ swallow { "swl.accept.finger.tracer";
+ scale;
+ mouse;
+ repeat;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_FINGER_TRACER_BG_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ }
}
- program {
- signal: "reset";
- source: "*";
- action: STATE_SET "default";
- targets: "spacer.right" "spacer.left";
- after: "try_show_arrows";
+ swallow { "swl.accept.icon";
+ scale;
+ mouse;
+ repeat;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_ICON_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_ACCEPT_COMPONENT_REL; to: "bg"; }
+ }
}
- program { "try_show_arrows";
- script {
- if (get_int(is_arrow_anim) == 1) {
- run_program(PROGRAM:"show_arrows");
- } else {
- run_program(PROGRAM:"hide_arrows");
- }
+ swallow { "swl.reject.finger.event";
+ scale;
+ mouse;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_ICON_BG_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
}
}
- program { "show_arrows";
- action: STATE_SET "visible";
- targets: "rect.arrows_left.clipper" "rect.arrows_right.clipper";
+ swallow { "swl.reject.finger.guide.bg";
+ scale;
+ mouse;
+ repeat;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_ICON_BG_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
+ }
}
- program { "hide_arrows";
- action: STATE_SET "default";
- targets: "rect.arrows_left.clipper" "rect.arrows_right.clipper";
+ swallow { "swl.reject.finger.tracer";
+ scale;
+ mouse;
+ repeat;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_FINGER_TRACER_BG_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
+ }
}
- program { "hide_arrows_anim";
- action: STATE_SET "default";
- targets: "rect.arrows_left.clipper" "rect.arrows_right.clipper";
- transition: LINEAR CU_BEZELCUE_HIDE_DURATION;
+ swallow { "swl.reject.icon";
+ scale;
+ mouse;
+ repeat;
+ desc { "default";
+ min: CU_ACCEPT_REJECT_ICON_SIZE;
+ fixed: 1 1;
+ rel1 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
+ rel2 { relative: CU_REJECT_COMPONENT_REL; to: "bg"; }
+ }
}
}
-}
\ No newline at end of file
+}
--- /dev/null
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "view/AcceptRejectWidget.h"
+
+#include <efl_extension.h>
+#include <functional>
+#include <math.h>
+
+#include <ucl/appfw/helpers.h>
+
+#include "common.h"
+
+#define CU_COL_TRANSPARENT 0, 0, 0, 0
+#define CU_COL_WHITE 255, 255, 255, 255
+
+#define CU_COL_AO0115 222, 11, 0, 255
+#define CU_COL_AO0115T 222, 11, 0, 0
+#define CU_COL_AO0115D 222, 11, 0, 63
+#define CU_COL_AO01151 222, 11, 0, 175
+#define CU_COL_AO01152 222, 11, 0, 77
+
+#define CU_COL_AO0113 77, 185, 39, 255
+#define CU_COL_AO0113T 77, 185, 39, 0
+#define CU_COL_AO0113D 77, 185, 39, 63
+#define CU_COL_AO01131 97, 237, 50, 175
+#define CU_COL_AO01132 97, 237, 50, 77
+
+namespace callui { namespace { namespace impl {
+
+ using namespace ucl;
+
+ constexpr LayoutTheme LAYOUT_IMG_ACCEPT_REJECT
+ {"layout", "callui", "accept_reject_main"};
+
+ constexpr LayoutTheme LAYOUT_EVENT_ACCEPT_REJECT
+ {"layout", "callui", "event_accept_reject"};
+
+ constexpr LayoutTheme LAYOUT_IMG_ACTION_BG
+ {"layout", "callui_image", "accept_reject_action_bg"};
+ constexpr LayoutTheme LAYOUT_IMG_ACCEPT
+ {"layout", "callui_image", "accept"};
+ constexpr LayoutTheme LAYOUT_IMG_REJECT
+ {"layout", "callui_image", "reject"};
+
+ constexpr auto BC_ITEM_COUNT = 4;
+
+ constexpr auto BC_ANIMATE_COUNT_MAX = 3;
+
+ constexpr auto FINGER_TRACER_DIM = 130;
+ constexpr auto FINGER_TRACER_HALF_DIM = FINGER_TRACER_DIM / 2;
+
+ constexpr auto FINGER_STROKE_DIM = 480;
+ constexpr auto FINGER_STROKE_HALF_DIM = FINGER_STROKE_DIM / 2;
+
+ constexpr auto INIT_MOVE_DISTANCE_VAL = 65;
+
+ constexpr double BC_ANIMATION_DURATION[BC_ITEM_COUNT] = {
+ 0.23, 0.16, 0.30, 0.16 };
+
+ constexpr auto BC_ANIM_DUR_HIDE = 0.16;
+
+ constexpr auto ROTARY_ACTION_ANIM_DUR = 0.15;
+
+ constexpr auto EXPAND_WAITING_TIMEOUT = 0.6;
+
+ constexpr auto ICON_ZOOM_EFF_VAL_MIN = 1.0;
+ constexpr auto ICON_ZOOM_EFF_VAL_MID = 2.0;
+ constexpr auto ICON_ZOOM_EFF_VAL_MAX = 3.7;
+
+ constexpr auto ACC_ICON_RIGHT_PAD_X = 13;
+ constexpr auto REJ_ICON_RIGHT_PAD_X = 293;
+ constexpr auto ACC_REJ_ICON_HIDE_THRESHOLD_W = 70;
+
+ struct BezelCueParams {
+ const EdjePart part;
+ const LayoutTheme theme;
+ };
+
+ static const BezelCueParams ACCEPT_BC_PARAMS[BC_ITEM_COUNT] = {
+ { EdjePart {"swl.accept.bezel.1"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_accept_1"} },
+ { EdjePart {"swl.accept.bezel.2"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_accept_2"} },
+ { EdjePart {"swl.accept.bezel.3"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_accept_3"} },
+ { EdjePart {"swl.accept.bezel.4"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_accept_4"} },
+ };
+
+ static const BezelCueParams REJECT_BC_PARAMS[BC_ITEM_COUNT] = {
+ { EdjePart {"swl.reject.bezel.1"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_reject_1"} },
+ { EdjePart {"swl.reject.bezel.2"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_reject_2"} },
+ { EdjePart {"swl.reject.bezel.3"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_reject_3"} },
+ { EdjePart {"swl.reject.bezel.4"},
+ LayoutTheme {"layout", "callui_image",
+ "bezel_cue_reject_4"} },
+ };
+
+ constexpr EdjePart PART_SWL_ACCEPT_FINGER_TRACER
+ {"swl.accept.finger.tracer"};
+ constexpr EdjePart PART_SWL_ACCEPT_FINGER_GUIDE_BG
+ {"swl.accept.finger.guide.bg"};
+ constexpr EdjePart PART_SWL_ACCEPT_FINGER_EVENT
+ {"swl.accept.finger.event"};
+ constexpr EdjePart PART_SWL_ACCEPT_ICON
+ {"swl.accept.icon"};
+
+ constexpr EdjePart PART_SWL_REJECT_FINGER_TRACER
+ {"swl.reject.finger.tracer"};
+ constexpr EdjePart PART_SWL_REJECT_FINGER_GUIDE_BG
+ {"swl.reject.finger.guide.bg"};
+ constexpr EdjePart PART_SWL_REJECT_FINGER_EVENT
+ {"swl.reject.finger.event"};
+ constexpr EdjePart PART_SWL_REJECT_ICON
+ {"swl.reject.icon"};
+
+ ElmWidgetSRef createImage(ElmWidget &parent, const LayoutTheme &theme)
+ {
+ auto layout = Layout::Builder().
+ setTheme(theme).
+ setIsOwner(true).
+ build(parent);
+ if (!layout) {
+ LOG_RETURN_VALUE(RES_FAIL, {}, "Layout::build() failed!");
+ }
+ return layout;
+ }
+
+ void resizeImage(ElmWidget &image, int size)
+ {
+ Evas_Coord x, y, w, h;
+ image.getGeometry(&x, &y, &w, &h);
+ image.move((x + (w / 2)) - (size / 2), (y + (h / 2)) - (size / 2));
+ image.resize(size, size);
+ }
+
+}}}
+
+namespace callui {
+
+ using namespace ucl;
+
+ AcceptRejectWidget::Builder::Builder()
+ {
+ }
+
+ AcceptRejectWidget::Builder &
+ AcceptRejectWidget::Builder::setAcceptEventHandler(
+ const NotiHandler &handler)
+ {
+ m_acceptHandler = handler;
+ return *this;
+ }
+
+ AcceptRejectWidget::Builder &
+ AcceptRejectWidget::Builder::setRejectEventHandler(
+ const NotiHandler &handler)
+ {
+ m_rejectHandler = handler;
+ return *this;
+ }
+
+ AcceptRejectWidgetSRef
+ AcceptRejectWidget::Builder::build(ElmWidget &parent) const
+ {
+ auto layout = Layout::Builder().
+ setTheme(impl::LAYOUT_IMG_ACCEPT_REJECT).
+ setIsOwner(true).
+ build(parent);
+ if (!layout) {
+ LOG_RETURN_VALUE(RES_FAIL, {}, "Layout::build() failed!");
+ }
+
+ auto result = makeShared<AcceptRejectWidget>(layout,
+ m_acceptHandler, m_rejectHandler);
+
+ result->bindToEo();
+
+ return result;
+ }
+
+ AcceptRejectWidget::AcceptRejectWidget(IRefCountObj &rc,
+ const LayoutSRef &layout,
+ const NotiHandler &acceptHandler,
+ const NotiHandler &rejectHandler):
+ ElmWidget(&rc, *layout, true),
+ m_layout(layout.get()),
+ m_accHandler(acceptHandler),
+ m_rejHandler(rejectHandler),
+ m_accBezelCueImg(impl::BC_ITEM_COUNT),
+ m_rejBezelCueImg(impl::BC_ITEM_COUNT),
+ m_isFreezed(false),
+ m_isAccPressed(false),
+ m_isRejPressed(false),
+ m_lastMoveDistance(impl::INIT_MOVE_DISTANCE_VAL),
+ m_rotaryClockwiseCount(0),
+ m_rotaryCounterClockwiseCount(0),
+ m_isContracting(false),
+ m_accTracerTr(nullptr),
+ m_accGuideTr(nullptr),
+ m_accIconTr(nullptr),
+ m_rejTracerTr(nullptr),
+ m_rejGuideTr(nullptr),
+ m_rejIconTr(nullptr),
+ m_lastAccBezelTr1(nullptr),
+ m_lastAccBezelTr2(nullptr),
+ m_lastRejBezelTr1(nullptr),
+ m_lastRejBezelTr2(nullptr),
+ m_accBCAnimCount(0),
+ m_rejBCAnimCount(0),
+ m_accBCAnimIndex(impl::BC_ITEM_COUNT - 1),
+ m_rejBCAnimIndex(impl::BC_ITEM_COUNT - 1)
+ {
+ prepare();
+ }
+
+ AcceptRejectWidget::~AcceptRejectWidget()
+ {
+ m_expandTimeout.reset();
+
+ m_accEventLy->delEventHandler(WidgetEvent::MOUSE_DOWN,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseDown, asWeak(*this)));
+ m_accEventLy->delEventHandler(WidgetEvent::MOUSE_UP,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseUp, asWeak(*this)));
+ m_accEventLy->delEventHandler(WidgetEvent::MOUSE_MOVE,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseMove, asWeak(*this)));
+
+ m_rejEventLy->delEventHandler(WidgetEvent::MOUSE_DOWN,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseDown, asWeak(*this)));
+ m_rejEventLy->delEventHandler(WidgetEvent::MOUSE_UP,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseUp, asWeak(*this)));
+ m_rejEventLy->delEventHandler(WidgetEvent::MOUSE_MOVE,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseMove, asWeak(*this)));
+
+ DEL_TRANSIT_FULL(m_lastAccBezelTr1);
+ DEL_TRANSIT_FULL(m_lastAccBezelTr2);
+ DEL_TRANSIT_FULL(m_lastRejBezelTr1);
+ DEL_TRANSIT_FULL(m_lastRejBezelTr2);
+
+ DEL_TRANSIT_FULL(m_accTracerTr);
+ DEL_TRANSIT_FULL(m_accGuideTr);
+ DEL_TRANSIT_FULL(m_accIconTr);
+
+ DEL_TRANSIT_FULL(m_rejTracerTr);
+ DEL_TRANSIT_FULL(m_rejGuideTr);
+ DEL_TRANSIT_FULL(m_rejIconTr);
+
+ eext_rotary_object_event_callback_del(*m_layout, CALLBACK_A(
+ AcceptRejectWidget::onRotaryEvent));
+ }
+
+ void AcceptRejectWidget::prepare()
+ {
+ FAIL_RETURN_VOID(createAcceptComponents(),
+ "createAcceptComponents() failed!");
+
+ FAIL_RETURN_VOID(createRejectComponents(),
+ "createRejectComponents() failed!");
+
+ FAIL_RETURN_VOID(createBezelCueComponents(),
+ "createBezelCueImages() failed!");
+
+ eext_rotary_object_event_callback_add(*m_layout, CALLBACK_A(
+ AcceptRejectWidget::onRotaryEvent), this);
+ }
+
+ Result AcceptRejectWidget::createAcceptComponents()
+ {
+ m_accTracer = impl::createImage(*m_layout, impl::LAYOUT_IMG_ACTION_BG);
+ if (!m_accTracer) {
+ LOG_RETURN(RES_FAIL, "createImage() failed");
+ }
+ m_accTracer->setColor(CU_COL_TRANSPARENT);
+ m_layout->setContent(*m_accTracer,
+ impl::PART_SWL_ACCEPT_FINGER_TRACER);
+
+ m_accGuide = impl::createImage(*m_layout, impl::LAYOUT_IMG_ACTION_BG);
+ if (!m_accGuide) {
+ LOG_RETURN(RES_FAIL, "createImage() failed");
+ }
+ m_accGuide->setColor(CU_COL_TRANSPARENT);
+ m_layout->setContent(*m_accGuide,
+ impl::PART_SWL_ACCEPT_FINGER_GUIDE_BG);
+
+ m_accIcon = impl::createImage(*m_layout, impl::LAYOUT_IMG_ACCEPT);
+ if (!m_accIcon) {
+ LOG_RETURN(RES_FAIL, "createImage() failed");
+ }
+ m_accIcon->setColor(CU_COL_AO0113);
+ m_layout->setContent(*m_accIcon,
+ impl::PART_SWL_ACCEPT_ICON);
+
+ m_accEventLy = Layout::Builder().
+ setTheme(impl::LAYOUT_EVENT_ACCEPT_REJECT).
+ build(*m_layout);
+ m_accEventLy->setWeight(EXPAND, EXPAND);
+ m_accEventLy->addEventHandler(WidgetEvent::MOUSE_DOWN,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseDown, asWeak(*this)));
+ m_accEventLy->addEventHandler(WidgetEvent::MOUSE_UP,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseUp, asWeak(*this)));
+ m_accEventLy->addEventHandler(WidgetEvent::MOUSE_MOVE,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseMove, asWeak(*this)));
+ m_layout->setContent(*m_accEventLy,
+ impl::PART_SWL_ACCEPT_FINGER_EVENT);
+
+ return RES_OK;
+ }
+
+ Result AcceptRejectWidget::createRejectComponents()
+ {
+ m_rejTracer = impl::createImage(*m_layout, impl::LAYOUT_IMG_ACTION_BG);
+ if (!m_rejTracer) {
+ LOG_RETURN(RES_FAIL, "createImage() failed");
+ }
+ m_rejTracer->setColor(CU_COL_TRANSPARENT);
+ m_layout->setContent(*m_rejTracer,
+ impl::PART_SWL_REJECT_FINGER_TRACER);
+
+ m_rejGuide = impl::createImage(*m_layout, impl::LAYOUT_IMG_ACTION_BG);
+ if (!m_rejGuide) {
+ LOG_RETURN(RES_FAIL, "createImage() failed");
+ }
+ m_rejGuide->setColor(CU_COL_TRANSPARENT);
+ m_layout->setContent(*m_rejGuide,
+ impl::PART_SWL_REJECT_FINGER_GUIDE_BG);
+
+ m_rejIcon = impl::createImage(*m_layout, impl::LAYOUT_IMG_REJECT);
+ if (!m_rejIcon) {
+ LOG_RETURN(RES_FAIL, "createImage() failed");
+ }
+ m_rejIcon->setColor(CU_COL_AO0115);
+ m_layout->setContent(*m_rejIcon,
+ impl::PART_SWL_REJECT_ICON);
+
+ m_rejEventLy = Layout::Builder().
+ setTheme(impl::LAYOUT_EVENT_ACCEPT_REJECT).
+ build(*m_layout);
+
+ m_rejEventLy->addEventHandler(WidgetEvent::MOUSE_DOWN,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseDown, asWeak(*this)));
+
+ m_rejEventLy->addEventHandler(WidgetEvent::MOUSE_UP,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseUp, asWeak(*this)));
+
+ m_rejEventLy->addEventHandler(WidgetEvent::MOUSE_MOVE,
+ WEAK_DELEGATE(AcceptRejectWidget::onMouseMove, asWeak(*this)));
+
+ m_layout->setContent(*m_rejEventLy,
+ impl::PART_SWL_REJECT_FINGER_EVENT);
+
+ return RES_OK;
+ }
+
+ void AcceptRejectWidget::onMouseDown(Widget &widget, void *eventInfo)
+ {
+ if (m_isFreezed) {
+ DLOG("Freezed");
+ return;
+ }
+
+ if (m_rotaryClockwiseCount > 0
+ || m_rotaryCounterClockwiseCount) {
+ DLOG("Rotary event is ongoing. Ignore touch callback");
+ return;
+ }
+
+ if (m_isAccPressed || m_isRejPressed) {
+ LOG_RETURN_VOID(RES_FAIL, "Down signal already got");
+ }
+
+ DEL_TRANSIT(m_accTracerTr);
+ DEL_TRANSIT(m_accGuideTr);
+ DEL_TRANSIT(m_accIconTr);
+
+ DEL_TRANSIT(m_rejTracerTr);
+ DEL_TRANSIT(m_rejGuideTr);
+ DEL_TRANSIT(m_rejIconTr);
+
+ bool needTransition = true;
+ if (m_rotaryClockwiseCount != 0
+ || m_rotaryCounterClockwiseCount != 0) {
+ m_rotaryClockwiseCount = 0;
+ m_rotaryCounterClockwiseCount = 0;
+ DLOG("Already expanded first step");
+ needTransition = false;
+ }
+
+ if (widget == *m_accEventLy) {
+ DLOG("Accept button down");
+ m_isAccPressed = true;
+ if (needTransition) {
+ setAcceptPressedState();
+ }
+ } else if (widget == *m_rejEventLy) {
+ DLOG("Reject button down");
+ m_isRejPressed = true;
+ if (needTransition) {
+ setRejectPressedState();
+ }
+ }
+ }
+
+ void AcceptRejectWidget::onMouseUp(Widget &widget, void *eventInfo)
+ {
+ if (m_isFreezed) {
+ DLOG("Freezed");
+ return;
+ }
+
+ if (m_rotaryClockwiseCount > 0 || m_rotaryCounterClockwiseCount) {
+ DLOG("Rotary event is ongoing. Ignore touch callback");
+ return;
+ }
+
+ if (m_isAccPressed) {
+ DEL_TRANSIT(m_accTracerTr);
+ DEL_TRANSIT(m_accGuideTr);
+ DEL_TRANSIT(m_accIconTr);
+ } else {
+ DEL_TRANSIT(m_rejTracerTr);
+ DEL_TRANSIT(m_rejGuideTr);
+ DEL_TRANSIT(m_rejIconTr);
+ }
+
+ m_lastMoveDistance = impl::INIT_MOVE_DISTANCE_VAL;
+
+ if (widget == *m_accEventLy) {
+ if (m_isAccPressed) {
+ DLOG("Accept button released");
+ setAcceptUnpressedState();
+ } else {
+ LOG_RETURN_VOID(RES_FAIL, "Accept button was not pressed");
+ }
+ } else if (widget == *m_rejEventLy) {
+ if (m_isRejPressed) {
+ DLOG("Reject button released");
+ setRejectUnpressedState();
+ } else {
+ LOG_RETURN_VOID(RES_FAIL, "Reject button was not pressed");
+ }
+ }
+ }
+
+ int AcceptRejectWidget::getTracerMoveDistance(
+ const ElmWidget &widget, int curX, int curY) const
+ {
+ Evas_Coord x, y, w, h;
+ widget.getGeometry(&x, &y, &w, &h);
+ int dx = curX - (x + (w / 2));
+ int dy = curY - (y + (h / 2));
+
+ int distance = pow(dx, 2);
+ distance += pow(dy, 2);
+ distance = sqrt(distance);
+
+ if (distance > impl::FINGER_STROKE_HALF_DIM) {
+ distance = impl::FINGER_STROKE_HALF_DIM;
+ }
+ return distance;
+ }
+
+ void AcceptRejectWidget::onMouseMove(Widget &widget, void *eventInfo)
+ {
+ if (m_isFreezed) {
+ DLOG("Freezed");
+ return;
+ }
+
+ if (m_rotaryClockwiseCount > 0 || m_rotaryCounterClockwiseCount) {
+ DLOG("Rotary event is ongoing. Ignore touch callback");
+ return;
+ }
+
+ ElmWidgetSRef img;
+ if (widget == *m_accEventLy) {
+ if (!m_isAccPressed) {
+ LOG_RETURN_VOID(RES_FAIL, "Down callback is not come");
+ }
+ img = m_accTracer;
+ } else if (widget == *m_rejEventLy) {
+ if (!m_isRejPressed) {
+ LOG_RETURN_VOID(RES_FAIL, "Down callback is not come");
+ }
+ img = m_rejTracer;
+ }
+
+ Evas_Event_Mouse_Move *ev =
+ static_cast<Evas_Event_Mouse_Move *>(eventInfo);
+ int distance = getTracerMoveDistance(*img,
+ ev->cur.canvas.x, ev->cur.canvas.y);
+
+ if (distance < impl::FINGER_TRACER_HALF_DIM) {
+ return;
+ }
+ if (m_isAccPressed) {
+ DEL_TRANSIT(m_accTracerTr);
+ } else {
+ DEL_TRANSIT(m_rejTracerTr);
+ }
+ m_lastMoveDistance = distance;
+
+ impl::resizeImage(*img, m_lastMoveDistance * 2);
+
+ if (m_lastMoveDistance >= impl::FINGER_STROKE_HALF_DIM) {
+ m_isFreezed = true;
+ if (m_accTracer == img && m_accHandler) {
+ m_accHandler();
+ } else if (m_rejTracer == img && m_rejHandler) {
+ m_rejHandler();
+ }
+ }
+ }
+
+ void AcceptRejectWidget::startBezelCueAnimation()
+ {
+ if (m_lastAccBezelTr1 || m_lastAccBezelTr2 ||
+ m_lastRejBezelTr1 || m_lastRejBezelTr2) {
+ ILOG("Bezel cue is already animating");
+ return;
+ }
+
+ // Accept bezel cue animation
+ for (int i = 0 ; i < impl::BC_ITEM_COUNT ; i++) {
+ m_accBezelCueImg[i]->setColor(CU_COL_AO0113D);
+ m_rejBezelCueImg[i]->setColor(CU_COL_AO0115D);
+ }
+
+ m_accBCAnimIndex = impl::BC_ITEM_COUNT - 1;
+ Elm_Transit *tr1 = elm_transit_add();
+ elm_transit_effect_color_add(tr1, CU_COL_AO0113D, CU_COL_AO0113);
+ elm_transit_object_add(tr1, *m_accBezelCueImg[m_accBCAnimIndex]);
+ elm_transit_duration_set(tr1,
+ impl::BC_ANIMATION_DURATION[m_accBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr1, EINA_TRUE);
+ elm_transit_del_cb_set(tr1,
+ CALLBACK_A(AcceptRejectWidget::onAcceptBCTransitDel),
+ this);
+ elm_transit_go(tr1);
+ m_lastAccBezelTr1 = tr1;
+
+ m_rejBCAnimIndex = impl::BC_ITEM_COUNT - 1;
+ Elm_Transit *tr2 = elm_transit_add();
+ elm_transit_effect_color_add(tr2, CU_COL_AO0115D, CU_COL_AO0115);
+ elm_transit_object_add(tr2, *m_rejBezelCueImg[m_rejBCAnimIndex]);
+ elm_transit_duration_set(tr2,
+ impl::BC_ANIMATION_DURATION[m_rejBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr2, EINA_TRUE);
+ elm_transit_del_cb_set(tr2,
+ CALLBACK_A(AcceptRejectWidget::onRejectBCTransitDel),
+ this);
+ elm_transit_go(tr2);
+ m_lastRejBezelTr1 = tr2;
+ }
+
+ void AcceptRejectWidget::setAcceptPressedTransitions()
+ {
+ setBezelCueVisible(false);
+
+ setAcceptTracerPressedTransition();
+ setAcceptGuidePressedTransition();
+ setAcceptIconPressedTransition();
+ setRejectIconHideTransition();
+ }
+
+ void AcceptRejectWidget::setAcceptTracerPressedTransition()
+ {
+ DEL_TRANSIT(m_accTracerTr);
+ m_accTracerTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_accTracerTr,
+ impl::ICON_ZOOM_EFF_VAL_MIN, impl::ICON_ZOOM_EFF_VAL_MID);
+ elm_transit_object_add(m_accTracerTr, *m_accTracer);
+ elm_transit_duration_set(m_accTracerTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_accTracerTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_accTracerTr,
+ CALLBACK_A(AcceptRejectWidget::onAcceptTransitDel),
+ this);
+ elm_transit_go(m_accTracerTr);
+ }
+
+ void AcceptRejectWidget::setAcceptGuidePressedTransition()
+ {
+ DEL_TRANSIT(m_accGuideTr);
+ m_accGuideTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_accGuideTr,
+ impl::ICON_ZOOM_EFF_VAL_MIN, impl::ICON_ZOOM_EFF_VAL_MAX);
+ elm_transit_object_add(m_accGuideTr, *m_accGuide);
+ elm_transit_duration_set(m_accGuideTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_accGuideTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_accGuideTr,
+ CALLBACK_A(AcceptRejectWidget::onAcceptBgExpandTransitDel),
+ this);
+ elm_transit_go(m_accGuideTr);
+ }
+
+ void AcceptRejectWidget::setAcceptIconPressedTransition()
+ {
+ DEL_TRANSIT(m_accIconTr);
+ m_accIconTr = elm_transit_add();
+ elm_transit_effect_color_add(m_accIconTr, CU_COL_AO0113, CU_COL_WHITE);
+ elm_transit_object_add(m_accIconTr, *m_accIcon);
+ elm_transit_duration_set(m_accIconTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_accIconTr, EINA_TRUE);
+ elm_transit_del_cb_set(m_accIconTr,
+ CALLBACK_A(AcceptRejectWidget::onAcceptIconTransitDel),
+ this);
+ elm_transit_go(m_accIconTr);
+ }
+
+ void AcceptRejectWidget::setRejectIconHideTransition()
+ {
+ DEL_TRANSIT(m_rejIconTr);
+
+ Evas_Coord x;
+ m_rejIcon->getGeometry(&x, nullptr, nullptr, nullptr);
+ int dx = x - impl::REJ_ICON_RIGHT_PAD_X;
+
+ int animTrace = impl::ACC_REJ_ICON_HIDE_THRESHOLD_W - dx;
+ if (animTrace <= 0) {
+ DLOG("No need to add transition");
+ return;
+ }
+
+ m_rejIconTr = elm_transit_add();
+ elm_transit_effect_translation_add(m_rejIconTr, 0, 0, animTrace, 0);
+ elm_transit_object_add(m_rejIconTr, *m_rejIcon);
+ elm_transit_duration_set(m_rejIconTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_rejIconTr, EINA_TRUE);
+ elm_transit_del_cb_set(m_rejIconTr,
+ CALLBACK_A(AcceptRejectWidget::onRejectIconTransitDel),
+ this);
+ elm_transit_go(m_rejIconTr);
+ }
+
+ void AcceptRejectWidget::setAcceptFullExpensionTransition()
+ {
+ DEL_TRANSIT(m_accTracerTr);
+ m_accTracerTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_accTracerTr,
+ impl::ICON_ZOOM_EFF_VAL_MIN, impl::ICON_ZOOM_EFF_VAL_MAX);
+ elm_transit_object_add(m_accTracerTr, *m_accTracer);
+ elm_transit_duration_set(m_accTracerTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_accTracerTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_accTracerTr,
+ CALLBACK_A(AcceptRejectWidget::
+ onAcceptFullExpensionTransitDel),
+ this);
+ elm_transit_go(m_accTracerTr);
+
+ }
+
+ void AcceptRejectWidget::setAcceptGuideUnpressedTransition()
+ {
+ DEL_TRANSIT(m_accGuideTr);
+ m_accGuideTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_accGuideTr,
+ impl::ICON_ZOOM_EFF_VAL_MAX, impl::ICON_ZOOM_EFF_VAL_MIN);
+ elm_transit_object_add(m_accGuideTr, *m_accGuide);
+ elm_transit_duration_set(m_accGuideTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_accGuideTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_accGuideTr,
+ CALLBACK_A(AcceptRejectWidget::onAcceptBgContractTransitDel),
+ this);
+ elm_transit_go(m_accGuideTr);
+ }
+
+ void AcceptRejectWidget::setRejectIconShowTransition()
+ {
+ DEL_TRANSIT(m_rejIconTr);
+
+ Evas_Coord x;
+ m_rejIcon->getGeometry(&x, nullptr, nullptr, nullptr);
+ int dx = impl::REJ_ICON_RIGHT_PAD_X - x;
+
+ if (dx >= 0) {
+ DLOG("No need to add transition");
+ return;
+ }
+
+ m_rejIconTr = elm_transit_add();
+ elm_transit_effect_translation_add(m_rejIconTr, 0, 0, dx, 0);
+ elm_transit_object_add(m_rejIconTr, *m_rejIcon);
+ elm_transit_duration_set(m_rejIconTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_rejIconTr, EINA_TRUE);
+ elm_transit_del_cb_set(m_rejIconTr,
+ CALLBACK_A(AcceptRejectWidget::onRejectIconTransitDel),
+ this);
+ elm_transit_go(m_rejIconTr);
+ }
+
+ void AcceptRejectWidget::setAcceptUnpressedTransitions()
+ {
+ setAcceptGuideUnpressedTransition();
+ setRejectIconShowTransition();
+ }
+
+ void AcceptRejectWidget::setRejectPressedTransitions()
+ {
+ setBezelCueVisible(false);
+
+ setRejectTracerPressedTransition();
+ setRejectGuidePressedTransition();
+ setRejectIconPressedTransition();
+ setAcceptIconHideTransition();
+ }
+
+ void AcceptRejectWidget::setRejectTracerPressedTransition()
+ {
+ DEL_TRANSIT(m_rejTracerTr);
+ m_rejTracerTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_rejTracerTr,
+ impl::ICON_ZOOM_EFF_VAL_MIN, impl::ICON_ZOOM_EFF_VAL_MID);
+ elm_transit_object_add(m_rejTracerTr, *m_rejTracer);
+ elm_transit_duration_set(m_rejTracerTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_rejTracerTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_rejTracerTr,
+ CALLBACK_A(AcceptRejectWidget::onRejectTransitDel),
+ this);
+ elm_transit_go(m_rejTracerTr);
+ }
+
+ void AcceptRejectWidget::setRejectGuidePressedTransition()
+ {
+ DEL_TRANSIT(m_rejGuideTr);
+ m_rejGuideTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_rejGuideTr,
+ impl::ICON_ZOOM_EFF_VAL_MIN, impl::ICON_ZOOM_EFF_VAL_MAX);
+ elm_transit_object_add(m_rejGuideTr, *m_rejGuide);
+ elm_transit_duration_set(m_rejGuideTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_rejGuideTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_rejGuideTr,
+ CALLBACK_A(AcceptRejectWidget::onRejectBgExpandTransitDel),
+ this);
+ elm_transit_go(m_rejGuideTr);
+ }
+
+ void AcceptRejectWidget::setRejectIconPressedTransition()
+ {
+ DEL_TRANSIT(m_rejIconTr);
+ m_rejIconTr = elm_transit_add();
+ elm_transit_effect_color_add(m_rejIconTr, CU_COL_AO0115, CU_COL_WHITE);
+ elm_transit_object_add(m_rejIconTr, *m_rejIcon);
+ elm_transit_duration_set(m_rejIconTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_rejIconTr, EINA_TRUE);
+ elm_transit_del_cb_set(m_rejIconTr,
+ CALLBACK_A(AcceptRejectWidget::onRejectIconTransitDel),
+ this);
+ elm_transit_go(m_rejIconTr);
+ }
+
+ void AcceptRejectWidget::setAcceptIconHideTransition()
+ {
+ DEL_TRANSIT(m_accIconTr);
+
+ Evas_Coord x;
+ m_accIcon->getGeometry(&x, nullptr, nullptr, nullptr);
+ int dx = impl::ACC_ICON_RIGHT_PAD_X - x;
+
+ int animTrace = dx - impl::ACC_REJ_ICON_HIDE_THRESHOLD_W;
+ if (animTrace >= 0) {
+ DLOG("No need to add transition");
+ return;
+ }
+ m_accIconTr = elm_transit_add();
+ elm_transit_effect_translation_add(m_accIconTr, 0, 0, animTrace, 0);
+ elm_transit_object_add(m_accIconTr, *m_accIcon);
+ elm_transit_duration_set(m_accIconTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_accIconTr, EINA_TRUE);
+ elm_transit_del_cb_set(m_accIconTr,
+ CALLBACK_A(AcceptRejectWidget::onAcceptIconTransitDel),
+ this);
+ elm_transit_go(m_accIconTr);
+ }
+
+ void AcceptRejectWidget::setAcceptIconShowTransition()
+ {
+ DEL_TRANSIT(m_accIconTr);
+
+ Evas_Coord x;
+ m_accIcon->getGeometry(&x, nullptr, nullptr, nullptr);
+ int dx = impl::ACC_ICON_RIGHT_PAD_X - x;
+
+ if (dx <= 0) {
+ DLOG("No need to add transition");
+ return;
+ }
+
+ m_accIconTr = elm_transit_add();
+ elm_transit_effect_translation_add(m_accIconTr, 0, 0, dx, 0);
+ elm_transit_object_add(m_accIconTr, *m_accIcon);
+ elm_transit_duration_set(m_accIconTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_accIconTr, EINA_TRUE);
+ elm_transit_del_cb_set(m_accIconTr,
+ CALLBACK_A(AcceptRejectWidget::onAcceptIconTransitDel),
+ this);
+ elm_transit_go(m_accIconTr);
+ }
+
+ void AcceptRejectWidget::setRejectFullExpensionTransition()
+ {
+ DEL_TRANSIT(m_rejTracerTr);
+ m_rejTracerTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_rejTracerTr,
+ impl::ICON_ZOOM_EFF_VAL_MIN, impl::ICON_ZOOM_EFF_VAL_MAX);
+ elm_transit_object_add(m_rejTracerTr, *m_rejTracer);
+ elm_transit_duration_set(m_rejTracerTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_rejTracerTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_rejTracerTr,
+ CALLBACK_A(AcceptRejectWidget::
+ onRejectFullExpensionTransitDel),
+ this);
+ elm_transit_go(m_rejTracerTr);
+ }
+
+ void AcceptRejectWidget::setRejectUnpressedTransitions()
+ {
+ setRejectGuideUnpressedTransition();
+ setAcceptIconShowTransition();
+ }
+
+ void AcceptRejectWidget::setRejectGuideUnpressedTransition()
+ {
+ DEL_TRANSIT(m_rejGuideTr);
+ m_rejGuideTr = elm_transit_add();
+ elm_transit_effect_zoom_add(m_rejGuideTr,
+ impl::ICON_ZOOM_EFF_VAL_MAX, impl::ICON_ZOOM_EFF_VAL_MIN);
+ elm_transit_object_add(m_rejGuideTr, *m_rejGuide);
+ elm_transit_duration_set(m_rejGuideTr, impl::ROTARY_ACTION_ANIM_DUR);
+ elm_transit_objects_final_state_keep_set(m_rejGuideTr, EINA_FALSE);
+ elm_transit_del_cb_set(m_rejGuideTr,
+ CALLBACK_A(AcceptRejectWidget::onRejectBgContractTransitDel),
+ this);
+ elm_transit_go(m_rejGuideTr);
+ }
+
+ Result AcceptRejectWidget::createBezelCueComponents()
+ {
+ for (int i = 0; i < impl::BC_ITEM_COUNT; i++) {
+ // Accept
+ m_accBezelCueImg[i] = impl::createImage(*m_layout,
+ impl::ACCEPT_BC_PARAMS[i].theme);
+ if (!m_accBezelCueImg[i]) {
+ LOG_RETURN(RES_FAIL, "Create bezel cue image failed");
+ }
+ m_accBezelCueImg[i]->setColor(CU_COL_AO0113T);
+ show(*m_accBezelCueImg[i]);
+ m_layout->setContent(*m_accBezelCueImg[i],
+ impl::ACCEPT_BC_PARAMS[i].part);
+
+ // Reject
+ m_rejBezelCueImg[i] = impl::createImage(*m_layout,
+ impl::REJECT_BC_PARAMS[i].theme);
+ if (!m_rejBezelCueImg[i]) {
+ LOG_RETURN(RES_FAIL, "Create bezel cue image failed");
+ }
+ m_rejBezelCueImg[i]->setColor(CU_COL_AO0113T);
+ show(*m_rejBezelCueImg[i]);
+ m_layout->setContent(*m_rejBezelCueImg[i],
+ impl::REJECT_BC_PARAMS[i].part);
+ }
+ return RES_OK;
+ }
+
+ void AcceptRejectWidget::setBezelCueVisible(bool isVisible)
+ {
+ if (isVisible) {
+ for (int i = 0; i < impl::BC_ITEM_COUNT; i++) {
+ show(*m_accBezelCueImg[i]);
+ show(*m_rejBezelCueImg[i]);
+ }
+ } else {
+ for (int i = 0; i < impl::BC_ITEM_COUNT; i++) {
+ hide(*m_accBezelCueImg[i]);
+ hide(*m_rejBezelCueImg[i]);
+ }
+ }
+ }
+
+ void AcceptRejectWidget::onAcceptTransitDel(Elm_Transit *transit)
+ {
+ m_accTracerTr = nullptr;
+
+ impl::resizeImage(*m_accTracer, impl::FINGER_TRACER_DIM);
+ }
+
+ void AcceptRejectWidget::onAcceptFullExpensionTransitDel(
+ Elm_Transit *transit)
+ {
+ m_accTracerTr = nullptr;
+
+ m_isFreezed = true;
+ impl::resizeImage(*m_accTracer, impl::FINGER_STROKE_DIM);
+
+ if (m_accHandler) {
+ m_accHandler();
+ }
+ }
+
+ void AcceptRejectWidget::onAcceptBgExpandTransitDel(Elm_Transit *transit)
+ {
+ m_accGuideTr = nullptr;
+
+ impl::resizeImage(*m_accGuide, impl::FINGER_STROKE_DIM);
+ }
+
+ void AcceptRejectWidget::onAcceptBgContractTransitDel(
+ Elm_Transit *transit)
+ {
+ m_accGuideTr = nullptr;
+
+ m_accGuide->setColor(CU_COL_TRANSPARENT);
+ impl::resizeImage(*m_accGuide, impl::FINGER_TRACER_DIM);
+
+ m_isAccPressed = false;
+ m_isRejPressed = false;
+ m_isContracting = false;
+
+ setBezelCueVisible(true);
+ }
+
+ void AcceptRejectWidget::onAcceptIconTransitDel(Elm_Transit *transit)
+ {
+ m_accIconTr = nullptr;
+ }
+
+ void AcceptRejectWidget::onRejectTransitDel(Elm_Transit *transit)
+ {
+ m_rejTracerTr = nullptr;
+
+ impl::resizeImage(*m_rejTracer, impl::FINGER_TRACER_DIM);
+ }
+
+ void AcceptRejectWidget::onRejectFullExpensionTransitDel(
+ Elm_Transit *transit)
+ {
+ m_rejTracerTr = nullptr;
+
+ m_isFreezed = true;
+ impl::resizeImage(*m_rejTracer, impl::FINGER_STROKE_DIM);
+
+ if (m_rejHandler) {
+ m_rejHandler();
+ }
+
+ }
+
+ void AcceptRejectWidget::onRejectBgExpandTransitDel(Elm_Transit *transit)
+ {
+ m_rejGuideTr = nullptr;
+
+ impl::resizeImage(*m_rejGuide, impl::FINGER_STROKE_DIM);
+ }
+
+ void AcceptRejectWidget::onRejectBgContractTransitDel(
+ Elm_Transit *transit)
+ {
+ m_rejGuideTr = nullptr;
+
+ m_rejGuide->setColor(CU_COL_TRANSPARENT);
+ impl::resizeImage(*m_rejGuide, impl::FINGER_TRACER_DIM);
+
+ m_isAccPressed = false;
+ m_isRejPressed = false;
+ m_isContracting = false;
+
+ setBezelCueVisible(true);
+ }
+
+ void AcceptRejectWidget::onRejectIconTransitDel(Elm_Transit *transit)
+ {
+ m_rejIconTr = nullptr;
+ }
+
+ void AcceptRejectWidget::onAcceptBCTransitDel(Elm_Transit *transit)
+ {
+ if (m_accBCAnimIndex == 0) {
+ Elm_Transit *tr1 = elm_transit_add();
+ elm_transit_effect_color_add(tr1, CU_COL_AO0113, CU_COL_AO0113D);
+ elm_transit_object_add(tr1, *m_accBezelCueImg[m_accBCAnimIndex]);
+ elm_transit_duration_set(tr1,
+ impl::BC_ANIMATION_DURATION[impl::BC_ITEM_COUNT - 1]);
+ elm_transit_objects_final_state_keep_set(tr1, EINA_TRUE);
+ elm_transit_del_cb_set(tr1,
+ CALLBACK_A(AcceptRejectWidget::onAcceptBCTransitDelLast),
+ this);
+ elm_transit_go(tr1);
+
+ m_lastAccBezelTr1 = tr1;
+ m_lastAccBezelTr2 = nullptr;
+ return;
+ }
+
+ int oldIndex = m_accBCAnimIndex;
+ m_accBCAnimIndex--;
+
+ Elm_Transit *tr1 = elm_transit_add();
+ elm_transit_effect_color_add(tr1, CU_COL_AO0113, CU_COL_AO0113D);
+ elm_transit_object_add(tr1, *m_accBezelCueImg[oldIndex]);
+ elm_transit_duration_set(tr1,
+ impl::BC_ANIMATION_DURATION[m_accBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr1, EINA_TRUE);
+ elm_transit_go(tr1);
+
+ Elm_Transit *tr2 = elm_transit_add();
+ elm_transit_effect_color_add(tr2, CU_COL_AO0113D, CU_COL_AO0113);
+ elm_transit_object_add(tr2, *m_accBezelCueImg[m_accBCAnimIndex]);
+ elm_transit_duration_set(tr2,
+ impl::BC_ANIMATION_DURATION[m_accBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr2, EINA_TRUE);
+ elm_transit_del_cb_set(tr2,
+ CALLBACK_A(AcceptRejectWidget::onAcceptBCTransitDel),
+ this);
+ elm_transit_go(tr2);
+
+ m_lastAccBezelTr1 = tr1;
+ m_lastAccBezelTr2 = tr2;
+ }
+
+ void AcceptRejectWidget::onAcceptBCTransitDelLast(Elm_Transit *transit)
+ {
+ m_accBCAnimCount++;
+
+ if (m_accBCAnimCount >= impl::BC_ANIMATE_COUNT_MAX) {
+ ILOG("Max count accept bezel animation reached. Hide all image");
+ m_accBCAnimCount = 0;
+
+ Elm_Transit *hideTransit = elm_transit_add();
+ elm_transit_effect_color_add(hideTransit,
+ CU_COL_AO0113D, CU_COL_AO0113T);
+ for (int i = 0; i < impl::BC_ITEM_COUNT; i++) {
+ m_accBezelCueImg[i]->setColor(CU_COL_AO0113D);
+ elm_transit_object_add(hideTransit, *m_accBezelCueImg[i]);
+ }
+ elm_transit_duration_set(hideTransit, impl::BC_ANIM_DUR_HIDE);
+ elm_transit_objects_final_state_keep_set(hideTransit, EINA_TRUE);
+ elm_transit_del_cb_set(hideTransit,
+ [](void *data, Elm_Transit *transit) -> void
+ {
+ auto self = static_cast<AcceptRejectWidget *>(data);
+ self->m_lastAccBezelTr1 = nullptr;
+ self->m_lastAccBezelTr2 = nullptr;
+ }, this);
+ elm_transit_go(hideTransit);
+
+ m_lastAccBezelTr1 = hideTransit;
+ m_lastAccBezelTr2 = nullptr;
+ return;
+ }
+
+ m_accBCAnimIndex = impl::BC_ITEM_COUNT - 1;
+ Elm_Transit *tr1 = elm_transit_add();
+ elm_transit_effect_color_add(tr1, CU_COL_AO0113D, CU_COL_AO0113);
+ elm_transit_object_add(tr1, *m_accBezelCueImg[m_accBCAnimIndex]);
+ elm_transit_duration_set(tr1,
+ impl::BC_ANIMATION_DURATION[m_accBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr1, EINA_TRUE);
+ elm_transit_del_cb_set(tr1,
+ CALLBACK_A(AcceptRejectWidget::onAcceptBCTransitDel),
+ this);
+ elm_transit_go(tr1);
+
+ m_lastAccBezelTr1 = tr1;
+ m_lastAccBezelTr2 = nullptr;
+ }
+
+ void AcceptRejectWidget::onRejectBCTransitDel(Elm_Transit *transit)
+ {
+ if (m_rejBCAnimIndex == 0) {
+ Elm_Transit *tr1 = elm_transit_add();
+ elm_transit_effect_color_add(tr1, CU_COL_AO0115, CU_COL_AO0115D);
+ elm_transit_object_add(tr1, *m_rejBezelCueImg[m_rejBCAnimIndex]);
+ elm_transit_duration_set(tr1,
+ impl::BC_ANIMATION_DURATION[impl::BC_ITEM_COUNT - 1]);
+ elm_transit_objects_final_state_keep_set(tr1, EINA_TRUE);
+ elm_transit_del_cb_set(tr1,
+ CALLBACK_A(AcceptRejectWidget::onRejectBCTransitDelLast),
+ this);
+ elm_transit_go(tr1);
+ m_lastRejBezelTr1 = tr1;
+ m_lastRejBezelTr2 = nullptr;
+ return;
+ }
+
+ int oldIndex = m_rejBCAnimIndex;
+ m_rejBCAnimIndex--;
+
+ Elm_Transit *tr1 = elm_transit_add();
+ elm_transit_effect_color_add(tr1, CU_COL_AO0115, CU_COL_AO0115D);
+ elm_transit_object_add(tr1, *m_rejBezelCueImg[oldIndex]);
+ elm_transit_duration_set(tr1,
+ impl::BC_ANIMATION_DURATION[m_rejBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr1, EINA_TRUE);
+ elm_transit_go(tr1);
+
+ Elm_Transit *tr2 = elm_transit_add();
+ elm_transit_effect_color_add(tr2, CU_COL_AO0115D, CU_COL_AO0115);
+ elm_transit_object_add(tr2, *m_rejBezelCueImg[m_rejBCAnimIndex]);
+ elm_transit_duration_set(tr2,
+ impl::BC_ANIMATION_DURATION[m_rejBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr2, EINA_TRUE);
+ elm_transit_del_cb_set(tr2,
+ CALLBACK_A(AcceptRejectWidget::onRejectBCTransitDel),
+ this);
+ elm_transit_go(tr2);
+
+ m_lastRejBezelTr1 = tr1;
+ m_lastRejBezelTr2 = tr2;
+ }
+
+ void AcceptRejectWidget::onRejectBCTransitDelLast(Elm_Transit *transit)
+ {
+ m_rejBCAnimCount++;
+
+ if (m_rejBCAnimCount >= impl::BC_ANIMATE_COUNT_MAX) {
+ ILOG("Max count accept bezel animation reached. Hide all image");
+ m_rejBCAnimCount = 0;
+
+ Elm_Transit *hideTransit = elm_transit_add();
+ elm_transit_effect_color_add(hideTransit,
+ CU_COL_AO0115D, CU_COL_AO0115T);
+ for (int i = 0; i < impl::BC_ITEM_COUNT; i++) {
+ m_rejBezelCueImg[i]->setColor(CU_COL_AO0115D);
+ elm_transit_object_add(hideTransit, *m_rejBezelCueImg[i]);
+ }
+ elm_transit_duration_set(hideTransit, impl::BC_ANIM_DUR_HIDE);
+ elm_transit_objects_final_state_keep_set(hideTransit, EINA_TRUE);
+ elm_transit_del_cb_set(hideTransit,
+ [](void *data, Elm_Transit *transit) -> void
+ {
+ auto self = static_cast<AcceptRejectWidget *>(data);
+ self->m_lastRejBezelTr1 = nullptr;
+ self->m_lastRejBezelTr2 = nullptr;
+ }, this);
+ elm_transit_go(hideTransit);
+
+ m_lastRejBezelTr1 = hideTransit;
+ m_lastRejBezelTr2 = nullptr;
+ return;
+ }
+
+ m_rejBCAnimIndex = impl::BC_ITEM_COUNT - 1;
+ Elm_Transit *tr1 = elm_transit_add();
+ elm_transit_effect_color_add(tr1, CU_COL_AO0115D, CU_COL_AO0115);
+ elm_transit_object_add(tr1, *m_rejBezelCueImg[m_rejBCAnimIndex]);
+ elm_transit_duration_set(tr1,
+ impl::BC_ANIMATION_DURATION[m_rejBCAnimIndex]);
+ elm_transit_objects_final_state_keep_set(tr1, EINA_TRUE);
+ elm_transit_del_cb_set(tr1,
+ CALLBACK_A(AcceptRejectWidget::onRejectBCTransitDel),
+ this);
+ elm_transit_go(tr1);
+
+ m_lastRejBezelTr1 = tr1;
+ m_lastRejBezelTr2 = nullptr;
+ }
+
+ void AcceptRejectWidget::onAcceptExpandTimeout(Timeout *sender)
+ {
+ if (m_rotaryClockwiseCount > 0) {
+ m_rotaryClockwiseCount = 0;
+ m_isContracting = true;
+ setAcceptUnpressedState();
+ } else {
+ DLOG("Counter is 0. Ignored");
+ }
+ m_expandTimeout.reset();
+ }
+
+ void AcceptRejectWidget::onRejectExpandTimeout(Timeout *sender)
+ {
+ if (m_rotaryCounterClockwiseCount > 0) {
+ m_rotaryCounterClockwiseCount = 0;
+ m_isContracting = true;
+ setRejectUnpressedState();
+ } else {
+ DLOG("Counter is 0. Ignored");
+ }
+ m_expandTimeout.reset();
+ }
+
+ Eina_Bool AcceptRejectWidget::processClockwiseRotaryEvent()
+ {
+ if (m_rotaryCounterClockwiseCount > 0) {
+ m_rotaryCounterClockwiseCount = 0;
+ setRejectUnpressedState();
+ return EINA_TRUE;
+ }
+
+ m_rotaryClockwiseCount++;
+
+ if (m_rotaryClockwiseCount == 1) {
+ setAcceptPressedState();
+ m_expandTimeout = Timeout::create(impl::EXPAND_WAITING_TIMEOUT,
+ WEAK_DELEGATE(AcceptRejectWidget::onAcceptExpandTimeout,
+ asWeak(*this)));
+ } else if (m_rotaryClockwiseCount == 2) {
+ m_expandTimeout.reset();
+ impl::resizeImage(*m_accTracer, impl::FINGER_TRACER_DIM);
+ setAcceptFullExpensionTransition();
+ return EINA_TRUE;
+ } else {
+ LOG_RETURN_VALUE(RES_FAIL, EINA_TRUE, "Illegal state");
+ }
+ return EINA_TRUE;
+ }
+
+ Eina_Bool AcceptRejectWidget::processCounterClockwiseRotaryEvent()
+ {
+ if (m_rotaryClockwiseCount > 0) {
+ m_rotaryClockwiseCount = 0;
+ setAcceptUnpressedState();
+ return EINA_TRUE;
+ }
+
+ m_rotaryCounterClockwiseCount ++;
+
+ if (m_rotaryCounterClockwiseCount == 1) {
+ setRejectPressedState();
+ m_expandTimeout = Timeout::create(impl::EXPAND_WAITING_TIMEOUT,
+ WEAK_DELEGATE(AcceptRejectWidget::onRejectExpandTimeout,
+ asWeak(*this)));
+
+ } else if (m_rotaryCounterClockwiseCount == 2) {
+ m_expandTimeout.reset();
+ impl::resizeImage(*m_rejTracer, impl::FINGER_TRACER_DIM);
+ setRejectFullExpensionTransition();
+ return EINA_TRUE;
+ } else {
+ LOG_RETURN_VALUE(RES_FAIL, EINA_TRUE, "Illegal state");
+ }
+ return EINA_TRUE;
+ }
+
+ Eina_Bool AcceptRejectWidget::onRotaryEvent(Evas_Object *obj,
+ Eext_Rotary_Event_Info *info)
+ {
+ if (m_isFreezed) {
+ DLOG("Freezed");
+ return EINA_TRUE;
+ }
+
+ if (m_isAccPressed || m_isRejPressed) {
+ LOG_RETURN_VALUE(RES_FAIL, EINA_TRUE,
+ "Button accept/reject button already pressed");
+ }
+
+ m_expandTimeout.reset();
+
+ if (m_isContracting) {
+ DLOG("Contracting. Ignore");
+ return EINA_TRUE;
+ }
+
+ if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) {
+ DLOG("Rotary event [CLOCKWISE]");
+ return processClockwiseRotaryEvent();
+ } else {
+ DLOG("Rotary event [COUNTER_CLOCKWISE]");
+ return processCounterClockwiseRotaryEvent();
+ }
+ }
+
+ void AcceptRejectWidget::activateRotary()
+ {
+ eext_rotary_object_event_activated_set(*m_layout, EINA_TRUE);
+ }
+ void AcceptRejectWidget::deactivateRotary()
+ {
+ eext_rotary_object_event_activated_set(*m_layout, EINA_FALSE);
+ }
+
+ void AcceptRejectWidget::reset()
+ {
+ m_isFreezed = false;
+
+ DEL_TRANSIT(m_accTracerTr);
+ DEL_TRANSIT(m_accGuideTr);
+ DEL_TRANSIT(m_accIconTr);
+
+ DEL_TRANSIT(m_rejTracerTr);
+ DEL_TRANSIT(m_rejGuideTr);
+ DEL_TRANSIT(m_rejIconTr);
+
+ m_lastMoveDistance = impl::INIT_MOVE_DISTANCE_VAL;
+
+ setAcceptUnpressedState();
+ setRejectUnpressedState();
+
+ m_rotaryClockwiseCount = 0;
+ m_rotaryCounterClockwiseCount = 0;
+ }
+
+ void AcceptRejectWidget::setAcceptPressedState()
+ {
+ impl::resizeImage(*m_accTracer, impl::FINGER_TRACER_HALF_DIM);
+ m_accTracer->setColor(CU_COL_AO01131);
+
+ impl::resizeImage(*m_accGuide, impl::FINGER_TRACER_DIM);
+ m_accGuide->setColor(CU_COL_AO01132);
+
+ setAcceptPressedTransitions();
+ }
+
+ void AcceptRejectWidget::setRejectPressedState()
+ {
+ impl::resizeImage(*m_rejTracer, impl::FINGER_TRACER_HALF_DIM);
+ m_rejTracer->setColor(CU_COL_AO01151);
+
+ impl::resizeImage(*m_rejGuide, impl::FINGER_TRACER_DIM);
+ m_rejGuide->setColor(CU_COL_AO01152);
+
+ setRejectPressedTransitions();
+ }
+
+ void AcceptRejectWidget::setAcceptUnpressedState()
+ {
+ impl::resizeImage(*m_accTracer, impl::FINGER_TRACER_HALF_DIM);
+ m_accTracer->setColor(CU_COL_TRANSPARENT);
+
+ m_accIcon->setColor(CU_COL_AO0113);
+
+ impl::resizeImage(*m_accGuide, impl::FINGER_TRACER_DIM);
+
+ setAcceptUnpressedTransitions();
+ }
+
+ void AcceptRejectWidget::setRejectUnpressedState()
+ {
+ impl::resizeImage(*m_rejTracer, impl::FINGER_TRACER_HALF_DIM);
+ m_rejTracer->setColor(CU_COL_TRANSPARENT);
+
+ m_rejIcon->setColor(CU_COL_AO0115);
+
+ impl::resizeImage(*m_rejGuide, impl::FINGER_TRACER_DIM);
+
+ setRejectUnpressedTransitions();
+ }
+}