TizenRefApp-7077 Implementation of Pause/Resume functionality for NaviFrame 51/87151/4
authorDenis Dolzhenko <d.dolzhenko@samsung.com>
Tue, 6 Sep 2016 13:57:14 +0000 (16:57 +0300)
committerAndrey Klimenko <and.klimenko@samsung.com>
Thu, 8 Sep 2016 09:52:16 +0000 (02:52 -0700)
Change-Id: Ibb812b86087f6906d67a04deabea60d7afb65be8
Signed-off-by: Denis Dolzhenko <d.dolzhenko@samsung.com>
src/Common/Controller/inc/App.h
src/Common/Controller/inc/FrameController.h
src/Common/Controller/inc/NaviFrameController.h
src/Common/Controller/src/App.cpp
src/Common/Controller/src/FrameController.cpp
src/Common/Controller/src/NaviFrameController.cpp
src/Common/View/inc/NaviFrameView.h
src/Common/View/src/NaviFrameView.cpp
src/Conversation/Main/Controller/inc/Conversation.h
src/Conversation/Main/Controller/src/Conversation.cpp
src/MainApp/MainApp.cpp

index 83d606e70fcf7d75b24d38f73ed8e24d602e726c..15d41316afd3b42da4a73e4f7e64f64698dd5171 100644 (file)
@@ -30,6 +30,7 @@ namespace Msg
 {
     class MsgEngine;
     class ContactManager;
+    class IAppListener;
 
     class App
     {
@@ -56,9 +57,14 @@ namespace Msg
             const SystemSettingsManager &getSysSettingsManager() const;
 
             void exit();
+            void addListener(IAppListener &l);
+            void removeListener(IAppListener &l);
+            bool isPause() const;
 
         protected:
             bool init();
+            void pause();
+            void resume();
 
         private:
             virtual void terminate() = 0;
@@ -69,6 +75,16 @@ namespace Msg
             PopupManager *m_pPopupManager;
             ThumbnailMaker *m_pThumbnailMaker;
             SystemSettingsManager *m_pSysSettingsManager;
+            std::list<IAppListener*> m_Listeners;
+            bool m_IsPause;
+    };
+
+    class IAppListener
+    {
+        public:
+            virtual ~IAppListener() {}
+            virtual void onAppPause() {};
+            virtual void onAppResume() {};
     };
 }
 
index 913bc7846f64045d769155d14082d71886700367..b32260e6c3fc3cf59f1999f90536a2cd1849378f 100644 (file)
@@ -38,11 +38,20 @@ namespace Msg
             virtual NaviFrameController &getParent();
             void pop();
 
+            void pause();
+            void resume();
+            bool isPause() const;
+
         protected:
             void setNaviBarTitle(const MsgAddressList &addressList);
 
             // NaviFrameItem
             virtual void onAttached(ViewItem &item);
+            virtual void onPause() {};
+            virtual void onResume() {};
+
+        private:
+            bool m_IsPause;
     };
 }
 
index 72c2513ccd648cd2e0e9dbf72587456ae8069947..d263c99c5d7515473cc5938cc690d4507371bb87 100644 (file)
@@ -24,6 +24,7 @@
 #include "AppControlCommand.h"
 #include "AppControlCompose.h"
 #include "AppControlDefault.h"
+#include "App.h"
 
 namespace Msg
 {
@@ -33,6 +34,7 @@ namespace Msg
         : public ViewController
         , public NaviFrameView
         , private IHwButtonListener
+        , private IAppListener
     {
         public:
             NaviFrameController(App &app);
@@ -61,18 +63,26 @@ namespace Msg
             void destroy();
 
         private:
-            void init();
             template<typename T>
             T *getTopFrame() const;
+            FrameController *getTopFrame() const;
             bool prepare(const AppControlCommand &cmd);
+            void registerHWButtonEvent();
 
             bool isUnreadNotificationSingle(AppControlDefault::DefaultType type) const;
 
+            // H/W buttons:
             virtual void onHwBackButtonClicked();
             virtual void onHwMoreButtonClicked();
 
-        private:
-            void registerHWButtonEvent();
+            // NaviFrameView:
+            virtual void onPause(NaviFrameItem &item);
+            virtual void onResume(NaviFrameItem &item);
+            virtual void onBeforeDelete(View &view);
+
+            // App:
+            virtual void onAppPause();
+            virtual void onAppResume();
     };
 }
 
index debe966b5a5e570010006e1d063d9c3929475bb9..3f845814af252639dfb9341a55906ab0a4880a3d 100644 (file)
@@ -21,6 +21,8 @@
 #include "ContactManager.h"
 #include "PathUtils.h"
 
+#include <algorithm>
+
 using namespace Msg;
 
 App::App()
@@ -28,6 +30,7 @@ App::App()
     , m_pPopupManager(nullptr)
     , m_pThumbnailMaker(nullptr)
     , m_pSysSettingsManager(nullptr)
