TSAM-1865 Don't display download MMS when turn off auto retrieve - FIXED 33/66733/4 submit/tizen_mobile/20160422.140818
authorMykola Alieksieiev <m.alieksieie@samsung.com>
Thu, 14 Apr 2016 13:34:32 +0000 (16:34 +0300)
committerMykola Alieksieiev <m.alieksieie@samsung.com>
Thu, 21 Apr 2016 15:57:05 +0000 (18:57 +0300)
Change-Id: I8263450da6c3f4d092f84c86e1f0edab3a85299d
Signed-off-by: Mykola Alieksieiev <m.alieksieie@samsung.com>
21 files changed:
src/Common/MsgEngine/inc/Message.h
src/Common/MsgEngine/inc/MessageMms.h
src/Common/MsgEngine/inc/MsgComposer.h
src/Common/MsgEngine/inc/MsgTransport.h
src/Common/MsgEngine/inc/MsgUtils.h
src/Common/MsgEngine/src/MsgUtils.cpp
src/Common/MsgEngine/src/private/MessageMmsPrivate.cpp
src/Common/MsgEngine/src/private/MessageMmsPrivate.h
src/Common/MsgEngine/src/private/MessagePrivate.cpp
src/Common/MsgEngine/src/private/MessagePrivate.h
src/Common/MsgEngine/src/private/MsgStoragePrivate.cpp
src/Common/MsgEngine/src/private/MsgTransportPrivate.cpp
src/Common/MsgEngine/src/private/MsgTransportPrivate.h
src/Common/MsgEngine/src/private/MsgUtilsPrivate.cpp
src/Common/MsgEngine/src/private/MsgUtilsPrivate.h
src/Conversation/ConvList/Controller/inc/ConvListItem.h
src/Conversation/ConvList/Controller/src/ConvListItem.cpp
src/Conversation/ConvList/View/inc/BubbleView.h
src/Conversation/ConvList/View/src/BubbleView.cpp
src/Conversation/Utils/inc/MessageDetailContent.h [moved from src/Conversation/ConvList/Controller/inc/MessageDetailContent.h with 85% similarity]
src/Conversation/Utils/src/MessageDetailContent.cpp [moved from src/Conversation/ConvList/Controller/src/MessageDetailContent.cpp with 87% similarity]

index 823c71a..bdac452 100644 (file)
@@ -43,7 +43,8 @@ namespace Msg
             {
                 MT_Unknown,
                 MT_SMS,
-                MT_MMS
+                MT_MMS,
+                MT_MMS_Noti
             };
 
             enum NetworkStatus
@@ -91,6 +92,7 @@ namespace Msg
             virtual void setSubject(const std::string &text) = 0;
             virtual void setMessageStorageType(Message::MessageStorageType msgStorage) = 0;
             virtual Message::MessageStorageType getMessageStorageType() const = 0;
+            virtual bool isMms() const = 0;
     };
 }
 
index e27bda1..ea364f5 100644 (file)
@@ -42,6 +42,7 @@ namespace Msg
             virtual const MsgAttachmentList &getAttachmentList() const = 0;
             virtual MsgAttachment &addAttachment() = 0;
             virtual int getMediaCount() const = 0;
+            virtual time_t getExpired() const = 0;
     };
 }
 
index 3e525bc..2f6bf80 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "MessageSMS.h"
 #include "MessageMms.h"
+#include "MsgUtils.h"
+#include "Logger.h"
 
 namespace Msg
 {
@@ -38,20 +40,12 @@ namespace Msg
     {
         MessageRef msg;
 
-        switch(type)
-        {
-            case Message::MT_SMS:
-                msg = createSms();
-            break;
-
-            case Message::MT_MMS:
-                msg = createMms();
-            break;
-
-            case Message::MT_Unknown:
-            default:
-            break;
-        }
+        if (MsgUtils::isSms(type))
+            msg = createSms();
+        else if (MsgUtils::isMms(type))
+            msg = createMms();
+        else
+            MSG_LOG_WARN("Unknown message type");
 
         return msg;
     }
index a2f3a73..eb7eb56 100644 (file)
@@ -44,6 +44,8 @@ namespace Msg
             SendResult sendMessage(MessageRef &msg, ThreadId *threadId = nullptr);
             SendResult sendMessage(MessageMmsRef &msg, ThreadId *threadId = nullptr);
             SendResult sendMessage(MessageSMSRef &msg, ThreadId *threadId = nullptr);
+
+            virtual void retrieveMessage(MsgId msgId) = 0;
     };
 }
 
