TizenRefApp-5372 Message can't be Sent from Contact Details Screen. Compose operation... 19/56019/10
authorDmytro Dragan <dm.dragan@samsung.com>
Thu, 31 Dec 2015 08:42:57 +0000 (10:42 +0200)
committerDmytro Dragan <dm.dragan@samsung.com>
Wed, 6 Jan 2016 13:28:13 +0000 (15:28 +0200)
Change-Id: I71ad51631e5a9808ae398bc461a8403bf054f67c
Signed-off-by: Dmytro Dragan <dm.dragan@samsung.com>
21 files changed:
src/Common/AppControl/inc/AppControlCommand.h
src/Common/AppControl/inc/AppControlCommandDefault.h
src/Common/AppControl/inc/AppControlCompose.h
src/Common/AppControl/src/AppControlCommand.cpp
src/Common/AppControl/src/AppControlCompose.cpp
src/Common/AppControl/src/AppControlParser.cpp
src/Common/Controller/inc/NaviFrameController.h
src/Common/Controller/src/NaviFrameController.cpp
src/Common/MsgEngine/inc/MsgStorage.h
src/Common/MsgEngine/src/private/MsgStoragePrivate.cpp
src/Common/MsgEngine/src/private/MsgStoragePrivate.h
src/Common/View/inc/NaviFrameView.h
src/Common/View/src/NaviFrameView.cpp
src/Conversation/Body/Controller/inc/Body.h
src/Conversation/Body/Controller/src/Body.cpp
src/Conversation/ConvList/Controller/src/ConvList.cpp
src/Conversation/Main/Controller/inc/Conversation.h
src/Conversation/Main/Controller/src/Conversation.cpp
src/Conversation/Recipients/Controller/inc/RecipientsPanel.h
src/Conversation/Recipients/Controller/src/RecipientsPanel.cpp
src/MainApp/MainApp.cpp

index 2c5f06a..f870974 100644 (file)
@@ -25,7 +25,7 @@
 namespace Msg
 {
     class AppControlCommand;
-    class AppControlCommandDefault;
+    typedef std::shared_ptr<AppControlCommand> AppControlCommandRef;
 
     class AppControlCommand
     {
@@ -34,26 +34,27 @@ namespace Msg
             {
                 OpUnknown,
                 OpDefault,
-                OpCompose,
-                OpShare,
-                OpMultiShare,
-                OpShareText
+                OpComposeFamily /** For operations Compose, Share, MultiShare and ShareText */
             };
 
         public:
             AppControlCommand(const std::string &opMsg, OperationType type);
             virtual ~AppControlCommand();
 
+            /**
+             * Get raw operation string.
+             */
             const std::string &getOperationMsg() const;
+
+            /**
+             * Get operation type.
+             */
             OperationType getOperationType() const;
 
         private:
             std::string m_OperationMsg;
-            OperationType m_Type;
+            OperationType m_OperationType;
     };
-
-    typedef std::shared_ptr<AppControlCommand> AppControlCommandRef;
-    typedef std::shared_ptr<AppControlCommandDefault> AppControlCommandDefaultRef;
 }
 
 #endif /* AppControlCommand_h_ */
