TizenRefApp-5730 Refactor redrawing of conversatioin-items list 45/60145/2
authorDmytro Dragan <dm.dragan@samsung.com>
Fri, 19 Feb 2016 11:51:51 +0000 (13:51 +0200)
committerDmytro Dragan <dm.dragan@samsung.com>
Wed, 24 Feb 2016 11:39:21 +0000 (13:39 +0200)
Change-Id: I1259f297010024bb6386776eea552b5f1c29662f
Signed-off-by: Dmytro Dragan <dm.dragan@samsung.com>
14 files changed:
res/edje/bubble_theme.edc
src/Common/MsgEngine/inc/MsgStorage.h
src/Common/MsgEngine/inc/MsgTypes.h
src/Common/MsgEngine/src/private/MsgStoragePrivate.cpp
src/Common/MsgEngine/src/private/MsgStoragePrivate.h
src/Common/View/inc/ListItem.h
src/Common/View/src/ListItem.cpp
src/Conversation/ConvList/Controller/inc/ConvList.h
src/Conversation/ConvList/Controller/inc/ConvListItem.h
src/Conversation/ConvList/Controller/src/ConvList.cpp
src/Conversation/ConvList/Controller/src/ConvListItem.cpp
src/Conversation/ConvList/View/inc/ConvListViewItem.h
src/Conversation/ConvList/View/src/BubbleView.cpp
src/Conversation/ConvList/View/src/ConvListViewItem.cpp

index 2e38ab2..97291d2 100755 (executable)
@@ -280,11 +280,12 @@ group { name: "elm/genlist/item/sentbubble/default";
             desc { "default";
                 max: BUBBLE_CONTENT_WIDTH_MAX -1;
                 rel1.to_y: "bubble.pad.top";
-                rel1.relative: 0.0 1.0;
+                rel1.relative: 1.0 1.0;
                 rel2.to_x: "bubble.pad.right";
                 rel2.to_y: "bubble.pad.bottom";
                 rel2.relative: 0.0 0.0;
                 align: 1.0 0.0;
+                fixed: 1 0;
             }
         }
         spacer { "bubble.pad.right"; scale;
@@ -481,7 +482,7 @@ group { name: "elm/genlist/item/receivebubble/default";
                 rel1.to_x: "info.thumb.pad";
                 rel1.relative: 1.0 1.0;
                 rel2.to_x: "";
-                rel2.relative: 1.0 0.0;
+                rel2.relative: 1.0 1.0;
                 text.style: "entry_bubble_receive_textblock_style";
             }
         }