index a4d4faf..2658541 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "MsgTypes.h"
 #include "MsgAddress.h"
+#include "Message.h"
 
 #include <string>
 #include <list>
@@ -41,6 +42,8 @@ namespace Msg
             static bool isValidEmail(const std::string &address);
             static MsgAddress::AddressType getAddressType(const std::string &address);
             static std::string makeNormalizedNumber(const std::string &number);
+            static bool isMms(Message::Type type);
+            static bool isSms(Message::Type type);
     };
 }
 
index 627f637..758a918 100644 (file)
@@ -108,3 +108,19 @@ std::string MsgUtils::makeNormalizedNumber(const std::string &number)
     return normalizedNumber;
 }
 
+bool MsgUtils::isMms(Message::Type type)
+{
+    switch(type)
+    {
+        case Message::MT_MMS:
+        case Message::MT_MMS_Noti:
+            return true;
+        default:
+            return false;
+    }
+}
+
+bool MsgUtils::isSms(Message::Type type)
+{
+    return type == Message::MT_SMS;
+}
index c549eeb..980cb67 100644 (file)
@@ -67,7 +67,9 @@ MessageMmsPrivate::~MessageMmsPrivate()
 
 MessageMmsPrivate::Type MessageMmsPrivate::getType() const
 {
-    return MT_MMS;
+    int nativeType = MSG_TYPE_INVALID;
+    msg_get_int_value(m_MsgStruct, MSG_MESSAGE_TYPE_INT, &nativeType);
+    return MsgUtilsPrivate::nativeToMessageType(nativeType);
 }
 
 void MessageMmsPrivate::setText(const std::string &text)
@@ -160,3 +162,10 @@ MsgAttachmentPrivate &MessageMmsPrivate::addAttachment()
     return m_Attachment;
 }
 
+time_t MessageMmsPrivate::getExpired() const
+{
+    int msgExpiry = 0;
+    //TODO: Check MSG_STRUCT_SENDOPT
+    msg_get_int_value(m_MmsStruct, MSG_MMS_SENDOPTION_EXPIRY_TIME_INT, &msgExpiry);
+    return msgExpiry;
+}
index 2e87c76..de354ce 100644 (file)
@@ -42,10 +42,11 @@ namespace Msg
 
             virtual const MsgAttachmentListHandlePrivate &getAttachmentList() const;
             virtual MsgAttachmentPrivate &addAttachment();
+            virtual time_t getExpired() const;
 
+            virtual void commit();
             void set(msg_struct_t msgStruct);
             msg_struct_t getMmsStruct() const;
-            virtual void commit();
 
         private:
             msg_struct_t m_MmsStruct;
index b95deeb..94e0320 100644 (file)
@@ -177,5 +177,6 @@ bool MessagePrivate::isMms() const
 {
     int nativeType = MSG_TYPE_INVALID;
     msg_get_int_value(m_MsgStruct, MSG_MESSAGE_TYPE_INT, &nativeType);
-    return MsgUtilsPrivate::nativeToMessageType(nativeType) == Message::MT_MMS;
+    Message::Type messageType = MsgUtilsPrivate::nativeToMessageType(nativeType);
+    return MsgUtils::isMms(messageType);
 }
index 7963305..69a8d9a 100644 (file)
@@ -50,14 +50,12 @@ namespace Msg
             virtual void setSubject(const std::string &text);
             virtual void setMessageStorageType(Message::MessageStorageType msgStorage);
             virtual Message::MessageStorageType getMessageStorageType() const;