+    , m_IsPause(true)
 {
     int serviceResult = m_Engine.openService();
     if(serviceResult != MESSAGES_ERROR_NONE)
@@ -132,3 +135,36 @@ void App::exit()
 {
     terminate();
 }
+
+void App::addListener(IAppListener &l)
+{
+    auto found = std::find(m_Listeners.begin(), m_Listeners.end(), &l);
+    if(found == m_Listeners.end())
+        m_Listeners.push_back(&l);
+}
+
+void App::removeListener(IAppListener &l)
+{
+    auto found = std::find(m_Listeners.begin(), m_Listeners.end(), &l);
+    if(found != m_Listeners.end())
+        m_Listeners.erase(found);
+}
+
+bool App::isPause() const
+{
+    return m_IsPause;
+}
+
+void App::pause()
+{
+    m_IsPause = true;
+    for(IAppListener *l : m_Listeners)
+        l->onAppPause();
+}
+
+void App::resume()
+{
+    m_IsPause = false;
+    for(IAppListener *l : m_Listeners)
+        l->onAppResume();
+}
index 1455c2c2aeaec89d2e5bda4e409d603b87b6578d..2b35ea35bce5cf4ef97841343a77687a132bd484 100644 (file)
@@ -27,6 +27,7 @@ using namespace Msg;
 FrameController::FrameController(NaviFrameController &parent)
     : ViewItemController(&parent)
     , NaviFrameItem(parent)
+    , m_IsPause(true)
 {
 }
 
@@ -72,3 +73,26 @@ void FrameController::setNaviBarTitle(const MsgAddressList &addressList)
     getNaviBar().showButton(NaviCenterButtonId, true);
     getNaviBar().setButtonText(NaviCenterButtonId, title);
 }
+
+void FrameController::pause()
+{
+    if(!m_IsPause)
+    {
+        m_IsPause = true;
+        onPause();
+    }
+}
+
+void FrameController::resume()
+{
+    if(m_IsPause)
+    {
+        m_IsPause = false;
+        onResume();
+    }
+}
+
+bool FrameController::isPause() const
+{
+    return m_IsPause;
+}
index 7eba56bde104df09841b069cb0d4db0fe4121d0d..51355a09db7e2292123b8cfd839c9be281d95a73 100644 (file)
@@ -31,7 +31,8 @@ NaviFrameController::NaviFrameController(App &app)
     : ViewController(app)
     , NaviFrameView(app.getWindow())
 {
-    init();
+    setHwButtonListener(getEo(), this);
+    getApp().addListener(*this);
 }
 
 NaviFrameController::~NaviFrameController()
@@ -39,11 +40,6 @@ NaviFrameController::~NaviFrameController()
     MSG_LOG("Destructor: ", this);
 }
 
-void NaviFrameController::init()
-{
-    setHwButtonListener(getEo(), this);
-}
-
 void NaviFrameController::pop(FrameController &frame)
 {
     if(isLastFrame())
@@ -131,6 +127,11 @@ T *NaviFrameController::getTopFrame() const
     return nullptr;
 }
 
+FrameController *NaviFrameController::getTopFrame() const
+{
+    return static_cast<FrameController*>(NaviFrameView::getTopFrame());
+}
+
 bool NaviFrameController::isUnreadNotificationSingle(AppControlDefault::DefaultType type) const
 {
     return type == AppControlDefault::NotificationType && getMsgEngine().getStorage().getUnreadThreadCount() == 1;
@@ -138,11 +139,42 @@ bool NaviFrameController::isUnreadNotificationSingle(AppControlDefault::DefaultT
 
 void NaviFrameController::onHwBackButtonClicked()
 {
-    pop();
+    auto *top = getTopFrame();
+    if(top)
+        pop(*top);
 }
 
 void NaviFrameController::onHwMoreButtonClicked()
 {
+}
+
+void NaviFrameController::onPause(NaviFrameItem &item)
+{
+    static_cast<FrameController&>(item).pause();
+}
+
+void NaviFrameController::onResume(NaviFrameItem &item)
+{
+    static_cast<FrameController&>(item).resume();
+}
 
+void NaviFrameController::onAppPause()
+{
+    auto *top = getTopFrame();
+    if(top)
+        top->pause();
+}
+
+void NaviFrameController::onAppResume()
+{
+    auto *top = getTopFrame();
+    if(top)
+        top->resume();
+}
+
+void NaviFrameController::onBeforeDelete(View &view)
+{
+    NaviFrameView::onBeforeDelete(view);
+    getApp().removeListener(*this);
 }
 
index 4600a5384a02f7353e110206a1a57b64758db101..40040c1e8da0ccbfe726d3b11aa49b0adc81334e 100644 (file)
@@ -95,8 +95,15 @@ namespace Msg
              */
             bool getTransitionStatus() const;
 
+        protected:
+            virtual void onPause(NaviFrameItem &item) {};
+            virtual void onResume(NaviFrameItem &item) {};
+            virtual void onBeforeDelete(View &view);
+
         private:
             void create(Evas_Object *parent);
+            void pause();
+            void resume();
             void onTransitionFinished(Evas_Object *obj, void *eventInfo);
 
         private:
index 26f346b353f5920b8cb51c89a941763e72fa5de0..5e600ae29b1921f27c7b9acb21e4b4d594fb872e 100644 (file)
@@ -50,6 +50,20 @@ void NaviFrameView::create(Evas_Object *parent)
     show();
 }
 
+void NaviFrameView::pause()
+{
+    NaviFrameItem *top = getTopFrame();
+    if(top)
+        onPause(*top);
+}
+
+void NaviFrameView::resume()
+{
+    NaviFrameItem *top = getTopFrame();
+    if(top)
+        onResume(*top);
+}
+
 bool NaviFrameView::isLastFrame() const
 {
     return elm_naviframe_bottom_item_get(getEo()) == elm_naviframe_top_item_get(getEo());
@@ -101,9 +115,11 @@ bool NaviFrameView::isEmpty() const
 void NaviFrameView::push(NaviFrameItem &item, Evas_Object *content)
 {
     m_TransitionStatus = !isEmpty();
+    pause();
     Elm_Object_Item *it = elm_naviframe_item_push(getEo(), nullptr, nullptr, nullptr, content, naviTitleStyleEmpty);
     item.setElmObjItem(it);
     processSignal();
+    resume();
 }
 
 void NaviFrameView::push(NaviFrameItem &item, View &content)
@@ -131,11 +147,15 @@ void NaviFrameView::pop(NaviFrameItem &item)
         if(getTopFrame() == &item)
         {
             m_TransitionStatus = getItemsCount() > 1;
+            pause();
             elm_naviframe_item_pop(getEo());
+            resume();
         }
         else
         {
+            pause();
             item.destroy();
+            resume();
         }
     }
 }
