#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();
virtual void onPause() {};
virtual void onResume() {};
+ void newGroup();
+
private:
bool m_IsPause;
+ std::shared_ptr<GroupList> m_GroupList;
};
}
*/
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.
*/
*/
void destroy();
- private:
template<typename T>
T *getTopFrame() const;
+
FrameController *getTopFrame() const;
+ private:
bool prepare(const AppControlCommand &cmd);
void registerHWButtonEvent();
: NaviFrameItem(parent)
, m_IsPause(true)
{
+ newGroup();
}
FrameController::~FrameController()
{
+ m_GroupList->remove(this);
}
NaviFrameController &FrameController::getParent()
{
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;
+ }
+}
}
}
+void NaviFrameController::popGroup(FrameController &frame)
+{
+ auto list = frame.getGroupList();
+ for (FrameController *item : list) {
+ if (item)
+ pop(*item);
+ }
+}
+
void NaviFrameController::destroy()
{
NaviFrameView::destroy();
#ifndef Recipient_h_
#define Recipient_h_
+#include "MsgTypes.h"
+
#include <string>
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;
#include "ContactManager.h"
#include "Logger.h"
#include "MsgUtils.h"
+#include "MsgEngine.h"
#include <memory>
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;
+}
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);
+ }
}
}
}
{
if (!m_pInputFrame) {
m_pInputFrame = new RecipInputFrame(getParent(), m_Recip);
+ addToGroup(*m_pInputFrame);
m_pInputFrame->setOnPopCb(makeCbLast(&RecipFrame::onInputFramePop), this);
getParent().push(*m_pInputFrame);
}
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
void onItemChecked(ConvListItem &item) override;
void onItemRequestDeleteMode(ConvListItem &listItem) override;
void onListChanged(ConvList &list) override;
+ void onReplyButtonClicked(ConvList &list) override;
private:
void prepareWorkingDir();
void prepareList();
void showSelectPopup();
void updateDeleteViews();
+ void reply();
void setMode(Mode mode);
void setDeleteMode(bool value);
private:
Mode m_Mode;
+ ThreadId m_ThreadId;
DefaultLayout *m_pLayout;
ConvList *m_pList;
MoreOption *m_pMoreOption;
virtual void onItemChecked(ConvListItem &item) {};
virtual void onItemRequestDeleteMode(ConvListItem &listItem) {};
virtual void onListChanged(ConvList &list) {};
+ virtual void onReplyButtonClicked(ConvList &list) {};
};
}
#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)
void ConvFrame::setThreadId(ThreadId id)
{
+ m_ThreadId = id;
m_pList->setThreadId(id);
m_pList->navigateToBottom();
}
}
}
+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"
updateDeleteViews();
}
+void ConvFrame::onReplyButtonClicked(ConvList &list)
+{
+ MSG_LOG("");
+ reply();
+}
+
void ConvFrame::onDelButtonClicked(Evas_Object *obj, void *event)
{
MSG_LOG("");
void ConvFrame::onReplyClicked(MoreOption &obj)
{
MSG_LOG("");
+ reply();
}
void ConvFrame::onCallClicked(MoreOption &obj)
void ConvList::onListItemSelected(ListItem &listItem)
{
MSG_LOG("");
+ if (dynamic_cast<ConvReplyListItem*>(&listItem) && m_pListener)
+ m_pListener->onReplyButtonClicked(*this);
}
void ConvList::onListItemLongPressed(ListItem &listItem)