+            virtual bool isMms() const;
 
             void setId(MsgId id);
             void set(msg_struct_t msgStruct);
             virtual void commit();
 
-        private:
-            bool isMms() const;
-
         protected:
             mutable MsgAddressPrivate m_Address;
             mutable MsgAddressListHandlePrivate m_AddressList;
index 3272984..435bffd 100644 (file)
@@ -18,7 +18,6 @@
 #include "MsgThreadItemPrivate.h"
 #include "MessageSMSPrivate.h"
 #include "MessageMmsPrivate.h"
-#include "MsgUtils.h"
 #include "MsgAddressPrivate.h"
 #include "MsgConversationItemPrivate.h"
 #include "Logger.h"
@@ -281,20 +280,10 @@ MessageRef MsgStoragePrivate::getMessage(MsgId id)
         msg_get_int_value(msg, MSG_MESSAGE_TYPE_INT, &nativeType);
         Message::Type type = MsgUtilsPrivate::nativeToMessageType(nativeType);
 
-        switch(type)
-        {
-            case Message::MT_SMS:
-                msgRef = std::make_shared<MessageSMSPrivate>(true, msg);
-                break;
-
-            case Message::MT_MMS:
-                msgRef = std::make_shared<MessageMmsPrivate>(true, msg);
-                break;
-
-            default:
-                msg_release_struct(&msg);
-                MSG_ASSERT(false, "Unsupported message type");
-        }
+        if (MsgUtils::isMms(type))
+            msgRef = std::make_shared<MessageMmsPrivate>(true, msg);
+        else
+            msgRef = std::make_shared<MessageSMSPrivate>(true, msg);
     }
     else
     {
index 2cbcfd1..2f9581e 100644 (file)
@@ -46,20 +46,15 @@ MsgTransport::SendResult MsgTransportPrivate::sendMessage(Message &msg, ThreadId
 
     msg_set_struct_handle(req, MSG_REQUEST_MESSAGE_HND, privMsg);
 
-    if (privMsg.getType() == Message::MT_SMS)
-    {
-        MSG_LOG("Sending SMS");
-        err = msg_sms_send_message(m_ServiceHandle, req);
-    }
-    else if (privMsg.getType() == Message::MT_MMS)
+    if(privMsg.isMms())
     {
         MSG_LOG("Sending MMS");
         err = msg_mms_send_message(m_ServiceHandle, req);
     }
     else
     {
-        msg_release_struct(&req);
-        return SendFail;
+        MSG_LOG("Sending SMS");
+        err = msg_sms_send_message(m_ServiceHandle, req);
     }
 
     if(threadId)
@@ -93,3 +88,20 @@ MsgTransport::SendResult MsgTransportPrivate::sendMessage(Message &msg, ThreadId
     }
 }
 
+void MsgTransportPrivate::retrieveMessage(MsgId msgId)
+{
+    msg_struct_t req = msg_create_struct(MSG_STRUCT_REQUEST_INFO);
+    msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
+    msg_struct_t retrieveMsg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
+
+    msg_get_message(m_ServiceHandle, msgId, retrieveMsg, sendOpt);
+    msg_set_struct_handle(req, MSG_REQUEST_MESSAGE_HND, retrieveMsg);
+    msg_set_struct_handle(req, MSG_REQUEST_SENDOPT_HND, sendOpt);
+
+    msg_error_t err = msg_mms_retrieve_message(m_ServiceHandle, req);
+    MSG_LOG("Retrieve message result: ", err);
+
+    msg_release_struct(&retrieveMsg);
+    msg_release_struct(&sendOpt);
+    msg_release_struct(&req);
+}
index 3bc2fdb..39653e0 100644 (file)
@@ -33,6 +33,7 @@ namespace Msg
             virtual ~MsgTransportPrivate();
 
             virtual SendResult sendMessage(Message &msg, ThreadId *threadId);
+            virtual void retrieveMessage(MsgId msgId);
 
         private:
             msg_handle_t m_ServiceHandle;
index ee84348..4b65c1c 100644 (file)
@@ -210,9 +210,11 @@ Message::Type MsgUtilsPrivate::nativeToMessageType(int type)
 
         case MSG_TYPE_MMS:
         case MSG_TYPE_MMS_JAVA:
-        case MSG_TYPE_MMS_NOTI:
             return Message::MT_MMS;
 
+        case MSG_TYPE_MMS_NOTI:
+                    return Message::MT_MMS_Noti;
+
         default:
             return Message::MT_Unknown;
     }