@@ -490,6 +491,7 @@ group { name: "elm/genlist/item/receivebubble/default";
                 max: BUBBLE_PAD_LEFT_WIDTH -1;
                 rel2.to: "";
                 align: 0.0 0.0;
+                fixed: 1 0;
             }
         }
         spacer { "pad.right"; scale;
@@ -520,7 +522,7 @@ group { name: "elm/genlist/item/receivebubble/default";
             desc { "default";
                 rel1.relative: 1.0 1.0;
                 rel1.to_x: "bubble.pad.left";
-                rel2.relative: 1.0 0.0;
+                rel2.relative: 0.0 0.0;
                 rel2.to_x: "";
                 align: 0.0 0.0;
             }
index 1fbda1c..821cb6b 100644 (file)
@@ -67,6 +67,7 @@ namespace Msg
 
             // Conversation:
             virtual MsgConversationListRef getConversationList(ThreadId id) = 0;
+            virtual MsgConversationItemRef getConversationItem(MsgId id) = 0;
 
         protected:
             typedef std::vector<IMsgStorageListener *> MsgStorageListeners;
index 21cae82..24712df 100644 (file)
@@ -24,12 +24,13 @@ namespace Msg
     class BaseMsgId
     {
         public:
+            typedef int Type;
             BaseMsgId()
                 : value(-1)
             {
             }
 
-            BaseMsgId(int id)
+            BaseMsgId(Type id)
                 : value(id)
             {
             }
@@ -39,12 +40,12 @@ namespace Msg
             {
             }
 
-            operator int() const
+            operator Type() const
             {
                 return value;
             }
 
-            BaseMsgId &operator=(int id)
+            BaseMsgId &operator=(Type id)
             {
                 value = id;
                 return *this;
@@ -60,7 +61,7 @@ namespace Msg
                 value = -1;
             }
 
-            int value; // implementation
+            Type value; // implementation
     };
 
     class ThreadId
index b0fa943..f9c5802 100644 (file)
@@ -253,6 +253,22 @@ MsgConversationListRef MsgStoragePrivate::getConversationList(ThreadId id)
     return res;
 }
 
+MsgConversationItemRef MsgStoragePrivate::getConversationItem(MsgId id)
+{
+    MsgConversationItemRef res;
+    msg_struct_t convItem = msg_create_struct(MSG_STRUCT_CONV_INFO);
+    if(msg_get_conversation(m_ServiceHandle, id, convItem) == 0)
+    {
+        res.reset(new MsgConversationItemPrivate(true, convItem));
+    }
+    else
+    {
+        msg_release_struct(&convItem);
+    }
+
+    return res;
+}
+
 MessageRef MsgStoragePrivate::getMessage(MsgId id)
 {
     MessageRef msgRef;
index 4e80ee6..a5fea5d 100644 (file)
@@ -58,6 +58,7 @@ namespace Msg
 
             // Conversation:
             virtual MsgConversationListRef getConversationList(ThreadId id);
+            virtual MsgConversationItemRef getConversationItem(MsgId id);
 
         private:
             typedef void (IMsgStorageListener::*ListenerMethod)(const MsgIdList &);
index ea0ead5..ab4aa7b 100644 (file)
@@ -46,6 +46,7 @@ namespace Msg
                                            const char *decorateAllItemStyle = nullptr);
         private:
             friend class ListView;
+            friend class ListItem;
 
             void registerCallback();
             void unregisterCallback();
index 72b3dc7..bef6dfd 100644 (file)
@@ -227,6 +227,8 @@ void ListItem::setExpanded(bool expand)
 
 void ListItem::update()
 {
+    if(m_ItemStyle->m_pGenlistItemClass != elm_genlist_item_item_class_get(getElmObjItem()))
+        elm_genlist_item_item_class_update(getElmObjItem(), m_ItemStyle->m_pGenlistItemClass);
     elm_genlist_item_update(getElmObjItem());
 }
 
index b65600b..490a89a 100644 (file)
@@ -24,6 +24,7 @@
 #include "ConvSelectAll.h"
 #include "App.h"
 #include "ConvListItem.h"
+#include <unordered_map>
 
 namespace Msg
 {
@@ -100,6 +101,9 @@ namespace Msg
             int getMessageCheckedCount() const;
 
         private:
+            typedef std::unordered_map<MsgId::Type, ConvListItem*> ConvListItemMap;
+
+        private:
             void create(Evas_Object *parent);
             Evas_Object *createSelectAll(Evas_Object *parent);
             Evas_Object *createList(Evas_Object *parent);
@@ -107,6 +111,9 @@ namespace Msg
             void selectListItems(bool state);
             bool isAllListItemSelected() const;
             ConvListItem *getItem(MsgId msgId) const;
+            void appendItem(ConvListItem *item);
+            void deleteItem(ConvListItem *item);
+            void clear();
 
             // IListViewListener:
             virtual void onListItemSelected(ListItem &listItem);
@@ -132,6 +139,7 @@ namespace Msg
             ThreadId m_ThreadId;
             ConvSelectAll *m_pSelectAll;
             ListView *m_pList;
+            ConvListItemMap m_ConvListItemMap;
             IConvListListener *m_pListner;
             App &m_App;
     };
index fd4da19..a11bb69 100644 (file)
@@ -49,8 +49,7 @@ namespace Msg
             MsgId getMsgId() const;
             void showPopup();
             void setListener(IConvListItemListener *l);
-            void updateStatus(MsgId id);
-
+            void updateStatus();
 
         protected:
             // ConvListViewItem:
index 00270d3..ce73840 100644 (file)
 
 using namespace Msg;
 
+namespace
+{
+    const int minMessagesBulk = 100;
+    const int additionalMessagesBulk = 50;
+}
+
 ConvList::ConvList(Evas_Object *parent, App &app)
     : ConvListLayout(parent)
     , m_Mode(NormalMode)
     , m_MsgEngine(app.getMsgEngine())
     , m_pSelectAll(nullptr)
     , m_pList(nullptr)
+    , m_ConvListItemMap()
     , m_pListner(nullptr)
     , m_App(app)
 {
@@ -98,26 +105,29 @@ Evas_Object *ConvList::createList(Evas_Object *parent)
 
 void ConvList::fill()
 {
-    m_pList->clear();
+    clear();
     if(!m_ThreadId.isValid())
         return;
 
     MsgConversationListRef convList = m_MsgEngine.getStorage().getConversationList(m_ThreadId);
     int convListLen = convList->getLength();
+    m_ConvListItemMap.reserve(convListLen <= minMessagesBulk/2 ? minMessagesBulk : convListLen + additionalMessagesBulk);
 
     for(int i = 0; i < convListLen; ++i)
     {
         MsgConversationItem &item = convList->at(i);
         ConvListItem *listItem = new ConvListItem(item, m_App);
-        listItem->setListener(this);
-        m_pList->appendItem(*listItem);
+        appendItem(listItem);
     }
 }
 
 void ConvList::setThreadId(ThreadId id)
 {
-    m_ThreadId = id;
-    fill();
+    if(m_ThreadId != id)
+    {
+        m_ThreadId = id;
+        fill();
+    }
 }
 
 void ConvList::navigateTo(MsgId msgId)
@@ -129,13 +139,27 @@ void ConvList::navigateTo(MsgId msgId)
 
 ConvListItem *ConvList::getItem(MsgId msgId) const
 {
-    auto items = m_pList->getItems<ConvListItem>();
-    for(ConvListItem *item : items)
-    {
-        if(item->getMsgId() == msgId)
-            return item;
-    }
-    return nullptr;
+    auto it = m_ConvListItemMap.find(msgId);
+    return it != m_ConvListItemMap.end() ? it->second : nullptr;
+}
+
+void ConvList::appendItem(ConvListItem *item)
+{
+    m_ConvListItemMap[item->getMsgId()] = item;
+    item->setListener(this);
+    m_pList->appendItem(*item);
+}
+
+void ConvList::deleteItem(ConvListItem *item)
+{
+    m_ConvListItemMap.erase(item->getMsgId());
+    m_pList->deleteItem(*item);
+}
+
+void ConvList::clear()
+{
+    m_pList->clear();
+    m_ConvListItemMap.clear();
 }
 
 void ConvList::deleteSelectedItems()
@@ -215,20 +239,38 @@ void ConvList::onListItemChecked(ListItem &listItem)
 
 void ConvList::onMsgStorageUpdate(const MsgIdList &msgIdList)
 {
-    // FIXME: simple impl for demo
-    fill();
+    for(auto &itemId: msgIdList)
+    {
+        ConvListItem *updated = getItem(itemId);
+        if(updated)
+            updated->updateStatus();
+    }
 }
 
 void ConvList::onMsgStorageInsert(const MsgIdList &msgIdList)
 {
-    // FIXME: simple impl for demo
-    fill();
+    for(auto &itemId: msgIdList)
+    {
+        if(m_ThreadId == m_MsgEngine.getStorage().getMessage(itemId)->getThreadId())
+        {
+            if(!getItem(itemId))
+            {
+                MsgConversationItemRef item = m_MsgEngine.getStorage().getConversationItem(itemId);
+                ConvListItem *listItem = new ConvListItem(*item, m_App);
+                appendItem(listItem);
+            }
+        }
+    }
 }
 
 void ConvList::onMsgStorageDelete(const MsgIdList &msgIdList)
 {
-    // FIXME: simple impl for demo
-    fill();
+    for(auto &itemId: msgIdList)
+    {
+        ConvListItem *deleted = getItem(itemId);
+        if(deleted)
+            deleteItem(deleted);
+    }
 
     if(m_pListner && m_pList->isEmpty())
         m_pListner->onAllItemsDeleted(*this);
index ae3c3a3..f014d5d 100644 (file)
@@ -47,14 +47,27 @@ ConvListItem::~ConvListItem()
 {
 }
 
-void ConvListItem::updateStatus(MsgId id)
+void ConvListItem::updateStatus()
 {
-    m_MsgId = id;
     MessageRef msg = m_App.getMsgEngine().getStorage().getMessage(m_MsgId);
     if(msg)
     {
+        m_Time = msg->getTime();
         m_NetworkStatus = msg->getNetworkStatus();
-        updateProgressField();
+    }
+
+
+    if(m_NetworkStatus != Message::NS_Sending)
+    {
+        if(m_NetworkStatus == Message::NS_Send_Fail)
+            updateItemType(ConvItemType::Failed);
+        else if(m_NetworkStatus == Message::NS_Send_Success)
+            updateItemType(ConvItemType::Sent);
+        else if(m_NetworkStatus == Message::NS_Not_Send)
+            updateItemType(ConvItemType::Draft);
+        else if(m_NetworkStatus == Message::NS_Received)
+            updateItemType(ConvItemType::Received);
+        update();
     }
 }
 
index 84abc4c..bb71c1c 100644 (file)
@@ -50,18 +50,13 @@ namespace Msg
         protected:
             Evas_Object *createProgress();
             void updateProgressField();
+            void updateItemType(ConvItemType type);
 
         private:
-            void onBubbleResized(Evas_Object *obj, void *data);
             Evas_Object *createButton(bool isEnabled, ConvItemType type);
             virtual std::string getText(ListItem &item, const char *part);
             virtual Evas_Object *getContent(ListItem &item, const char *part);
             virtual const char *getCheckPart(ListItem &item);
-
-        private:
-            //Fixme: temporary fix caused by genlist resize issue
-            Evas_Coord m_BubbleWidth;
-            Evas_Coord m_BubbleHeight;
     };
 }
 
index bf16b0b..7a49504 100644 (file)
@@ -26,8 +26,8 @@ namespace
 {
     const int verticalBoxPads = 10;
     const int horizontalBoxPads = 0;
-    const int maxWidth = 220; //Fixme: set to 340 when apply base_scale: 2.6
-    const char *textStyle = "DEFAULT='font=Tizen:style=Regular font_size=30 wrap=mixed text_class=label'";
+    const int maxWidth = 340;
+    const char *textStyle = "DEFAULT='font=Tizen:style=Regular font_size=24 wrap=mixed text_class=label'";
 }
 
 BubbleView::BubbleView(Evas_Object *parent)
@@ -68,6 +68,7 @@ void BubbleView::fill(const BubbleEntity &entity)
                 break;
         }
     }
