From: Denis Dolzhenko Date: Tue, 15 Aug 2017 09:00:43 +0000 (+0300) Subject: TizenRefApp-9118 Implement retrieve of MMS feature X-Git-Tag: submit/tizen/20170815.144740~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5b02e5070af5cb822e0da9abc0724f74898a754d;p=profile%2Fwearable%2Fapps%2Fnative%2Fmessage.git TizenRefApp-9118 Implement retrieve of MMS feature Change-Id: If6a9c230da9caaa88ac86f59b332e0150806c25f Signed-off-by: Denis Dolzhenko --- diff --git a/src/Common/Controller/inc/ConnectivityChecker.h b/src/Common/Controller/inc/ConnectivityChecker.h index 8a8a841..dfa1d6d 100644 --- a/src/Common/Controller/inc/ConnectivityChecker.h +++ b/src/Common/Controller/inc/ConnectivityChecker.h @@ -35,6 +35,7 @@ namespace Msg { bool isReadyToSendSms(); bool isReadyToSendMms(); + bool isReadyToRetrieveMms(); private: ConnectivityChecker(const ConnectivityChecker &) = delete; @@ -42,10 +43,16 @@ namespace Msg { SystemSettingsManager &getSysSettings(); + // Retrieve: + bool isRetrieveMobileDataEnabled(); + bool isRetrieveRoamingDataEnabled(); + void showNoSimCardPopup(); void showDisableFlightModePopup(); void showMobileNetworkSettingsPopup(); void showUnableDataRoamingPopup(); + void showRetrieveMobileDataPopup(); + void showRetrieveEnableDataRoamingPopup(); void onTurnOffFlightModeClicked(Popup &popup); void onAllowTransmissionTextClicked(Popup &popup); diff --git a/src/Common/Controller/src/ConnectivityChecker.cpp b/src/Common/Controller/src/ConnectivityChecker.cpp index d1b067c..b19ff1b 100644 --- a/src/Common/Controller/src/ConnectivityChecker.cpp +++ b/src/Common/Controller/src/ConnectivityChecker.cpp @@ -63,6 +63,24 @@ bool ConnectivityChecker::isRoamingDataEnabled() return true; } +bool ConnectivityChecker::isRetrieveMobileDataEnabled() +{ + if (!getSysSettings().isMobileDataEnabled()) { + showRetrieveMobileDataPopup(); + return false; + } + return true; +} + +bool ConnectivityChecker::isRetrieveRoamingDataEnabled() +{ + if (getSysSettings().isRoaming() && !getSysSettings().isRoamingDataEnabled()) { + showRetrieveEnableDataRoamingPopup(); + return false; + } + return true; +} + bool ConnectivityChecker::isReadyToSendSms() { return isSimInserted() && @@ -76,6 +94,12 @@ bool ConnectivityChecker::isReadyToSendMms() isRoamingDataEnabled(); } +bool ConnectivityChecker::isReadyToRetrieveMms() +{ + return isRetrieveMobileDataEnabled() && + isRetrieveRoamingDataEnabled(); +} + SystemSettingsManager &ConnectivityChecker::getSysSettings() { return App::getInst().getSysSettingsManager(); @@ -113,6 +137,16 @@ void ConnectivityChecker::showUnableDataRoamingPopup() popup->show(); } +void ConnectivityChecker::showRetrieveMobileDataPopup() +{ + ToastPopup::toast(msgt("WDS_MSG_TPOP_UNABLE_TO_RETRIEVE_MESSAGE_MOBILE_DATA_OFF_ABB")); +} + +void ConnectivityChecker::showRetrieveEnableDataRoamingPopup() +{ + ToastPopup::toast(msgt("WDS_MSG_TPOP_UNABLE_TO_RETRIEVE_MMS_ENABLE_DATA_ROAMING_ABB")); +} + void ConnectivityChecker::onTurnOffFlightModeClicked(Popup &popup) { MSG_LOG(""); diff --git a/src/Common/SystemSettingsManager/inc/SystemSettingsManager.h b/src/Common/SystemSettingsManager/inc/SystemSettingsManager.h index 5cd9520..893d5b0 100644 --- a/src/Common/SystemSettingsManager/inc/SystemSettingsManager.h +++ b/src/Common/SystemSettingsManager/inc/SystemSettingsManager.h @@ -19,6 +19,7 @@ #include #include +#include namespace Msg { @@ -88,9 +89,11 @@ namespace Msg SystemSettingsManager(SystemSettingsManager&) = delete; SystemSettingsManager &operator =(const SystemSettingsManager&) = delete; - void onTimeFormatChanged(); - void onLanguageChanged(); - void prepareTel(); + void onTimeFormatChanged(system_settings_key_e key); + void onLanguageChanged(system_settings_key_e key); + + bool prepareTel(); + private: std::vector m_Listeners; telephony_handle_list_s m_TelHandleList; diff --git a/src/Common/SystemSettingsManager/src/SystemSettingsManager.cpp b/src/Common/SystemSettingsManager/src/SystemSettingsManager.cpp index 91b0bcc..b523233 100644 --- a/src/Common/SystemSettingsManager/src/SystemSettingsManager.cpp +++ b/src/Common/SystemSettingsManager/src/SystemSettingsManager.cpp @@ -16,25 +16,20 @@ #include "SystemSettingsManager.h" #include "Logger.h" +#include "Callback.h" #include -#include #include #include #include using namespace Msg; -#define CALLBACK(method) [](system_settings_key_e key, void *user_data) \ -{ \ - static_cast(user_data)->method(); \ -} - SystemSettingsManager::SystemSettingsManager() : m_TelHandleList() { - system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, CALLBACK(onTimeFormatChanged), this); - system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, CALLBACK(onLanguageChanged), this); + system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, makeCbLast(&SystemSettingsManager::onTimeFormatChanged), this); + system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, makeCbLast(&SystemSettingsManager::onLanguageChanged), this); } SystemSettingsManager::~SystemSettingsManager() @@ -43,12 +38,14 @@ SystemSettingsManager::~SystemSettingsManager() telephony_deinit(&m_TelHandleList); } -void SystemSettingsManager::prepareTel() +bool SystemSettingsManager::prepareTel() { - if (m_TelHandleList.handle != nullptr) - return; + if (m_TelHandleList.handle) + return true; + int err = telephony_init(&m_TelHandleList); MSG_LOG("telephony_init = ", err); + return m_TelHandleList.handle != nullptr; } void SystemSettingsManager::addListener(ISystemSettingsManager &l) @@ -67,11 +64,11 @@ void SystemSettingsManager::removeListener(ISystemSettingsManager&l) bool SystemSettingsManager::isSimInserted() const { - bool res = false; - const_cast(this)->prepareTel(); + if (!const_cast(this)->prepareTel()) + return false; - if (m_TelHandleList.count > 0) - { + bool res = false; + if (m_TelHandleList.count > 0) { telephony_h handle = m_TelHandleList.handle[0]; telephony_sim_state_e simState = TELEPHONY_SIM_STATE_UNAVAILABLE; telephony_sim_get_state(handle, &simState); @@ -84,15 +81,14 @@ bool SystemSettingsManager::isSimInserted() const bool SystemSettingsManager::isSimActive() const { - bool res = false; - const_cast(this)->prepareTel(); + if (!const_cast(this)->prepareTel()) + return false; - if (m_TelHandleList.count > 0) - { + bool res = false; + if (m_TelHandleList.count > 0) { telephony_h telHandle = m_TelHandleList.handle[0]; telephony_network_service_state_e servState; - if (telephony_network_get_service_state(telHandle, &servState) == TELEPHONY_ERROR_NONE) - { + if (telephony_network_get_service_state(telHandle, &servState) == TELEPHONY_ERROR_NONE) { res = (servState == TELEPHONY_NETWORK_SERVICE_STATE_IN_SERVICE); MSG_LOG("servState = ", servState); } @@ -117,6 +113,9 @@ bool SystemSettingsManager::isFlightModeEnabled() const bool SystemSettingsManager::isRoaming() const { + if (!const_cast(this)->prepareTel()) + return false; + bool status = false; telephony_h telHandle = m_TelHandleList.handle[0]; telephony_network_get_roaming_status(telHandle, &status); @@ -130,13 +129,13 @@ bool SystemSettingsManager::isRoamingDataEnabled() const return enabled; } -void SystemSettingsManager::onTimeFormatChanged() +void SystemSettingsManager::onTimeFormatChanged(system_settings_key_e key) { for (ISystemSettingsManager *it : m_Listeners) it->onTimeFormatChanged(); } -void SystemSettingsManager::onLanguageChanged() +void SystemSettingsManager::onLanguageChanged(system_settings_key_e key) { for (ISystemSettingsManager *it : m_Listeners) it->onLanguageChanged(); diff --git a/src/Conversation/Controller/inc/BubbleEntity.h b/src/Conversation/Controller/inc/BubbleEntity.h index 7e71d00..69a305e 100644 --- a/src/Conversation/Controller/inc/BubbleEntity.h +++ b/src/Conversation/Controller/inc/BubbleEntity.h @@ -41,7 +41,7 @@ namespace Msg { ContactItem, CalendarEventItem, UnknownFileItem, - RetrieveMessageItem, + RetrieveItem, NoContentItem }; diff --git a/src/Conversation/Controller/inc/BubbleEntityFactory.h b/src/Conversation/Controller/inc/BubbleEntityFactory.h index 5c765d2..0782d87 100644 --- a/src/Conversation/Controller/inc/BubbleEntityFactory.h +++ b/src/Conversation/Controller/inc/BubbleEntityFactory.h @@ -48,7 +48,7 @@ namespace Msg { private: BubbleEntity *createEntity(const MsgConvMedia &msgMedia, Message::Direction direction); BubbleTextEntity *createTextEntity(std::string text, Message::Direction direction); - BubbleRetrieveEntity *createRetrieveEntity(Message::Direction direction); + BubbleRetrieveEntity *createRetrieveEntity(); BubbleNoContentEntity *createNoContentEntity(Message::Direction direction); BubbleEntity *createTextEntityFromFile(std::string filePath, Message::Direction direction); BubbleEntity *createSubjectEntity(const std::string subject, Message::Direction direction); diff --git a/src/Conversation/Controller/inc/BubbleRetrieveEntity.h b/src/Conversation/Controller/inc/BubbleRetrieveEntity.h index a9a3f74..eed777d 100644 --- a/src/Conversation/Controller/inc/BubbleRetrieveEntity.h +++ b/src/Conversation/Controller/inc/BubbleRetrieveEntity.h @@ -31,7 +31,7 @@ namespace Msg { }; inline BubbleRetrieveEntity::BubbleRetrieveEntity(Message::Direction direction) - : BubbleEntity(RetrieveMessageItem, direction) + : BubbleEntity(RetrieveItem, direction) { } diff --git a/src/Conversation/Controller/inc/ConvDateLineListItem.h b/src/Conversation/Controller/inc/ConvDateLineListItem.h index c00f249..7474d8d 100644 --- a/src/Conversation/Controller/inc/ConvDateLineListItem.h +++ b/src/Conversation/Controller/inc/ConvDateLineListItem.h @@ -35,7 +35,7 @@ namespace Msg { time_t getRawTime() const override; private: - virtual std::string getText(ListItem &item, const char *part); + std::string getText(ListItem &item, const char *part) override; private: time_t m_DateTime; diff --git a/src/Conversation/Controller/inc/ConvListItem.h b/src/Conversation/Controller/inc/ConvListItem.h index 075d709..0841b30 100644 --- a/src/Conversation/Controller/inc/ConvListItem.h +++ b/src/Conversation/Controller/inc/ConvListItem.h @@ -48,8 +48,9 @@ namespace Msg { virtual ~ConvListItem(); MsgId getMsgId() const; + Message::Type getMsgType() const; time_t getRawTime() const override; - void updateStatus(); + void updateMsgInfo(); void updateLangInfo(); void updateTime(); void setActionEventFlag(bool isAction = true); @@ -57,14 +58,18 @@ namespace Msg { protected: Evas_Object *getBubbleContent() override; - std::string getTime() override; - std::string getMsgType() override; + std::string getTimeStr() override; + std::string getMsgTypeStr() override; private: - void updateViewStatus(); + void updateMsgInfo(const MsgConversationItem &item); + void updateStatus(bool updateUi); void prepareContent(const MsgConversationItem &item); void launchImageViewer(const BubbleImageEntity &image); bool launchViewer(const std::list &fileList, unsigned index = 0); + void requestRetrieveMms(); + void retrieveMms(); + void convertNotiToMms(); // Popups: void showMobileDataOffPopup(); diff --git a/src/Conversation/Controller/src/BubbleEntityFactory.cpp b/src/Conversation/Controller/src/BubbleEntityFactory.cpp index 2d4aa0d..e58d124 100644 --- a/src/Conversation/Controller/src/BubbleEntityFactory.cpp +++ b/src/Conversation/Controller/src/BubbleEntityFactory.cpp @@ -60,7 +60,7 @@ std::list BubbleEntityFactory::create(const MsgConversationItem list.push_back(BubbleEntityRef(entity)); } else if (type == Message::MT_MMS_Noti) { // MMS_Noti: - auto *entity = createRetrieveEntity(direct); + auto *entity = createRetrieveEntity(); if (entity) list.push_back(BubbleEntityRef(entity)); } else { @@ -136,9 +136,9 @@ BubbleTextEntity *BubbleEntityFactory::createTextEntity(std::string text, Messag return text.empty() ? nullptr : new BubbleTextEntity(direction, std::move(text)); } -BubbleRetrieveEntity *BubbleEntityFactory::createRetrieveEntity(Message::Direction direction) +BubbleRetrieveEntity *BubbleEntityFactory::createRetrieveEntity() { - return new BubbleRetrieveEntity(direction); + return new BubbleRetrieveEntity(Message::MD_Received); } BubbleNoContentEntity *BubbleEntityFactory::createNoContentEntity(Message::Direction direction) diff --git a/src/Conversation/Controller/src/ConvList.cpp b/src/Conversation/Controller/src/ConvList.cpp index 15d84e4..c8ef1fc 100644 --- a/src/Conversation/Controller/src/ConvList.cpp +++ b/src/Conversation/Controller/src/ConvList.cpp @@ -312,7 +312,7 @@ bool ConvList::updateItem(MsgId id) if (item && !isSpam) { time_t beforeTime = item->getRawTime(); - item->updateStatus(); + item->updateMsgInfo(); if (beforeTime != item->getRawTime()) updateItemPos(*item); return true; @@ -411,8 +411,11 @@ void ConvList::onListItemSelected(ListItem &listItem) } if (auto *item = dynamic_cast(&listItem)) { - if (item->getStatusType() == ConvListViewItem::FailedStatus && !item->getActionEventFlag()) - resendMsg(*item); + + if (!item->getActionEventFlag()) { + if (item->getStatusType() == ConvListViewItem::FailedStatus) + resendMsg(*item); + } item->setActionEventFlag(false); } diff --git a/src/Conversation/Controller/src/ConvListItem.cpp b/src/Conversation/Controller/src/ConvListItem.cpp index 937eff1..5b73522 100644 --- a/src/Conversation/Controller/src/ConvListItem.cpp +++ b/src/Conversation/Controller/src/ConvListItem.cpp @@ -31,6 +31,7 @@ #include "Callback.h" #include "BubbleAudioEntity.h" #include "BubbleImageEntity.h" +#include "NaviFrameController.h" #include @@ -51,8 +52,7 @@ ConvListItem::ConvListItem(const MsgConversationItem &item, , m_BubbleEntityFactory(bubbleEntityFactory) , m_ActionEventFlag(false) { - prepareContent(item); - updateViewStatus(); + updateMsgInfo(item); } ConvListItem::~ConvListItem() @@ -64,44 +64,63 @@ MsgId ConvListItem::getMsgId() const return m_MsgId; } +Message::Type ConvListItem::getMsgType() const +{ + return m_Type; +} + time_t ConvListItem::getRawTime() const { return m_Time; } -void ConvListItem::updateViewStatus() +void ConvListItem::updateStatus(bool updateUi) { switch (m_NetworkStatus) { case Message::NS_Send_Fail: - setInfoStatus(ConvListViewItem::FailedStatus); + case Message::NS_Retrieve_Fail: + setInfoStatus(ConvListViewItem::FailedStatus, updateUi); break; case Message::NS_Sending: case Message::NS_Send_Pending: - setInfoStatus(ConvListViewItem::ProgressStatus); + setInfoStatus(ConvListViewItem::ProgressStatus, updateUi); break; case Message::NS_Retrieving: + setInfoStatus(m_NetworkStatus == Message::NS_Retrieving ? ProgressStatus : NoneStatus, updateUi); + break; + case Message::NS_Retrieve_Success: - case Message::NS_Retrieve_Fail: - setInfoStatus(m_NetworkStatus == Message::NS_Retrieving ? ProgressStatus : NoneStatus); + convertNotiToMms(); break; default: - setInfoStatus(NoneStatus); + setInfoStatus(NoneStatus, updateUi); break; } } -void ConvListItem::updateStatus() +void ConvListItem::updateMsgInfo() { - MessageRef msg = App::getInst().getMsgEngine().getStorage().getMessage(m_MsgId); - if (msg) { - m_Time = msg->getTime(); - m_NetworkStatus = msg->getNetworkStatus(); - updateTime(); - updateViewStatus(); - } + MsgConversationItemRef item = App::getInst().getMsgEngine().getStorage().getConversationItem(m_MsgId); + if (item) + updateMsgInfo(*item); +} + +void ConvListItem::updateMsgInfo(const MsgConversationItem &item) +{ + m_BubbleEntityList.clear(); + m_MsgId = item.getMsgId(); + m_Time = item.getTime(); + m_NetworkStatus = item.getNetworkStatus(); + m_Type = item.getType(); + + prepareContent(item); + updateStatus(false); + + if (getElmObjItem()) + ConvListViewItem::update(); } void ConvListItem::updateTime() @@ -114,6 +133,13 @@ void ConvListItem::updateLangInfo() updateTime(); } +void ConvListItem::convertNotiToMms() +{ + if (m_Type == Message::MT_MMS_Noti && + m_NetworkStatus != Message::NS_Retrieving) + updateMsgInfo(); +} + void ConvListItem::setActionEventFlag(bool isAction) { m_ActionEventFlag = isAction; @@ -179,15 +205,29 @@ void ConvListItem::launchImageViewer(const BubbleImageEntity &image) launchViewer(allFiles, index); } +void ConvListItem::requestRetrieveMms() +{ + ConnectivityChecker &checker = App::getInst().getNavigation().getConnectivityChecker(); + if (checker.isReadyToRetrieveMms()) { + showRetrieveMmsPopup(); + } +} + +void ConvListItem::retrieveMms() +{ + if (App::getInst().getMsgEngine().getTransport().retrieveMessage(m_MsgId) != MsgTransport::SendSuccess) + showFailedToRetrievePopup(); +} + void ConvListItem::onCancelButtonClicked(Popup &popup) { - MSG_LOG(""); popup.destroy(); } void ConvListItem::onRetrieveButtonClicked(Popup &popup) { - MSG_LOG(""); + popup.destroy(); + retrieveMms(); } Evas_Object *ConvListItem::getBubbleContent() @@ -208,14 +248,14 @@ Evas_Object *ConvListItem::getBubbleContent() return *bubble; } -std::string ConvListItem::getTime() +std::string ConvListItem::getTimeStr() { if (m_TimeStr.empty()) m_TimeStr = TimeUtils::makeBubbleTimeString(m_Time); return m_TimeStr; } -std::string ConvListItem::getMsgType() +std::string ConvListItem::getMsgTypeStr() { return MsgUtils::isMms(m_Type) ? (std::string)msg("WDS_MSG_SBODY_MMS_ABB") : ""; } @@ -223,14 +263,24 @@ std::string ConvListItem::getMsgType() void ConvListItem::onAction(BubbleViewItem &item) { MSG_LOG(""); + if (m_Type == Message::MT_MMS_Noti) { + // MMS Notification: + setActionEventFlag(); + requestRetrieveMms(); + return; + } + if (auto *audio = dynamic_cast(&item.getEntity())) { + // Audio: audio->clickHandler(); setActionEventFlag(); } else { if (item.getEntity().getType() == BubbleEntity::ImageItem) { + // Image: setActionEventFlag(); launchImageViewer(static_cast(item.getEntity())); } else { + // Other files: std::string filePath = item.getEntity().getFilePath(); if (!filePath.empty()) { setActionEventFlag(); diff --git a/src/Conversation/View/inc/ConvListViewItem.h b/src/Conversation/View/inc/ConvListViewItem.h index 20fd07d..607946a 100644 --- a/src/Conversation/View/inc/ConvListViewItem.h +++ b/src/Conversation/View/inc/ConvListViewItem.h @@ -38,13 +38,13 @@ namespace Msg { virtual ~ConvListViewItem(); void setCheckedState(bool state, bool updateUi) override; - void setInfoStatus(InfoStatusType statusType); + void setInfoStatus(InfoStatusType statusType, bool updateUi); InfoStatusType getStatusType() const; protected: virtual Evas_Object *getBubbleContent() = 0; - virtual std::string getTime() = 0; - virtual std::string getMsgType() = 0; + virtual std::string getTimeStr() = 0; + virtual std::string getMsgTypeStr() = 0; protected: void updateContent(); diff --git a/src/Conversation/View/src/ConvListViewItem.cpp b/src/Conversation/View/src/ConvListViewItem.cpp index b64886a..d3b0a83 100644 --- a/src/Conversation/View/src/ConvListViewItem.cpp +++ b/src/Conversation/View/src/ConvListViewItem.cpp @@ -49,14 +49,14 @@ void ConvListViewItem::setCheckedState(bool state, bool updateUi) updateSelectedState(state); } -void ConvListViewItem::setInfoStatus(InfoStatusType statusType) +void ConvListViewItem::setInfoStatus(InfoStatusType statusType, bool updateUi) { if (statusType == m_Status) return; m_Status = statusType; - if (getElmObjItem()) { + if (getElmObjItem() && updateUi) { updateFields(infoStatus, ELM_GENLIST_ITEM_FIELD_CONTENT); updateFields(timeTextPart, ELM_GENLIST_ITEM_FIELD_TEXT); updateFields(msgType, ELM_GENLIST_ITEM_FIELD_TEXT); @@ -72,9 +72,9 @@ std::string ConvListViewItem::getText(ListItem &item, const char *part) { if (m_Status == NoneStatus || m_Type == Received) { if (!strcmp(part, timeTextPart)) - return getTime(); + return getTimeStr(); else if (!strcmp(part, msgType)) - return getMsgType(); + return getMsgTypeStr(); } return "";