index 9fd1322..23ad2d1 100644 (file)
@@ -20,6 +20,7 @@
 #include "Message.h"
 #include "MsgMedia.h"
 #include "MsgReport.h"
+#include "MsgUtils.h"
 
 #include <msg_storage.h>
 #include <msg_types.h>
index a70213b..528a2f4 100644 (file)
@@ -28,6 +28,7 @@
 #include <string>
 #include "MessageDetailContent.h"
 #include "WorkingDir.h"
+#include "MsgUtils.h"
 
 namespace Msg
 {
@@ -36,6 +37,7 @@ namespace Msg
 
     class ConvListItem
         : public ConvListViewItem
+        , public IBubbleViewListener
     {
         public:
             /**
@@ -87,6 +89,7 @@ namespace Msg
             // Create Popup when message is clicked
             void showMainCtxPopup();
             void showDraftCtxPopup();
+            void onDownloadItemPressed(ContextPopupItem &item);
             void onDeleteItemPressed(ContextPopupItem &item);
             void onCopyTextItemPressed(ContextPopupItem &item);
             void onForwardItemPressed(ContextPopupItem &item);
@@ -105,6 +108,9 @@ namespace Msg
             void onDeleteButtonClicked(Popup &popup, int buttonId);
             void onPopupDel(Evas_Object *popup, void *eventInfo);
 
+            // IBubbleViewListener
+            virtual void onDownloadButtonClicked();
+
         private:
             IConvListItemListener *m_pListener;
             App &m_App;
index 02ac7e0..fe4dfb6 100644 (file)
@@ -112,11 +112,18 @@ void ConvListItem::addVideoItem(const std::string &path)
 
 void ConvListItem::prepareBubble(const MsgConversationItem &item, const std::string &searchWord)
 {
-    if(m_Type == Message::MT_SMS)
+    if(!MsgUtils::isMms(m_Type))
     {
         std::string highlightedText = TextDecorator::highlightKeyword(utf8ToMarkup(item.getText()), utf8ToMarkup(searchWord));
         m_BubbleEntity.addItem(BubbleEntity::TextItem, highlightedText);
     }
+    else if(m_Type == Message::MT_MMS_Noti)
+    {
+        std::string text = MessageDetailContent::getMmsNotiConvListItemContent(m_App, m_MsgId);
+        std::string highlightedText = TextDecorator::highlightKeyword(text, utf8ToMarkup(searchWord));
+        m_BubbleEntity.addItem(BubbleEntity::TextItem, highlightedText);
+        m_BubbleEntity.addItem(BubbleEntity::DownloadButtonItem);
+    }
     else
     {
         const MsgConvMediaList &list = item.getMediaList();
@@ -166,6 +173,7 @@ Evas_Object *ConvListItem::getBubbleContent()
 {
     BubbleView *bubble = new BubbleView(*getOwner());
     bubble->fill(m_BubbleEntity);
+    bubble->setListener(this);
     return *bubble;
 }
 
@@ -177,7 +185,8 @@ Evas_Object *ConvListItem::getThumbnail()
 Evas_Object *ConvListItem::getProgress()
 {
     return m_NetworkStatus == Message::NS_Send_Pending ||
-           m_NetworkStatus == Message::NS_Sending  ? createProgress() : nullptr;
+           m_NetworkStatus == Message::NS_Sending ||
+           m_NetworkStatus == Message::NS_Retrieving ? createProgress() : nullptr;
 }
 
 std::string ConvListItem::getTime()
@@ -223,6 +232,8 @@ void ConvListItem::showMainCtxPopup()
 
     if(m_Type == Message::MT_MMS)
         ctxPopup.appendItem(msg("IDS_MSG_OPT_VIEW_AS_SLIDESHOW_ABB"), nullptr, CTXPOPUP_ITEM_PRESSED_CB(ConvListItem, onSlideShowItemPressed), this);
+    if(m_Type == Message::MT_MMS_Noti)
+        ctxPopup.appendItem(msg("IDS_MSG_BUTTON_DOWNLOAD_ABB3"), nullptr, CTXPOPUP_ITEM_PRESSED_CB(ConvListItem, onDownloadItemPressed), this);
 
     if(!msgText.empty())
         ctxPopup.appendItem(msg("IDS_MSG_OPT_COPY_TEXT"), nullptr, CTXPOPUP_ITEM_PRESSED_CB(ConvListItem, onCopyTextItemPressed), this);
@@ -280,6 +291,17 @@ void ConvListItem::onDeleteItemPressed(ContextPopupItem &item)
     popup.show();
 }
 
+void ConvListItem::onDownloadItemPressed(ContextPopupItem &item)
+{
+    item.getParent().destroy();
+    m_App.getMsgEngine().getTransport().retrieveMessage(m_MsgId);
+}
+
+void ConvListItem::onDownloadButtonClicked()
+{
+    m_App.getMsgEngine().getTransport().retrieveMessage(m_MsgId);
+}
+
 void ConvListItem::onCopyTextItemPressed(ContextPopupItem &item)
 {
     item.getParent().destroy();
@@ -357,7 +379,7 @@ void ConvListItem::onViewDetailsItemPressed(ContextPopupItem &item)
     Popup &popup = m_App.getPopupManager().getPopup();
     popup.addButton(msgt("IDS_MSG_BUTTON_OK_ABB"), Popup::CancelButtonId, POPUP_BUTTON_CB(ConvListItem, onCancelButtonClicked), this);
     popup.setTitle(msgt("IDS_MSGF_HEADER_MESSAGE_DETAILS"));
-    popup.setContent(MessageDetailContent::getMsgDetailContent(m_App, m_MsgId));
+    popup.setContent(MessageDetailContent::getMsgDetailsPopupContent(m_App, m_MsgId));
     popup.show();
 }
 
index d630100..a6f6bf0 100644 (file)
@@ -27,6 +27,7 @@
 namespace Msg
 {
     class BubbleView;
+    class IBubbleViewListener;
 
     class BubbleEntity
     {
@@ -39,7 +40,8 @@ namespace Msg
             {
                 TextItem,
                 ImageItem,
-                VideoItem
+                VideoItem,
+                DownloadButtonItem
             };
 
             /**
@@ -47,7 +49,7 @@ namespace Msg
              * @param[in] type Set which type is @value
              * @param[in] value Resource path or raw text to display
              */
-            void addItem(ItemType type, const std::string &value);
+            void addItem(ItemType type, const std::string &value = std::string());
 
         private:
             BubbleEntity(BubbleEntity&) = delete;
@@ -75,12 +77,25 @@ namespace Msg
              * @param[in] entity Filled list of contents
              */
             void fill(const BubbleEntity &entity);
+            void setListener(IBubbleViewListener *listener);
 
         private:
             void create(Evas_Object *parent);
             Evas_Object *createText(const std::string &text);
             Evas_Object *createImage(const std::string &path);
             Evas_Object *createVideo(const std::string &path);
+            Evas_Object *createDownloadButton();
+            void onDownloadPressed(Evas_Object *obj, void *event_info);
+
+        private:
+            IBubbleViewListener *m_pListener;
+    };
+
+    class IBubbleViewListener
+    {
+        public:
+            virtual ~IBubbleViewListener() {}
+            virtual void onDownloadButtonClicked() {};
     };
 }
 
