TizenRefApp-8365 Implement reply in conversation 43/124843/1
authorDenis Dolzhenko <d.dolzhenko@samsung.com>
Wed, 12 Apr 2017 13:25:53 +0000 (16:25 +0300)
committerDenis Dolzhenko <d.dolzhenko@samsung.com>
Wed, 12 Apr 2017 13:25:53 +0000 (16:25 +0300)
Change-Id: I2e4cf1359226114c69ab9c03eba08a70b8f0cdd4
Signed-off-by: Denis Dolzhenko <d.dolzhenko@samsung.com>
12 files changed:
src/Common/Controller/inc/FrameController.h
src/Common/Controller/inc/NaviFrameController.h
src/Common/Controller/src/FrameController.cpp
src/Common/Controller/src/NaviFrameController.cpp
src/Common/Recipient/inc/Recipient.h
src/Common/Recipient/src/Recipient.cpp
src/Composer/Controller/src/MsgBodyFrame.cpp
src/Composer/Controller/src/RecipFrame.cpp
src/Conversation/Controller/inc/ConvFrame.h
src/Conversation/Controller/inc/ConvList.h
src/Conversation/Controller/src/ConvFrame.cpp
src/Conversation/Controller/src/ConvList.cpp

index 62ee3dfe1db0ce92aadf3911953adb5b2d9d4c8d..2307353452d313da688efda850cff3bb230aaf2e 100644 (file)
 #include "NaviFrameItem.h"
 #include "NaviFrameController.h"
 
