From: Denis Dolzhenko Date: Wed, 12 Apr 2017 13:25:53 +0000 (+0300) Subject: TizenRefApp-8365 Implement reply in conversation X-Git-Tag: submit/tizen/20170427.124559~20 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=901fa48aaf5ac06859dd90f638c213853300647f;p=profile%2Fwearable%2Fapps%2Fnative%2Fmessage.git TizenRefApp-8365 Implement reply in conversation Change-Id: I2e4cf1359226114c69ab9c03eba08a70b8f0cdd4 Signed-off-by: Denis Dolzhenko --- diff --git a/src/Common/Controller/inc/FrameController.h b/src/Common/Controller/inc/FrameController.h index 62ee3df..2307353 100644 --- a/src/Common/Controller/inc/FrameController.h +++ b/src/Common/Controller/inc/FrameController.h @@ -20,17 +20,27 @@ #include "NaviFrameItem.h" #include "NaviFrameController.h" +#include +#include + namespace Msg { class NaviFrameController; class FrameController : public NaviFrameItem { + + public: + typedef std::list 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 m_GroupList; }; } diff --git a/src/Common/Controller/inc/NaviFrameController.h b/src/Common/Controller/inc/NaviFrameController.h index ea3ba8e..24cbaac 100644 --- a/src/Common/Controller/inc/NaviFrameController.h +++ b/src/Common/Controller/inc/NaviFrameController.h @@ -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 T *getTopFrame() const; + FrameController *getTopFrame() const; + private: bool prepare(const AppControlCommand &cmd); void registerHWButtonEvent(); diff --git a/src/Common/Controller/src/FrameController.cpp b/src/Common/Controller/src/FrameController.cpp index 2c176a3..5c11398 100644 --- a/src/Common/Controller/src/FrameController.cpp +++ b/src/Common/Controller/src/FrameController.cpp @@ -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(); + 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; + } +} diff --git a/src/Common/Controller/src/NaviFrameController.cpp b/src/Common/Controller/src/NaviFrameController.cpp index 0f1bf9d..8d1d8d3 100644 --- a/src/Common/Controller/src/NaviFrameController.cpp +++ b/src/Common/Controller/src/NaviFrameController.cpp @@ -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(); diff --git a/src/Common/Recipient/inc/Recipient.h b/src/Common/Recipient/inc/Recipient.h index 585f354..08e3670 100644 --- a/src/Common/Recipient/inc/Recipient.h +++ b/src/Common/Recipient/inc/Recipient.h @@ -17,6 +17,8 @@ #ifndef Recipient_h_ #define Recipient_h_ +#include "MsgTypes.h" + #include 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; diff --git a/src/Common/Recipient/src/Recipient.cpp b/src/Common/Recipient/src/Recipient.cpp index 8486cba..6ffb8c5 100644 --- a/src/Common/Recipient/src/Recipient.cpp +++ b/src/Common/Recipient/src/Recipient.cpp @@ -19,6 +19,7 @@ #include "ContactManager.h" #include "Logger.h" #include "MsgUtils.h" +#include "MsgEngine.h" #include @@ -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; +} diff --git a/src/Composer/Controller/src/MsgBodyFrame.cpp b/src/Composer/Controller/src/MsgBodyFrame.cpp index c152e5c..94ee59c 100644 --- a/src/Composer/Controller/src/MsgBodyFrame.cpp +++ b/src/Composer/Controller/src/MsgBodyFrame.cpp @@ -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(); + if (!conv) { + conv = new ConvFrame(getParent()); + conv->setThreadId(m_ThreadId); + getParent().push(*conv); + } else { + conv->setThreadId(m_ThreadId); + getParent().promote(*conv); + } } } } diff --git a/src/Composer/Controller/src/RecipFrame.cpp b/src/Composer/Controller/src/RecipFrame.cpp index 725333c..b27a22f 100644 --- a/src/Composer/Controller/src/RecipFrame.cpp +++ b/src/Composer/Controller/src/RecipFrame.cpp @@ -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 diff --git a/src/Conversation/Controller/inc/ConvFrame.h b/src/Conversation/Controller/inc/ConvFrame.h index 33f2f52..9c4b41c 100644 --- a/src/Conversation/Controller/inc/ConvFrame.h +++ b/src/Conversation/Controller/inc/ConvFrame.h @@ -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; diff --git a/src/Conversation/Controller/inc/ConvList.h b/src/Conversation/Controller/inc/ConvList.h index 7af3db9..a0ac917 100644 --- a/src/Conversation/Controller/inc/ConvList.h +++ b/src/Conversation/Controller/inc/ConvList.h @@ -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) {}; }; } diff --git a/src/Conversation/Controller/src/ConvFrame.cpp b/src/Conversation/Controller/src/ConvFrame.cpp index 2d0db16..e154e8d 100644 --- a/src/Conversation/Controller/src/ConvFrame.cpp +++ b/src/Conversation/Controller/src/ConvFrame.cpp @@ -22,12 +22,15 @@ #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) diff --git a/src/Conversation/Controller/src/ConvList.cpp b/src/Conversation/Controller/src/ConvList.cpp index 821b2d9..847aa75 100644 --- a/src/Conversation/Controller/src/ConvList.cpp +++ b/src/Conversation/Controller/src/ConvList.cpp @@ -249,6 +249,8 @@ void ConvList::setThreadId(ThreadId id) void ConvList::onListItemSelected(ListItem &listItem) { MSG_LOG(""); + if (dynamic_cast(&listItem) && m_pListener) + m_pListener->onReplyButtonClicked(*this); } void ConvList::onListItemLongPressed(ListItem &listItem)