index 526340e..95f70a8 100644 (file)
@@ -30,6 +30,7 @@ namespace
 }
 
 BubbleView::BubbleView(Evas_Object *parent)
+    : m_pListener(nullptr)
 {
     create(parent);
 }
@@ -63,6 +64,9 @@ void BubbleView::fill(const BubbleEntity &entity)
             case BubbleEntity::VideoItem:
                 elm_box_pack_end(*this, createVideo(item.value));
                 break;
+            case BubbleEntity::DownloadButtonItem:
+                elm_box_pack_end(*this, createDownloadButton());
+                break;
             default:
                 break;
         }
@@ -134,6 +138,28 @@ Evas_Object *BubbleView::createVideo(const std::string &path)
     return image;
 }
 
+Evas_Object *BubbleView::createDownloadButton()
+{
+    Evas_Object *retrieveBtn = elm_button_add(*this);
+    View::expand(retrieveBtn);
+    elm_object_domain_translatable_text_set(retrieveBtn, MSG_DOMAIN, "IDS_MSG_BUTTON_DOWNLOAD_ABB3");
+    evas_object_smart_callback_add(retrieveBtn, "clicked", SMART_CALLBACK(BubbleView, onDownloadPressed), this);
+    evas_object_show(retrieveBtn);
+
+    return retrieveBtn;
+}
+
+void BubbleView::setListener(IBubbleViewListener *listener)
+{
+    m_pListener = listener;
+}
+
+void BubbleView::onDownloadPressed(Evas_Object *obj, void *event_info)
+{
+    if(m_pListener)
+        m_pListener->onDownloadButtonClicked();
+}
+
 BubbleEntity::BubbleEntity()
 {
 }