index 98c8e2f..ae0ec01 100644 (file)
@@ -22,6 +22,9 @@
 
 namespace Msg
 {
+    class AppControlCommandDefault;
+    typedef std::shared_ptr<AppControlCommandDefault> AppControlCommandDefaultRef;
+
     class AppControlCommandDefault
         : public AppControlCommand
     {
index 107147a..d9a1ee3 100644 (file)
 
 namespace Msg
 {
+    class AppControlCompose;
+    typedef std::shared_ptr<AppControlCompose> AppControlComposeRef;
+
     class AppControlCompose
         : public AppControlCommand
     {
         public:
             typedef std::list<std::string> RecipientList;
             typedef std::list<std::string> FileList;
-            enum MessageType
+
+            enum OpComposeType
             {
-                UnknownType,
-                MmsType,
-                SmsType
+                OpUnknown,
+                OpCompose, /** APP_CONTROL_OPERATION_COMPOSE */
+                OpShare, /** APP_CONTROL_OPERATION_SHARE */
+                OpMultiShare, /** APP_CONTROL_OPERATION_MULTI_SHARE */
+                OpShareText /** APP_CONTROL_OPERATION_SHARE_TEXT */
             };
+
         public:
             AppControlCompose(const std::string &opMsg, app_control_h handle);
             virtual ~AppControlCompose();
 
+            /**
+             * Gets compose type.
+             */
+            OpComposeType getComposeType() const;
+
+            /**
+             * Gets data from APP_CONTROL_DATA_TO or URI(if exists).
+             */
             const RecipientList &getRecipientList() const;
-            MessageType getMessageType() const;
-            const std::string getMessageText() const;
-            const std::string getMessageSubject() const;
+
+            /**
+             * Checks if is MMS.
+             */
+            bool isMms() const;
+
+            /**
+             * Gets data from APP_CONTROL_DATA_TEXT.
+             */
+            const std::string &getMessageText() const;
+
+            /**
+             * Gets data from APP_CONTROL_DATA_SUBJECT.
+             */
+            const std::string &getMessageSubject() const;
+
+            /**
+             * Gets data from APP_CONTROL_DATA_PATH or URI(if exists).
+             */
             const FileList &getFileList() const;
 
         private:
             bool parseUri(const char *uri);
 
         private:
+            OpComposeType m_ComposeType;
             RecipientList m_RecipientList;
-            MessageType m_MessageType;
+            bool m_isMms;
             FileList m_FileList;
             std::string m_MessageText;
             std::string m_Subject;
index b7ea2fd..8abee05 100644 (file)
@@ -21,7 +21,7 @@ using namespace Msg;
 
 AppControlCommand::AppControlCommand(const std::string &opMsg, OperationType type)
     : m_OperationMsg(opMsg)
-    , m_Type(type)
+    , m_OperationType(type)
 {
 }
 
@@ -36,6 +36,5 @@ const std::string &AppControlCommand::getOperationMsg() const
 
 AppControlCommand::OperationType AppControlCommand::getOperationType() const
 {
-    return m_Type;
+    return m_OperationType;
 }
-
index 69a5136..f354575 100644 (file)
 #include "AppControlCompose.h"
 #include "Logger.h"
 #include <algorithm>
+#include <unordered_map>
 
 #include "AppControlUtils.h"
 
 using namespace Msg;
 
+namespace
+{
+    typedef std::unordered_map<std::string, AppControlCompose::OpComposeType> OperationMap;
+
+    const OperationMap operationMap =
+    {
+        {APP_CONTROL_OPERATION_COMPOSE, AppControlCompose::OpCompose},
+        {APP_CONTROL_OPERATION_SHARE, AppControlCompose::OpShare},
+        {APP_CONTROL_OPERATION_MULTI_SHARE, AppControlCompose::OpMultiShare},
+        {APP_CONTROL_OPERATION_SHARE_TEXT, AppControlCompose::OpShareText}
+    };
+
+    AppControlCompose::OpComposeType getOperation(const std::string &op)
+    {
+        auto it = operationMap.find(op);
+        return it != operationMap.end() ? it->second : AppControlCompose::OpUnknown;
+    };
+}
+
 AppControlCompose::AppControlCompose(const std::string &opMsg, app_control_h handle)
-    : AppControlCommand(opMsg, OpCompose)
-    , m_MessageType(UnknownType)
+    : AppControlCommand(opMsg, OpComposeFamily)
+    , m_ComposeType(getOperation(opMsg))
+    , m_isMms(false)
 {
     if(handle)
     {
@@ -46,6 +67,34 @@ AppControlCompose::~AppControlCompose()
 {
 }
 
+AppControlCompose::OpComposeType AppControlCompose::getComposeType() const
+{
+    return m_ComposeType;
+}
+
+const AppControlCompose::RecipientList &AppControlCompose::getRecipientList() const
+{
+    return m_RecipientList;
+}
+
+bool AppControlCompose::isMms() const
+{
+    return m_isMms;
+}
+const std::string &AppControlCompose::getMessageText() const
+{
+    return m_MessageText;
+}
+const std::string &AppControlCompose::getMessageSubject() const
+{
+    return m_Subject;
+}
+const AppControlCompose::FileList &AppControlCompose::getFileList() const
+{
+    return m_FileList;
+}
+
+
 bool AppControlCompose::parseUri(const char *uri)
 {
     TRACE;
@@ -57,20 +106,16 @@ bool AppControlCompose::parseUri(const char *uri)
         std::istringstream is(uriToParse);
 
         std::string cur;
-        std::getline(is, cur, '?');
+        std::getline(is, cur, ':');
         MSG_LOG("cur = ", cur.c_str());
-        if(cur == "sms")
-        {
-             m_MessageType = SmsType;
-        }
-        else if(cur == "mmsto")
-        {
-            m_MessageType = MmsType;
-        }
 
-        if(m_MessageType != UnknownType)
+        if(cur == "sms" || cur == "mmsto")
         {
-            //TODO: further uri parsing
+            m_isMms = (cur == "mmsto");
+            for( ;std::getline(is, cur, ','); )
+            {
+                m_RecipientList.push_back(cur);
+            }
             res = true;
         }
 
@@ -78,24 +123,3 @@ bool AppControlCompose::parseUri(const char *uri)
     return res;
 }
 
-const AppControlCompose::RecipientList &AppControlCompose::getRecipientList() const
-{
-    return m_RecipientList;
-}
-
-AppControlCompose::MessageType AppControlCompose::getMessageType() const
-{
-    return m_MessageType;
-}
-const std::string AppControlCompose::getMessageText() const
-{
-    return m_MessageText;
-}
-const std::string AppControlCompose::getMessageSubject() const
-{
-    return m_Subject;
-}
-const AppControlCompose::FileList &AppControlCompose::getFileList() const
-{
-    return m_FileList;
-}
index 7fec54c..23e3ab6 100644 (file)
@@ -34,12 +34,12 @@ namespace
 
     const OperationMap operationMap =
     {
-        {"http://tizen.org/appcontrol/operation/default", AppControlCommand::OpDefault},
-        {"http://tizen.org/appcontrol/operation/main", AppControlCommand::OpDefault},
-        {"http://tizen.org/appcontrol/operation/compose", AppControlCommand::OpCompose},
-        {"http://tizen.org/appcontrol/operation/share", AppControlCommand::OpShare},
-        {"http://tizen.org/appcontrol/operation/multi_share", AppControlCommand::OpMultiShare},
-        {"http://tizen.org/appcontrol/operation/share_text", AppControlCommand::OpShareText}
+        {APP_CONTROL_OPERATION_DEFAULT, AppControlCommand::OpDefault},
+        {APP_CONTROL_OPERATION_MAIN, AppControlCommand::OpDefault},
+        {APP_CONTROL_OPERATION_COMPOSE, AppControlCommand::OpComposeFamily},
+        {APP_CONTROL_OPERATION_SHARE, AppControlCommand::OpComposeFamily},
+        {APP_CONTROL_OPERATION_MULTI_SHARE, AppControlCommand::OpComposeFamily},
+        {APP_CONTROL_OPERATION_SHARE_TEXT, AppControlCommand::OpComposeFamily}
     };
 
     AppControlCommand::OperationType getOperation(const char *op)
@@ -71,7 +71,7 @@ AppControlCommandRef AppControlParser::parse(app_control_h handle)
             cmd = std::make_shared<AppControlCommandDefault>(opStr);
             break;
 
-        case AppControlCommand::OpCompose:
+        case AppControlCommand::OpComposeFamily:
             cmd = std::make_shared<AppControlCompose>(opStr, handle);
             break;
 
index e90c06b..b490ddb 100644 (file)
@@ -22,6 +22,8 @@
 #include "NaviFrameView.h"
 #include "HwButtonListener.h"
 #include "AppControlCommand.h"
+#include "AppControlCommandDefault.h"
+#include "AppControlCompose.h"
 
 namespace Msg
 {
@@ -36,16 +38,35 @@ namespace Msg
             NaviFrameController(App &app);
             virtual ~NaviFrameController();
 
+            /**
+             * Pushes @frame to screen.
+             */
             void push(FrameController &frame);
+
+            /**
+             * Pops last frame. Exit from app if frame count reaches zero.
+             */
             void pop();
-            void executeCommand(AppControlCommandRef &cmd);
+
+            /**
+             * Executes app control command of default type.
+             */
+            void execCmd(const AppControlCommandDefaultRef &cmd);
+
+            /**
+             * Executes app control command of compose type. This is Compose, Share, MultiShare, ShareText.
+             */
+            void execCmd(const AppControlComposeRef &cmd);
+
+            /**
+             * Destroys naviframe. Note, than this doesn't close app.
+             */
             void destroy();
 
         private:
             void init();
 
-            void execCmd(AppControlCommandDefaultRef cmd);
-            void execCmd(AppControlCommandRef cmd);
+            bool execCmd(const AppControlCommand &cmd);
 
             virtual void onHwBackButtonClicked();
             virtual void onHwMoreButtonClicked();
index dacaeec..d9c9abc 100644 (file)
@@ -19,8 +19,8 @@
 #include "FrameController.h"
 #include "App.h"
 #include "MsgThread.h"
+#include "Conversation.h"
 #include "Logger.h"
-#include "AppControlCommandDefault.h"
 
 #include <memory>
 #include <notification.h>
@@ -62,43 +62,46 @@ void NaviFrameController::destroy()
     NaviFrameView::destroy();
 }
 
-void NaviFrameController::executeCommand(AppControlCommandRef &cmd)
+bool NaviFrameController::execCmd(const AppControlCommand &cmd)
 {
-    MSG_LOG("Execute app. control command: ", cmd->getOperationMsg());
+    MSG_LOG("Execute app. control command: ", cmd.getOperationMsg());
 
     std::string errorMsg;
     if(!getMsgEngine().isReady(errorMsg))
     {
         notification_status_message_post(errorMsg.c_str());
-        return;
-    }
-
-    AppControlCommand::OperationType op = cmd->getOperationType();
-
-    switch(op)
-    {
-        case AppControlCommand::OpDefault:
-            execCmd(std::static_pointer_cast<AppControlCommandDefault>(cmd));
-            break;
-
-        case AppControlCommand::OpUnknown:
-            execCmd(cmd);
-            break;
-
-        default:
-            break;
+        return false;
     }
+    return true;
 }
 
-void NaviFrameController::execCmd(AppControlCommandDefaultRef cmd)
+void NaviFrameController::execCmd(const AppControlCommandDefaultRef &cmd)
 {
-    MsgThread *threadFrame = new MsgThread(*this);
-    push(*threadFrame);
+    if(execCmd(*cmd))
+    {
+        if(isEmpty())
+        {
+            MsgThread *threadFrame = new MsgThread(*this);
+            push(*threadFrame);
+        }
+    }
 }
 
-void NaviFrameController::execCmd(AppControlCommandRef cmd)
+void NaviFrameController::execCmd(const AppControlComposeRef &cmd)
 {
-    MSG_LOG_WARN("Unknown app control command");
+    if(execCmd(*cmd))
+    {
+        if(isEmpty())
+        {
+            Conversation *convFrame = new Conversation(*this, cmd);
+            push(*convFrame);
+        }
+        else
+        {
+            //TODO: Handle this case (erase or save previous data)
+            MSG_LOG_WARN("App was already launched! You may lost previous data!");
+        }
+    }
 }
 
 void NaviFrameController::onHwBackButtonClicked()
index 1e92517..3a1f4fa 100644 (file)
@@ -21,6 +21,7 @@
 #include <messages.h>
 #include <memory>
 #include <vector>
+#include <list>
 
 #include "MsgThreadItem.h"
 #include "Message.h"
@@ -45,6 +46,7 @@ namespace Msg
             virtual MsgThreadListRef getThreadList() = 0;
             virtual MsgThreadItemRef getThread(ThreadId id) = 0;
             virtual ThreadId getThreadId(const MsgAddressList &addressList) = 0;
+            virtual ThreadId getThreadId(const std::list<std::string> &addressList) = 0;
             virtual bool deleteThread(ThreadId id) = 0;
             virtual MsgAddressListRef getAddressList(ThreadId id) = 0;
 
index 971bd60..e4a1072 100644 (file)
@@ -22,6 +22,7 @@
 #include "MsgAddressPrivate.h"
 #include "MsgConversationItemPrivate.h"
 #include "Logger.h"
+#include "MsgUtilsPrivate.h"
 
 #include <msg_storage.h>
 
@@ -141,6 +142,37 @@ ThreadId MsgStoragePrivate::getThreadId(const MsgAddressList &addressList)
     return (ThreadId)id;
 }
 
+ThreadId MsgStoragePrivate::getThreadId(const std::list<std::string> &addressList)
+{
+    msg_thread_id_t tid = -1;
+    msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
+
+    if(msgInfo)
+    {
+        for(auto &addr : addressList)
+        {
+            MsgAddress::AddressType type = MsgUtils::getAddressType(addr);
+            msg_struct_t tmpAddr = nullptr;
+
+            if (msg_list_add_item(msgInfo, MSG_MESSAGE_ADDR_LIST_HND, &tmpAddr) == MSG_SUCCESS)
+            {
+                msg_set_int_value(tmpAddr, MSG_ADDRESS_INFO_ADDRESS_TYPE_INT, MsgUtilsPrivate::addressTypeToNative(type));
+                msg_set_int_value(tmpAddr, MSG_ADDRESS_INFO_RECIPIENT_TYPE_INT, MSG_RECIPIENTS_TYPE_TO);
+                MsgUtilsPrivate::setStr(tmpAddr, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, addr);
+            }
+        }
+
+        msg_list_handle_t addrList = nullptr;
+        msg_get_list_handle(msgInfo, MSG_MESSAGE_ADDR_LIST_HND, (void **)&addrList);
+        if(addrList)
+            msg_get_thread_id_by_address2(m_ServiceHandle, addrList, &tid);
+
+        msg_release_struct(&msgInfo);
+    }
+
+    return (ThreadId)tid;
+}
+
 MsgAddressListRef MsgStoragePrivate::getAddressList(ThreadId id)
 {
     MsgAddressStructListPrivate *result = new MsgAddressStructListPrivate(true);
index 328cd09..7888042 100644 (file)
@@ -37,6 +37,7 @@ namespace Msg
             virtual MsgThreadListRef getThreadList();
             virtual MsgThreadItemRef getThread(ThreadId id);
             virtual ThreadId getThreadId(const MsgAddressList &addressList);
+            virtual ThreadId getThreadId(const std::list<std::string> &addressList);
             virtual bool deleteThread(ThreadId id);
             virtual MsgAddressListRef getAddressList(ThreadId id);
 
index 7a3b4ab..180e41f 100644 (file)
@@ -31,7 +31,24 @@ namespace Msg
             NaviFrameView(View &parent);
             virtual ~NaviFrameView();
 
+            /**
+             * Checks is it last frame.
+             */
             bool isLastFrame() const;
+
+            /**
+             * Get count of pushed frames.
+             */
+            int getItemsCount() const;
+
+            /**
+             * Checks if any frame was pushed.
+             */
+            bool isEmpty() const;
+
+            /**
+             * Pushes new frame. Attaches @content to frame. Updates @item with created frame.
+             */
             void push(NaviFrameItem &item, Evas_Object *content = nullptr);
             void push(NaviFrameItem &item, View &content);
             void pop();
index 0d42907..f80884c 100644 (file)
@@ -50,6 +50,23 @@ bool NaviFrameView::isLastFrame() const
     return elm_naviframe_bottom_item_get(getEo()) == elm_naviframe_top_item_get(getEo());
 }
 
+int NaviFrameView::getItemsCount() const
+{
+    int res = 0;
+    Eina_List *list= elm_naviframe_items_get(getEo());
+    if(list)
+    {
+        res = eina_list_count(list);
+        eina_list_free(list);
+    }
+    return res;
+}
+
+bool NaviFrameView::isEmpty() const
+{
+    return getItemsCount() <= 0;
+}
+
 void NaviFrameView::push(NaviFrameItem &item, Evas_Object *content)
 {
     Elm_Object_Item *it = elm_naviframe_item_push(getEo(), NULL, NULL, NULL, content, NULL);
index 18f7d9e..da2122f 100644 (file)
@@ -22,6 +22,7 @@
 #include "MessageSMS.h"
 #include "MessageMms.h"
 #include "WorkingDir.h"
+#include "AppControlCompose.h"
 
 #include <list>
 #include <Ecore.h>
@@ -42,6 +43,7 @@ namespace Msg
     {
         public:
             Body(Evas_Object *parent, MsgEngine &msgEngine);
+            Body(Evas_Object *parent, MsgEngine &msgEngine, const AppControlComposeRef &cmd);
             virtual ~Body();
 
             void setListener(IBodyListener *listener);
@@ -66,6 +68,7 @@ namespace Msg
             void write(const MessageMms &msg);
             bool isMms(const PageView &page) const;
             void writeTextToFile(TextPageViewItem &item);
+            void execCmd(const AppControlComposeRef &cmd);
 
             // BodyView:
             virtual void onContentChanged();
index 74136b2..cf2bc8b 100644 (file)
@@ -47,6 +47,13 @@ Body::Body(Evas_Object *parent, MsgEngine &msgEngine)
 {
 }
 
+Body::Body(Evas_Object *parent, MsgEngine &msgEngine, const AppControlComposeRef &cmd)
+    : Body(parent, msgEngine)
+{
+    if(cmd)
+        execCmd(cmd);
+}
+
 Body::~Body()
 {
     if(m_pOnChangedIdler)
@@ -160,7 +167,12 @@ void Body::write(const Message &msg)
 
 void Body::write(const MessageSMS &msg)
 {
-    // TODO: impl
+    TextPageViewItem *textItem = getTextItem(getDefaultPage());
+    assert(textItem);
+    if(textItem)
+    {
+        textItem->setText(msg.getText());
+    }
 }
 
 void Body::write(const MessageMms &msg)
@@ -257,6 +269,18 @@ void Body::readAttachments(MessageMms &msg)
     }
 }
 
+void Body::execCmd(const AppControlComposeRef &cmd)
+{
+    TextPageViewItem *textItem = getTextItem(getDefaultPage());
+    if(textItem)
+    {
+        textItem->setText(cmd->getMessageText());
+    }
+    //TODO: implement fill of subject.
+
+    addMedia(cmd->getFileList());
+}
+
 void Body::onMediaRemoved(const std::string &resourcePath)
 {
     m_WorkingDir.removeFile(resourcePath);
index 8f0f835..616b97f 100644 (file)
@@ -93,6 +93,8 @@ Evas_Object *ConvList::createList(Evas_Object *parent)
 void ConvList::fill()
 {
     m_pList->clear();
+    if(!m_ThreadId.isValid())
+        return;
 
     MsgConversationListRef convList = m_MsgEngine.getStorage().getConversationList(m_ThreadId);
     int convListLen = convList->getLength();
index 0036b01..a273e01 100644 (file)
@@ -29,6 +29,7 @@
 #include "MsgEngine.h"
 #include "ConvContactList.h"
 #include "ConvList.h"
+#include "AppControlCompose.h"
 
 namespace Msg
 {
@@ -46,7 +47,7 @@ namespace Msg
         , private IConvContactListListener
     {
         public:
-            Conversation(NaviFrameController &parent);
+            Conversation(NaviFrameController &parent, const AppControlComposeRef &cmd = AppControlComposeRef());
             Conversation(NaviFrameController &parent, ThreadId threadId);
             virtual ~Conversation();
 
@@ -85,7 +86,7 @@ namespace Msg
         private:
             // Empty initializer constructor:
             Conversation(NaviFrameController &parent, bool dummy);
-            void create(Mode mode);
+            void create();
             void setMode(Mode mode);
             void setNewMessageMode();
             void setConversationMode();
@@ -119,6 +120,7 @@ namespace Msg
             ThreadId m_ThreadId;
             bool m_IsMms; // Compose message type
             ConvList *m_pConvList;
+            const AppControlComposeRef m_ComposeCmd;
     };
 }
 
index cec8ed7..8c34ab1 100644 (file)
@@ -42,20 +42,26 @@ Conversation::Conversation(NaviFrameController &parent, bool dummy)
     , m_ThreadId()
     , m_IsMms(false)
     , m_pConvList(nullptr)
+    , m_ComposeCmd()
 {
 }
 
-Conversation::Conversation(NaviFrameController &parent)
+Conversation::Conversation(NaviFrameController &parent, const AppControlComposeRef &cmd)
     : Conversation(parent, false)
 {
-    create(NewMessageMode);
+    if(cmd)
+    {
+        m_ComposeCmd = cmd;
+        m_ThreadId = getMsgEngine().getStorage().getThreadId(m_ComposeCmd->getRecipientList());
+    }
+    create();
 }
 
 Conversation::Conversation(NaviFrameController &parent,ThreadId threadId)
     : Conversation(parent, false)
 {
     m_ThreadId = threadId;
-    create(ConversationMode);
+    create();
 }
 
 Conversation::~Conversation()
@@ -72,7 +78,7 @@ Conversation::~Conversation()
         m_pContactsList->setListener(nullptr);
 }
 
-void Conversation::create(Mode mode)
+void Conversation::create()
 {
     createMainLayout(getParent());
     createConvList(*m_pLayout);
@@ -83,7 +89,7 @@ void Conversation::create(Mode mode)
     updateMsgInputPanel();
     m_pLayout->setMsgInputPanel(*m_pMsgInputPanel);
 
-    setMode(mode);
+    setMode(m_ThreadId.isValid() ? ConversationMode : NewMessageMode);
 
     getMsgEngine().getStorage().addListener(*this);
     setHwButtonListener(*m_pLayout, this);
@@ -165,7 +171,7 @@ void Conversation::createRecipPanel(Evas_Object *parent)
 {
     if(!m_pRecipPanel)
     {
-        m_pRecipPanel = new RecipientsPanel(parent, getApp());
+        m_pRecipPanel = new RecipientsPanel(parent, getApp(), m_ComposeCmd);
         m_pRecipPanel->setListener(this);
         m_pRecipPanel->show();
         m_pRecipPanel->setRecipientRect(m_pLayout->getRecipientRect());
@@ -214,7 +220,7 @@ void Conversation::createBody(Evas_Object *parent)
 {
     if(!m_pBody)
     {
-        m_pBody = new Body(*m_pMsgInputPanel, getMsgEngine());
+        m_pBody = new Body(*m_pMsgInputPanel, getMsgEngine(), m_ComposeCmd);
         m_pBody->setListener(this);
         m_pBody->show();
     }
index a4ad1df..89f667d 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "RecipientViewItem.h"
 #include "RecipientsPanelView.h"
+#include "AppControlCompose.h"
 #include "RecipientItem.h"
 #include "Message.h"
 #include "App.h"
@@ -33,6 +34,7 @@ namespace Msg
     {
         public:
             RecipientsPanel(Evas_Object *parent, App &app);
+            RecipientsPanel(Evas_Object *parent, App &app, const AppControlComposeRef &cmd);
             virtual ~RecipientsPanel();
 
             void read(Message &msg);
@@ -53,6 +55,7 @@ namespace Msg
             virtual void onContactButtonClicked();
 
             void addRecipients();
+            void execCmd(const AppControlComposeRef &cmd);
 
         private:
             App &m_App;
index bfe5c00..2c0522f 100644 (file)
@@ -28,6 +28,13 @@ RecipientsPanel::RecipientsPanel(Evas_Object *parent, App &app)
 {
 }
 
+RecipientsPanel::RecipientsPanel(Evas_Object *parent, App &app, const AppControlComposeRef &cmd)
+    : RecipientsPanel(parent, app)
+{
+    if(cmd)
+        execCmd(cmd);
+}
+
 RecipientsPanel::~RecipientsPanel()
 {
 
@@ -102,6 +109,14 @@ bool RecipientsPanel::appendItem(const std::string &address, const std::string &
     return result;
 }
 
+void RecipientsPanel::execCmd(const AppControlComposeRef &cmd)
+{
+    for(auto item: cmd->getRecipientList())
+    {
+        appendItem(item, item, MsgAddress::UnknownAddressType);
+    }
+}
+
 void RecipientsPanel::onKeyDown(Evas_Event_Key_Down *ev)
 {
     if(ev && ev->keyname)
index bf22e2c..9447f42 100644 (file)
@@ -21,6 +21,8 @@
 #include "CallbackAssist.h"
 #include "Logger.h"
 #include "AppControlParser.h"
+#include "AppControlCommandDefault.h"
+#include "AppControlCompose.h"
 #include "PathUtils.h"
 #include "Config.h"
 
@@ -155,9 +157,24 @@ void MainApp::onAppControl(app_control_h app_control)
     TRACE;
 
     AppControlCommandRef cmd = AppControlParser::parse(app_control);
+    if(!cmd)
+        return;
 
-    if(m_pRootController)
-        m_pRootController->executeCommand(cmd);
+    switch(cmd->getOperationType())
+    {
+        case AppControlCommand::OpDefault:
+            if(m_pRootController)
+                m_pRootController->execCmd(std::static_pointer_cast<AppControlCommandDefault>(cmd));
+            break;
+        case AppControlCommand::OpComposeFamily:
+            if(m_pRootController)
+                m_pRootController->execCmd(std::static_pointer_cast<AppControlCompose>(cmd));
+            break;
+        case AppControlCommand::OpUnknown:
+        default:
+            MSG_LOG_WARN("Not supported command");
+            break;
+    }
 }
 
 void MainApp::onLanguageChanged(app_event_info_h appEvent)