+    elm_box_recalculate(*this);
 }
 
 Evas_Object *BubbleView::createTextView(const std::string &text)
@@ -107,7 +108,6 @@ Evas_Object *BubbleView::createTextFileView(const std::string &path)
 Evas_Object *BubbleView::createThumbView(const std::string &path)
 {
     Evas_Object *image = elm_image_add(*this);
-    elm_image_aspect_fixed_set(image, false);
     elm_image_file_set(image, path.c_str(), nullptr);
     int imageWidth = 0;
     int imageHeight = 0;
index 32a30b5..c3f5c09 100644 (file)
@@ -43,26 +43,8 @@ namespace
 
 ConvListViewItem::ConvListViewItem(ConvItemType type)
     : ListItem()
-    , m_BubbleWidth(0)
-    , m_BubbleHeight(0)
 {
-    switch (type)
-    {
-        case Sent:
-            setStyle(sentStyle);
-            break;
-        case Received:
-            setStyle(receivedStyle);
-            break;
-        case Draft:
-            setStyle(draftStyle);
-            break;
-        case Failed:
-            setStyle(failedStyle);
-            break;
-        default:
-            break;
-    }
+    updateItemType(type);
 }
 
 ConvListViewItem::~ConvListViewItem()
@@ -72,9 +54,7 @@ ConvListViewItem::~ConvListViewItem()
 
 std::string ConvListViewItem::getText(ListItem &item, const char *part)
 {
-    if(!strcmp(part, "elm.text"))
-        return getText();
-    else if(!strcmp(part, timeTextPart))
+    if(!strcmp(part, timeTextPart))
         return getTime();
     else
         return "";
@@ -84,14 +64,7 @@ Evas_Object *ConvListViewItem::getContent(ListItem &item, const char *part)
 {
     if(!strcmp(part, bubbleContentPart))
     {
-        Evas_Object *bubble = getBubbleContent();
-        evas_object_event_callback_add(bubble, EVAS_CALLBACK_RESIZE, EVAS_EVENT_CALLBACK(ConvListViewItem, onBubbleResized), this);
-        if(m_BubbleHeight > 0 && m_BubbleWidth > 0)
-        {
-            evas_object_size_hint_min_set(bubble, m_BubbleWidth, m_BubbleHeight);
-            evas_object_size_hint_max_set(bubble, m_BubbleWidth, m_BubbleHeight);
-        }
-        return bubble;
+        return getBubbleContent();
     }
     else if(!strcmp(part, thumbContentPart))
     {
@@ -157,15 +130,23 @@ void ConvListViewItem::updateProgressField()
     updateFields(infoStatus, ELM_GENLIST_ITEM_FIELD_CONTENT);
 }
 
-void ConvListViewItem::onBubbleResized(Evas_Object *obj, void *data)
+void ConvListViewItem::updateItemType(ConvItemType type)
 {
-    MSG_LOG("");
-    Evas_Coord w,h;
-    evas_object_geometry_get(obj, nullptr, nullptr, &w, &h);
-    if(m_BubbleHeight < h || m_BubbleWidth < w)
+    switch (type)
     {
-        m_BubbleWidth = w;
-        m_BubbleHeight = h;
-        elm_genlist_item_update(this->getElmObjItem());
+        case Sent:
+            setStyle(sentStyle);
+            break;
+        case Received:
+            setStyle(receivedStyle);
+            break;
+        case Draft:
+            setStyle(draftStyle);
+            break;
+        case Failed:
+            setStyle(failedStyle);
+            break;
+        default:
+            break;
     }
 }