{
MT_Unknown,
MT_SMS,
- MT_MMS
+ MT_MMS,
+ MT_MMS_Noti
};
enum NetworkStatus
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;
};
}
virtual const MsgAttachmentList &getAttachmentList() const = 0;
virtual MsgAttachment &addAttachment() = 0;
virtual int getMediaCount() const = 0;
+ virtual time_t getExpired() const = 0;
};
}
#include "MessageSMS.h"
#include "MessageMms.h"
+#include "MsgUtils.h"
+#include "Logger.h"
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;
}
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;
};
}
#include "MsgTypes.h"
#include "MsgAddress.h"
+#include "Message.h"
#include <string>
#include <list>
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);
};
}
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;
+}
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)
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;
+}
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;
{
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);
}
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;
#include "MsgThreadItemPrivate.h"
#include "MessageSMSPrivate.h"
#include "MessageMmsPrivate.h"
-#include "MsgUtils.h"
#include "MsgAddressPrivate.h"
#include "MsgConversationItemPrivate.h"
#include "Logger.h"
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
{
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)
}
}
+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);
+}
virtual ~MsgTransportPrivate();
virtual SendResult sendMessage(Message &msg, ThreadId *threadId);
+ virtual void retrieveMessage(MsgId msgId);
private:
msg_handle_t m_ServiceHandle;
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;
}
#include "Message.h"
#include "MsgMedia.h"
#include "MsgReport.h"
+#include "MsgUtils.h"
#include <msg_storage.h>
#include <msg_types.h>
#include <string>
#include "MessageDetailContent.h"
#include "WorkingDir.h"
+#include "MsgUtils.h"
namespace Msg
{
class ConvListItem
: public ConvListViewItem
+ , public IBubbleViewListener
{
public:
/**
// 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);
void onDeleteButtonClicked(Popup &popup, int buttonId);
void onPopupDel(Evas_Object *popup, void *eventInfo);
+ // IBubbleViewListener
+ virtual void onDownloadButtonClicked();
+
private:
IConvListItemListener *m_pListener;
App &m_App;
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();
{
BubbleView *bubble = new BubbleView(*getOwner());
bubble->fill(m_BubbleEntity);
+ bubble->setListener(this);
return *bubble;
}
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()
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);
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();
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();
}
namespace Msg
{
class BubbleView;
+ class IBubbleViewListener;
class BubbleEntity
{
{
TextItem,
ImageItem,
- VideoItem
+ VideoItem,
+ DownloadButtonItem
};
/**
* @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;
* @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() {};
};
}
}
BubbleView::BubbleView(Evas_Object *parent)
+ : m_pListener(nullptr)
{
create(parent);
}
case BubbleEntity::VideoItem:
elm_box_pack_end(*this, createVideo(item.value));
break;
+ case BubbleEntity::DownloadButtonItem:
+ elm_box_pack_end(*this, createDownloadButton());
+ break;
default:
break;
}
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()
{
}
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);
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();
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/>");
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;
}
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(")");
}
}
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"));
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;
}