TizenRefApp-8529 [Call UI] Implement end call feature 65/131165/2
authorIgor Olshevskyi <i.olshevskyi@samsung.com>
Mon, 22 May 2017 10:02:25 +0000 (13:02 +0300)
committerIgor Olshevskyi <i.olshevskyi@samsung.com>
Tue, 30 May 2017 11:47:00 +0000 (14:47 +0300)
Change-Id: I622be4ff62f053d0b6806f842b0a47b7db0caacc

22 files changed:
.cproject
edc/buttons.edc
edc/call_info.edc
edc/color_classes.edc
edc/images/tw_bottom_btn_bg.png [new file with mode: 0644]
edc/main_ly.edc
inc/model/types.h
inc/presenters/CallInfoPresenter.h
inc/presenters/CallStatus.h
inc/presenters/MainPage.h
inc/presenters/types.h
src/model/ActiveCall.cpp
src/model/CallInfo.cpp
src/model/CallManager.cpp
src/model/CallManager.h
src/model/EndCall.cpp
src/model/EndCall.h
src/presenters/CallInfoPresenter.cpp
src/presenters/CallStatus.cpp
src/presenters/MainPage.cpp
src/presenters/RejectMsgPresenter.cpp
tizen-manifest.xml

index eb6f60d9ba3be9c04951ede465797d3e40c93295..8c8c08345522280fd90cdad451a4007356f19fda 100644 (file)
--- a/.cproject
+++ b/.cproject
                                                        </tool>
                                                </toolChain>
                                        </folderInfo>
-                                       <fileInfo id="org.tizen.nativecore.config.sbi.gcc45.app.debug.746875570.28367371" name="SlidingLabel.cpp" rcbsApplicability="disable" resourcePath="src/view/SlidingLabel.cpp" toolsToInvoke="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.66050065.777132781">
-                                               <tool id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.66050065.777132781" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.66050065"/>
-                                       </fileInfo>
-                                       <fileInfo id="org.tizen.nativecore.config.sbi.gcc45.app.debug.746875570.972811223" name="SlidingLabel.h" rcbsApplicability="disable" resourcePath="inc/view/SlidingLabel.h" toolsToInvoke=""/>
                                        <sourceEntries>
                                                <entry excluding="view/SlidingLabel.h" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
                                                <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
index 776ae02eea4d4a152e5d816d53746f88d8c0d82b..2b1b968feaedd8ce42e710d7dfb47b86a4c2790f 100644 (file)
  * limitations under the License.
  */
 
-#define CU_BTN_ANIM_TIME       0.15
-#define CU_BTN_UNPRESS_DELAY   0.6
+#define CU_BTN_INCOM_CALL_ANIM_TIME         0.15
+#define CU_BTN_INCOM_CALL_UNPRESS_DELAY     0.6
+#define CU_BTN_INCOM_CALL_ICON_SIZE         54 54
+#define CU_BTN_INCOM_CALL_EFF_START_SIZE    100 100
+#define CU_BTN_INCOM_CALL_EFF_END_DIMENTION 130
+#define CU_BTN_INCOM_CALL_EFF_END_SIZE      CU_BTN_INCOM_CALL_EFF_END_DIMENTION CU_BTN_INCOM_CALL_EFF_END_DIMENTION
 
-#define CU_BTN_ICON_WH         54
-#define CU_BTN_EFFECT_START_WH 100
-#define CU_BTN_EFFECT_END_WH   130
+#define CU_BTN_BOTTOM_ICON_TOP_PADDING_INC  14
+#define CU_BTN_BOTTOM_SIZE_INC              360 78
+#define CU_BTN_BOTTOM_ICON_SIZE_INC         50 50
 
