From: Igor Olshevskyi Date: Mon, 22 May 2017 10:02:25 +0000 (+0300) Subject: TizenRefApp-8529 [Call UI] Implement end call feature X-Git-Tag: submit/tizen/20170630.111746~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ac0162238d74df80e201b6031e5e40086be8d805;p=profile%2Fwearable%2Fapps%2Fnative%2Fcall-ui.git TizenRefApp-8529 [Call UI] Implement end call feature Change-Id: I622be4ff62f053d0b6806f842b0a47b7db0caacc --- diff --git a/.cproject b/.cproject index eb6f60d..8c8c083 100644 --- a/.cproject +++ b/.cproject @@ -401,10 +401,6 @@ - - - - diff --git a/edc/buttons.edc b/edc/buttons.edc index 776ae02..2b1b968 100644 --- a/edc/buttons.edc +++ b/edc/buttons.edc @@ -14,14 +14,18 @@ * 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") diff --git a/edc/call_info.edc b/edc/call_info.edc index 5bcef54..7330124 100644 --- a/edc/call_info.edc +++ b/edc/call_info.edc @@ -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); } diff --git a/edc/color_classes.edc b/edc/color_classes.edc index eb27b05..3f4f1b7 100644 --- a/edc/color_classes.edc +++ b/edc/color_classes.edc @@ -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 index 0000000..55522be Binary files /dev/null and b/edc/images/tw_bottom_btn_bg.png differ diff --git a/edc/main_ly.edc b/edc/main_ly.edc index d39eeae..04c6c23 100644 --- a/edc/main_ly.edc +++ b/edc/main_ly.edc @@ -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"; diff --git a/inc/model/types.h b/inc/model/types.h index d4f9f69..3d4b92c 100644 --- a/inc/model/types.h +++ b/inc/model/types.h @@ -54,6 +54,7 @@ namespace callui { }; enum { + CALL_FLAG_NONE = 0, CALL_FLAG_INCOMING = 1, CALL_FLAG_ACTIVE = 2, CALL_FLAG_HELD = 4, diff --git a/inc/presenters/CallInfoPresenter.h b/inc/presenters/CallInfoPresenter.h index 1d69705..53b6a60 100644 --- a/inc/presenters/CallInfoPresenter.h +++ b/inc/presenters/CallInfoPresenter.h @@ -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(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; diff --git a/inc/presenters/CallStatus.h b/inc/presenters/CallStatus.h index 62bdad4..bd00881 100644 --- a/inc/presenters/CallStatus.h +++ b/inc/presenters/CallStatus.h @@ -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(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; diff --git a/inc/presenters/MainPage.h b/inc/presenters/MainPage.h index 43055a3..3b29211 100644 --- a/inc/presenters/MainPage.h +++ b/inc/presenters/MainPage.h @@ -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; }; } diff --git a/inc/presenters/types.h b/inc/presenters/types.h index 052dfbf..182b515 100644 --- a/inc/presenters/types.h +++ b/inc/presenters/types.h @@ -30,7 +30,7 @@ namespace callui { BACK }; - enum class CallInfoMode { + enum class CallMode { UNDEFINED, INCOMING, OUTGOING, diff --git a/src/model/ActiveCall.cpp b/src/model/ActiveCall.cpp index b9e0397..f945ed8 100644 --- a/src/model/ActiveCall.cpp +++ b/src/model/ActiveCall.cpp @@ -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); } diff --git a/src/model/CallInfo.cpp b/src/model/CallInfo.cpp index c31d68b..7341675 100644 --- a/src/model/CallInfo.cpp +++ b/src/model/CallInfo.cpp @@ -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; diff --git a/src/model/CallManager.cpp b/src/model/CallManager.cpp index 0df997e..e036d89 100644 --- a/src/model/CallManager.cpp +++ b/src/model/CallManager.cpp @@ -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: diff --git a/src/model/CallManager.h b/src/model/CallManager.h index 583c05c..0dde5c6 100644 --- a/src/model/CallManager.h +++ b/src/model/CallManager.h @@ -63,9 +63,16 @@ namespace callui { template ucl::Result updateCall(ucl::SharedRef &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; }; } diff --git a/src/model/EndCall.cpp b/src/model/EndCall.cpp index b4ca64f..2a9c92f 100644 --- a/src/model/EndCall.cpp +++ b/src/model/EndCall.cpp @@ -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() diff --git a/src/model/EndCall.h b/src/model/EndCall.h index a89ac5d..8a30957 100644 --- a/src/model/EndCall.h +++ b/src/model/EndCall.h @@ -48,6 +48,7 @@ namespace callui { private: CallManagerWRef m_cm; ICallInfoSCRef m_callInfo; + bool m_callbackInProgress; }; } diff --git a/src/presenters/CallInfoPresenter.cpp b/src/presenters/CallInfoPresenter.cpp index 37e518a..d7dd99d 100644 --- a/src/presenters/CallInfoPresenter.cpp +++ b/src/presenters/CallInfoPresenter.cpp @@ -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: diff --git a/src/presenters/CallStatus.cpp b/src/presenters/CallStatus.cpp index 0499dbe..9629208 100644 --- a/src/presenters/CallStatus.cpp +++ b/src/presenters/CallStatus.cpp @@ -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; diff --git a/src/presenters/MainPage.cpp b/src/presenters/MainPage.cpp index fbaf264..7bfe62d 100644 --- a/src/presenters/MainPage.cpp +++ b/src/presenters/MainPage.cpp @@ -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(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( + 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(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(); } } diff --git a/src/presenters/RejectMsgPresenter.cpp b/src/presenters/RejectMsgPresenter.cpp index 06e07c1..3911e08 100644 --- a/src/presenters/RejectMsgPresenter.cpp +++ b/src/presenters/RejectMsgPresenter.cpp @@ -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(impl::ALPHA_CHANNEL_MAX * ev->rel_y); + m_panelBg->setColor(0, alphaValue); if (isActive()) { deactivateBy(m_widget.get()); sendActivateBy(*m_widget, this); diff --git a/tizen-manifest.xml b/tizen-manifest.xml index b7dd00d..cfdf0c6 100644 --- a/tizen-manifest.xml +++ b/tizen-manifest.xml @@ -1,7 +1,7 @@ - + call-ui.png