@@ -26,11 +26,12 @@ namespace Msg
     class MessageDetailContent
     {
         public:
-            static std::string getMsgDetailContent(App &app, MsgId msgId);
+            static std::string getMsgDetailsPopupContent(App &app, MsgId msgId);
+            static std::string getMmsNotiConvListItemContent(App &app, MsgId msgId);
 
         private:
             // Create Content of Popup for View Details
-            static std::string createMsgDetailsText(App &app, MsgId msgId);
+            static std::string createMsgDetailsPopupText(App &app, MsgId msgId);
             static std::string getMessageType(Message::Type msgType);
             static std::string getContactsInfo(App &app, Message::Direction m_Direction, ThreadId msgThreadId);
             static std::string getSentReceivedTime(MsgStorage &msgStorage, Message::Direction msgDirection, MsgId msgId);
@@ -39,6 +40,7 @@ namespace Msg
             static std::string getSmsStatus(Message::NetworkStatus msgStatus);
             static std::string getMmsSubject(App &app, MsgId msgId);
             static std::string getMmsMessageSize(App &app, MsgId msgId);
+            static std::string getMmsMessageExpired(App &app, MsgId msgId);
             static std::string makeReadReportResult(App &app, MsgId msgId, ThreadId msgThreadId, Message::NetworkStatus msgStatus);
     };
 }
 
 #include "MessageDetailContent.h"
 #include "ThumbnailMaker.h"
-#include <telephony_common.h>
-#include <telephony_sim.h>
 #include "ContactManager.h"
 #include "LangUtils.h"
 #include "TimeUtils.h"
+#include "MessageMms.h"
+
+#include <telephony_common.h>
+#include <telephony_sim.h>
 
 using namespace Msg;
 
-std::string MessageDetailContent::getMsgDetailContent(App &app, MsgId msgId)
+std::string MessageDetailContent::getMsgDetailsPopupContent(App &app, MsgId msgId)
 {
-    return createMsgDetailsText(app, msgId);
+    return createMsgDetailsPopupText(app, msgId);
 }
 
-std::string MessageDetailContent::createMsgDetailsText(App &app, MsgId msgId)
+std::string MessageDetailContent::createMsgDetailsPopupText(App &app, MsgId msgId)
 {
     std::string msgDetails;
     Message::Direction msgDirection = app.getMsgEngine().getStorage().getMessage(msgId)->getDirection();
@@ -49,6 +51,13 @@ std::string MessageDetailContent::createMsgDetailsText(App &app, MsgId msgId)
         msgDetails += makeReportResult(app, msgStatus, msgType, msgThreadId, msgId);
         msgDetails += getSmsStatus(msgStatus);
     }