-#define INCOMING_CALL_BTN(_name, _icon, _bg_cc, _effect_cc, _icon_norm_cc, _icon_pressed_cc) \
+#define CU_BTN_INCOM_CALL(_name, _icon, _bg_cc, _effect_cc, _icon_norm_cc, _icon_pressed_cc) \
 group { "elm/button/base/"_name; \
        script { \
                public is_pressed; \
@@ -37,7 +41,7 @@ group { "elm/button/base/"_name; \
                                emit("elm,action,press", ""); \
                        } \
                        if (auto_unpress) { \
-                               set_int(unpress_timer, timer(CU_BTN_UNPRESS_DELAY, "unpress", 0)); \
+                               set_int(unpress_timer, timer(CU_BTN_INCOM_CALL_UNPRESS_DELAY, "unpress", 0)); \
                        } \
                } \
                public unpress() \
@@ -53,7 +57,7 @@ group { "elm/button/base/"_name; \
                        if (get_int(is_pressed) == 1 && get_int(is_expanded) == 0) { \
                                set_int(is_expanded, 1); \
                                run_program(PROGRAM:"expanded"); \
-                               timer(CU_BTN_ANIM_TIME + 0.1, "click", 0); \
+                               timer(CU_BTN_INCOM_CALL_ANIM_TIME + 0.1, "click", 0); \
                        } \
                } \
                public click() \
@@ -79,11 +83,11 @@ group { "elm/button/base/"_name; \
                        } \
                        desc { "pressed_effect"; \
                                inherit: "default"; \
-                               min: CU_BTN_EFFECT_START_WH CU_BTN_EFFECT_START_WH; \
+                               min: CU_BTN_INCOM_CALL_EFF_START_SIZE; \
                        } \
                        desc { "pressed"; \
                                inherit: "pressed_effect"; \
-                               min: CU_BTN_EFFECT_END_WH CU_BTN_EFFECT_END_WH; \
+                               min: CU_BTN_INCOM_CALL_EFF_END_SIZE; \
                        } \
                        desc { "expanded"; \
                                inherit: "pressed"; \
@@ -110,7 +114,7 @@ group { "elm/button/base/"_name; \
                        clip: "rect.icon_bg"; \
                        desc { "default"; \
                                fixed: 1 1; \
-                               min: CU_BTN_ICON_WH CU_BTN_ICON_WH; \
+                               min: CU_BTN_INCOM_CALL_ICON_SIZE; \
                                rel1.relative: 0.5 0.5; \
                                rel2.relative: 0.5 0.5; \
                                image.normal: _icon; \
@@ -127,7 +131,7 @@ group { "elm/button/base/"_name; \
                rect { "rect.event"; \
                        desc { "default"; \
                                fixed: 1 1; \
-                               min: CU_BTN_EFFECT_START_WH CU_BTN_EFFECT_START_WH; \
+                               min: CU_BTN_INCOM_CALL_EFF_START_SIZE; \
                                rel1.relative: 0.5 0.5; \
                                rel2.relative: 0.5 0.5; \
                                color: 0 0 0 0; \
@@ -185,7 +189,7 @@ group { "elm/button/base/"_name; \
                                targets: "image.effect" "image.border"; \
                                action: STATE_SET "pressed"; \
                                targets: "image.effect" "image.border" "rect.icon_bg"; \
-                               transition: TRANSITION_GLIDE(CU_BTN_ANIM_TIME); \
+                               transition: TRANSITION_GLIDE(CU_BTN_INCOM_CALL_ANIM_TIME); \
                        } \
                } \
                program { \
@@ -195,7 +199,7 @@ group { "elm/button/base/"_name; \
                                targets: "image.border" "rect.icon_bg"; \
                                action: STATE_SET "pressed_effect"; \
                                target: "image.effect"; \
-                               transition: TRANSITION_GLIDE(CU_BTN_ANIM_TIME); \
+                               transition: TRANSITION_GLIDE(CU_BTN_INCOM_CALL_ANIM_TIME); \
                                action: STATE_SET "default"; \
                                target: "image.effect"; \
                        } \
@@ -215,7 +219,7 @@ group { "elm/button/base/"_name; \
                        name: "expanded"; \
                        action: STATE_SET "expanded"; \
                        target: "image.border"; \
-                       transition: TRANSITION_GLIDE(CU_BTN_ANIM_TIME); \
+                       transition: TRANSITION_GLIDE(CU_BTN_INCOM_CALL_ANIM_TIME); \
                } \
                program { \
                        signal: "mouse,move"; \
@@ -234,7 +238,7 @@ group { "elm/button/base/"_name; \
                                get_geometry(PART:"image.effect", x, y, w, h); \
                                if (d >= w) { \
                                        expand(); \
-                               } else if (d <= CU_BTN_EFFECT_END_WH) { \
+                               } else if (d <= CU_BTN_INCOM_CALL_EFF_END_DIMENTION) { \
                                        set_state(PART:"image.border", "pressed", 0.0); \
                                } else { \
                                        new Float:rel = ((w - d) / w) / 2; \
@@ -248,5 +252,254 @@ group { "elm/button/base/"_name; \
        } \
 }
 
-INCOMING_CALL_BTN("callui/accept", "w_call_incoming_icon_accept.png", "AO01131", "AO01132", "AO0113", "AO0113P")
-INCOMING_CALL_BTN("callui/reject", "w_call_incoming_icon_reject.png", "AO01151", "AO01152", "AO0115", "AO0115P")
+#define CU_BTN_BOTTOM(_name, _icon, _normal_cc, _pressed_cc, _overlay_normal_cc, _overlay_pressed_cc) \
+       group { "elm/button/base/"_name; \
+               images { \
+                       image: "tw_bottom_btn_bg.png" COMP; \
+                       image: _icon COMP; \
+               } \
+               parts { \
+                       spacer { "base"; \
+                               scale; \
+                               desc { "default"; \
+                                       min: CU_BTN_BOTTOM_SIZE_INC; \
+                               } \
+                       } \
+                       image { "elm.content.bg"; \
+                               scale; \
+                               nomouse; \
+                               repeat; \
+                               desc { "default"; \
+                                       image.normal: "tw_bottom_btn_bg.png"; \
+                                       color_class: _normal_cc; \
+                                       rel.to: "base"; \
+                               } \
+                               desc { "pressed"; \
+                                       inherit: "default"; \
+                                       color_class: _pressed_cc; \
+                               } \
+                               desc { "disabled"; \
+                                       inherit: "default"; \
+                                       color_class: DISABLED_BTN; \
+                               } \
+                       } \
+                       image { "elm.content.bg.overlay"; \
+                               scale; \
+                               nomouse; \
+                               desc { "default"; \
+                                       image.normal: "tw_bottom_btn_bg.png"; \
+                                       rel.to: "elm.content.bg"; \
+                                       color_class: _overlay_normal_cc; \
+                               } \
+                               desc { "pressed"; \
+                                       inherit: "default"; \
+                                       color_class: _overlay_pressed_cc; \
+                               } \
+                       } \
+                       spacer { "icon_padding_top"; \
+                               scale; \
+                               desc { "default"; \
+                                       fixed: 0 1; \
+                                       min: 0 CU_BTN_BOTTOM_ICON_TOP_PADDING_INC; \
+                                       max: -1 CU_BTN_BOTTOM_ICON_TOP_PADDING_INC; \
+                                       rel1.to: "elm.content.bg"; \
+                                       rel2.to: "elm.content.bg"; \
+                                       rel2.relative: 1.0 0.0; \
+                                       align: 0.5 0.0; \
+                               } \
+                       } \
+                       image { "icon"; \
+                               clip: "icon.clipper"; \
+                               scale; \
+                               desc { "default"; \
+                                       align: 0.5 0.0; \
+                                       rel1 { \
+                                               relative: 0.0 1.0; \
+                                               to: "icon_padding_top"; \
+                                       } \
+                                       rel2 { \
+                                               relative: 1.0 1.0; \
+                                               to: "icon_padding_top"; \
+                                       } \
+                                       min: CU_BTN_BOTTOM_ICON_SIZE_INC; \
+                                       max: CU_BTN_BOTTOM_ICON_SIZE_INC; \
+                                       fixed: 1 1; \
+                                       image.normal: _icon; \
+                               } \
+                       } \
+                       rect { "icon.clipper"; \
+                               scale; \
+                               desc { "default"; \
+                                       rel.to: "icon"; \
+                                       color: 250 250 250 255; \
+                               } \
+                               desc { "pressed"; \
+                                       inherit: "default"; \
+                                       color: 250 250 250 255; \
+                               } \
+                               desc { "disabled"; \
+                                       inherit: "default"; \
+                                       color: 250 250 250 89; \
+                               } \
+                       } \
+                       image { "event"; \
+                               scale; \
+                               precise; \
+                               desc { "default"; \
+                                       image.normal: "tw_bottom_btn_bg.png"; \
+                                       color: 0 0 0 0; \
+                                       rel.to: "elm.content.bg"; \
+                               } \
+                       } \
+               } \
+               programs { \
+                       script { \
+                               public mouse_down = 0; \
+                               public multi_down = 0; \
+                               public disabled = 0; \
+                       } \
+                       program { "pressed"; \
+                               signal: "mouse,down,1*"; \
+                               source: "event"; \
+                               action: SIGNAL_EMIT "elm,action,press" ""; \
+                               after: "on_pressed"; \
+                       } \
+                       program { "unpressed"; \
+                               signal: "mouse,up,1*"; \
+                               source: "event"; \
+                               action: SIGNAL_EMIT "elm,action,unpress" ""; \
+                               after: "on_unpressed"; \
+                       } \
+                       program { "clicked"; \
+                               signal: "mouse,clicked,1"; \
+                               source: "event"; \
+                               action: SIGNAL_EMIT "elm,action,click" ""; \
+                               after: "on_clicked"; \
+                       } \
+                       program { "enabled"; \
+                               signal: "elm,state,enabled"; \
+                               source: "elm"; \
+                               action: STATE_SET "default"; \
+                               target: "event"; \
+                               after: "on_enabled"; \
+                       } \
+                       program { "disabled"; \
+                               signal: "elm,state,disabled"; \
+                               source: "elm"; \
+                               action: STATE_SET "disabled"; \
+                               target: "event"; \
+                               after: "on_disabled"; \
+                       } \
+                       program { "enable_event_pass"; \
+                               signal: "elm,event,pass,enabled"; \
+                               source: "elm"; \
+                               script { \
+                                       set_mouse_events(PART:"event", 0); \
+                               } \
+                       } \
+                       program { "disable_event_pass"; \
+                               signal: "elm,event,pass,disabled"; \
+                               source:"elm"; \
+                                       script { \
+                                               set_mouse_events(PART:"event", 1); \
+                               } \
+                       } \
+                       program { "enable_event_repeat"; \
+                               signal: "elm,event,repeat,enabled"; \
+                               source: "elm"; \
+                               script { \
+                                       set_repeat_events(PART:"event", 1); \
+                               } \
+                       } \
+                       program { "disable_event_repeat"; \
+                               signal: "elm,event,repeat,disabled"; \
+                               source:"elm"; \
+                               script { \
+                                       set_repeat_events(PART:"event", 0); \
+                               } \
+                       } \
+                       program { "on_pressed"; \
+                               script { \
+                                       if ((get_int(multi_down) == 0) && (get_int(mouse_down) == 0)) { \
+                                               set_int(mouse_down, 1); \
+                                               if (!get_int(disabled)) { \
+                                                       run_program(PROGRAM:"cancel_effect"); \
+                                                       set_state(PART:"elm.content.bg", "pressed", 0.0); \
+                                                       set_state(PART:"elm.content.bg.overlay", "pressed", 0.0); \
+                                                       set_state(PART:"icon.clipper", "pressed", 0.0); \
+                                               } \
+                                       } \
+                               } \
+                       } \
+                       program { "cancel_effect"; \
+                               action: ACTION_STOP; \
+                               target: "unpressed_effect"; \
+                       } \
+                       program { "on_unpressed"; \
+                               script { \
+                                       if (get_int(mouse_down) == 1) { \
+                                               set_int(mouse_down, 0); \
+                                               if (!get_int(disabled)) { \
+                                                       run_program(PROGRAM:"unpressed_effect"); \
+                                               } \
+                                       } \
+                               } \
+                       } \
+                       program { "unpressed_effect"; \
+                               in: 0.1 0.0; \
+                               action: STATE_SET "default"; \
+                               transition: LINEAR 0.2; \
+                               target: "elm.content.bg"; \
+                               target: "elm.content.bg.overlay"; \
+                               target: "icon.clipper"; \
+                       } \
+                       program { "on_clicked"; \
+                               script { \
+                                       if (get_int(multi_down) == 0) { \
+                                               if (!get_int(disabled)) { \
+                                                       run_program(PROGRAM:"play_sample"); \
+                                               } \
+                                       } \
+                               } \
+                       } \
+                       program { "play_sample"; \
+                               action: RUN_PLUGIN "touch_sound"; \
+                       } \
+                       program { "on_disabled"; \
+                               script { \
+                                       set_int(disabled, 1); \
+                                       run_program(PROGRAM:"cancel_effect"); \
+                                       set_state(PART:"elm.content.bg", "disabled", 0.0); \
+                                       set_state(PART:"elm.content.bg.overlay", "default", 0.0); \
+                                       set_state(PART:"icon.clipper", "disabled", 0.0); \
+                               } \
+                       } \
+                       program { "on_enabled"; \
+                               script { \
+                                       set_int(disabled, 0); \
+                                       set_state(PART:"elm.content.bg", "default", 0.0); \
+                                       set_state(PART:"icon.clipper", "default", 0.0); \
+                               } \
+                       } \
+                       program { "multi_down"; \
+                               signal: "elm,action,multi,down"; \
+                               source: "elm"; \
+                               script { \
+                                       set_int(multi_down, 1); \
+                               } \
+                       } \
+                       program { "multi_up"; \
+                               signal: "elm,action,multi,up"; \
+                               source: "elm"; \
+                               script { \
+                                       set_int(multi_down, 0); \
+                               } \
+                       } \
+               } \
+       }
+
+CU_BTN_INCOM_CALL("callui/accept", "w_call_incoming_icon_accept.png", "AO01131", "AO01132", "AO0113", "AO0113P")
+CU_BTN_INCOM_CALL("callui/reject", "w_call_incoming_icon_reject.png", "AO01151", "AO01152", "AO0115", "AO0115P")
+
+CU_BTN_BOTTOM("callui/end_call", "w_incoming_icon_end_phone.png", "AO0121", "AO0121P", "B013A", "B013")
+CU_BTN_BOTTOM("callui/call_back", "w_incoming_icon_call.png", "AO0171", "AO0171P", "B013A", "B013")
index 5bcef54708db47793562169501b5299e65c39f53..7330124a11d98e7ab60e19f3336e8791eba21af7 100644 (file)
@@ -161,7 +161,7 @@ group { "elm/layout/callui/call_info";
                                inherit: "default";
                                min: 0 95;
                        }
-                       desc { "2line_1text";
+                       desc { "1line_2text";
                                inherit: "default";
                                min: 0 99;
                        }
@@ -265,8 +265,8 @@ group { "elm/layout/callui/call_info";
                        }
                        desc { "1line";
                                inherit: "default";
-                               min: 208 52;
-                               max: 208 52;
+                               min: 208 53;
+                               max: 208 53;
                        }
                        desc { "incom_2line";
                                inherit: "default";
@@ -588,7 +588,7 @@ group { "elm/layout/callui/call_info";
                        signal: "1line_2text";
                        source: "top_padding";
                        script {
-                               set_state(PART:"top.pad", "default", 0.0);
+                               set_state(PART:"top.pad", "1line_2text", 0.0);
                                set_state(PART:"zone.text_1line", "1line", 0.0);
                                set_state(PART:"text_1line", "default", 0.0);
                        }
index eb27b0535a5fddd9b9f570582d6f8c713b572dfa..3f4f1b7411faffeb944dcb74df9914a8bd83984f 100644 (file)
@@ -75,4 +75,27 @@ color_classes {
        color_class { name: "AO029";
                color: 255 255 255 204;
        }
+
+       // Bottom button
+       color_class { name: "DISABLED_BTN";
+               color: 97 97 97 230;
+       }
+       color_class { name: "AO0121";
+               color: 222 11 0 179;
+       }
+       color_class { name: "AO0121P";
+               color: 222 11 0 77;
+       }
+       color_class { name: "AO0171";
+               color: 76 186 39 179;
+       }
+       color_class { name: "AO0171P";
+               color: 76 186 39 77;
+       }
+       color_class { name: "B013A";
+               color: 0 146 204 0;
+       }
+       color_class { name: "B013";
+               color: 0 146 204 77;
+       }
 }
diff --git a/edc/images/tw_bottom_btn_bg.png b/edc/images/tw_bottom_btn_bg.png
new file mode 100644 (file)
index 0000000..55522be
Binary files /dev/null and b/edc/images/tw_bottom_btn_bg.png differ
index d39eeae83b2d2d2801c346114f657b570f75b8e6..04c6c230db1881228f0274ae1763d258ebff6293 100644 (file)
@@ -36,6 +36,15 @@ group { "elm/layout/callui/main";
                        desc { "default";
                        }
                }
+               swallow { "swl.bottom_btn";
+                       scale;
+                       desc { "default";
+                               rel1.relative: 0.0 1.0;
+                               rel2.relative: 1.0 1.0;
+                               align: 0.5 1.0;
+                               fixed: 0 1;
+                       }
+               }
                swallow { "swl.overlay";
                        scale;
                        desc { "default";
index d4f9f694ac35239c4d93c8487b8c423ce985e5c7..3d4b92cdf211973ff7a473b891047befb1fbab1f 100644 (file)
@@ -54,6 +54,7 @@ namespace callui {
        };
 
        enum {
+               CALL_FLAG_NONE     = 0,
                CALL_FLAG_INCOMING = 1,
                CALL_FLAG_ACTIVE   = 2,
                CALL_FLAG_HELD     = 4,
index 1d69705410401ace8294535c9c8be02e9cf34858..53b6a60f1b3981914c2c9c007e4e0da042d76b0d 100644 (file)
@@ -33,25 +33,25 @@ namespace callui {
                        Builder();
                        virtual ~Builder();
                        Builder &setCallManager(const ICallManagerSRef &cm);
-                       Builder &setMode(CallInfoMode mode);
+                       Builder &setMode(CallMode mode);
                        CallInfoPresenterSRef build(ucl::ElmWidget &parent) const;
                private:
                        ICallManagerSRef m_cm;
-                       CallInfoMode m_mode;
+                       CallMode m_mode;
                };
 
        public:
                virtual ~CallInfoPresenter();
 
                ucl::Widget &getWidget();
-               CallInfoMode getMode() const;
-               ucl::Result update(CallInfoMode mode, const ICallManagerSRef &cm);
+               CallMode getMode() const;
+               ucl::Result update(CallMode mode, const ICallManagerSRef &cm);
 
        private:
                friend class ucl::RefCountObj<CallInfoPresenter>;
                CallInfoPresenter(ucl::RefCountObjBase &rc,
                                const ICallManagerSRef &cm,
-                               CallInfoMode mode);
+                               CallMode mode);
 
                ucl::Result prepare(ucl::ElmWidget &parent);
 
@@ -81,7 +81,7 @@ namespace callui {
                ucl::LayoutSRef m_widget;
                ucl::StyledWidgetSRef m_callerId;
                ucl::StyledWidgetSRef m_label;
-               CallInfoMode m_mode;
+               CallMode m_mode;
                ICallInfoSCRef m_incomCallInfo;
                ICallInfoSCRef m_activeCallInfo;
                ICallInfoSCRef m_heldCallInfo;
index 62bdad424c9d019e02cd3f512e49ff1452f83fe9..bd008815fcc4052140cad534883a3612f5228f23 100644 (file)
@@ -33,14 +33,14 @@ namespace callui {
                public:
                        Builder();
                        virtual ~Builder();
-                       Builder &setMode(CallInfoMode mode);
+                       Builder &setMode(CallMode mode);
                        Builder &setCallInfo(const ICallInfoWCRef &info);
                        Builder &setCallHoldState(bool isOnHold);
                        Builder &setLayout(const ucl::LayoutSRef &layout);
                        CallStatusSRef build() const;
                private:
                        ucl::LayoutSRef m_ly;
-                       CallInfoMode m_mode;
+                       CallMode m_mode;
                        ICallInfoWCRef m_info;
                        bool m_isOnHold;
                };
@@ -51,7 +51,7 @@ namespace callui {
                friend class ucl::RefCountObj<CallStatus>;
                CallStatus(ucl::RefCountObjBase &rc,
                                const ucl::LayoutSRef &layout,
-                               CallInfoMode mode,
+                               CallMode mode,
                                const ICallInfoWCRef &info,
                                bool isOnHold);
 
@@ -67,7 +67,7 @@ namespace callui {
 
        private:
                ucl::LayoutSRef m_ly;
-               CallInfoMode m_mode;
+               CallMode m_mode;
                ICallInfoWCRef m_info;
                bool m_isOnHold;
                Ecore_Timer *m_timer;
index 43055a3fca67b5ca11abc2037783d04d744427a0..3b29211412402121edcaa28629f031dfb380ce81 100644 (file)
@@ -21,7 +21,7 @@
 #include "model/ICallListener.h"
 
 #include "ucl/gui/Layout.h"
-
+#include "ucl/gui/StyledWidget.h"
 #include "types.h"
 
 namespace callui {
@@ -50,15 +50,24 @@ namespace callui {
 
                ucl::Result prepare();
 
-               ucl::Result processIncomingCall(const IIncomingCallSRef &incom);
+               ucl::Result showWindow();
+               void updateCallMode();
 
+               ucl::Result processIncomingCall();
                ucl::Result createAcceptRejectPresenter();
-               ucl::Result createRejectMsgPresenter(const IIncomingCallSRef &incom);
-               ucl::Result createCallInfoPresenter(CallInfoMode mode);
-
+               ucl::Result createRejectMsgPresenter(const IRejectMsgProviderSRef &provider);
                void RejectMsgStateCb(RejectMsgState state);
                void RejectMsgSelectCb(const IRejectMsgSRef &rm);
 
+               ucl::Result createCallInfoPresenter(CallMode mode);
+
+               ucl::Result createBottomBtn(const ucl::ElmStyle &style);
+               void onBottomBtnClicked(ucl::Widget &widget, void *eventInfo);
+
+               void startEndCallTimer();
+               void stopEndCallTimer();
+               Eina_Bool onEndCallTimerCb();
+
                // Presenter
 
                virtual void onActivateBy(const DeactivatorInfo &info) final override;
@@ -76,11 +85,16 @@ namespace callui {
        private:
                ucl::LayoutSRef m_widget;
                ucl::LayoutSRef m_rmLy;
+               ucl::StyledWidgetSRef m_bottomBtn;
                ICallSRef m_call;
+               ICallManagerSRef m_cm;
                IndicatorSRef m_indicator;
                CallInfoPresenterSRef m_callInfoPrs;
                AcceptRejectPresenterSRef m_acceptRejectPrs;
                RejectMsgPresenterSRef m_rmPrs;
+               CallMode m_mode;
+               Ecore_Timer *m_ecTimer;
+               bool m_ecTimerBtnReq;
        };
 }
 
index 052dfbf72182adec29a079393f490ba0d9025990..182b515d722febab35cbc5cbc87a8c49a0715ada 100644 (file)
@@ -30,7 +30,7 @@ namespace callui {
                BACK
        };
 
-       enum class CallInfoMode {
+       enum class CallMode {
                UNDEFINED,
                INCOMING,
                OUTGOING,
index b9e0397add64a29a0fb1925b79bc4b92f84c041b..f945ed856e84499ccfc936dd112d3d43525e9b37 100644 (file)
@@ -92,6 +92,11 @@ namespace callui {
                if (!m_cm) {
                        LOG_RETURN(RES_FAIL, "Call Manager is NULL");
                }
+
+               if (m_isDialing) {
+                       return m_cm->endCall(m_callInfo->getCallId(),
+                                       CallReleaseType::BY_CALL_HANDLE);
+               }
                return m_cm->endCall(0, CallReleaseType::ALL_ACTIVE);
        }
 
index c31d68be6b7b75198ef596b12c79b1bdae390d8e..7341675b4d4823cd9439134c390a15e4aba8444b 100644 (file)
@@ -35,6 +35,8 @@ namespace callui { namespace { namespace impl {
        {
                if (time == 0) {
                        ILOG("Call start time does not set");
+                       tmTime = {0};
+                       return RES_OK;
                }
 
                long currTime = 0;
index 0df997e7fa5462134e624fdb32ce74286fba20b8..e036d89168128ac941ec79980762d6e0e21f1c28 100644 (file)
@@ -41,7 +41,9 @@ namespace callui {
                        m_callClient(callClient),
                        m_listener(listener),
                        m_slot(SimSlot::UNDEFINED),
-                       m_waitDialing(false)
+                       m_waitDialing(false),
+                       m_confTypeCallReq(CALL_FLAG_NONE),
+                       m_blockCMEvents(false)
        {
        }
 
@@ -141,7 +143,7 @@ namespace callui {
 
        CallMask CallManager::getAvailableCalls() const
        {
-               int res = 0;
+               int res = CALL_FLAG_NONE;
 
                if (m_incomingCall)
                        res |= CALL_FLAG_INCOMING;
@@ -169,6 +171,24 @@ namespace callui {
 
        Result CallManager::endCall(unsigned int callId, CallReleaseType type)
        {
+               ICallInfoSCRef info;
+               int flag = CALL_FLAG_NONE;
+               if (type == CallReleaseType::ALL_ACTIVE
+                               && !m_incomingCall
+                               && !m_heldCall) {
+                       info = m_activeCall->getInfo();
+                       flag = CALL_FLAG_ACTIVE;
+               } else if (type == CallReleaseType::ALL_HOLD
+                               && !m_incomingCall
+                               && !m_activeCall) {
+                       info = m_heldCall->getInfo();
+                       flag = CALL_FLAG_HELD;
+               }
+
+               if (info && info->getConferenceMemberCount() > 1) {
+                       m_confTypeCallReq = flag;
+               }
+
                return convertCMResult(
                                cm_end_call(*m_callClient, callId, convertCUICallReleaseType(type)));
        }
@@ -200,56 +220,51 @@ namespace callui {
                return m_rejectMsgProvider;
        }
 
-       Result CallManager::processEndCallEvent(cm_call_event_data_h callEventData)
+       Result CallManager::processEndCallEvent(unsigned int callId,
+                       cm_call_data_h cmIncom,
+                       cm_call_data_h cmActive,
+                       cm_call_data_h cmHeld)
        {
-               unsigned int callId = 0;
-               FAIL_RETURN(convertCMResult(
-                               cm_call_event_data_get_call_id(callEventData, &callId)),
-                               "cm_call_event_data_get_call_id() failed!");
-
-               Result res = RES_OK;
-               if (m_incomingCall && callId == m_incomingCall->getInfo()->getCallId()) {
-                       res = updateCall(m_endCall, m_incomingCall->getInfo());
-                       m_incomingCall.reset();
-               } else if (m_activeCall && callId == m_activeCall->getInfo()->getCallId()) {
-                       res = updateCall(m_endCall, m_activeCall->getInfo());
-                       m_activeCall.reset();
-               } else if (m_heldCall && callId == m_heldCall->getInfo()->getCallId()) {
-                       res = updateCall(m_endCall, m_heldCall->getInfo());
-                       m_heldCall.reset();
-               } else if (m_activeCall && m_activeCall->getInfo()->getConferenceMemberCount() > 1) {
-                       res = updateCall(m_endCall, m_activeCall->getInfo());
-                       m_activeCall.reset();
-               } else if (m_heldCall && m_heldCall->getInfo()->getConferenceMemberCount() > 1) {
-                       res = updateCall(m_endCall, m_heldCall->getInfo());
-                       m_heldCall.reset();
+               if (m_activeCall &&
+                               callId == m_activeCall->getInfo()->getCallId() &&
+                               !cmIncom && !cmActive && !cmHeld) {
+                       return updateCall(m_endCall, m_activeCall->getInfo());
+               } else if (m_heldCall &&
+                               callId == m_heldCall->getInfo()->getCallId() &&
+                               !cmIncom && !cmActive && !cmHeld) {
+                       return updateCall(m_endCall, m_heldCall->getInfo());
+               } else if (m_activeCall &&
+                               m_confTypeCallReq == CALL_FLAG_ACTIVE) {
+
+                       m_confTypeCallReq = CALL_FLAG_NONE;
+                       m_blockCMEvents = true;
+
+                       return updateCall(m_endCall, m_activeCall->getInfo());
+               } else if (m_heldCall &&
+                               m_confTypeCallReq == CALL_FLAG_HELD) {
+
+                       m_confTypeCallReq = CALL_FLAG_NONE;
+                       m_blockCMEvents = true;
+
+                       return updateCall(m_endCall, m_heldCall->getInfo());
                }
-
-               return res;
+               return RES_OK;
        }
 
-       Result CallManager::processCommonCallEvent(cm_call_event_data_h callEventData, CallEventType type)
+       Result CallManager::processCommonCallEvent(unsigned int callId,
+                       cm_call_data_h cmIncom,
+                       cm_call_data_h cmActive,
+                       cm_call_data_h cmHeld)
        {
-               unsigned int callId = 0;
-               cm_call_data_h cmIncom = nullptr;
-               cm_call_data_h cmActive = nullptr;
-               cm_call_data_h cmHeld = nullptr;
+               if (m_blockCMEvents) {
+                       ILOG("Ignore call manager state");
 
-               FAIL_RETURN(convertCMResult(
-                               cm_call_event_data_get_call_id(callEventData, &callId)),
-                               "cm_call_event_data_get_call_id() failed!");
-
-               FAIL_RETURN(convertCMResult(
-                               cm_call_event_data_get_incom_call(callEventData, &cmIncom)),
-                               "cm_call_event_data_get_incom_call() failed!");
-
-               FAIL_RETURN(convertCMResult(
-                               cm_call_event_data_get_active_call(callEventData, &cmActive)),
-                               "cm_call_event_data_get_active_call() failed!");
+                       m_incomingCall.reset();
+                       m_activeCall.reset();
+                       m_heldCall.reset();
 
-               FAIL_RETURN(convertCMResult(
-                               cm_call_event_data_get_held_call(callEventData, &cmHeld)),
-                               "cm_call_event_data_get_held_call() failed!");
+                       return RES_OK;
+               }
 
                FAIL_RETURN(updateCall(m_incomingCall, cmIncom), "updateCall() failed!");
                FAIL_RETURN(updateCall(m_activeCall, cmActive), "updateCall() failed!");
@@ -273,6 +288,15 @@ namespace callui {
 
                DLOG("Call event changed on [%d]", type);
 
+               if (m_blockCMEvents) {
+                       if (type == CallEventType::END) {
+                               ILOG("Ignore call manager state");
+                               return;
+                       } else {
+                               m_blockCMEvents = false;
+                       }
+               }
+
                if (m_slot == SimSlot::UNDEFINED) {
                        cm_multi_sim_slot_type_e cmSimSlot;
                        FAIL_RETURN_VOID(convertCMResult(
@@ -281,11 +305,35 @@ namespace callui {
                        m_slot = convertCMSimSlot(cmSimSlot);
                }
 
+               unsigned int callId = 0;
+               cm_call_data_h cmIncom = nullptr;
+               cm_call_data_h cmActive = nullptr;
+               cm_call_data_h cmHeld = nullptr;
+
+               FAIL_RETURN_VOID(convertCMResult(
+                               cm_call_event_data_get_call_id(callEventData, &callId)),
+                               "cm_call_event_data_get_call_id() failed!");
+
+               FAIL_RETURN_VOID(convertCMResult(
+                               cm_call_event_data_get_incom_call(callEventData, &cmIncom)),
+                               "cm_call_event_data_get_incom_call() failed!");
+
+               FAIL_RETURN_VOID(convertCMResult(
+                               cm_call_event_data_get_active_call(callEventData, &cmActive)),
+                               "cm_call_event_data_get_active_call() failed!");
+
+               FAIL_RETURN_VOID(convertCMResult(
+                               cm_call_event_data_get_held_call(callEventData, &cmHeld)),
+                               "cm_call_event_data_get_held_call() failed!");
+
                m_endCall.reset();
 
                switch (type) {
                case CallEventType::END:
-                       FAIL_RETURN_VOID(processEndCallEvent(callEventData),
+                       FAIL_RETURN_VOID(processEndCallEvent(callId,
+                                       cmIncom,
+                                       cmActive,
+                                       cmHeld),
                                        "processEndCallEvent() failed!");
                case CallEventType::ACTIVE:
                case CallEventType::INCOMING:
@@ -295,7 +343,10 @@ namespace callui {
                case CallEventType::SWAPPED:
                case CallEventType::JOIN:
                case CallEventType::SPLIT:
-                       FAIL_RETURN_VOID(processCommonCallEvent(callEventData, type),
+                       FAIL_RETURN_VOID(processCommonCallEvent(callId,
+                                       cmIncom,
+                                       cmActive,
+                                       cmHeld),
                                        "processCommonCallEvent() failed!");
                        break;
                default:
index 583c05c54b508c52b5ac40edfbe69542344f2d69..0dde5c67b0f494f158dcc3be5d86679414ccc734 100644 (file)
@@ -63,9 +63,16 @@ namespace callui {
                template <class TYPE, class TYPE2>
                ucl::Result updateCall(ucl::SharedRef<TYPE> &call, TYPE2 &&data);
 
-               ucl::Result processEndCallEvent(cm_call_event_data_h callEventData);
-               ucl::Result processCommonCallEvent(cm_call_event_data_h callEventData,
-                               CallEventType type);
+               ucl::Result processEndCallEvent(unsigned int callId,
+                               cm_call_data_h cmIncom,
+                               cm_call_data_h cmActive,
+                               cm_call_data_h cmHeld);
+
+               ucl::Result processCommonCallEvent(unsigned int callId,
+                               cm_call_data_h cmIncom,
+                               cm_call_data_h cmActive,
+                               cm_call_data_h cmHeld);
+
                void callEventCb(cm_call_event_e call_event, cm_call_event_data_h call_state_data);
                void dialStatusCb(cm_dial_status_e status);
 
@@ -80,6 +87,9 @@ namespace callui {
                EndCallSRef m_endCall;
                SimSlot m_slot;
                bool m_waitDialing;
+
+               int m_confTypeCallReq;
+               bool m_blockCMEvents;
        };
 
 }
index b4ca64f4c525c22f01e558e12ccb589f489cf5d3..2a9c92fd625d2899dc7d2f12c575678c0ff03962 100644 (file)
@@ -28,7 +28,8 @@ namespace callui {
 
        EndCall::EndCall(CallManagerWRef cm, ICallInfoSCRef callInfo):
                        m_cm(cm),
-                       m_callInfo(callInfo)
+                       m_callInfo(callInfo),
+                       m_callbackInProgress(false)
        {
        }
 
@@ -55,10 +56,19 @@ namespace callui {
 
        Result EndCall::callBack()
        {
+               if (m_callbackInProgress) {
+                       LOG_RETURN(RES_OK, "Callback already in progress");
+               }
+
                if (!m_cm) {
                        LOG_RETURN(RES_FAIL, "Call Manager is NULL");
                }
-               return m_cm->dialVoiceCall(m_callInfo->getPhoneNumber());
+
+               auto res = m_cm->dialVoiceCall(m_callInfo->getPhoneNumber());
+               if (res == RES_OK) {
+                       m_callbackInProgress = true;
+               }
+               return res;
        }
 
        Result EndCall::writeMessage()
index a89ac5df05836c8bced78a248122c95e7ceaaaff..8a3095752c75b4ba932769a39d097b09d8b0e9cf 100644 (file)
@@ -48,6 +48,7 @@ namespace callui {
        private:
                CallManagerWRef m_cm;
                ICallInfoSCRef m_callInfo;
+               bool m_callbackInProgress;
        };
 
 }
index 37e518a1e1a4ae40d201b5be1794f5e0cc530688..d7dd99da9f5fe473f7f60b1ae2e792b412d5f852 100644 (file)
@@ -89,7 +89,7 @@ namespace callui {
        using namespace ucl;
 
        CallInfoPresenter::Builder::Builder():
-               m_mode(CallInfoMode::UNDEFINED)
+               m_mode(CallMode::UNDEFINED)
        {
        }
 
@@ -103,7 +103,7 @@ namespace callui {
                return *this;
        }
 
-       CallInfoPresenter::Builder &CallInfoPresenter::Builder::setMode(CallInfoMode mode)
+       CallInfoPresenter::Builder &CallInfoPresenter::Builder::setMode(CallMode mode)
        {
                m_mode = mode;
                return *this;
@@ -111,7 +111,7 @@ namespace callui {
 
        CallInfoPresenterSRef CallInfoPresenter::Builder::build(ElmWidget &parent) const
        {
-               if (m_mode == CallInfoMode::UNDEFINED || !m_cm) {
+               if (m_mode == CallMode::UNDEFINED || !m_cm) {
                        LOG_RETURN_VALUE(RES_FAIL, {}, "Not all params are set");
                }
 
@@ -123,7 +123,7 @@ namespace callui {
 
        CallInfoPresenter::CallInfoPresenter(RefCountObjBase &rc,
                        const ICallManagerSRef &cm,
-                       CallInfoMode mode):
+                       CallMode mode):
                        Presenter(rc),
                        m_mode(mode),
                        m_isCallerIdEnable(false),
@@ -171,7 +171,7 @@ namespace callui {
                return *m_widget;
        }
 
-       CallInfoMode CallInfoPresenter::getMode() const
+       CallMode CallInfoPresenter::getMode() const
        {
                return m_mode;
        }
@@ -207,15 +207,18 @@ namespace callui {
                }
        }
 
-       Result CallInfoPresenter::update(CallInfoMode mode, const ICallManagerSRef &cm)
+       Result CallInfoPresenter::update(CallMode mode, const ICallManagerSRef &cm)
        {
                m_needModifyCallStatus = false;
-               if (mode != m_mode || mode == CallInfoMode::DURING) {
+               if (mode != m_mode || mode == CallMode::DURING) {
                        m_needModifyCallStatus = true;
                }
 
                m_mode = mode;
                initCallInfos(cm);
+               m_isCallerIdEnable = false;
+               m_isEmergency = false;
+               m_isSubTxtEnable = false;
 
                return update();
        }
@@ -328,7 +331,7 @@ namespace callui {
                m_callerId.reset();
                m_widget->emit(impl::SIGN_CALLER_ID_DISABLE, impl::SRC_CALLER_ID);
 
-               if (m_mode == CallInfoMode::INCOMING) {
+               if (m_mode == CallMode::INCOMING) {
 
                        if (!m_incomCallInfo) {
                                LOG_RETURN(RES_FAIL, "m_incomCallInfo is NULL");
@@ -382,23 +385,22 @@ namespace callui {
        {
                std::string subTxt;
                m_isSubTxtEnable = false;
-
                m_label.reset();
 
                switch (m_mode) {
-               case CallInfoMode::INCOMING:
+               case CallMode::INCOMING:
                        subTxt = getIncomingCallSubText();
                        break;
-               case CallInfoMode::DURING:
+               case CallMode::DURING:
                        subTxt = getDuringCallSubText();
                        break;
-               case CallInfoMode::OUTGOING:
+               case CallMode::OUTGOING:
                        ILOG("Outgoing call not supported");
                        break;
-               case CallInfoMode::END:
+               case CallMode::END:
                        subTxt = getEndCallSubText();
                        break;
-               case CallInfoMode::UNDEFINED:
+               case CallMode::UNDEFINED:
                        LOG_RETURN(RES_FAIL, "Undefined caller info mode!");
                        break;
                default:
@@ -466,16 +468,11 @@ namespace callui {
 
                        m_widget->emit(impl::SIGN_CALLER_ID_DISABLE, impl::SRC_TXT_1LINE);
 
-                       if (m_mode == CallInfoMode::END) {
-
-                               if (isMainTxtSingleLine) {
-                                       m_widget->emit(impl::SIGN_1LINE, impl::SRC_TOP_PAD);
-                               } else {
-                                       m_widget->emit(impl::SIGN_2LINE, impl::SRC_TOP_PAD);
-
-                               }
-                       } else if (m_mode == CallInfoMode::INCOMING) {
+                       if (m_isEmergency) {
+                               m_widget->emit(impl::SIGN_EMERGENCY_MODE, impl::SRC_TXT_1LINE);
+                       }
 
+                       if (m_mode == CallMode::INCOMING) {
                                if (m_isCallerIdEnable) {
                                        m_widget->emit(impl::SIGN_CALLER_ID_ENABLE, impl::SRC_TXT_1LINE);
                                } else {
@@ -488,11 +485,6 @@ namespace callui {
                                }
 
                        } else {
-
-                               if (m_isEmergency) {
-                                       m_widget->emit(impl::SIGN_EMERGENCY_MODE, impl::SRC_TXT_1LINE);
-                               }
-
                                if (isMainTxtSingleLine) {
                                        if (m_isSubTxtEnable) {
                                                m_widget->emit(impl::SIGN_1LINE_2TXT, impl::SRC_TOP_PAD);
@@ -514,20 +506,20 @@ namespace callui {
        {
                std::string mainTxt;
                switch (m_mode) {
-               case CallInfoMode::INCOMING:
+               case CallMode::INCOMING:
                        mainTxt = generateMainTxt(m_incomCallInfo);
                        break;
-               case CallInfoMode::OUTGOING:
+               case CallMode::OUTGOING:
                        mainTxt = generateMainTxt(m_activeCallInfo);
                        break;
-               case CallInfoMode::DURING:
+               case CallMode::DURING:
                        if (m_activeCallInfo) {
                                mainTxt = generateMainTxt(m_activeCallInfo);
                        } else if (m_heldCallInfo) {
                                mainTxt = generateMainTxt(m_heldCallInfo);
                        }
                        break;
-               case CallInfoMode::END:
+               case CallMode::END:
                        mainTxt = generateMainTxt(m_endCallInfo);
                        break;
                default:
@@ -552,13 +544,13 @@ namespace callui {
                m_callStatus.reset();
 
                switch (m_mode) {
-               case CallInfoMode::INCOMING:
+               case CallMode::INCOMING:
                        callInfo = m_incomCallInfo;
                        break;
-               case CallInfoMode::OUTGOING:
+               case CallMode::OUTGOING:
                        callInfo = m_activeCallInfo;
                        break;
-               case CallInfoMode::DURING:
+               case CallMode::DURING:
                        if (m_activeCallInfo) {
                                callInfo = m_activeCallInfo;
                        } else if (m_heldCallInfo) {
@@ -566,7 +558,7 @@ namespace callui {
                                isOnHold = true;
                        }
                        break;
-               case CallInfoMode::END:
+               case CallMode::END:
                        callInfo = m_endCallInfo;
                        break;
                default:
index 0499dbe9154ec1d131f04250f8a751d32482c802..962920806f98d609627d91ca7c863045c6997efe 100644 (file)
@@ -72,7 +72,7 @@ namespace callui {
        using namespace ucl;
 
        CallStatus::Builder::Builder():
-               m_mode(CallInfoMode::UNDEFINED),
+               m_mode(CallMode::UNDEFINED),
                m_isOnHold(false)
        {
        }
@@ -81,7 +81,7 @@ namespace callui {
        {
        }
 
-       CallStatus::Builder &CallStatus::Builder::setMode(CallInfoMode mode)
+       CallStatus::Builder &CallStatus::Builder::setMode(CallMode mode)
        {
                m_mode = mode;
                return *this;
@@ -107,7 +107,7 @@ namespace callui {
 
        CallStatusSRef CallStatus::Builder::build() const
        {
-               if (m_mode == CallInfoMode::UNDEFINED || !m_ly) {
+               if (m_mode == CallMode::UNDEFINED || !m_ly) {
                        LOG_RETURN_VALUE(RES_FAIL, {}, "Not all params are set");
                }
 
@@ -122,7 +122,7 @@ namespace callui {
 
        CallStatus::CallStatus(RefCountObjBase &rc,
                        const LayoutSRef &layout,
-                       CallInfoMode mode,
+                       CallMode mode,
                        const ICallInfoWCRef &info,
                        bool isHeld):
                Presenter(rc),
@@ -148,12 +148,13 @@ namespace callui {
        Result CallStatus::prepare()
        {
                m_ly->emit(impl::SIGN_RESET, impl::SIGN_SRC_DOT);
+               m_ly->setText("", impl::PART_TXT_TEXT_INFO);
 
                switch (m_mode) {
-               case CallInfoMode::INCOMING:  return processIncomingMode();
-               case CallInfoMode::OUTGOING:  return processOutgoingMode();
-               case CallInfoMode::DURING:    return processDuringMode();
-               case CallInfoMode::END:       return processEndMode();
+               case CallMode::INCOMING:  return processIncomingMode();
+               case CallMode::OUTGOING:  return processOutgoingMode();
+               case CallMode::DURING:    return processDuringMode();
+               case CallMode::END:       return processEndMode();
                default:
                        LOG_RETURN(RES_FAIL, "Unknown mode");
                        break;
index fbaf2641a5d40092773ead0355e54f5093a6e099..7bfe62de6f23b031f708229f7a6fadef362f8733 100644 (file)
@@ -28,6 +28,7 @@
 #include "model/IEndCall.h"
 #include "model/IIndicatorStateProvider.h"
 #include "model/ICallInfo.h"
+#include "model/IRejectMsgProvider.h"
 
 #include "presenters/Indicator.h"
 #include "presenters/AcceptRejectPresenter.h"
@@ -41,6 +42,9 @@ namespace callui { namespace { namespace impl {
 
        using namespace ucl;
 
+       constexpr double CU_RECALL_BTN_SHOW_TIMEOUT = 1.0;
+       constexpr double CU_EXIT_APP_TIMEOUT = 4.0;
+
        constexpr LayoutTheme LAYOUT_MAIN_WIDGET
                        {"layout", "callui", "main"};
 
@@ -51,9 +55,15 @@ namespace callui { namespace { namespace impl {
        constexpr EdjePart PART_SWL_ACCEPT_REJECT {"swl.accept_reject"};
        constexpr EdjePart PART_SWL_CALL_INFO {"swl.call_info"};
        constexpr EdjePart PART_SWL_REJECT_MSG {"swl.rm"};
+       constexpr EdjePart PART_SWL_BOTTOM_BTN {"swl.bottom_btn"};
        constexpr EdjePart PART_SWL_OVERLAY {"swl.overlay"};
 
-       constexpr EdjePart PART_TXT_REJECT_MSG{"reject_msg_text"};
+       constexpr EdjePart PART_TXT_REJECT_MSG {"reject_msg_text"};
+
+       constexpr ElmStyle STYLE_BB_END_CALL {"callui/end_call"};
+       constexpr ElmStyle STYLE_BB_RECALL {"callui/call_back"};
+
+       constexpr SmartEvent EVENT_CLICKED {"clicked"};
 }}}
 
 namespace callui {
@@ -116,7 +126,10 @@ namespace callui {
                        const ExitRequestHandler onExitRequest,
                        const ICallSRef &call) :
                Page(rc, navi, onExitRequest),
-               m_call(call)
+               m_call(call),
+               m_mode(CallMode::UNDEFINED),
+               m_ecTimer(nullptr),
+               m_ecTimerBtnReq(false)
        {
        }
 
@@ -126,6 +139,11 @@ namespace callui {
 
        Result MainPage::prepare()
        {
+               m_cm = m_call->getCallManager();
+               if (!m_cm) {
+                       LOG_RETURN(RES_FAIL, "Call manager is NULL!");
+               }
+
                m_widget = Layout::Builder().
                                setTheme(impl::LAYOUT_MAIN_WIDGET).
                                setIsOwner(true).
@@ -140,6 +158,7 @@ namespace callui {
                if (!m_indicator) {
                        LOG_RETURN(RES_FAIL, "Indicator::build() failed!");
                }
+
                m_widget->setContent(m_indicator->getWidget().getEo(), impl::PART_SWL_INDICATOR);
 
                return Page::prepare([this]() {
@@ -176,19 +195,29 @@ namespace callui {
 
        void MainPage::onBackKey()
        {
-               auto callMng = m_call->getCallManager();
-               if (m_call->getCallManager()->getAvailableCalls()
+               if (m_cm->getAvailableCalls()
                                == CALL_FLAG_END) {
                        requestExit();
                }
        }
 
-       Result MainPage::processIncomingCall(const IIncomingCallSRef &incom)
+       Result MainPage::processIncomingCall()
        {
+               auto incom = m_cm->getIncomingCall();
+               if (!incom) {
+                       LOG_RETURN(RES_FAIL, "incom is NULL");
+               }
+
+               auto provider = incom->getRejectMsgProvider();
+               if (!provider) {
+                       LOG_RETURN(RES_FAIL, "Reject message provider is NULL");
+               }
+
                FAIL_RETURN(createAcceptRejectPresenter(),
                                "createAcceptRejectPresenter() failed!");
 
-               if (!isUnknownCaller(*incom->getInfo())) {
+               if (!isUnknownCaller(*incom->getInfo())
+                               && (provider->getMsgCount() > 0)) {
                        m_rmLy = Layout::Builder().
                                        setTheme(impl::LAYOUT_REJECT_MSG_WIDGET).
                                        setIsOwner(true).
@@ -200,78 +229,178 @@ namespace callui {
 
                        m_widget->setContent(m_rmLy->getEo(), impl::PART_SWL_REJECT_MSG);
 
-                       FAIL_RETURN(createRejectMsgPresenter(incom),
+                       FAIL_RETURN(createRejectMsgPresenter(provider),
                                        "createRejectMsgPresenter() failed!");
                }
 
                return RES_OK;
        }
 
-       void MainPage::onCallEvent(CallEventType type)
+       void MainPage::updateCallMode()
        {
-               ILOG("CallEventType [%d]", static_cast<int>(type));
+               auto incom = m_cm->getIncomingCall();
+               auto active = m_cm->getActiveCall();
+               auto held = m_cm->getHeldCall();
+               auto end = m_cm->getEndCall();
 
-               auto cm = m_call->getCallManager();
-               auto incom = cm->getIncomingCall();
-               auto active = cm->getActiveCall();
-               auto held = cm->getHeldCall();
-               auto end = cm->getEndCall();
+               m_mode = CallMode::UNDEFINED;
 
-               auto win = getNaviframe().getWindow();
+               if (incom) {
+                       DLOG("Mode [Incoming call]");
+                       m_mode = CallMode::INCOMING;
+               } else if (active && active->isDialingMode()) {
+                       DLOG("Mode [Outgoing call]");
+                       m_mode = CallMode::OUTGOING;
+               } else if (active || held) {
+                       DLOG("Mode [During call]");
+                       m_mode = CallMode::DURING;
+               } else if (end) {
+                       DLOG("Mode [End call]");
+                       m_mode = CallMode::END;
+               } else {
+                       DLOG("Mode [Undefined]");
+               }
+       }
 
+       Result MainPage::showWindow()
+       {
+               auto win = getNaviframe().getWindow();
                if (!win) {
-                       LOG_RETURN_VOID(RES_FAIL, "win is NULL");
+                       LOG_RETURN(RES_FAIL, "win is NULL");
                }
 
-               if ((type == CallEventType::DIALING
-                               || type == CallEventType::INCOMING)
-                               && !win->isVisible()) {
+               if (!win->isVisible() &&
+                               (m_mode == CallMode::INCOMING
+                               || m_mode == CallMode::OUTGOING)) {
                        show(*win);
                }
+               return RES_OK;
+       }
 
-               if (incom) {
-                       FAIL_RETURN_VOID(processIncomingCall(incom),
-                                       "processIncomingCall() failed!");
+       void MainPage::onBottomBtnClicked(Widget &widget, void *eventInfo)
+       {
+               auto active = m_cm->getActiveCall();
+               auto held = m_cm->getHeldCall();
+               auto end = m_cm->getEndCall();
+
+               if (active) {
+                       active->end();
+               } else if (held) {
+                       held->end();
+               } else if (end) {
+                       stopEndCallTimer();
+                       end->callBack();
+               }
+       }
+
+       void MainPage::startEndCallTimer()
+       {
+               stopEndCallTimer();
+
+               m_ecTimer = ecore_timer_add(
+                               impl::CU_RECALL_BTN_SHOW_TIMEOUT,
+                               CALLBACK_B(MainPage::onEndCallTimerCb),
+                               this);
+       }
+
+       void MainPage::stopEndCallTimer()
+       {
+               m_ecTimerBtnReq = false;
+
+               if (m_ecTimer) {
+                       ecore_timer_del(m_ecTimer);
+                       m_ecTimer = nullptr;
+               }
+       }
+
+       Result MainPage::createBottomBtn(const ElmStyle &style)
+       {
+               m_bottomBtn = makeShared<StyledWidget>(
+                               elm_button_add(*m_widget), true);
+               m_bottomBtn->setStyle(style);
+
+               m_bottomBtn->addEventHandler(impl::EVENT_CLICKED,
+                               WEAK_DELEGATE(MainPage::onBottomBtnClicked,
+                                               asWeak(*this)));
+
+               m_widget->setContent(*m_bottomBtn, impl::PART_SWL_BOTTOM_BTN);
+               show(*m_bottomBtn);
+
+               return RES_OK;
+       }
+
+       Eina_Bool MainPage::onEndCallTimerCb()
+       {
+               auto end = m_cm->getEndCall();
+               if (!end) {
+                       requestExit();
+                       LOG_RETURN_VALUE(RES_FAIL, ECORE_CALLBACK_CANCEL, "end is NULL");
+               }
+
+               auto info = end->getInfo();
+               if (!m_bottomBtn && !m_ecTimerBtnReq) {
+                       if (info && info->getConferenceMemberCount() == 1) {
+                               if (createBottomBtn(impl::STYLE_BB_RECALL) != RES_OK) {
+                                       m_ecTimer = nullptr;
+                                       requestExit();
+                                       LOG_RETURN_VALUE(RES_FAIL, ECORE_CALLBACK_CANCEL,
+                                                       "createBottomBtn() failed!");
+                               }
+                       }
+                       ecore_timer_interval_set(m_ecTimer, impl::CU_EXIT_APP_TIMEOUT);
+                       m_ecTimerBtnReq = true;
+                       return ECORE_CALLBACK_RENEW;
                } else {
-                       m_rmPrs.reset();
-                       m_acceptRejectPrs.reset();
-                       m_rmLy.reset();
+                       m_ecTimer = nullptr;
+                       requestExit();
+                       return ECORE_CALLBACK_CANCEL;
                }
+       }
 
-               CallInfoMode mode = CallInfoMode::UNDEFINED;
-               if (incom) {
-                       mode = CallInfoMode::INCOMING;
-               } else if (active && active->isDialingMode()) {
-                       mode = CallInfoMode::OUTGOING;
-               } else if (active || held) {
-                       mode = CallInfoMode::DURING;
-               } else if (end) {
-                       mode = CallInfoMode::END;
+       void MainPage::onCallEvent(CallEventType type)
+       {
+               ILOG("CallEventType [%d]", static_cast<int>(type));
+
+               stopEndCallTimer();
+
+               updateCallMode();
+               if (m_mode == CallMode::UNDEFINED) {
+                       requestExit();
+                       return;
                }
-               FAIL_RETURN_VOID(createCallInfoPresenter(mode),
-                               "createCallInfoPresenter() failed!");
+               FAIL_RETURN_VOID(showWindow(), "showWindow failed!");
 
+               m_bottomBtn.reset();
 
-               if (type == CallEventType::END) {
-                       if (m_call->getCallManager()->getAvailableCalls()
-                                       == CALL_FLAG_END) {
-                               requestExit();
+               if (m_mode == CallMode::INCOMING) {
+                       FAIL_RETURN_VOID(processIncomingCall(),
+                                       "processIncomingCall() failed!");
+               } else {
+                       m_rmPrs.reset();
+                       m_acceptRejectPrs.reset();
+                       m_rmLy.reset();
+
+                       if (m_mode == CallMode::END) {
+                               startEndCallTimer();
+                       } else {
+                               createBottomBtn(impl::STYLE_BB_END_CALL);
                        }
                }
+
+               FAIL_RETURN_VOID(createCallInfoPresenter(m_mode),
+                               "createCallInfoPresenter() failed!");
        }
 
        Result MainPage::createAcceptRejectPresenter()
        {
-               auto callMng = m_call->getCallManager();
-
                if (m_acceptRejectPrs) {
-                       m_acceptRejectPrs->update(callMng->getAvailableCalls());
+                       m_acceptRejectPrs->update(m_cm->getAvailableCalls());
                        return RES_OK;
                }
 
                m_acceptRejectPrs = AcceptRejectPresenter::Builder().
-                               setIncomingCall(callMng->getIncomingCall()).
-                               setAvailableCallsFlag(callMng->getAvailableCalls()).
+                               setIncomingCall(m_cm->getIncomingCall()).
+                               setAvailableCallsFlag(m_cm->getAvailableCalls()).
                                build(*m_widget);
 
                if (!m_acceptRejectPrs) {
@@ -296,18 +425,16 @@ namespace callui {
 
        void MainPage::RejectMsgSelectCb(const IRejectMsgSRef &rm)
        {
-               auto callMng = m_call->getCallManager();
-               auto incom = callMng->getIncomingCall();
-
+               auto incom = m_cm->getIncomingCall();
                if (incom) {
                        incom->rejectWithMessage(rm);
                }
        }
 
-       Result MainPage::createRejectMsgPresenter(const IIncomingCallSRef &incom)
+       Result MainPage::createRejectMsgPresenter(const IRejectMsgProviderSRef &provider)
        {
                m_rmPrs = RejectMsgPresenter::Builder().
-                               setProvider(incom->getRejectMsgProvider()).
+                               setProvider(provider).
                                setStateHandler(
                                                WEAK_DELEGATE(MainPage::RejectMsgStateCb,
                                                                asWeak(*this))).
@@ -328,16 +455,14 @@ namespace callui {
                return RES_OK;
        }
 
-       Result MainPage::createCallInfoPresenter(CallInfoMode mode)
+       Result MainPage::createCallInfoPresenter(CallMode mode)
        {
-               auto callMng = m_call->getCallManager();
-
                if (m_callInfoPrs) {
-                       return m_callInfoPrs->update(mode, callMng);
+                       return m_callInfoPrs->update(mode, m_cm);
                }
 
                m_callInfoPrs = CallInfoPresenter::Builder().
-                               setCallManager(callMng).
+                               setCallManager(m_cm).
                                setMode(mode).
                                build(*m_widget);
 
@@ -353,7 +478,7 @@ namespace callui {
 
        void MainPage::onError(CallErr err)
        {
-               if (!m_call->getCallManager()->getAvailableCalls()) {
+               if (!m_cm->getAvailableCalls()) {
                        requestExit();
                }
        }
index 06e07c1def9a7dccbe5035721e66d067417ffce7..3911e08d82faf14492ecf7533c8aa6cfa3106234 100644 (file)
@@ -27,6 +27,8 @@ namespace callui { namespace { namespace impl {
 
        using namespace ucl;
 
+       const int ALPHA_CHANNEL_MAX = 255;
+
        constexpr LayoutTheme LAYOUT_DRAWER_PANEL
                {"layout", "drawer", "panel"};
 
@@ -211,6 +213,9 @@ namespace callui {
                        elm_scroller_region_show(m_genlist->getEo(), 0, 0, 0, 0);
                } else {
                        m_state = RejectMsgState::IN_TRANSITION;
+                       const auto alphaValue =
+                                       static_cast<int>(impl::ALPHA_CHANNEL_MAX * ev->rel_y);
+                       m_panelBg->setColor(0, alphaValue);
                        if (isActive()) {
                                deactivateBy(m_widget.get());
                                sendActivateBy(*m_widget, this);
index b7dd00d07e6ab3ed50e6433e7ddbfdde8c075751..cfdf0c617e7a2ab617260984f8f65fd806cb345f 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <manifest xmlns="http://tizen.org/ns/packages" api-version="3.0" package="org.tizen.call-ui" version="1.0.0">
     <profile name="wearable"/>
-    <ui-application appid="org.tizen.call-ui" exec="call-ui" multiple="false" nodisplay="false" taskmanage="true" type="capp">
+    <ui-application appid="org.tizen.call-ui" exec="call-ui" multiple="false" nodisplay="true" taskmanage="false" type="capp">
         <label>call-ui</label>
         <icon>call-ui.png</icon>
         <app-control>