TizenRefApp-8859 [Call UI] Reimplement incoming call controls 57/139057/1
authorIgor Olshevskyi <i.olshevskyi@samsung.com>
Fri, 14 Jul 2017 09:52:48 +0000 (12:52 +0300)
committerIgor Olshevskyi <i.olshevskyi@samsung.com>
Mon, 17 Jul 2017 05:58:22 +0000 (08:58 +0300)
Change-Id: I447c95b35df52a98159d77df8fa83163d650762c

edc/accept_reject.edc
edc/images.edc [new file with mode: 0644]
inc/presenters/AcceptRejectPresenter.h
inc/presenters/types.h
inc/view/AcceptRejectWidget.h [new file with mode: 0644]
inc/view/types.h
res/edje/theme.edc
src/presenters/AcceptRejectPresenter.cpp
src/presenters/RejectMsgPresenter.cpp
src/view/AcceptRejectWidget.cpp [new file with mode: 0644]
src/view/common.h

index 179e04222de9629522f28abbaf9455ed8a8c8e60..6938525da323ea34aeed31d238399f72b327b055 100644 (file)
  * 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
+}
diff --git a/edc/images.edc b/edc/images.edc
new file mode 100644 (file)
index 0000000..b68be9c
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+#define CU_RES_IMAGE(_style, _file_name) \
+       group { "elm/layout/callui_image/"_style; \
+               images.image: _file_name COMP; \
+               parts { \
+                       image { "image"; \
+                               scale; \
+                               desc { "default"; \
+                                       image.normal: _file_name; \
+                                       aspect: 1 1; \
+                                       aspect_preference: BOTH; \
+                               } \
+                       } \
+               } \
+       }
+
+CU_RES_IMAGE("bezel_cue_accept_1", "Incoming/w_alert_interaction_cue_l_01.png")
+CU_RES_IMAGE("bezel_cue_accept_2", "Incoming/w_alert_interaction_cue_l_02.png")
+CU_RES_IMAGE("bezel_cue_accept_3", "Incoming/w_alert_interaction_cue_l_03.png")
+CU_RES_IMAGE("bezel_cue_accept_4", "Incoming/w_alert_interaction_cue_l_04.png")
+
+CU_RES_IMAGE("bezel_cue_reject_1", "Incoming/w_alert_interaction_cue_r_01.png")
+CU_RES_IMAGE("bezel_cue_reject_2", "Incoming/w_alert_interaction_cue_r_02.png")
+CU_RES_IMAGE("bezel_cue_reject_3", "Incoming/w_alert_interaction_cue_r_03.png")
+CU_RES_IMAGE("bezel_cue_reject_4", "Incoming/w_alert_interaction_cue_r_04.png")
+
+CU_RES_IMAGE("accept_reject_action_bg", "call_button_bg_accept_reject_press.png")
+CU_RES_IMAGE("accept", "w_call_incoming_icon_accept.png")
+CU_RES_IMAGE("reject", "w_call_incoming_icon_reject.png")
index cd449977610d87ba22512f4f0d1dc210892b149e..fb96cd471006644d32dbc8081fa1ed533e111458 100644 (file)
@@ -60,32 +60,27 @@ namespace callui {
                                ucl::ElmWidget &parentWidget);
 
                ucl::Result createWidget(ucl::ElmWidget &parent);
-               ucl::Result createAcceptBtn();
-               ucl::Result createRejectBtn();
                ucl::Result createMotionSensorPresenter();
 
-               ucl::StyledWidgetSRef createBtn(const ucl::ElmStyle &style,
-                               const ucl::EdjePart &part);
                void showPopup();
 
                void processAccept();
                void processReject() const;
 
-               void onBtnPressed(ucl::Widget &widget, void *eventInfo);
-               void onBtnUnpressed(ucl::Widget &widget, void *eventInfo);
-               void onBtnClicked(ucl::Widget &widget, void *eventInfo);
-
-               Eina_Bool onRotaryEvent(Eext_Rotary_Event_Info *info);
                void onMotionEvent();
 
                bool onAcceptPopupEvent(AcceptDialog &popup, AcceptDialogEvent event);