+#include <list>
+#include <memory>
+
 namespace Msg {
     class NaviFrameController;
 
     class FrameController
         : public NaviFrameItem {
+
+        public:
+            typedef std::list<FrameController*> GroupList;
+
         public:
             FrameController(NaviFrameController &parent);
             virtual ~FrameController();
 
             NaviFrameController &getParent();
             void pop();
+            void addToGroup(FrameController &frame);
+            void removeFromGroup();
+            const GroupList &getGroupList() const;
 
             void pause();
             void resume();
@@ -42,8 +52,11 @@ namespace Msg {
             virtual void onPause() {};
             virtual void onResume() {};
 
+            void newGroup();
+
         private:
             bool m_IsPause;
+            std::shared_ptr<GroupList> m_GroupList;
     };
 }
 
index ea3ba8e7e5f025ec3501133425a8f09d55cbac0c..24cbaac20827cf245af20f67e6ca8873a0c7cc19 100644 (file)
@@ -45,6 +45,12 @@ namespace Msg {
              */
             void pop(int count);
 
+            /**
+             * @brief Pops this frame and all frames exists in group.
+             * @param[in] frame with group items for pop
+             */
+            void popGroup(FrameController &frame);
+
             /**
              * @brief Executes app control command of default type.
              */
@@ -60,10 +66,11 @@ namespace Msg {
              */
             void destroy();
 
-        private:
             template<typename T>
             T *getTopFrame() const;
+
             FrameController *getTopFrame() const;
+        private:
             bool prepare(const AppControlCommand &cmd);
             void registerHWButtonEvent();
 
index 2c176a3f0869decf4a642090f94a5c11053e5b51..5c113984ea3140cd3615853123d04d724744f301 100644 (file)
@@ -27,10 +27,12 @@ FrameController::FrameController(NaviFrameController &parent)
     : NaviFrameItem(parent)
     , m_IsPause(true)
 {
+    newGroup();
 }
 
 FrameController::~FrameController()
 {
+    m_GroupList->remove(this);
 }
 
 NaviFrameController &FrameController::getParent()
@@ -68,3 +70,35 @@ bool FrameController::isPause() const
 {
     return m_IsPause;
 }
+
+void FrameController::addToGroup(FrameController &frame)
+{
+    if (this == &frame)
+        return;
+
+    m_GroupList->merge(*frame.m_GroupList);
+    m_GroupList->unique();
+    frame.m_GroupList = m_GroupList;
+}
+
+void FrameController::newGroup()
+{
+    m_GroupList = std::make_shared<GroupList>();
+    m_GroupList->push_back(this);
+}
+
+void FrameController::removeFromGroup()
+{
+    m_GroupList->remove(this);
+    newGroup();
+}
+
+const FrameController::GroupList &FrameController::getGroupList() const
+{
+    if (m_GroupList) {
+        return *m_GroupList;
+    } else {
+        static GroupList list;
+        return list;
+    }
+}
index 0f1bf9d2c31838846193f0e7b31102fd6951db93..8d1d8d35fbfb111492ce296bbf784141fefd9a89 100644 (file)
@@ -63,6 +63,15 @@ void NaviFrameController::pop(int count)
     }
 }
 
+void NaviFrameController::popGroup(FrameController &frame)
+{
+    auto list = frame.getGroupList();
+    for (FrameController *item : list) {
+        if (item)
+            pop(*item);
+    }
+}
+
 void NaviFrameController::destroy()
 {
     NaviFrameView::destroy();
index 585f3548984bfbbac2dd608a39391f8ffc0e82c6..08e36708318569ff56be4e25c81bc396ae53a839 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef Recipient_h_
 #define Recipient_h_
 
+#include "MsgTypes.h"
+
 #include <string>
 
 namespace Msg {
@@ -40,6 +42,14 @@ namespace Msg {
              */
             static Recipient searchFirstRecip(const std::string &searchWord);
 
+            /**
+             * @brief       Get recipient by ThreadId
+             * @param       id valid thread id
+             * @return      recipient
+             */
+
+            static Recipient getByThreadId(ThreadId id);
+
         private:
             std::string m_Address;
             std::string m_DispName;
index 8486cbac6b96acb623dffb3bebab1d1e0493b2fe..6ffb8c57b97a44833082306af47d1dba6b6040c9 100644 (file)
@@ -19,6 +19,7 @@
 #include "ContactManager.h"
 #include "Logger.h"
 #include "MsgUtils.h"
+#include "MsgEngine.h"
 
 #include <memory>
 
@@ -104,3 +105,16 @@ Recipient Recipient::searchFirstRecip(const std::string &searchWord)
 
     return res;
 }
+
+Recipient Recipient::getByThreadId(ThreadId id)
+{
+    Recipient res;
+    if (id.isValid()) {
+        MsgAddressListRef list = App::getInst().getMsgEngine().getStorage().getAddressList(id);
+        if (list && !list->isEmpty()) {
+            const MsgAddress &addrr = list->at(0);
+            res.setAddress(addrr.getAddress());
+        }
+    }
+    return res;
+}
index c152e5c81371420940e13bd181487baa3225bbee..94ee59ca4f2d837e203d9f5f7d11b746b3717c05 100644 (file)
@@ -163,15 +163,21 @@ void MsgBodyFrame::sendMsg()
 
 void MsgBodyFrame::navigateAfterSent()
 {
-    // Close composer: BodyFrame, RecipFrame
-    getParent().pop(2);
+    // Close composer: BodyFrame, RecipFrame, ContactFrame
+    getParent().popGroup(*this);
 
     if (!App::getInst().isTerminating()) {
         // Navigate to ConvFrame
         if (m_ThreadId.isValid()) {
-            auto *conv = new ConvFrame(getParent());
-            conv->setThreadId(m_ThreadId);
-            getParent().push(*conv);
+            ConvFrame *conv = getParent().getTopFrame<ConvFrame>();
+            if (!conv) {
+                conv = new ConvFrame(getParent());
+                conv->setThreadId(m_ThreadId);
+                getParent().push(*conv);
+            } else {
+                conv->setThreadId(m_ThreadId);
+                getParent().promote(*conv);
+            }
         }
     }
 }
index 725333cd469783c29a4bbfd245ebb4833995659d..b27a22fc05da0785ec183ddd1f1968264750ce57 100644 (file)
@@ -99,6 +99,7 @@ void RecipFrame::showInputFrame()
 {
     if (!m_pInputFrame) {
         m_pInputFrame = new RecipInputFrame(getParent(), m_Recip);
+        addToGroup(*m_pInputFrame);
         m_pInputFrame->setOnPopCb(makeCbLast(&RecipFrame::onInputFramePop), this);
         getParent().push(*m_pInputFrame);
     }
@@ -122,6 +123,7 @@ void RecipFrame::onNextButtonClicked(Evas_Object *obj, void *event)
     MSG_LOG("");
     if (m_Recip.isValid()) {
         auto *composerFrame = new MsgBodyFrame(getParent(), m_Recip);
+        addToGroup(*composerFrame);
         getParent().push(*composerFrame);
     } else {
         ToastPopup::toast("Invalid recipient."); // TODO: localization
index 33f2f523e78a084363b85184c053e007823b4e9e..9c4b41c8a738debf52b181a9aa7f3535edae92df 100644 (file)
@@ -78,6 +78,7 @@ namespace Msg
             void onItemChecked(ConvListItem &item) override;
             void onItemRequestDeleteMode(ConvListItem &listItem) override;
             void onListChanged(ConvList &list) override;
+            void onReplyButtonClicked(ConvList &list) override;
 
         private:
             void prepareWorkingDir();
@@ -87,6 +88,7 @@ namespace Msg
             void prepareList();
             void showSelectPopup();
             void updateDeleteViews();
+            void reply();
 
             void setMode(Mode mode);
             void setDeleteMode(bool value);
@@ -94,6 +96,7 @@ namespace Msg
 
         private:
             Mode m_Mode;
+            ThreadId m_ThreadId;
             DefaultLayout *m_pLayout;
             ConvList *m_pList;
             MoreOption *m_pMoreOption;
index 7af3db9bd625ae5ab41029c7d32d7595f43ffd29..a0ac917121f671ddccd4814b0b3466ab947c52cf 100644 (file)
@@ -97,6 +97,7 @@ namespace Msg {
             virtual void onItemChecked(ConvListItem &item) {};
             virtual void onItemRequestDeleteMode(ConvListItem &listItem) {};
             virtual void onListChanged(ConvList &list) {};
+            virtual void onReplyButtonClicked(ConvList &list) {};
     };
 }
 
index 2d0db16d33f8c29c6a01bb3688891a048b61cd1f..e154e8d2ec946d957303094bac8e76f9ec249325 100644 (file)
 #include "SelectCtxPopup.h"
 #include "ToastPopup.h"
 #include "IconTextPopup.h"
+#include "MsgBodyFrame.h"
+#include "Recipient.h"
 
 using namespace Msg;
 
 ConvFrame::ConvFrame(NaviFrameController &parent)
     : FrameController(parent)
     , m_Mode(InitMode)
+    , m_ThreadId()
     , m_pLayout(nullptr)
     , m_pList(nullptr)
     , m_pMoreOption(nullptr)
@@ -158,6 +161,7 @@ void ConvFrame::prepareList()
 
 void ConvFrame::setThreadId(ThreadId id)
 {
+    m_ThreadId = id;
     m_pList->setThreadId(id);
     m_pList->navigateToBottom();
 }
@@ -188,6 +192,13 @@ void ConvFrame::updateDeleteViews()
     }
 }
 
+void ConvFrame::reply()
+{
+    Recipient recip = Recipient::getByThreadId(m_ThreadId);
+    auto *frame = new MsgBodyFrame(getParent(), recip);
+    getParent().push(*frame);
+}
+
 void ConvFrame::showNumberBlockUnblockPopup(bool isBlocked)
 {
     const char *text = isBlocked ? "WDS_LOGS_TPOP_CALLS_MSGS_TO_GEAR_NUMBER_FROM_THIS_NUMBER_ARE_BLOCKED_ABB"
@@ -234,6 +245,12 @@ void ConvFrame::onListChanged(ConvList &list)
         updateDeleteViews();
 }
 
+void ConvFrame::onReplyButtonClicked(ConvList &list)
+{
+    MSG_LOG("");
+    reply();
+}
+
 void ConvFrame::onDelButtonClicked(Evas_Object *obj, void *event)
 {
     MSG_LOG("");
@@ -270,6 +287,7 @@ void ConvFrame::onDeselectAllButtonClicked(CtxPopupItem &item)
 void ConvFrame::onReplyClicked(MoreOption &obj)
 {
     MSG_LOG("");
+    reply();
 }
 
 void ConvFrame::onCallClicked(MoreOption &obj)
index 821b2d984560ec23a213908848f6bae4ede1d5ae..847aa7502247c85d1dfcded5d9df7bf1f6f32f22 100644 (file)
@@ -249,6 +249,8 @@ void ConvList::setThreadId(ThreadId id)
 void ConvList::onListItemSelected(ListItem &listItem)
 {
     MSG_LOG("");
+    if (dynamic_cast<ConvReplyListItem*>(&listItem) && m_pListener)
+        m_pListener->onReplyButtonClicked(*this);
 }
 
 void ConvList::onListItemLongPressed(ListItem &listItem)