+    else if(msgType == Message::MT_MMS_Noti)
+    {
+        msgDetails.append("<br/>");
+        msgDetails += getMmsSubject(app, msgId);
+        msgDetails += getMmsMessageSize(app, msgId);
+        msgDetails += getMmsMessageExpired(app, msgId);
+    }
     else if(msgType == Message::MT_MMS)
     {
         msgDetails.append("<br/>");
@@ -65,16 +74,34 @@ std::string MessageDetailContent::createMsgDetailsText(App &app, MsgId msgId)
     return msgDetails;
 }
 
+std::string MessageDetailContent::getMmsNotiConvListItemContent(App &app, MsgId msgId)
+{
+    std::string msgDetails;
+    msgDetails += getMmsSubject(app, msgId);
+    msgDetails += getMmsMessageSize(app, msgId);
+    msgDetails += getMmsMessageExpired(app, msgId);
+    return msgDetails;
+}
+
 std::string MessageDetailContent::getMessageType(Message::Type msgType)
 {
     std::string msgDetails = msg("IDS_MSG_BODY_TYPE_C");
     msgDetails.append(" ");
 
-    if(msgType == Message::MT_SMS)
+    switch(msgType)
+    {
+    case Message::MT_SMS:
         msgDetails.append(msg("IDS_MSGF_OPT_TEXT_MESSAGE"));
-    else if(msgType == Message::MT_MMS)
+        break;
+    case Message::MT_MMS:
         msgDetails.append(msg("IDS_MSGF_BODY_MULTIMEDIA_MESSAGE"));
-
+        break;
+    case Message::MT_MMS_Noti:
+        msgDetails.append(msg("IDS_MSGF_BODY_MULTIMEDIA_MESSAGE_NOTIFICATION"));
+        break;
+    default:
+        MSG_LOG_WARN("Unknown message type");
+    }
     msgDetails.append("<br/>");
     return msgDetails;
 }
@@ -174,10 +201,10 @@ std::string MessageDetailContent::makeReportResult(App &app, Message::NetworkSta
                         deliverText.append(" (");
 
                         time_t time = reportList->at(i).getTime();
-                        if(msgType == Message::MT_SMS)
-                            deliverText.append(TimeUtils::makeSmsReportTimeString(time));
-                        else
+                        if(MsgUtils::isMms(msgType))
                             deliverText.append(TimeUtils::makeMmsReportTimeString(time));
+                        else
+                            deliverText.append(TimeUtils::makeSmsReportTimeString(time));
 
                         deliverText.append(")");
                     }
@@ -191,7 +218,7 @@ std::string MessageDetailContent::makeReportResult(App &app, Message::NetworkSta
                     }
                     else
                     {
-                        if(msgType == Message::MT_MMS)
+                        if(MsgUtils::isMms(msgType))
                             deliverText.append(msg("IDS_MSGF_BODY_UNKNOWN"));
                         else
                             deliverText.append(msg("IDS_MSGF_BODY_REQUESTED"));
@@ -299,6 +326,22 @@ std::string MessageDetailContent::getMmsMessageSize(App &app, MsgId msgId)
     msgDetails.append(std::to_string(msgSize));
     msgDetails.append(msg("IDS_MSGF_BODY_MSGSIZE_KB"));
 
+    msgDetails.append("<br/>");
+    return msgDetails;
+}
+
+std::string MessageDetailContent::getMmsMessageExpired(App &app, MsgId msgId)
+{
+    std::string msgDetails = msg("IDS_MSGF_BODY_EXPIRED");
+    msgDetails.append(": ");
+
+    MessageMmsRef mms = std::dynamic_pointer_cast<MessageMms>(app.getMsgEngine().getStorage().getMessage(msgId));
+    if(mms)
+    {
+        time_t msgExpired = mms->getExpired();
+        msgDetails.append(TimeUtils::makeDateTimeString(msgExpired));
+        msgDetails.append("<br/>");
+    }
     return msgDetails;
 }