+               void onAcceptEvent();
+               void onRejectEvent();
+
+               // GuiPresenter
+               virtual void onActivate() final override;
+               virtual void onDeactivate() final override;
 
        private:
-               ucl::LayoutSRef m_widget;
+               AcceptRejectWidgetSRef m_widget;
                AcceptDialogWRef m_popup;
                MotionSensorPresenterSRef m_motionPrs;
-               ucl::StyledWidgetSRef m_accept;
-               ucl::StyledWidgetSRef m_reject;
 
                IIncomingCallSRef m_call;
                CallMask m_callMask;
index 7139437458d548824c967d5b31242815061e0847..516fc8748ebad692b1062ecfd851a8c3c3e79b1c 100644 (file)
@@ -77,8 +77,6 @@ namespace callui {
        UCL_DECLARE_REF_ALIASES(DeviceStatePresenter);
        UCL_DECLARE_REF_ALIASES(MotionSensorPresenter);
 
-       UCL_DECLARE_REF_ALIASES(AlertBaseViewController);
-
        using AcceptDialogHandler = ucl::WeakDelegate<bool(AcceptDialog &, AcceptDialogEvent)>;
        using RejectMsgStateHandler = ucl::WeakDelegate<void(RejectMsgState)>;
        using RejectMsgSelectHandler = ucl::WeakDelegate<void(const IRejectMsgSRef &rm)>;
diff --git a/inc/view/AcceptRejectWidget.h b/inc/view/AcceptRejectWidget.h
new file mode 100644 (file)
index 0000000..c064de7
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * 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.
+ */
+
+#ifndef __CALLUI_VIEW_ACCEPT_REJECT_WIDGET_H__
+#define __CALLUI_VIEW_ACCEPT_REJECT_WIDGET_H__
+
+#include "ucl/gui/ElmWidget.h"
+
+#include "ucl/gui/Layout.h"
+#include "ucl/gui/StyledWidget.h"
+#include "ucl/misc/Timeout.h"
+
+#include "types.h"
+
+namespace callui {
+
+       class AcceptRejectWidget final : public ucl::ElmWidget {
+       public:
+               class Builder {
+               public:
+                       Builder();
+                       Builder &setAcceptEventHandler(const NotiHandler &handler);
+                       Builder &setRejectEventHandler(const NotiHandler &handler);
+                       AcceptRejectWidgetSRef build(ucl::ElmWidget &parent) const;
+
+               private:
+                       NotiHandler m_acceptHandler;
+                       NotiHandler m_rejectHandler;
+               };
+
+       public:
+               ~AcceptRejectWidget();
+
+               void startBezelCueAnimation();
+               void reset();
+               void activateRotary();
+               void deactivateRotary();
+
+       private:
+               friend class ucl::ReffedObj<AcceptRejectWidget>;
+               AcceptRejectWidget(ucl::IRefCountObj &rc,
+                               const ucl::LayoutSRef &layout,
+                               const NotiHandler &acceptHandler,
+                               const NotiHandler &rejectHandler);
+
+               void prepare();
+
+               ucl::Result createAcceptComponents();
+               ucl::Result createRejectComponents();
+               ucl::Result createBezelCueComponents();
+
+               void setBezelCueVisible(bool isVisible);
+
+               void onMouseDown(ucl::Widget &widget, void *eventInfo);
+               void onMouseUp(ucl::Widget &widget, void *eventInfo);
+               void onMouseMove(ucl::Widget &widget, void *eventInfo);
+
+               int getTracerMoveDistance(
+                               const ElmWidget &widget, int curX, int curY) const;
+
+               void onAcceptBCTransitDel(Elm_Transit *transit);
+               void onAcceptBCTransitDelLast(Elm_Transit *transit);
+
+               void onRejectBCTransitDel(Elm_Transit *transit);
+               void onRejectBCTransitDelLast(Elm_Transit *transit);
+
+               void setAcceptPressedTransitions();
+               void setAcceptTracerPressedTransition();
+               void setAcceptGuidePressedTransition();
+               void setAcceptGuideUnpressedTransition();
+               void setAcceptIconPressedTransition();
+               void setRejectIconHideTransition();
+               void setRejectIconShowTransition();
+               void setAcceptFullExpensionTransition();
+               void setAcceptUnpressedTransitions();
+
+               void setRejectPressedTransitions();
+               void setRejectTracerPressedTransition();
+               void setRejectGuidePressedTransition();
+               void setRejectGuideUnpressedTransition();
+               void setRejectIconPressedTransition();
+               void setAcceptIconHideTransition();
+               void setAcceptIconShowTransition();
+               void setRejectFullExpensionTransition();
+               void setRejectUnpressedTransitions();
+
+               void onAcceptTransitDel(Elm_Transit *transit);
+               void onAcceptFullExpensionTransitDel(Elm_Transit *transit);
+               void onAcceptBgExpandTransitDel(Elm_Transit *transit);
+               void onAcceptBgContractTransitDel(Elm_Transit *transit);
+               void onAcceptIconTransitDel(Elm_Transit *transit);
+
+               void onRejectTransitDel(Elm_Transit *transit);
+               void onRejectFullExpensionTransitDel(Elm_Transit *transit);
+               void onRejectBgExpandTransitDel(Elm_Transit *transit);
+               void onRejectBgContractTransitDel(Elm_Transit *transit);
+               void onRejectIconTransitDel(Elm_Transit *transit);
+
+               void onAcceptExpandTimeout(ucl::Timeout *sender);
+               void onRejectExpandTimeout(ucl::Timeout *sender);
+
+               Eina_Bool onRotaryEvent(Evas_Object *obj, Eext_Rotary_Event_Info *info);
+               Eina_Bool processClockwiseRotaryEvent();
+               Eina_Bool processCounterClockwiseRotaryEvent();
+
+               void setAcceptPressedState();
+               void setRejectPressedState();
+               void setAcceptUnpressedState();
+               void setRejectUnpressedState();
+
+       private:
+               ucl::Layout *m_layout;
+               NotiHandler m_accHandler;
+               NotiHandler m_rejHandler;
+
+               std::vector<ucl::ElmWidgetSRef> m_accBezelCueImg;
+               std::vector<ucl::ElmWidgetSRef> m_rejBezelCueImg;
+
+               ucl::ElmWidgetSRef m_accTracer;
+               ucl::ElmWidgetSRef m_accGuide;
+               ucl::ElmWidgetSRef m_accIcon;
+               ucl::LayoutSRef m_accEventLy;
+
+               ucl::ElmWidgetSRef m_rejTracer;
+               ucl::ElmWidgetSRef m_rejGuide;
+               ucl::ElmWidgetSRef m_rejIcon;
+               ucl::LayoutSRef m_rejEventLy;
+
+               bool m_isFreezed;
+               bool m_isAccPressed;
+               bool m_isRejPressed;
+               int m_lastMoveDistance;
+               int m_rotaryClockwiseCount;
+               int m_rotaryCounterClockwiseCount;
+               bool m_isContracting;
+
+               Elm_Transit *m_accTracerTr;
+               Elm_Transit *m_accGuideTr;
+               Elm_Transit *m_accIconTr;
+
+               Elm_Transit *m_rejTracerTr;
+               Elm_Transit *m_rejGuideTr;
+               Elm_Transit *m_rejIconTr;
+
+               Elm_Transit *m_lastAccBezelTr1;
+               Elm_Transit *m_lastAccBezelTr2;
+               Elm_Transit *m_lastRejBezelTr1;
+               Elm_Transit *m_lastRejBezelTr2;
+
+               int m_accBCAnimCount;
+               int m_rejBCAnimCount;
+
+               ucl::TimeoutSRef m_expandTimeout;
+
+               int m_accBCAnimIndex;
+               int m_rejBCAnimIndex;
+       };
+
+}
+
+#endif // __CALLUI_VIEW_ACCEPT_REJECT_WIDGET_H__
index eace9d04ec643477941de6059c3a235ad4b9d5fc..75ee69fd83c3ea93bcf9b43136889beb93346eaf 100644 (file)
@@ -32,9 +32,9 @@ namespace callui {
 
        UCL_DECLARE_REF_ALIASES(Slider);
        UCL_DECLARE_REF_ALIASES(VolumeControl);
+       UCL_DECLARE_REF_ALIASES(AcceptRejectWidget);
 
        using VolumeControlEventHandler = ucl::WeakDelegate<void(VolumeControlEvent)>;
-
 }
 
 #endif // __CALLUI_VIEW_TYPES_H__
index 9fbddf06b56f6dfe0508de598bce84b41d121ab9..5fe63717c70c491c7b50f196606786dbe0f68d82 100644 (file)
@@ -37,6 +37,7 @@ collections {
 
        #include "../../edc/color_classes.edc"
        #include "../../edc/buttons.edc"
+       #include "../../edc/images.edc"
 
        #include "../../edc/main_ly.edc"
        #include "../../edc/accept_reject.edc"
index 90bb88f81cfa79240f1cfce2b5e2e37396453454..efe38880c067f0ddfdd6a54cf4d5f95cef8474a8 100644 (file)
 #include "presenters/AcceptDialog.h"
 #include "presenters/MotionSensorPresenter.h"
 
+#include "view/AcceptRejectWidget.h"
+
 #include "../view/common.h"
 #include "common.h"
 
-namespace callui { namespace { namespace impl {
-
-       using namespace ucl;
-
-       constexpr LayoutTheme LAYOUT_ACCEPT_REJECT_WIDGET
-                       {"layout", "callui", "accept_reject"};
-
-       constexpr EdjeSignal SIGNAL_ACCEEPT_SHOW {"accept,show"};
-       constexpr EdjeSignal SIGNAL_ACCEEPT_HIDE {"accept,hide"};
-       constexpr EdjeSignal SIGNAL_REJECT_SHOW {"reject,show"};
-       constexpr EdjeSignal SIGNAL_REJECT_HIDE {"reject,hide"};
-
-       constexpr EdjeSignal SIGNAL_ARROWS_SHOW {"arrows,show"};
-       constexpr EdjeSignal SIGNAL_RESET {"reset"};
-
-       constexpr EdjePart PART_SWL_BTN_ACCEPT {"swl.button_accept"};
-       constexpr EdjePart PART_SWL_BTN_REJECT {"swl.button_reject"};
-
-       constexpr EdjeSignal SIGNAL_BTN_PRESS {"press"};
-       constexpr EdjeSignal SIGNAL_BTN_UNPRESS {"unpress"};
-
-       constexpr ElmStyle STYLE_BTN_ACCEPT {"callui/accept"};
-       constexpr ElmStyle STYLE_BTN_REJECT {"callui/reject"};
-
-       constexpr SmartEvent EVENT_PRESSED {"pressed"};
-       constexpr SmartEvent EVENT_UNPRESSED {"unpressed"};
-
-}}}
-
 namespace callui {
 
        using namespace ucl;
@@ -119,8 +92,9 @@ namespace callui {
                        popup->dispose();
                }
 
-               delRotaryEventHandler(
-                               CALLBACK_A(AcceptRejectPresenter::onRotaryEvent), this);
+               if (m_widget) {
+                       m_widget->deactivateRotary();
+               }
        }
 
        Result AcceptRejectPresenter::prepare(GuiPresenter &parent,
@@ -132,20 +106,11 @@ namespace callui {
                FAIL_RETURN(createWidget(parentWidget),
                                "createWidget() failed!");
 
-               FAIL_RETURN(createAcceptBtn(),
-                               "createAcceptBtn() failed!");
-
-               FAIL_RETURN(createRejectBtn(),
-                               "createRejectBtn() failed!");
-
                // Motion sensor not supported on Emulator
                if (createMotionSensorPresenter() != RES_OK) {
                        ELOG("createMotionSensorPresenter() failed!");
                }
 
-               addRotaryEventHandler(CALLBACK_A(
-                               AcceptRejectPresenter::onRotaryEvent), this);
-
                return RES_OK;
        }
 
@@ -159,8 +124,7 @@ namespace callui {
                if (m_callMask != calls) {
                        m_callMask = calls;
                        if (const auto popup = m_popup.lock()) {
-                               m_accept->emit(impl::SIGNAL_RESET);
-                               m_widget->emit(impl::SIGNAL_RESET);
+                               m_widget->reset();
                                popup->dismiss();
                        }
                }
@@ -168,35 +132,19 @@ namespace callui {
 
        Result AcceptRejectPresenter::createWidget(ElmWidget &parent)
        {
-               m_widget = Layout::Builder().
-                               setTheme(impl::LAYOUT_ACCEPT_REJECT_WIDGET).
-                               setIsOwner(true).
+               m_widget = AcceptRejectWidget::Builder().
+                               setAcceptEventHandler(WEAK_DELEGATE(
+                                               AcceptRejectPresenter::onAcceptEvent,
+                                               asWeak(*this))).
+                               setRejectEventHandler(WEAK_DELEGATE(
+                                               AcceptRejectPresenter::onRejectEvent,
+                                               asWeak(*this))).
                                build(parent);
                if (!m_widget) {
                        LOG_RETURN(RES_FAIL, "Layout::build() failed!");
                }
 
-               return RES_OK;
-       }
-
-       Result AcceptRejectPresenter::createAcceptBtn()
-       {
-               m_accept = createBtn(impl::STYLE_BTN_ACCEPT,
-                               impl::PART_SWL_BTN_ACCEPT);
-               if (!m_accept) {
-                       LOG_RETURN(RES_FAIL, "createBtn() failed!");
-               }
-
-               return RES_OK;
-       }
-
-       Result AcceptRejectPresenter::createRejectBtn()
-       {
-               m_reject = createBtn(impl::STYLE_BTN_REJECT,
-                               impl::PART_SWL_BTN_REJECT);
-               if (!m_reject) {
-                       LOG_RETURN(RES_FAIL, "createBtn() failed!");
-               }
+               m_widget->activateRotary();
 
                return RES_OK;
        }
@@ -217,34 +165,7 @@ namespace callui {
 
        void AcceptRejectPresenter::onMotionEvent()
        {
-               m_widget->emit(impl::SIGNAL_ARROWS_SHOW);
-       }
-
-       void AcceptRejectPresenter::onBtnPressed(Widget &widget, void *eventInfo)
-       {
-               if (widget == (*m_accept)) {
-                       m_widget->emit(impl::SIGNAL_REJECT_HIDE);
-               } else if (widget == (*m_reject)) {
-                       m_widget->emit(impl::SIGNAL_ACCEEPT_HIDE);
-               }
-       }
-
-       void AcceptRejectPresenter::onBtnUnpressed(Widget &widget, void *eventInfo)
-       {
-               if (widget == (*m_accept)) {
-                       m_widget->emit(impl::SIGNAL_REJECT_SHOW);
-               } else if (widget == (*m_reject)) {
-                       m_widget->emit(impl::SIGNAL_ACCEEPT_SHOW);
-               }
-       }
-
-       void AcceptRejectPresenter::onBtnClicked(Widget &widget, void *eventInfo)
-       {
-               if (widget == (*m_accept)) {
-                       processAccept();
-               } else if (widget == (*m_reject)) {
-                       processReject();
-               }
+               m_widget->startBezelCueAnimation();
        }
 
        void AcceptRejectPresenter::processAccept()
@@ -265,54 +186,9 @@ namespace callui {
                m_call->reject();
        }
 
-       Eina_Bool AcceptRejectPresenter::onRotaryEvent(Eext_Rotary_Event_Info *info)
-       {
-               if (!isActive()) {
-                       LOG_RETURN_VALUE(RES_OK, EINA_TRUE, "Presenter is not active. Ignore");
-               }
-
-               if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) {
-                       m_reject->emit(impl::SIGNAL_BTN_UNPRESS);
-                       m_accept->emit(impl::SIGNAL_BTN_PRESS);
-               } else {
-                       m_reject->emit(impl::SIGNAL_BTN_PRESS);
-                       m_accept->emit(impl::SIGNAL_BTN_UNPRESS);
-               }
-               return EINA_TRUE;
-       }
-
-       StyledWidgetSRef AcceptRejectPresenter::createBtn(const ElmStyle &style,
-                       const EdjePart &part)
-       {
-               Evas_Object *const btnEo = elm_button_add(*m_widget);
-               if (!btnEo) {
-                       LOG_RETURN_VALUE(RES_FAIL, {}, "elm_button_add() failed!");
-               }
-               StyledWidgetSRef btn = makeShared<StyledWidget>(btnEo);
-               btn->setStyle(style);
-
-               btn->addEventHandler(impl::EVENT_PRESSED,
-                               WEAK_DELEGATE(AcceptRejectPresenter::onBtnPressed,
-                                               asWeak(*this)));
-
-               btn->addEventHandler(impl::EVENT_UNPRESSED,
-                               WEAK_DELEGATE(AcceptRejectPresenter::onBtnUnpressed,
-                                               asWeak(*this)));
-
-               btn->addEventHandler(BTN_CLICKED,
-                               WEAK_DELEGATE(AcceptRejectPresenter::onBtnClicked,
-                                               asWeak(*this)));
-
-               m_widget->setContent(*btn, part);
-               show(*btn);
-
-               return btn;
-       }
-
        bool AcceptRejectPresenter::onAcceptPopupEvent(AcceptDialog &popup, AcceptDialogEvent event)
        {
-               m_accept->emit(impl::SIGNAL_RESET);
-               m_widget->emit(impl::SIGNAL_RESET);
+               m_widget->reset();
 
                switch (event) {
                case AcceptDialogEvent::HOLD_AND_ACCEPT:
@@ -343,4 +219,26 @@ namespace callui {
                }
        }
 
+       void AcceptRejectPresenter::onAcceptEvent()
+       {
+               processAccept();
+       }
+
+       void AcceptRejectPresenter::onRejectEvent()
+       {
+               processReject();
+       }
+
+       void AcceptRejectPresenter::onActivate()
+       {
+               DLOG();
+               m_widget->activateRotary();
+       }
+
+       void AcceptRejectPresenter::onDeactivate()
+       {
+               DLOG();
+               m_widget->deactivateRotary();
+       }
+
 }
index ee3cd8bd53f5028a282c7fffe852afd0423f6537..77743218dd15f02ceec3eca717b72fda7c3668ca 100644 (file)
@@ -447,7 +447,9 @@ namespace callui {
 
        void RejectMsgPresenter::hidePanel()
        {
+               DLOG();
                if (m_state == RejectMsgState::SHOWN) {
+                       DLOG("Panel state [SHOWN]");
                        elm_object_scroll_freeze_pop(m_panel->getEo());
                        elm_panel_hidden_set(m_panel->getEo(), EINA_TRUE);
                }
@@ -467,22 +469,28 @@ namespace callui {
 
        void RejectMsgPresenter::onActivate()
        {
+               DLOG();
                activateRotary();
        }
 
        void RejectMsgPresenter::onDeactivate()
        {
+               DLOG();
                deactivateRotary();
        }
 
        void RejectMsgPresenter::activateRotary()
        {
-               eext_rotary_object_event_activated_set(m_circleEo, EINA_TRUE);
+               if (m_circleEo) {
+                       eext_rotary_object_event_activated_set(m_circleEo, EINA_TRUE);
+               }
        }
 
        void RejectMsgPresenter::deactivateRotary()
        {
-               eext_rotary_object_event_activated_set(m_circleEo, EINA_FALSE);
+               if (m_circleEo) {
+                       eext_rotary_object_event_activated_set(m_circleEo, EINA_FALSE);
+               }
        }
 
 }
diff --git a/src/view/AcceptRejectWidget.cpp b/src/view/AcceptRejectWidget.cpp
new file mode 100644 (file)
index 0000000..4a53750
--- /dev/null
@@ -0,0 +1,1361 @@
+/*
+ * 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();
+       }
+}
index 68cc4c430530b49ff0aa8f5f5160c8a19d483b76..85e3887c7dd5412324be7aa31538035bdf7b3c8a 100644 (file)
 
 #include "../common.h"
 
+#define DEL_TRANSIT(ptr) \
+       do { \
+               if (ptr) { \
+                       elm_transit_del(ptr); \
+                       ptr = nullptr; \
+               } \
+       } while (0)
+
+#define DEL_TRANSIT_FULL(ptr) \
+       do { \
+               if (ptr) { \
+                       elm_transit_del_cb_set(ptr, nullptr, nullptr); \
+                       elm_transit_del(ptr); \
+                       ptr = nullptr; \
+               } \
+       } while (0)
+
 namespace callui {
 
        constexpr ucl::SmartEvent BTN_CLICKED {"clicked"};