@@ -148,20 +168,28 @@ void NaviFrameView::insertToBottom(NaviFrameItem &item)
     if(before)
     {
         insert = elm_naviframe_item_insert_before(getEo(), before, nullptr, nullptr, nullptr, nullptr, naviTitleStyleEmpty);
+        item.setElmObjItem(insert);
     }
     else
     {
         m_TransitionStatus = !isEmpty();
+        pause();
         insert = elm_naviframe_item_push(getEo(), nullptr, nullptr, nullptr, nullptr, naviTitleStyleEmpty);
+        item.setElmObjItem(insert);
+        resume();
     }
-
-    item.setElmObjItem(insert);
 }
 
 void NaviFrameView::promote(NaviFrameItem &item)
 {
-    m_TransitionStatus = &item != getTopFrame();
-    elm_naviframe_item_promote(item);
+    bool isTop = &item != getTopFrame();
+    if(!isTop)
+    {
+        m_TransitionStatus = true;
+        pause();
+        elm_naviframe_item_promote(item);
+        resume();
+    }
 }
 
 void NaviFrameView::onTransitionFinished(Evas_Object *obj, void *eventInfo)
@@ -183,6 +211,11 @@ void NaviFrameView::onTransitionFinished(Evas_Object *obj, void *eventInfo)
         transFinishedItem->onTransitionFinished(*transFinishedItem);
 }
 
+void NaviFrameView::onBeforeDelete(View &view)
+{
+    pause();
+}
+
 bool NaviFrameView::getTransitionStatus() const
 {
     // TODO: Move functionality for gets TransitionStatus to EFL (elm_naviframe) side.
index c9115587192bdb9b3316ffa0539ace631ba6c5ad..e7e7908f17a4570ec99e0575c1c35330b11ababd 100644 (file)
@@ -89,6 +89,8 @@ namespace Msg
             virtual void onAttached(ViewItem &item);
             virtual void onTransitionFinished(NaviFrameItem &item);
             virtual void onButtonClicked(NaviFrameItem &item, NaviButtonId buttonId);
+            virtual void onPause();
+            virtual void onResume();
 
             // IHwButtonListener:
             virtual void onHwBackButtonClicked();
index a34fd9e2df48387fdd4f0e013b4357597890fc21..ea84c9374c681890c9d3668fb3b90adbce9f969b 100644 (file)
@@ -954,6 +954,16 @@ void Conversation::onTransitionFinished(NaviFrameItem &item)
     }
 }
 
+void Conversation::onPause()
+{
+    MSG_LOG("");
+}
+
+void Conversation::onResume()
+{
+    MSG_LOG("");
+}
+
 void Conversation::onHwBackButtonClicked()
 {
     MSG_LOG("");
index 8ba9ea0ff6b15d39efbc0ca323d65e309f8fb162..50d3b806963b6b284433c04888e9659adf60fdba 100644 (file)
@@ -142,11 +142,13 @@ void MainApp::onAppTerminate()
 void MainApp::onAppPause()
 {
     TRACE;
+    App::pause();
 }
 
 void MainApp::onAppResume()
 {
     TRACE;
+    App::resume();
 }
 
 void MainApp::onAppControl(app_control_h app_control)