namespace Msg
{
class AppControlCommand;
- class AppControlCommandDefault;
+ typedef std::shared_ptr<AppControlCommand> AppControlCommandRef;
class AppControlCommand
{
{
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_ */
namespace Msg
{
+ class AppControlCommandDefault;
+ typedef std::shared_ptr<AppControlCommandDefault> AppControlCommandDefaultRef;
+
class AppControlCommandDefault
: public AppControlCommand
{
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;
AppControlCommand::AppControlCommand(const std::string &opMsg, OperationType type)
: m_OperationMsg(opMsg)
- , m_Type(type)
+ , m_OperationType(type)
{
}
AppControlCommand::OperationType AppControlCommand::getOperationType() const
{
- return m_Type;
+ return m_OperationType;
}
-
#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)
{
{
}
+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;
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;
}
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;
-}
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)
cmd = std::make_shared<AppControlCommandDefault>(opStr);
break;
- case AppControlCommand::OpCompose:
+ case AppControlCommand::OpComposeFamily:
cmd = std::make_shared<AppControlCompose>(opStr, handle);
break;
#include "NaviFrameView.h"
#include "HwButtonListener.h"
#include "AppControlCommand.h"
+#include "AppControlCommandDefault.h"
+#include "AppControlCompose.h"
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();
#include "FrameController.h"
#include "App.h"
#include "MsgThread.h"
+#include "Conversation.h"
#include "Logger.h"
-#include "AppControlCommandDefault.h"
#include <memory>
#include <notification.h>
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()
#include <messages.h>
#include <memory>
#include <vector>
+#include <list>
#include "MsgThreadItem.h"
#include "Message.h"
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;
#include "MsgAddressPrivate.h"
#include "MsgConversationItemPrivate.h"
#include "Logger.h"
+#include "MsgUtilsPrivate.h"
#include <msg_storage.h>
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);
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);
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();
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);
#include "MessageSMS.h"
#include "MessageMms.h"
#include "WorkingDir.h"
+#include "AppControlCompose.h"
#include <list>
#include <Ecore.h>
{
public:
Body(Evas_Object *parent, MsgEngine &msgEngine);
+ Body(Evas_Object *parent, MsgEngine &msgEngine, const AppControlComposeRef &cmd);
virtual ~Body();
void setListener(IBodyListener *listener);
void write(const MessageMms &msg);
bool isMms(const PageView &page) const;
void writeTextToFile(TextPageViewItem &item);
+ void execCmd(const AppControlComposeRef &cmd);
// BodyView:
virtual void onContentChanged();
{
}
+Body::Body(Evas_Object *parent, MsgEngine &msgEngine, const AppControlComposeRef &cmd)
+ : Body(parent, msgEngine)
+{
+ if(cmd)
+ execCmd(cmd);
+}
+
Body::~Body()
{
if(m_pOnChangedIdler)
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)
}
}
+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);
void ConvList::fill()
{
m_pList->clear();
+ if(!m_ThreadId.isValid())
+ return;
MsgConversationListRef convList = m_MsgEngine.getStorage().getConversationList(m_ThreadId);
int convListLen = convList->getLength();
#include "MsgEngine.h"
#include "ConvContactList.h"
#include "ConvList.h"
+#include "AppControlCompose.h"
namespace Msg
{
, private IConvContactListListener
{
public:
- Conversation(NaviFrameController &parent);
+ Conversation(NaviFrameController &parent, const AppControlComposeRef &cmd = AppControlComposeRef());
Conversation(NaviFrameController &parent, ThreadId threadId);
virtual ~Conversation();
private:
// Empty initializer constructor:
Conversation(NaviFrameController &parent, bool dummy);
- void create(Mode mode);
+ void create();
void setMode(Mode mode);
void setNewMessageMode();
void setConversationMode();
ThreadId m_ThreadId;
bool m_IsMms; // Compose message type
ConvList *m_pConvList;
+ const AppControlComposeRef m_ComposeCmd;
};
}
, 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()
m_pContactsList->setListener(nullptr);
}
-void Conversation::create(Mode mode)
+void Conversation::create()
{
createMainLayout(getParent());
createConvList(*m_pLayout);
updateMsgInputPanel();
m_pLayout->setMsgInputPanel(*m_pMsgInputPanel);
- setMode(mode);
+ setMode(m_ThreadId.isValid() ? ConversationMode : NewMessageMode);
getMsgEngine().getStorage().addListener(*this);
setHwButtonListener(*m_pLayout, this);
{
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());
{
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();
}
#include "RecipientViewItem.h"
#include "RecipientsPanelView.h"
+#include "AppControlCompose.h"
#include "RecipientItem.h"
#include "Message.h"
#include "App.h"
{
public:
RecipientsPanel(Evas_Object *parent, App &app);
+ RecipientsPanel(Evas_Object *parent, App &app, const AppControlComposeRef &cmd);
virtual ~RecipientsPanel();
void read(Message &msg);
virtual void onContactButtonClicked();
void addRecipients();
+ void execCmd(const AppControlComposeRef &cmd);
private:
App &m_App;
{
}
+RecipientsPanel::RecipientsPanel(Evas_Object *parent, App &app, const AppControlComposeRef &cmd)
+ : RecipientsPanel(parent, app)
+{
+ if(cmd)
+ execCmd(cmd);
+}
+
RecipientsPanel::~RecipientsPanel()
{
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)
#include "CallbackAssist.h"
#include "Logger.h"
#include "AppControlParser.h"
+#include "AppControlCommandDefault.h"
+#include "AppControlCompose.h"
#include "PathUtils.h"
#include "Config.h"
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)