From 29606e0e3d03a318dbd170fce145c568286568dc Mon Sep 17 00:00:00 2001 From: Igor Olshevskyi Date: Wed, 21 Jun 2017 14:05:26 +0300 Subject: [PATCH] TizenRefApp-8729 [Call UI] Add new Presenter functionality Change-Id: I048d4f82fdd3baa26ae03ea736bd90dbe254ff8b --- edc/buttons.edc | 29 +++-- inc/presenters/AcceptRejectPresenter.h | 7 +- inc/presenters/AccessoryPresenter.h | 8 +- inc/presenters/CallInfoPresenter.h | 12 +- .../{CallStatus.h => CallStatusPresenter.h} | 18 +-- .../{Indicator.h => IndicatorPresenter.h} | 24 ++-- inc/presenters/KeypadPage.h | 3 +- inc/presenters/MainPage.h | 11 +- inc/presenters/MoreOptionsPresenter.h | 7 +- inc/presenters/Page.h | 10 +- inc/presenters/Page.hpp | 15 +-- inc/presenters/Presenter.h | 52 +++++--- inc/presenters/RejectMsgPresenter.h | 7 +- inc/presenters/types.h | 5 +- src/model/CallManager.cpp | 3 +- src/model/RejectMsg.cpp | 6 - src/model/SoundManager.cpp | 18 +++ src/presenters/AcceptDialog.cpp | 6 +- src/presenters/AcceptRejectPresenter.cpp | 33 +++-- src/presenters/AccessoryPresenter.cpp | 43 +++++-- src/presenters/CallInfoPresenter.cpp | 48 ++++--- ...CallStatus.cpp => CallStatusPresenter.cpp} | 50 ++++---- .../{Indicator.cpp => IndicatorPresenter.cpp} | 64 ++++++---- src/presenters/Instance.cpp | 3 +- src/presenters/KeypadPage.cpp | 17 ++- src/presenters/MainPage.cpp | 88 +++++-------- src/presenters/MoreOptionsPresenter.cpp | 37 ++++-- src/presenters/Page.cpp | 18 +-- src/presenters/Presenter.cpp | 117 ++++++++++++++---- src/presenters/RejectMsgPresenter.cpp | 34 +++-- 30 files changed, 508 insertions(+), 285 deletions(-) rename inc/presenters/{CallStatus.h => CallStatusPresenter.h} (78%) rename inc/presenters/{Indicator.h => IndicatorPresenter.h} (73%) rename src/presenters/{CallStatus.cpp => CallStatusPresenter.cpp} (75%) rename src/presenters/{Indicator.cpp => IndicatorPresenter.cpp} (85%) diff --git a/edc/buttons.edc b/edc/buttons.edc index 54b7a18..f20f2d7 100644 --- a/edc/buttons.edc +++ b/edc/buttons.edc @@ -40,11 +40,13 @@ group { "elm/button/base/"_name; \ script { \ public is_pressed; \ public is_expanded; \ + public is_move_blocked; \ public unpress_timer; \ public press(bool:auto_unpress) \ { \ cancel_timer(get_int(unpress_timer)); \ set_int(unpress_timer, 0); \ + set_int(is_move_blocked, 1); \ if (get_int(is_pressed) == 0) { \ set_int(is_pressed, 1); \ run_program(PROGRAM:"pressed"); \ @@ -150,14 +152,14 @@ group { "elm/button/base/"_name; \ } \ programs { \ program { \ - signal: "mouse,down,*"; \ + signal: "mouse,down,1"; \ source: "rect.event"; \ script { \ press(false); \ } \ } \ program { \ - signal: "mouse,up,*"; \ + signal: "mouse,up,1"; \ source: "rect.event"; \ script { \ unpress(); \ @@ -194,12 +196,21 @@ group { "elm/button/base/"_name; \ } \ program { \ name: "pressed"; \ - sequence { \ - action: STATE_SET "pressed_effect"; \ - targets: "image.effect" "image.border"; \ - action: STATE_SET "pressed"; \ - targets: "image.effect" "image.border" "rect.icon_bg"; \ - transition: TRANSITION_GLIDE(CU_BTN_INCOM_CALL_ANIM_TIME); \ + action: STATE_SET "pressed_effect"; \ + targets: "image.effect" "image.border"; \ + after: "on_press"; \ + } \ + program { \ + name: "on_press"; \ + action: STATE_SET "pressed"; \ + targets: "image.effect" "image.border" "rect.icon_bg"; \ + transition: TRANSITION_GLIDE(CU_BTN_INCOM_CALL_ANIM_TIME); \ + after: "reset_move_flag"; \ + } \ + program { \ + name: "reset_move_flag"; \ + script { \ + set_int(is_move_blocked, 0); \ } \ } \ program { \ @@ -235,7 +246,7 @@ group { "elm/button/base/"_name; \ signal: "mouse,move"; \ source: "rect.event"; \ script { \ - if (get_int(is_pressed) == 0 || get_int(is_expanded) == 1) { \ + if (get_int(is_pressed) == 0 || get_int(is_expanded) == 1 || get_int(is_move_blocked) == 1) { \ return; \ } \ new mx, my; \ diff --git a/inc/presenters/AcceptRejectPresenter.h b/inc/presenters/AcceptRejectPresenter.h index 4adf6c6..5268f0d 100644 --- a/inc/presenters/AcceptRejectPresenter.h +++ b/inc/presenters/AcceptRejectPresenter.h @@ -34,11 +34,13 @@ namespace callui { ~Builder(); Builder &setIncomingCall(const IIncomingCallSRef &call); Builder &setAvailableCallsFlag(CallMask calls); - AcceptRejectPresenterSRef build(ucl::ElmWidget &parent) const; + Builder &setParentWidget(const ucl::ElmWidgetSRef &parentWidget); + AcceptRejectPresenterSRef build(Presenter &parent) const; private: IIncomingCallSRef m_call; CallMask m_callMask; + ucl::ElmWidgetSRef m_parentWidget; }; public: @@ -54,7 +56,8 @@ namespace callui { const IIncomingCallSRef &call, CallMask calls); - ucl::Result prepare(ucl::ElmWidget &parent); + ucl::Result prepare(Presenter &parent, + ucl::ElmWidget &parentWidget); ucl::Result createWidget(ucl::ElmWidget &parent); ucl::Result createAcceptBtn(); diff --git a/inc/presenters/AccessoryPresenter.h b/inc/presenters/AccessoryPresenter.h index 4810532..31bc625 100644 --- a/inc/presenters/AccessoryPresenter.h +++ b/inc/presenters/AccessoryPresenter.h @@ -33,11 +33,13 @@ namespace callui { Builder(); Builder &setSoundManager(const ISoundManagerSRef &sm); Builder &setMuteControlDisabled(bool isDisabled); - AccessoryPresenterSRef build(ucl::ElmWidget &parent) const; + Builder &setParentWidget(const ucl::ElmWidgetSRef &parentWidget); + AccessoryPresenterSRef build(Presenter &parent) const; private: ISoundManagerSRef m_sm; bool m_isMuteControlDisabled; + ucl::ElmWidgetSRef m_parentWidget; }; public: @@ -52,7 +54,9 @@ namespace callui { AccessoryPresenter(ucl::IRefCountObj &rc, const ISoundManagerSRef &sm); - ucl::Result prepare(ucl::ElmWidget &parent, bool isMuteControlDisabled = false); + ucl::Result prepare(Presenter &parent, + ucl::ElmWidget &parentWidget, + bool isMuteControlDisabled = false); ucl::Result createWidget(ucl::ElmWidget &parent); ucl::Result createSlider(); diff --git a/inc/presenters/CallInfoPresenter.h b/inc/presenters/CallInfoPresenter.h index 2c203d3..6a836b1 100644 --- a/inc/presenters/CallInfoPresenter.h +++ b/inc/presenters/CallInfoPresenter.h @@ -34,10 +34,12 @@ namespace callui { virtual ~Builder(); Builder &setCallManager(const ICallManagerSRef &cm); Builder &setMode(CallMode mode); - CallInfoPresenterSRef build(ucl::ElmWidget &parent) const; + Builder &setParentWidget(const ucl::ElmWidgetSRef &parentWidget); + CallInfoPresenterSRef build(Presenter &parent) const; private: ICallManagerSRef m_cm; CallMode m_mode; + ucl::ElmWidgetSRef m_parentWidget; }; public: @@ -53,14 +55,15 @@ namespace callui { const ICallManagerSRef &cm, CallMode mode); - ucl::Result prepare(ucl::ElmWidget &parent); + ucl::Result prepare(Presenter &parent, + ucl::ElmWidget &parentWidget); void initCallInfos(const ICallManagerSRef &cm); ucl::Result createWidget(ucl::ElmWidget &parent); ucl::Result createLabel(const std::string &text); ucl::Result createCallerIdImage(const std::string &imagePath); - ucl::Result createCallStatus(); + ucl::Result createCallStatus(Presenter &parent); ucl::Result update(); ucl::Result updateCallerId(); @@ -81,12 +84,13 @@ namespace callui { ucl::LayoutSRef m_widget; ucl::StyledWidgetSRef m_callerId; ucl::StyledWidgetSRef m_label; + PresenterWRef m_parent; CallMode m_mode; ICallInfoSCRef m_incomCallInfo; ICallInfoSCRef m_activeCallInfo; ICallInfoSCRef m_heldCallInfo; ICallInfoSCRef m_endCallInfo; - CallStatusSRef m_callStatus; + CallStatusPresenterSRef m_callStatus; bool m_isSubTxtEnable; bool m_needModifyCallStatus; }; diff --git a/inc/presenters/CallStatus.h b/inc/presenters/CallStatusPresenter.h similarity index 78% rename from inc/presenters/CallStatus.h rename to inc/presenters/CallStatusPresenter.h index b3158a4..e4c7b4a 100644 --- a/inc/presenters/CallStatus.h +++ b/inc/presenters/CallStatusPresenter.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef __CALLUI_PRESENTERS_CALL_STATUS_H__ -#define __CALLUI_PRESENTERS_CALL_STATUS_H__ +#ifndef __CALLUI_PRESENTERS_CALL_STATUS_PRESENTER_H__ +#define __CALLUI_PRESENTERS_CALL_STATUS_PRESENTER_H__ #include "Presenter.h" @@ -27,7 +27,7 @@ namespace callui { - class CallStatus final : public Presenter { + class CallStatusPresenter final : public Presenter { public: class Builder { public: @@ -37,7 +37,7 @@ namespace callui { Builder &setCallInfo(const ICallInfoWCRef &info); Builder &setCallHoldState(bool isOnHold); Builder &setLayout(const ucl::LayoutSRef &layout); - CallStatusSRef build() const; + CallStatusPresenterSRef build(Presenter &parent) const; private: ucl::LayoutSRef m_ly; CallMode m_mode; @@ -45,17 +45,17 @@ namespace callui { bool m_isOnHold; }; public: - virtual ~CallStatus(); + virtual ~CallStatusPresenter(); private: - friend class ucl::ReffedObj; - CallStatus(ucl::IRefCountObj &rc, + friend class ucl::ReffedObj; + CallStatusPresenter(ucl::IRefCountObj &rc, const ucl::LayoutSRef &layout, CallMode mode, const ICallInfoWCRef &info, bool isOnHold); - ucl::Result prepare(); + ucl::Result prepare(Presenter &parent); ucl::Result processIncomingMode(); ucl::Result processOutgoingMode(); @@ -77,4 +77,4 @@ namespace callui { } -#endif // __CALLUI_PRESENTERS_CALL_STATUS_H__ +#endif // __CALLUI_PRESENTERS_CALL_STATUS_PRESENTER_H__ diff --git a/inc/presenters/Indicator.h b/inc/presenters/IndicatorPresenter.h similarity index 73% rename from inc/presenters/Indicator.h rename to inc/presenters/IndicatorPresenter.h index 232ed0c..6492a11 100644 --- a/inc/presenters/Indicator.h +++ b/inc/presenters/IndicatorPresenter.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef __CALLUI_PRESENTERS_INDICATOR_H__ -#define __CALLUI_PRESENTERS_INDICATOR_H__ +#ifndef __CALLUI_PRESENTERS_INDICATOR_PRESENTER_H__ +#define __CALLUI_PRESENTERS_INDICATOR_PRESENTER_H__ #include "Presenter.h" #include "model/IIndicatorStateListener.h" @@ -27,7 +27,7 @@ namespace callui { - class Indicator final : + class IndicatorPresenter final : public IIndicatorStateListener, public Presenter { public: @@ -35,23 +35,27 @@ namespace callui { public: Builder(); ~Builder(); - Builder &setIndicatorStateProvider(const IIndicatorStateProviderSRef &provider); - IndicatorSRef build(ucl::ElmWidget &parent) const; + Builder &setIndicatorStateProvider( + const IIndicatorStateProviderSRef &provider); + Builder &setParentWidget(const ucl::ElmWidgetSRef + &parentWidget); + IndicatorPresenterSRef build(Presenter &parent) const; private: IIndicatorStateProviderSRef m_provider; + ucl::ElmWidgetSRef m_parentWidget; }; public: - virtual ~Indicator(); + virtual ~IndicatorPresenter(); ucl::Widget &getWidget(); private: - friend class ucl::ReffedObj; - Indicator(ucl::IRefCountObj &rc, + friend class ucl::ReffedObj; + IndicatorPresenter(ucl::IRefCountObj &rc, const IIndicatorStateProviderSRef &provider); - ucl::Result prepare(ucl::ElmWidget &parent); + ucl::Result prepare(Presenter &parent, ucl::ElmWidget &parentWidget); ucl::Result createWidget(ucl::ElmWidget &parent); ucl::Result createConnectionLayout(); @@ -83,4 +87,4 @@ namespace callui { ucl::EdjeSignal getConnectionSignal(ConnectionType type); } -#endif // __CALLUI_PRESENTERS_INDICATOR_H__ +#endif // __CALLUI_PRESENTERS_INDICATOR_PRESENTER_H__ diff --git a/inc/presenters/KeypadPage.h b/inc/presenters/KeypadPage.h index 187fa8e..c00eb23 100644 --- a/inc/presenters/KeypadPage.h +++ b/inc/presenters/KeypadPage.h @@ -20,6 +20,7 @@ #include "Page.h" #include "ucl/gui/Layout.h" +#include "ucl/gui/NaviItem.h" #include "types.h" @@ -44,7 +45,7 @@ namespace callui { const ExitRequestHandler onExitRequest); virtual ~KeypadPage(); - ucl::Result prepare(); + ucl::Result doPrepare(ucl::NaviItem &item); private: ucl::LayoutSRef m_widget; diff --git a/inc/presenters/MainPage.h b/inc/presenters/MainPage.h index 0ac969e..610b789 100644 --- a/inc/presenters/MainPage.h +++ b/inc/presenters/MainPage.h @@ -22,6 +22,8 @@ #include "ucl/gui/Layout.h" #include "ucl/gui/StyledWidget.h" +#include "ucl/gui/NaviItem.h" + #include "types.h" namespace callui { @@ -50,7 +52,7 @@ namespace callui { const ICallSRef &call); virtual ~MainPage(); - ucl::Result prepare(); + ucl::Result doPrepare(ucl::NaviItem &item); ucl::Result showWindow(); void updateCallMode(); @@ -83,11 +85,6 @@ namespace callui { ucl::Result createIndicatorPresenter(); ucl::Result createDisplayPresenter(); - // Presenter - - virtual void onActivateBy(const DeactivatorInfo &info) final override; - virtual void onDeactivateBy(const DeactivatorInfo &info) final override; - // Page virtual void onBackKey() final override; @@ -104,7 +101,7 @@ namespace callui { ICallSRef m_call; ICallManagerSRef m_cm; - IndicatorSRef m_indicator; + IndicatorPresenterSRef m_indicator; CallInfoPresenterSRef m_callInfoPrs; AcceptRejectPresenterSRef m_acceptRejectPrs; RejectMsgPresenterSRef m_rmPrs; diff --git a/inc/presenters/MoreOptionsPresenter.h b/inc/presenters/MoreOptionsPresenter.h index 62d3bd2..f6ab91a 100644 --- a/inc/presenters/MoreOptionsPresenter.h +++ b/inc/presenters/MoreOptionsPresenter.h @@ -37,11 +37,13 @@ namespace callui { Builder &setCallManager(const ICallManagerSRef &cm); Builder &setSoundManager(const ISoundManagerSRef &sm); Builder &setNaviframe(const ucl::NaviframeSRef &navi); - MoreOptionsPresenterSRef build(ucl::ElmWidget &parent) const; + Builder &setParentWidget(const ucl::ElmWidgetSRef &parentWidget); + MoreOptionsPresenterSRef build(Presenter &parent) const; private: ICallManagerSRef m_cm; ISoundManagerSRef m_sm; ucl::NaviframeSRef m_navi; + ucl::ElmWidgetSRef m_parentWidget; }; public: @@ -56,7 +58,8 @@ namespace callui { const ucl::NaviframeSRef &navi); virtual ~MoreOptionsPresenter(); - ucl::Result prepare(ucl::ElmWidget &parent); + ucl::Result prepare(Presenter &parent, + ucl::ElmWidget &parentWidget); ucl::Result createWidget(ucl::ElmWidget &parent); ucl::Result createPanel(); diff --git a/inc/presenters/Page.h b/inc/presenters/Page.h index 8dfdc77..8c63c6e 100644 --- a/inc/presenters/Page.h +++ b/inc/presenters/Page.h @@ -21,11 +21,13 @@ #include "Presenter.h" +#include "types.h" + namespace callui { class Page : public Presenter { public: - using ExitRequestHandler = ucl::Delegate; + using ExitRequestHandler = ucl::WeakDelegate; public: ucl::Naviframe &getNaviframe(); @@ -48,11 +50,11 @@ namespace callui { protected: Page(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi, - ExitRequestHandler onExitRequest); + const ExitRequestHandler &onExitRequest); virtual ~Page(); - template - ucl::Result prepare(ITEM_FACTORY &&makeItem); + template + ucl::Result prepare(ON_PREPARE &&onPrepare); ucl::NaviItem getItem(); diff --git a/inc/presenters/Page.hpp b/inc/presenters/Page.hpp index 7ee2a56..886f114 100644 --- a/inc/presenters/Page.hpp +++ b/inc/presenters/Page.hpp @@ -18,13 +18,14 @@ namespace callui { - template - inline ucl::Result Page::prepare(ITEM_FACTORY &&makeItem) + template + inline ucl::Result Page::prepare(ON_PREPARE &&onPrepare) { - m_item = makeItem(); - if (!m_item) { - UCL_LOG_RETURN(ucl::RES_FAIL, "m_item is NULL"); - } + UCL_FAIL_RETURN(Presenter::prepare(*m_navi), + "Presenter::prepare() failed!"); + + UCL_FAIL_RETURN(onPrepare(m_item), "onPrepare() failed!"); + return preparePart2(); } @@ -56,7 +57,7 @@ namespace callui { return (m_navi->getBottomItem() == m_item); } - // Non-member functions + // Non-member functions // inline bool isLast(const Page &page) { diff --git a/inc/presenters/Presenter.h b/inc/presenters/Presenter.h index c3db2f4..5bf2b3b 100644 --- a/inc/presenters/Presenter.h +++ b/inc/presenters/Presenter.h @@ -25,36 +25,53 @@ namespace callui { + UCL_DECLARE_REF_ALIASES(Presenter); + class Presenter : public ucl::RefCountAware { public: struct DeactivatorInfo { - void *deactivator; + const void *deactivator; bool isBroadcast; }; public: bool isActive() const; - bool isDeactivatedBy(void *deactivator) const; + bool isDeactivatedBy(const void *deactivator) const; + + void activateBy(const void *deactivator); + void deactivateBy(const void *deactivator); + + void addDeactivatorSource(ucl::Widget &source); + void delDeactivatorSource(ucl::Widget &source); - void activateBy(void *deactivator); - void deactivateBy(void *deactivator); + protected: + enum { + PF_ADD_DEACTIVATOR_SOURCES = 1, + PF_ADD_SELF_EXCEPT = 2, + + PF_PASSIVE = 0, + PF_DEACTIVATOR = (PF_ADD_DEACTIVATOR_SOURCES | PF_ADD_SELF_EXCEPT), + PF_DEFAULT = PF_ADD_DEACTIVATOR_SOURCES + }; protected: Presenter(ucl::IRefCountObj &rc); virtual ~Presenter(); - ucl::Result prepare(ucl::ElmWidget &widget); + ucl::Result prepare(ucl::ElmWidget &widget, int flags = PF_DEFAULT); + ucl::Result prepare(Presenter &parent, int flags = PF_DEFAULT); ucl::Window &getWindow(); + bool isWindowReady() const; - void addDeactivatorSource(ucl::Widget &source); - void addDeactivatorException(void *deactivator); + void addDeactivatorException(const void *deactivator); + void setDeactivatorSink(const ucl::WidgetSRef &sink); - void sendActivateBy(ucl::Widget &sender, void *deactivator); - void sendDeactivateBy(ucl::Widget &sender, void *deactivator); + void sendActivate(ucl::Widget &sender); + void sendDeactivate(ucl::Widget &sender); - void broadcastActivateBy(void *deactivator); - void broadcastDeactivateBy(void *deactivator); + void broadcastActivate(); + void broadcastDeactivate(); virtual void onActivate(); virtual void onDeactivate(); @@ -63,8 +80,9 @@ namespace callui { private: void sendDeactivator(ucl::Widget &sender, - ucl::SmartEvent event, void *deactivator); - void broadcastDeactivator(ucl::SmartEvent event, void *deactivator); + ucl::SmartEvent event, const void *deactivator); + void broadcastDeactivator(ucl::SmartEvent event, + const void *deactivator); void sendDeactivatorInfo(ucl::Widget &sender, ucl::SmartEvent event, const DeactivatorInfo &info); @@ -76,9 +94,13 @@ namespace callui { void onDeactivateBySmart(ucl::Widget &widget, void *eventInfo); private: - std::unordered_set m_deactivatorExceptions; - std::unordered_set m_deactivators; + std::unordered_set m_deactivatorExceptions; + std::unordered_set m_deactivators; ucl::WindowSRef m_window; + ucl::WidgetSRef m_sink; + ucl::WidgetWRef m_parentSink; + bool m_hasBuildInSources; + bool m_isChild; bool m_isPrepared; }; } diff --git a/inc/presenters/RejectMsgPresenter.h b/inc/presenters/RejectMsgPresenter.h index 03eacbd..40cb2ae 100644 --- a/inc/presenters/RejectMsgPresenter.h +++ b/inc/presenters/RejectMsgPresenter.h @@ -35,12 +35,14 @@ namespace callui { Builder &setProvider(const IRejectMsgProviderSRef &provider); Builder &setStateHandler(const RejectMsgStateHandler &handler); Builder &setSelectHandler(const RejectMsgSelectHandler &handler); - RejectMsgPresenterSRef build(ucl::ElmWidget &parent) const; + Builder &setParentWidget(const ucl::ElmWidgetSRef &parentWidget); + RejectMsgPresenterSRef build(Presenter &parent) const; private: IRejectMsgProviderSRef m_provider; RejectMsgStateHandler m_stateHandler; RejectMsgSelectHandler m_selectHandler; + ucl::ElmWidgetSRef m_parentWidget; }; public: @@ -65,7 +67,8 @@ namespace callui { const RejectMsgStateHandler &stateHandler, const RejectMsgSelectHandler &selectHandler); - ucl::Result prepare(ucl::ElmWidget &parent); + ucl::Result prepare(Presenter &parent, + ucl::ElmWidget &parentWidget); ucl::Result createWidget(ucl::ElmWidget &parent); ucl::Result createPanel(); diff --git a/inc/presenters/types.h b/inc/presenters/types.h index 297b4e0..4978b78 100644 --- a/inc/presenters/types.h +++ b/inc/presenters/types.h @@ -58,15 +58,16 @@ namespace callui { }; UCL_DECLARE_REF_ALIASES(Page); + UCL_DECLARE_REF_ALIASES(MainPage); UCL_DECLARE_REF_ALIASES(KeypadPage); UCL_DECLARE_REF_ALIASES(AcceptRejectPresenter); UCL_DECLARE_REF_ALIASES(AcceptDialog); - UCL_DECLARE_REF_ALIASES(Indicator); + UCL_DECLARE_REF_ALIASES(IndicatorPresenter); UCL_DECLARE_REF_ALIASES(CallInfoPresenter); - UCL_DECLARE_REF_ALIASES(CallStatus); + UCL_DECLARE_REF_ALIASES(CallStatusPresenter); UCL_DECLARE_REF_ALIASES(RejectMsgPresenter); diff --git a/src/model/CallManager.cpp b/src/model/CallManager.cpp index 069162a..8c9c7bd 100644 --- a/src/model/CallManager.cpp +++ b/src/model/CallManager.cpp @@ -422,7 +422,8 @@ namespace callui { { if (m_incomingCall) { if (m_slot == SimSlot::UNDEFINED) { - m_slot = slot; + // TODO: need to modify when companion mode will be added + m_slot = SimSlot::GEAR; } if (const auto listener = m_listener.lock()) { listener->onCallEvent(CallEventType::INCOMING); diff --git a/src/model/RejectMsg.cpp b/src/model/RejectMsg.cpp index 6c3165b..c1f6d52 100644 --- a/src/model/RejectMsg.cpp +++ b/src/model/RejectMsg.cpp @@ -68,12 +68,6 @@ namespace callui { // Set message type to SMS reject msg_set_int_value(msgInfo, MSG_MESSAGE_TYPE_INT, MSG_TYPE_SMS_REJECT); - int slotId = convertEnumValueToInt(slot); - DLOG("msg_sms_send_message() Sim slot [%d]", slotId); - // TODO: need to investigate whether this is needed - slotId++; - msg_set_int_value(msgInfo, MSG_MESSAGE_SIM_INDEX_INT, slotId); - // No setting send option msg_set_bool_value(sendOpt, MSG_SEND_OPT_SETTING_BOOL, false); diff --git a/src/model/SoundManager.cpp b/src/model/SoundManager.cpp index 0c45120..85b4c6e 100644 --- a/src/model/SoundManager.cpp +++ b/src/model/SoundManager.cpp @@ -54,11 +54,25 @@ namespace callui { namespace { namespace impl { if (!device) { UCL_FAIL_BREAK(res, "device is NULL"); } + sound_manager_get_device_type(device, &type); if (searchType == type) { DLOG("Bluetooth voice device found"); count++; } + + // For debug only + int id; + char *name; + sound_device_io_direction_e direction; + sound_manager_get_device_id(device, &id); + sound_manager_get_device_name(device, &name); + sound_manager_get_device_io_direction(device, &direction); + DLOG("===================="); + DLOG("Device ID [%d]", id); + DLOG("Device name [%s]", name); + DLOG("Device IO direction [%d]", direction); + DLOG("Device type [%d]", type); } sound_manager_free_device_list(deviceList); deviceCount = count; @@ -96,6 +110,8 @@ namespace callui { void SoundManager::audioStateChangedCb(cm_audio_state_type_e state) { + DLOG(); + if (state == CM_AUDIO_STATE_NONE_E) { ILOG("Ignore. Unhandled state [%d]", state); return; @@ -105,6 +121,8 @@ namespace callui { void SoundManager::muteStateChangedCb(cm_mute_status_e status) { + DLOG(); + m_muteStateEvent.dispatch(status == CM_MUTE_STATUS_ON); } diff --git a/src/presenters/AcceptDialog.cpp b/src/presenters/AcceptDialog.cpp index 668b5c0..79df682 100644 --- a/src/presenters/AcceptDialog.cpp +++ b/src/presenters/AcceptDialog.cpp @@ -87,7 +87,7 @@ namespace callui { Result AcceptDialog::prepare(ElmWidget &parent) { - FAIL_RETURN(Presenter::prepare(parent), + FAIL_RETURN(Presenter::prepare(parent, PF_DEACTIVATOR), "Presenter::prepare() failed!"); FAIL_RETURN(createPopup(parent, impl::POPUP_STYLE), @@ -99,7 +99,7 @@ namespace callui { m_rc->ref(); addDeactivatorException(this); - broadcastDeactivateBy(this); + broadcastDeactivate(); return RES_OK; } @@ -282,7 +282,7 @@ namespace callui { CALLBACK_A(AcceptDialog::onPopupHWBackKey)); deactivateBy(m_popup.get()); - broadcastActivateBy(this); + broadcastActivate(); m_popup.reset(); diff --git a/src/presenters/AcceptRejectPresenter.cpp b/src/presenters/AcceptRejectPresenter.cpp index 5a23249..97d00ac 100644 --- a/src/presenters/AcceptRejectPresenter.cpp +++ b/src/presenters/AcceptRejectPresenter.cpp @@ -65,22 +65,38 @@ namespace callui { { } - AcceptRejectPresenter::Builder &AcceptRejectPresenter::Builder::setIncomingCall(const IIncomingCallSRef &call) + AcceptRejectPresenter::Builder & + AcceptRejectPresenter::Builder::setIncomingCall(const IIncomingCallSRef &call) { m_call = call; return *this; } - AcceptRejectPresenter::Builder &AcceptRejectPresenter::Builder::setAvailableCallsFlag(CallMask mask) + AcceptRejectPresenter::Builder & + AcceptRejectPresenter::Builder::setAvailableCallsFlag(CallMask mask) { m_callMask = mask; return *this; } - AcceptRejectPresenterSRef AcceptRejectPresenter::Builder::build(ElmWidget &parent) const + AcceptRejectPresenter::Builder & + AcceptRejectPresenter::Builder::setParentWidget( + const ElmWidgetSRef &parentWidget) { + m_parentWidget = parentWidget; + return *this; + } + + AcceptRejectPresenterSRef + AcceptRejectPresenter::Builder::build(Presenter &parent) const + { + if (!m_parentWidget) { + LOG_RETURN_VALUE(RES_FAIL, {}, "m_parentWidget is NULL"); + } + auto result = makeShared(m_call, m_callMask); - FAIL_RETURN_VALUE(result->prepare(parent), {}, "result->prepare() failed!"); + FAIL_RETURN_VALUE(result->prepare(parent, *m_parentWidget), + {}, "result->prepare() failed!"); return result; } @@ -105,12 +121,13 @@ namespace callui { CALLBACK_A(AcceptRejectPresenter::onRotaryEvent), this); } - Result AcceptRejectPresenter::prepare(ElmWidget &parent) + Result AcceptRejectPresenter::prepare(Presenter &parent, + ElmWidget &parentWidget) { FAIL_RETURN(Presenter::prepare(parent), "Presenter::prepare() failed!"); - FAIL_RETURN(createWidget(parent), + FAIL_RETURN(createWidget(parentWidget), "createWidget() failed!"); FAIL_RETURN(createAcceptBtn(), @@ -238,8 +255,8 @@ namespace callui { return EINA_TRUE; } - StyledWidgetSRef AcceptRejectPresenter::createBtn(const ucl::ElmStyle &style, - const ucl::EdjePart &part) + StyledWidgetSRef AcceptRejectPresenter::createBtn(const ElmStyle &style, + const EdjePart &part) { Evas_Object *const btnEo = elm_button_add(*m_widget); if (!btnEo) { diff --git a/src/presenters/AccessoryPresenter.cpp b/src/presenters/AccessoryPresenter.cpp index 0e33872..d4c667d 100644 --- a/src/presenters/AccessoryPresenter.cpp +++ b/src/presenters/AccessoryPresenter.cpp @@ -52,26 +52,37 @@ namespace callui { { } - AccessoryPresenter::Builder &AccessoryPresenter::Builder::setSoundManager(const ISoundManagerSRef &sm) + AccessoryPresenter::Builder & + AccessoryPresenter::Builder::setSoundManager(const ISoundManagerSRef &sm) { m_sm = sm; return *this; } - AccessoryPresenter::Builder &AccessoryPresenter::Builder::setMuteControlDisabled(bool isDisabled) + AccessoryPresenter::Builder & + AccessoryPresenter::Builder::setMuteControlDisabled(bool isDisabled) { m_isMuteControlDisabled = isDisabled; return *this; } - AccessoryPresenterSRef AccessoryPresenter::Builder::build(ElmWidget &parent) const + AccessoryPresenter::Builder & + AccessoryPresenter::Builder::setParentWidget( + const ElmWidgetSRef &parentWidget) { - if (!m_sm) { - LOG_RETURN_VALUE(RES_FAIL, {}, "Sound manager is NULL"); + m_parentWidget = parentWidget; + return *this; + } + + AccessoryPresenterSRef + AccessoryPresenter::Builder::build(Presenter &parent) const + { + if (!m_sm || !m_parentWidget) { + LOG_RETURN_VALUE(RES_FAIL, {}, "Main params are not set"); } auto result = makeShared(m_sm); - FAIL_RETURN_VALUE(result->prepare(parent, m_isMuteControlDisabled), + FAIL_RETURN_VALUE(result->prepare(parent, *m_parentWidget, m_isMuteControlDisabled), {}, "result->prepare() failed!"); return result; } @@ -91,11 +102,13 @@ namespace callui { unregisterCallbacks(); } - Result AccessoryPresenter::prepare(ElmWidget &parent, bool isMuteControlDisabled) + Result AccessoryPresenter::prepare(Presenter &parent, + ElmWidget &parentWidget, + bool isMuteControlDisabled) { FAIL_RETURN(Presenter::prepare(parent), "Presenter::prepare() failed"); - FAIL_RETURN(createWidget(parent), "createWidget() failed"); + FAIL_RETURN(createWidget(parentWidget), "createWidget() failed"); FAIL_RETURN(createSlider(), "createSlider() failed"); @@ -227,12 +240,22 @@ namespace callui { void AccessoryPresenter::onVolumeBtnClicked(Widget &widget, void *eventInfo) { + if (!isActive()) { + ILOG("Presenter is not active. Ignore"); + return; + } + show(*m_vc); startVCTimer(); } void AccessoryPresenter::onMuteBtnClicked(Widget &widget, void *eventInfo) { + if (!isActive()) { + ILOG("Presenter is not active. Ignore"); + return; + } + m_sm->setMuteState(!m_sm->getMuteState()); } @@ -322,6 +345,10 @@ namespace callui { void AccessoryPresenter::onVolumeControlEventCb(VolumeControlEvent event) { + if (!isActive()) { + LOG_RETURN_VOID(RES_OK, "Presenter is not active. Ignore"); + } + if (!m_vcTimer) { DLOG("Ignore as control is hidden"); return; diff --git a/src/presenters/CallInfoPresenter.cpp b/src/presenters/CallInfoPresenter.cpp index a4bbe98..cfccf52 100644 --- a/src/presenters/CallInfoPresenter.cpp +++ b/src/presenters/CallInfoPresenter.cpp @@ -14,12 +14,11 @@ * limitations under the License. */ +#include "presenters/CallStatusPresenter.h" #include "presenters/CallInfoPresenter.h" #include "ucl/gui/Window.h" -#include "presenters/CallStatus.h" - #include "model/ICallManager.h" #include "model/IIncomingCall.h" #include "model/IActiveCall.h" @@ -100,27 +99,39 @@ namespace callui { { } - CallInfoPresenter::Builder &CallInfoPresenter::Builder::setCallManager(const ICallManagerSRef &cm) + CallInfoPresenter::Builder & + CallInfoPresenter::Builder::setCallManager(const ICallManagerSRef &cm) { m_cm = cm; return *this; } - CallInfoPresenter::Builder &CallInfoPresenter::Builder::setMode(CallMode mode) + CallInfoPresenter::Builder & + CallInfoPresenter::Builder::setMode(CallMode mode) { m_mode = mode; return *this; } - CallInfoPresenterSRef CallInfoPresenter::Builder::build(ElmWidget &parent) const + CallInfoPresenter::Builder & + CallInfoPresenter::Builder::setParentWidget( + const ucl::ElmWidgetSRef &parentWidget) + { + m_parentWidget = parentWidget; + return *this; + } + + CallInfoPresenterSRef + CallInfoPresenter::Builder::build(Presenter &parent) const { - if (m_mode == CallMode::UNDEFINED || !m_cm) { - LOG_RETURN_VALUE(RES_FAIL, {}, "Not all params are set"); + if (m_mode == CallMode::UNDEFINED || !m_cm || !m_parentWidget) { + LOG_RETURN_VALUE(RES_FAIL, {}, "Main params are are set"); } auto result = makeShared(m_cm, m_mode); - FAIL_RETURN_VALUE(result->prepare(parent), {}, + FAIL_RETURN_VALUE(result->prepare(parent, *m_parentWidget), {}, "result->prepare() failed!"); + return result; } @@ -139,15 +150,18 @@ namespace callui { { } - Result CallInfoPresenter::prepare(ElmWidget &parent) + Result CallInfoPresenter::prepare(Presenter &parent, + ElmWidget &parentWidget) { - FAIL_RETURN(Presenter::prepare(parent), + FAIL_RETURN(Presenter::prepare(parent, PF_PASSIVE), "Presenter::prepare() failed!"); - FAIL_RETURN(createWidget(parent), + m_parent = asWeak(parent); + + FAIL_RETURN(createWidget(parentWidget), "createWidget() failed!"); - FAIL_RETURN(createCallStatus(), + FAIL_RETURN(createCallStatus(parent), "createCallStatus() failed!"); FAIL_RETURN(update(), "update() failed!"); @@ -562,7 +576,7 @@ namespace callui { return RES_OK; } - Result CallInfoPresenter::createCallStatus() + Result CallInfoPresenter::createCallStatus(Presenter &parent) { ICallInfoWCRef callInfo; bool isOnHold = false; @@ -592,11 +606,12 @@ namespace callui { break; } - m_callStatus = CallStatus::Builder().setLayout(m_widget). + m_callStatus = CallStatusPresenter::Builder(). + setLayout(m_widget). setMode(m_mode). setCallInfo(callInfo). setCallHoldState(isOnHold). - build(); + build(parent); if (!m_callStatus) { LOG_RETURN(RES_FAIL, "CallStatus::build() failed!"); @@ -614,7 +629,8 @@ namespace callui { FAIL_RETURN(updateMainTxt(), "diplayMainTxt() failed!"); if (m_needModifyCallStatus) { - return createCallStatus(); + if (const auto parent = m_parent.lock()) + return createCallStatus(*parent); } return RES_OK; diff --git a/src/presenters/CallStatus.cpp b/src/presenters/CallStatusPresenter.cpp similarity index 75% rename from src/presenters/CallStatus.cpp rename to src/presenters/CallStatusPresenter.cpp index 73d807b..6274d89 100644 --- a/src/presenters/CallStatus.cpp +++ b/src/presenters/CallStatusPresenter.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "presenters/CallStatus.h" +#include "presenters/CallStatusPresenter.h" #include "model/ICallInfo.h" @@ -43,56 +43,61 @@ namespace callui { using namespace ucl; - CallStatus::Builder::Builder(): + CallStatusPresenter::Builder::Builder(): m_mode(CallMode::UNDEFINED), m_isOnHold(false) { } - CallStatus::Builder::~Builder() + CallStatusPresenter::Builder::~Builder() { } - CallStatus::Builder &CallStatus::Builder::setMode(CallMode mode) + CallStatusPresenter::Builder & + CallStatusPresenter::Builder::setMode(CallMode mode) { m_mode = mode; return *this; } - CallStatus::Builder &CallStatus::Builder::setCallInfo(const ICallInfoWCRef &info) + CallStatusPresenter::Builder & + CallStatusPresenter::Builder::setCallInfo(const ICallInfoWCRef &info) { m_info = info; return *this; } - CallStatus::Builder &CallStatus::Builder::setCallHoldState(bool isOnHold) + CallStatusPresenter::Builder & + CallStatusPresenter::Builder::setCallHoldState(bool isOnHold) { m_isOnHold = isOnHold; return *this; } - CallStatus::Builder &CallStatus::Builder::setLayout(const LayoutSRef &layout) + CallStatusPresenter::Builder & + CallStatusPresenter::Builder::setLayout(const LayoutSRef &layout) { m_ly = layout; return *this; } - CallStatusSRef CallStatus::Builder::build() const + CallStatusPresenterSRef + CallStatusPresenter::Builder::build(Presenter &parent) const { if (m_mode == CallMode::UNDEFINED || !m_ly) { LOG_RETURN_VALUE(RES_FAIL, {}, "Not all params are set"); } - auto result = makeShared(m_ly, m_mode, + auto result = makeShared(m_ly, m_mode, m_info, m_isOnHold); - FAIL_RETURN_VALUE(result->prepare(), {}, + FAIL_RETURN_VALUE(result->prepare(parent), {}, "result->prepare() failed!"); return result; } - CallStatus::CallStatus(IRefCountObj &rc, + CallStatusPresenter::CallStatusPresenter(IRefCountObj &rc, const LayoutSRef &layout, CallMode mode, const ICallInfoWCRef &info, @@ -108,7 +113,7 @@ namespace callui { { } - CallStatus::~CallStatus() + CallStatusPresenter::~CallStatusPresenter() { m_ly.reset(); if (m_timer) { @@ -117,8 +122,11 @@ namespace callui { } } - Result CallStatus::prepare() + Result CallStatusPresenter::prepare(Presenter &parent) { + FAIL_RETURN(Presenter::prepare(parent, PF_PASSIVE), + "Presenter::prepare() failed!"); + m_ly->emit(impl::SIGN_RESET, impl::SIGN_SRC_DOT); m_ly->setText("", impl::PART_TXT_TEXT_INFO); @@ -135,7 +143,7 @@ namespace callui { return RES_OK; } - Result CallStatus::processIncomingMode() + Result CallStatusPresenter::processIncomingMode() { m_ly->setText(STR_INCOMING_CALL, impl::PART_TXT_TEXT_INFO); @@ -145,7 +153,7 @@ namespace callui { return RES_OK; } - Result CallStatus::processOutgoingMode() + Result CallStatusPresenter::processOutgoingMode() { m_ly->setText(STR_DIALING_CALL, impl::PART_TXT_TEXT_INFO); @@ -155,7 +163,7 @@ namespace callui { return RES_OK; } - Eina_Bool CallStatus::onCallDurationTimerCb() + Eina_Bool CallStatusPresenter::onCallDurationTimerCb() { const auto info = m_info.lock(); if (!info) { @@ -173,7 +181,7 @@ namespace callui { return ECORE_CALLBACK_RENEW; } - Result CallStatus::processDuringMode() + Result CallStatusPresenter::processDuringMode() { if (m_isOnHold) { @@ -190,7 +198,7 @@ namespace callui { } m_timer = ecore_timer_add(impl::CALL_DURATION_TIMER_INTERVAL, - CALLBACK_B(CallStatus::onCallDurationTimerCb), + CALLBACK_B(CallStatusPresenter::onCallDurationTimerCb), this); if (!m_timer) { @@ -200,7 +208,7 @@ namespace callui { return RES_OK; } - Eina_Bool CallStatus::onBlinkingTimerCb() + Eina_Bool CallStatusPresenter::onBlinkingTimerCb() { if ((m_blinkCount % 2) == 0) { setCallDuration(m_duration, *m_ly, impl::PART_TXT_TEXT_INFO); @@ -218,7 +226,7 @@ namespace callui { return ECORE_CALLBACK_RENEW; } - Result CallStatus::processEndMode() + Result CallStatusPresenter::processEndMode() { if (m_timer) { ecore_timer_del(m_timer); @@ -230,7 +238,7 @@ namespace callui { } m_timer = ecore_timer_add(impl::END_CALL_BLINKING_TIMER_INTERVAL, - CALLBACK_B(CallStatus::onBlinkingTimerCb), this); + CALLBACK_B(CallStatusPresenter::onBlinkingTimerCb), this); if (!m_timer) { LOG_RETURN(RES_FAIL, "m_timer is NULL"); } diff --git a/src/presenters/Indicator.cpp b/src/presenters/IndicatorPresenter.cpp similarity index 85% rename from src/presenters/Indicator.cpp rename to src/presenters/IndicatorPresenter.cpp index cda01fc..7ec1d57 100644 --- a/src/presenters/Indicator.cpp +++ b/src/presenters/IndicatorPresenter.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "presenters/Indicator.h" +#include "presenters/IndicatorPresenter.h" #include @@ -161,50 +161,60 @@ namespace callui { using namespace ucl; - Indicator::Builder::Builder() + IndicatorPresenter::Builder::Builder() { } - Indicator::Builder::~Builder() + IndicatorPresenter::Builder::~Builder() { } - Indicator::Builder &Indicator::Builder::setIndicatorStateProvider( + IndicatorPresenter::Builder & + IndicatorPresenter::Builder::setIndicatorStateProvider( const IIndicatorStateProviderSRef &provider) { m_provider = provider; return *this; } - IndicatorSRef Indicator::Builder::build(ElmWidget &parent) const + IndicatorPresenter::Builder & + IndicatorPresenter::Builder::setParentWidget(const ucl::ElmWidgetSRef &parentWidget) { - if (!m_provider) { - LOG_RETURN_VALUE(RES_FAIL, {}, "Not all params are set"); + m_parentWidget = parentWidget; + return *this; + } + + IndicatorPresenterSRef + IndicatorPresenter::Builder::build(Presenter &parent) const + { + if (!m_provider || !m_parentWidget) { + LOG_RETURN_VALUE(RES_FAIL, {}, "Main params are not set"); } - auto result = makeShared(m_provider); - FAIL_RETURN_VALUE(result->prepare(parent), {}, + auto result = makeShared(m_provider); + FAIL_RETURN_VALUE(result->prepare(parent, *m_parentWidget), {}, "result->prepare() failed!"); return result; } - Indicator::Indicator(IRefCountObj &rc, + IndicatorPresenter::IndicatorPresenter(IRefCountObj &rc, const IIndicatorStateProviderSRef &provider): Presenter(rc), m_provider(provider) { } - Indicator::~Indicator() + IndicatorPresenter::~IndicatorPresenter() { } - Result Indicator::prepare(ElmWidget &parent) + Result IndicatorPresenter::prepare(Presenter &parent, + ElmWidget &parentWidget) { - FAIL_RETURN(Presenter::prepare(parent), + FAIL_RETURN(Presenter::prepare(parent, PF_PASSIVE), "Presenter::prepare() failed!"); - FAIL_RETURN(createWidget(parent), + FAIL_RETURN(createWidget(parentWidget), "createWidget() failed!"); FAIL_RETURN(createConnectionLayout(), @@ -227,7 +237,7 @@ namespace callui { return RES_OK; } - Result Indicator::createWidget(ElmWidget &parent) + Result IndicatorPresenter::createWidget(ElmWidget &parent) { m_widget = Layout::Builder(). setTheme(impl::LAYOUT_INDICATOR_WIDGET). @@ -240,7 +250,7 @@ namespace callui { return RES_OK; } - Result Indicator::createConnectionLayout() + Result IndicatorPresenter::createConnectionLayout() { m_connLayout = Layout::Builder(). setTheme(impl::LAYOUT_CONNECTION). @@ -255,7 +265,7 @@ namespace callui { return RES_OK; } - Result Indicator::createRssiLayout() + Result IndicatorPresenter::createRssiLayout() { m_rssiLayout = Layout::Builder(). setTheme(impl::LAYOUT_RSSI). @@ -270,7 +280,7 @@ namespace callui { return RES_OK; } - Result Indicator::createBatteryLayout() + Result IndicatorPresenter::createBatteryLayout() { m_batteryLayout = Layout::Builder(). setTheme(impl::LAYOUT_BATTERY). @@ -285,7 +295,7 @@ namespace callui { return RES_OK; } - Result Indicator::createSimLayout() + Result IndicatorPresenter::createSimLayout() { m_simLayout = Layout::Builder(). setTheme(impl::LAYOUT_SIM). @@ -300,7 +310,7 @@ namespace callui { return RES_OK; } - Result Indicator::createHdVoiceLayout() + Result IndicatorPresenter::createHdVoiceLayout() { m_hdCallLayout = Layout::Builder(). setTheme(impl::LAYOUT_HD_CALL). @@ -315,7 +325,7 @@ namespace callui { return RES_OK; } - void Indicator::updateConnectionState() + void IndicatorPresenter::updateConnectionState() { auto state = m_provider->getState(IndicatorProperty::NW_CONNECTION); @@ -326,7 +336,7 @@ namespace callui { getPacketDirection(state))); } - void Indicator::updateRssiState() + void IndicatorPresenter::updateRssiState() { auto state = m_provider->getState(IndicatorProperty::RSSI); @@ -335,7 +345,7 @@ namespace callui { getRoamingState(state))); } - void Indicator::updateBatteryState() + void IndicatorPresenter::updateBatteryState() { auto state = m_provider->getState(IndicatorProperty::BATTERY); auto battState = getBatteryState(state); @@ -348,7 +358,7 @@ namespace callui { (battState == BatteryState::UNKNOWN))); } - void Indicator::updateSimState() + void IndicatorPresenter::updateSimState() { auto state = m_provider->getState(IndicatorProperty::SIM_SLOT); @@ -357,19 +367,19 @@ namespace callui { getSimForwardState(state))); } - void Indicator::updateHdVoiceState() + void IndicatorPresenter::updateHdVoiceState() { auto state = m_provider->getState(IndicatorProperty::HD_VOICE); m_hdCallLayout->emit(EdjeSignal{ (getHDVoiceState(state) ? "hd_voice_show" : "hd_voice_hide")}); } - Widget &Indicator::getWidget() + Widget &IndicatorPresenter::getWidget() { return *m_widget; } - void Indicator::onStateChanged(IndicatorProperty property) + void IndicatorPresenter::onStateChanged(IndicatorProperty property) { switch (property) { case IndicatorProperty::NW_CONNECTION: diff --git a/src/presenters/Instance.cpp b/src/presenters/Instance.cpp index b3f815a..8da8645 100644 --- a/src/presenters/Instance.cpp +++ b/src/presenters/Instance.cpp @@ -119,7 +119,8 @@ namespace callui { auto page = MainPage::Builder(). setNaviframe(m_navi). setCall(m_call). - build(DELEGATE(Instance::onPageExitRequest, this)); + build(WEAK_DELEGATE(Instance::onPageExitRequest, + asWeak(this))); if (!page) { ELOG("Create page failed! Exit application"); m_context->exitApp(); diff --git a/src/presenters/KeypadPage.cpp b/src/presenters/KeypadPage.cpp index 791efd4..e1460b3 100644 --- a/src/presenters/KeypadPage.cpp +++ b/src/presenters/KeypadPage.cpp @@ -62,8 +62,11 @@ namespace callui { auto result = makeShared(m_navi, onExitRequest); - FAIL_RETURN_VALUE(result->prepare(), {}, - "result->prepare() failed!"); + FAIL_RETURN_VALUE(result->prepare([&result](NaviItem &item) + { + return result->doPrepare(item); + }), + {}, "result->prepare() failed!"); return result; } @@ -81,7 +84,7 @@ namespace callui { { } - Result KeypadPage::prepare() + Result KeypadPage::doPrepare(NaviItem &item) { m_widget = Layout::Builder(). setTheme(impl::LAYOUT_KEYPAD_WIDGET). @@ -91,9 +94,11 @@ namespace callui { LOG_RETURN(RES_FAIL, "Layout::build() failed!"); } - return Page::prepare([this]() { - return getNaviframe().push(*m_widget); - }); + item = getNaviframe().push(*m_widget); + if (!item) { + LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); + } + return RES_OK; } } diff --git a/src/presenters/MainPage.cpp b/src/presenters/MainPage.cpp index d63715e..ea7683b 100644 --- a/src/presenters/MainPage.cpp +++ b/src/presenters/MainPage.cpp @@ -29,7 +29,7 @@ #include "model/ICallInfo.h" #include "model/IRejectMsgProvider.h" -#include "presenters/Indicator.h" +#include "presenters/IndicatorPresenter.h" #include "presenters/AcceptRejectPresenter.h" #include "presenters/CallInfoPresenter.h" #include "presenters/RejectMsgPresenter.h" @@ -114,8 +114,11 @@ namespace callui { auto result = makeShared( m_navi, handler, m_call); - FAIL_RETURN_VALUE(result->prepare(), {}, - "result->prepare() failed!"); + FAIL_RETURN_VALUE(result->prepare([&result](NaviItem &item) + { + return result->doPrepare(item); + }), + {}, "result->prepare() failed!"); return result; } @@ -138,7 +141,7 @@ namespace callui { { } - Result MainPage::prepare() + Result MainPage::doPrepare(NaviItem &item) { m_cm = m_call->getCallManager(); if (!m_cm) { @@ -156,47 +159,12 @@ namespace callui { win->addEventHandler(WIN_POWER_KEY_UP_EVENT, WEAK_DELEGATE( MainPage::onPowerKeyUp, asWeak(*this))); - return Page::prepare([this]() { - return getNaviframe().push(*m_widget); - }); - } - - void MainPage::onActivateBy(const DeactivatorInfo &info) - { - if (info.isBroadcast) { - return; - } - - if (m_rmPrs) { - m_rmPrs->activateBy(info.deactivator); - } - - if (m_acceptRejectPrs) { - m_acceptRejectPrs->activateBy(info.deactivator); - } - - if (m_accessoryPrs) { - m_accessoryPrs->activateBy(info.deactivator); - } - } - - void MainPage::onDeactivateBy(const DeactivatorInfo &info) - { - if (info.isBroadcast) { - return; + item = getNaviframe().push(*m_widget); + if (!item) { + LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); } - if (m_rmPrs) { - m_rmPrs->deactivateBy(info.deactivator); - } - - if (m_acceptRejectPrs) { - m_acceptRejectPrs->deactivateBy(info.deactivator); - } - - if (m_accessoryPrs) { - m_accessoryPrs->deactivateBy(info.deactivator); - } + return RES_OK; } void MainPage::processKeyPress() @@ -476,15 +444,18 @@ namespace callui { LOG_RETURN(RES_FAIL, "Layout::build() failed!"); } + setDeactivatorSink(m_widget); + return RES_OK; } Result MainPage::createIndicatorPresenter() { - m_indicator = Indicator::Builder(). + m_indicator = IndicatorPresenter::Builder(). setIndicatorStateProvider( m_call->getIndicatorStateProvider()). - build(*m_widget); + setParentWidget(m_widget). + build(*this); if (!m_indicator) { LOG_RETURN(RES_FAIL, "Indicator::build() failed!"); @@ -525,7 +496,8 @@ namespace callui { m_accessoryPrs = AccessoryPresenter::Builder(). setMuteControlDisabled(detectMuteControlDisableState()). setSoundManager(m_call->getSoundManager()). - build(*m_widget); + setParentWidget(m_widget). + build(*this); if (!m_accessoryPrs) { LOG_RETURN(RES_FAIL, @@ -550,7 +522,8 @@ namespace callui { setCallManager(m_cm). setSoundManager(m_call->getSoundManager()). setNaviframe(asShared(getNaviframe())). - build(*m_widget); + setParentWidget(m_widget). + build(*this); if (!m_moreOptionsPrs) { LOG_RETURN(RES_FAIL, @@ -559,7 +532,6 @@ namespace callui { m_widget->setContent(m_moreOptionsPrs->getWidget(), impl::PART_SWL_MORE_OPTION); - addDeactivatorSource(m_moreOptionsPrs->getWidget()); return RES_OK; } @@ -574,7 +546,8 @@ namespace callui { m_acceptRejectPrs = AcceptRejectPresenter::Builder(). setIncomingCall(m_cm->getIncomingCall()). setAvailableCallsFlag(m_cm->getAvailableCalls()). - build(*m_widget); + setParentWidget(m_widget). + build(*this); if (!m_acceptRejectPrs) { LOG_RETURN(RES_FAIL, @@ -605,13 +578,12 @@ namespace callui { { m_rmPrs = RejectMsgPresenter::Builder(). setProvider(provider). - setStateHandler( - WEAK_DELEGATE(MainPage::RejectMsgStateCb, - asWeak(*this))). - setSelectHandler( - WEAK_DELEGATE(MainPage::RejectMsgSelectCb, - asWeak(*this))). - build(*m_widget); + setStateHandler(WEAK_DELEGATE(MainPage::RejectMsgStateCb, + asWeak(*this))). + setSelectHandler(WEAK_DELEGATE(MainPage::RejectMsgSelectCb, + asWeak(*this))). + setParentWidget(m_widget). + build(*this); if (!m_rmPrs) { LOG_RETURN(RES_FAIL, @@ -620,7 +592,6 @@ namespace callui { m_widget->setContent(m_rmPrs->getWidget().getEo(), impl::PART_SWL_OVERLAY); - addDeactivatorSource(m_rmPrs->getWidget()); return RES_OK; } @@ -634,7 +605,8 @@ namespace callui { m_callInfoPrs = CallInfoPresenter::Builder(). setCallManager(m_cm). setMode(mode). - build(*m_widget); + setParentWidget(m_widget). + build(*this); if (!m_callInfoPrs) { LOG_RETURN(RES_FAIL, "CallerInfo::build() failed!"); diff --git a/src/presenters/MoreOptionsPresenter.cpp b/src/presenters/MoreOptionsPresenter.cpp index 75e7b39..91b3ee6 100644 --- a/src/presenters/MoreOptionsPresenter.cpp +++ b/src/presenters/MoreOptionsPresenter.cpp @@ -96,15 +96,23 @@ namespace callui { return *this; } + MoreOptionsPresenter::Builder & + MoreOptionsPresenter::Builder::setParentWidget( + const ElmWidgetSRef &parentWidget) + { + m_parentWidget = parentWidget; + return *this; + } + MoreOptionsPresenterSRef - MoreOptionsPresenter::Builder::build(ElmWidget &parent) const + MoreOptionsPresenter::Builder::build(Presenter &parent) const { - if (!m_cm || !m_sm || !m_navi) { + if (!m_cm || !m_sm || !m_navi || !m_parentWidget) { LOG_RETURN_VALUE(RES_FAIL, {}, "Main params are not set"); } auto result = makeShared(m_cm, m_sm, m_navi); - FAIL_RETURN_VALUE(result->prepare(parent), {}, + FAIL_RETURN_VALUE(result->prepare(parent, *m_parentWidget), {}, "result->prepare() failed!"); return result; @@ -132,7 +140,7 @@ namespace callui { eext_object_event_callback_del(*m_widget, EEXT_CALLBACK_BACK, CALLBACK_A(MoreOptionsPresenter::onBackKey)); - sendActivateBy(*m_widget, this); + sendActivate(*m_widget); } m_sm->removeAudioStateHandler(DELEGATE( @@ -143,11 +151,13 @@ namespace callui { } } - Result MoreOptionsPresenter::prepare(ElmWidget &parent) + Result MoreOptionsPresenter::prepare(Presenter &parent, + ElmWidget &parentWidget) { - FAIL_RETURN(Presenter::prepare(parent), "Presenter::prepare() failed!"); + FAIL_RETURN(Presenter::prepare(parent, PF_DEACTIVATOR), + "Presenter::prepare() failed!"); - FAIL_RETURN(createWidget(parent), "createWidget() failed!"); + FAIL_RETURN(createWidget(parentWidget), "createWidget() failed!"); FAIL_RETURN(createPanel(), "createPanel() failed!"); @@ -160,7 +170,9 @@ namespace callui { update(); - addDeactivatorException(this); + deactivateBy(m_widget.get()); + + parent.addDeactivatorSource(*m_widget); return RES_OK; } @@ -374,8 +386,9 @@ namespace callui { } else { LOG_RETURN_VOID(RES_FAIL, "Naviframe is NULL"); } - m_keypad = builder.build(DELEGATE( - MoreOptionsPresenter::onPageExitRequest, this)); + m_keypad = builder.build( + WEAK_DELEGATE(MoreOptionsPresenter::onPageExitRequest, + asWeak(this))); } void MoreOptionsPresenter::onPageExitRequest(Page &page) @@ -428,7 +441,7 @@ namespace callui { CALLBACK_A(MoreOptionsPresenter::onBackKey), this); const auto keepAliver = asShared(*this); - sendDeactivateBy(*m_widget, this); + sendDeactivate(*m_widget); activateBy(m_widget.get()); } @@ -441,7 +454,7 @@ namespace callui { const auto keepAliver = asShared(*this); deactivateBy(m_widget.get()); - sendActivateBy(*m_widget, this); + sendActivate(*m_widget); } void MoreOptionsPresenter::onBackKey(Evas_Object *obj, void *eventInfo) diff --git a/src/presenters/Page.cpp b/src/presenters/Page.cpp index b36d41e..8695f63 100644 --- a/src/presenters/Page.cpp +++ b/src/presenters/Page.cpp @@ -20,8 +20,6 @@ namespace callui { namespace { namespace impl { - using namespace ucl; - constexpr SmartEvent TOP_PAGE_CHANGED {"ucl,top,page,changed"}; }}} @@ -30,7 +28,7 @@ namespace callui { using namespace ucl; Page::Page(IRefCountObj &rc, const NaviframeSRef &navi, - const ExitRequestHandler onExitRequest) : + const ExitRequestHandler &onExitRequest) : Presenter(rc), m_navi(navi), m_onExitRequest(onExitRequest) @@ -47,8 +45,9 @@ namespace callui { Result Page::preparePart2() { - FAIL_RETURN(Presenter::prepare(*m_navi), - "Presenter::prepare() failed!"); + if (!m_item) { + UCL_LOG_RETURN(ucl::RES_FAIL, "m_item is NULL"); + } Evas_Object *content = m_item.getContent(); if (!content) { @@ -97,7 +96,7 @@ namespace callui { void Page::exit() { - if (isAtTop() && !isAtBottom()) { + if (isAtTop() && !isAtBottom() && !m_navi->isInTransition()) { m_navi->pop(); m_item = nullptr; } else { @@ -146,7 +145,12 @@ namespace callui { void Page::requestExit() { - m_onExitRequest(*this); + if (m_onExitRequest) { + m_onExitRequest(*this); + } else { + WLOG("m_onExitRequest is NULL"); + exit(); + } } void Page::updateActiveState() diff --git a/src/presenters/Presenter.cpp b/src/presenters/Presenter.cpp index 6b9503c..b17f5cd 100644 --- a/src/presenters/Presenter.cpp +++ b/src/presenters/Presenter.cpp @@ -20,8 +20,6 @@ namespace callui { namespace { namespace impl { - using namespace ucl; - constexpr SmartEvent ACTIVATE_BY {"callui,activate,by"}; constexpr SmartEvent DEACTIVATE_BY {"callui,deactivate,by"}; }}} @@ -32,42 +30,88 @@ namespace callui { Presenter::Presenter(IRefCountObj &rc) : RefCountAware(&rc), + m_hasBuildInSources(false), + m_isChild(false), m_isPrepared(false) { } Presenter::~Presenter() { + if (m_hasBuildInSources) { + if (m_isChild) { + if (const auto parentSink = m_parentSink.lock()) { + delDeactivatorSource(*parentSink); + } + } else if (m_window) { + delDeactivatorSource(*m_window); + } + } } - Result Presenter::prepare(ElmWidget &widget) + Result Presenter::prepare(ElmWidget &widget, const int flags) { m_window = asShared(widget.getWindow()); if (!m_window) { LOG_RETURN(RES_FAIL, "m_window is NULL!"); } - addDeactivatorSource(*m_window); + if (flags & PF_ADD_DEACTIVATOR_SOURCES) { + addDeactivatorSource(*m_window); + m_hasBuildInSources = true; + } + + if (flags & PF_ADD_SELF_EXCEPT) { + addDeactivatorException(m_rc->getObjPtr()); + } m_isPrepared = true; return RES_OK; } + Result Presenter::prepare(Presenter &parent, const int flags) + { + if (!parent.m_sink) { + LOG_RETURN(RES_FAIL, "parent.m_sink is NULL!"); + } + + for (auto deactivator: parent.m_deactivators) { + if (m_deactivatorExceptions.find(deactivator) == + m_deactivatorExceptions.end()) { + m_deactivators.insert(deactivator); + } + } + + if (flags & PF_ADD_DEACTIVATOR_SOURCES) { + addDeactivatorSource(*parent.m_sink); + m_hasBuildInSources = true; + } + + if (flags & PF_ADD_SELF_EXCEPT) { + addDeactivatorException(m_rc->getObjPtr()); + } + + m_window = parent.m_window; + m_parentSink = parent.m_sink; + m_isChild = true; + m_isPrepared = true; + + return RES_OK; + } + Window &Presenter::getWindow() { + UCL_ASSERT(isWindowReady(), "m_window is NULL!"); return *m_window; } - void Presenter::addDeactivatorSource(Widget &source) + bool Presenter::isWindowReady() const { - source.addEventHandler(impl::ACTIVATE_BY, - WEAK_DELEGATE(Presenter::onActivateBySmart, asWeak(*this))); - source.addEventHandler(impl::DEACTIVATE_BY, - WEAK_DELEGATE(Presenter::onDeactivateBySmart, asWeak(*this))); + return !!m_window; } - void Presenter::addDeactivatorException(void *const deactivator) + void Presenter::addDeactivatorException(const void *const deactivator) { const auto pair = m_deactivatorExceptions.insert(deactivator); if (pair.second) { @@ -75,34 +119,39 @@ namespace callui { } } - void Presenter::sendActivateBy(Widget &sender, void *const deactivator) + void Presenter::setDeactivatorSink(const WidgetSRef &sink) { - sendDeactivator(sender, impl::ACTIVATE_BY, deactivator); + m_sink = sink; } - void Presenter::sendDeactivateBy(Widget &sender, void *const deactivator) + void Presenter::sendActivate(Widget &sender) { - sendDeactivator(sender, impl::DEACTIVATE_BY, deactivator); + sendDeactivator(sender, impl::ACTIVATE_BY, m_rc->getObjPtr()); } - void Presenter::broadcastActivateBy(void *const deactivator) + void Presenter::sendDeactivate(Widget &sender) { - broadcastDeactivator(impl::ACTIVATE_BY, deactivator); + sendDeactivator(sender, impl::DEACTIVATE_BY, m_rc->getObjPtr()); } - void Presenter::broadcastDeactivateBy(void *const deactivator) + void Presenter::broadcastActivate() { - broadcastDeactivator(impl::DEACTIVATE_BY, deactivator); + broadcastDeactivator(impl::ACTIVATE_BY, m_rc->getObjPtr()); + } + + void Presenter::broadcastDeactivate() + { + broadcastDeactivator(impl::DEACTIVATE_BY, m_rc->getObjPtr()); } void Presenter::sendDeactivator(Widget &sender, - SmartEvent event, void *deactivator) + SmartEvent event, const void *deactivator) { sendDeactivatorInfo(sender, event, {deactivator, false}); } void Presenter::broadcastDeactivator(const SmartEvent event, - void *const deactivator) + const void *const deactivator) { sendDeactivatorInfo(*m_window, event, {deactivator, true}); } @@ -118,25 +167,44 @@ namespace callui { return isEmpty(m_deactivators); } - bool Presenter::isDeactivatedBy(void *const deactivator) const + bool Presenter::isDeactivatedBy(const void *const deactivator) const { return (m_deactivators.find(deactivator) != m_deactivators.end()); } - void Presenter::activateBy(void *const deactivator) + void Presenter::activateBy(const void *const deactivator) { activateByImpl({deactivator, false}); } - void Presenter::deactivateBy(void *const deactivator) + void Presenter::deactivateBy(const void *const deactivator) { deactivateByImpl({deactivator, false}); } + void Presenter::addDeactivatorSource(Widget &source) + { + source.addEventHandler(impl::ACTIVATE_BY, + WEAK_DELEGATE(Presenter::onActivateBySmart, asWeak(*this))); + source.addEventHandler(impl::DEACTIVATE_BY, + WEAK_DELEGATE(Presenter::onDeactivateBySmart, asWeak(*this))); + } + + void Presenter::delDeactivatorSource(Widget &source) + { + source.delEventHandler(impl::ACTIVATE_BY, + WEAK_DELEGATE(Presenter::onActivateBySmart, asWeak(*this))); + source.delEventHandler(impl::DEACTIVATE_BY, + WEAK_DELEGATE(Presenter::onDeactivateBySmart, asWeak(*this))); + } + void Presenter::activateByImpl(const DeactivatorInfo &info) { const auto count = m_deactivators.erase(info.deactivator); if (m_isPrepared && (count > 0)) { + if (m_sink) { + sendDeactivatorInfo(*m_sink, impl::ACTIVATE_BY, info); + } onActivateBy(info); if (m_deactivators.size() == 0) { onActivate(); @@ -152,6 +220,9 @@ namespace callui { } const auto pair = m_deactivators.insert(info.deactivator); if (m_isPrepared && pair.second) { + if (m_sink) { + sendDeactivatorInfo(*m_sink, impl::DEACTIVATE_BY, info); + } onDeactivateBy(info); if (m_deactivators.size() == 1) { onDeactivate(); diff --git a/src/presenters/RejectMsgPresenter.cpp b/src/presenters/RejectMsgPresenter.cpp index 400e1be..ec041ff 100644 --- a/src/presenters/RejectMsgPresenter.cpp +++ b/src/presenters/RejectMsgPresenter.cpp @@ -112,17 +112,25 @@ namespace callui { return *this; } - RejectMsgPresenterSRef RejectMsgPresenter::Builder::build( - ElmWidget &parent) const + RejectMsgPresenter::Builder & + RejectMsgPresenter::Builder::setParentWidget( + const ElmWidgetSRef &parentWidget) + { + m_parentWidget = parentWidget; + return *this; + } + + RejectMsgPresenterSRef + RejectMsgPresenter::Builder::build(Presenter &parent) const { - if (!m_provider) { - LOG_RETURN_VALUE(RES_FAIL, {}, "m_provider is NULL"); + if (!m_provider || !m_parentWidget) { + LOG_RETURN_VALUE(RES_FAIL, {}, "Main params are not set"); } auto result = makeShared(m_provider, m_stateHandler, m_selectHandler); - FAIL_RETURN_VALUE(result->prepare(parent), {}, + FAIL_RETURN_VALUE(result->prepare(parent, *m_parentWidget), {}, "result->prepare() failed!"); return result; @@ -144,16 +152,17 @@ namespace callui { RejectMsgPresenter::~RejectMsgPresenter() { if (m_widget) { - sendActivateBy(*m_widget, this); + sendActivate(*m_widget); } } - Result RejectMsgPresenter::prepare(ElmWidget &parent) + Result RejectMsgPresenter::prepare(Presenter &parent, + ElmWidget &parentWidget) { - FAIL_RETURN(Presenter::prepare(parent), + FAIL_RETURN(Presenter::prepare(parent, PF_DEACTIVATOR), "Presenter::prepare() failed!"); - FAIL_RETURN(createWidget(parent), + FAIL_RETURN(createWidget(parentWidget), "createWidget() failed!"); FAIL_RETURN(createPanel(), @@ -168,9 +177,10 @@ namespace callui { FAIL_RETURN(createGenlist(), "createGenlist() failed!"); - addDeactivatorException(this); deactivateBy(m_widget.get()); + parent.addDeactivatorSource(*m_widget); + return RES_OK; } @@ -207,7 +217,7 @@ namespace callui { m_state = RejectMsgState::SHOWN; // Prevent panel scrolling elm_object_scroll_freeze_push(m_panel->getEo()); - sendDeactivateBy(*m_widget, this); + sendDeactivate(*m_widget); activateBy(m_widget.get()); } else if (ev->rel_y == 0.0) { m_state = RejectMsgState::HIDDEN; @@ -220,7 +230,7 @@ namespace callui { m_panelBg->setColor(0, alphaValue); if (isActive()) { deactivateBy(m_widget.get()); - sendActivateBy(*m_widget, this); + sendActivate(*m_widget); } } -- 2.34.1