TSAM-8530: Message lastest don't display on top of Thread list when have messages 42/91942/1 submit/tizen/20161012.145055
authorDenis Dolzhenko <d.dolzhenko@samsung.com>
Wed, 12 Oct 2016 08:41:13 +0000 (11:41 +0300)
committerDenis Dolzhenko <d.dolzhenko@samsung.com>
Wed, 12 Oct 2016 08:41:13 +0000 (11:41 +0300)
Change-Id: Icd0d7f229f8832eb790749b9deb0875a407da39f
Signed-off-by: Denis Dolzhenko <d.dolzhenko@samsung.com>
src/Common/View/inc/ListView.h
src/MsgThread/Controller/inc/ThreadList.h
src/MsgThread/Controller/inc/ThreadListItem.h
src/MsgThread/Controller/src/ThreadList.cpp
src/MsgThread/Controller/src/ThreadListItem.cpp

index a72aa40..a246b2e 100644 (file)
@@ -182,6 +182,9 @@ namespace Msg
              */
             ListItem *getNextItem(ListItem &item) const;
 
+            template<typename T>
+            T *getNextItem(ListItem &item) const;
+
             /**
              * @brief Gets list-view item previous to specified one.
              * @param[in] item  an item in genlist.
@@ -189,6 +192,9 @@ namespace Msg
              */
             ListItem *getPrevItem(ListItem &item) const;
 
+            template<typename T>
+            T *getPrevItem(ListItem &item) const;
+
             /**
              * @brief Demotes specified list-view item to the end of the list.
              * @param[in] item an item to be demoted.
@@ -301,6 +307,34 @@ namespace Msg
 
         return list;
     }
+
+    template<typename T>
+    T *ListView::getNextItem(ListItem &item) const
+    {
+        T *res = nullptr;
+        ListItem *next = nullptr;
+        do
+        {
+            next = getNextItem(item);
+            res = dynamic_cast<T*>(next);
+        } while(next && !res);
+
+        return res;
+    }
+
+    template<typename T>
+    T *ListView::getPrevItem(ListItem &item) const
+    {
+        T *res = nullptr;
+        ListItem *next = nullptr;
+        do
+        {
+            next = getPrevItem(item);
+            res = dynamic_cast<T*>(next);
+        } while(next && !res);
+
+        return res;
+    }
 }
 
 #endif // ListView_15152b60_4142_11b3_aa6e_080a200c9a62_h_
index ea15cd9..ffdafbb 100644 (file)
@@ -74,7 +74,7 @@ namespace Msg
             void deleteItems();
             void updateItems(const MsgIdList &idList);
             void updateItems();
-            void update(ThreadListItem &item);
+            void updateItem(ThreadListItem &item);
             void insertItem(const MsgThreadItem &msgThreadItem);
             void insertItem(ThreadId id);
             ThreadListItem *getItem(ThreadId id) const;
index 09916e1..cfad3ed 100644 (file)
@@ -35,8 +35,7 @@ namespace Msg
             virtual ~ThreadListItem();
 
             ThreadId getThreadId() const;
-            void updateModel(const MsgThreadItem &threadItem);
-            void updateModel();
+            void update(const MsgThreadItem &threadItem, bool updateUi);
 
         private:
             // ThreadListViewItem:
index 2bfb22e..a40ac45 100644 (file)
@@ -247,10 +247,8 @@ void ThreadList::updateItems(const MsgIdList &idList)
     for(ThreadListItem *item: threadItems)
     {
         if(threadIdSet.count(item->getThreadId()))
-            update(*item);
+            updateItem(*item);
     }
-
-    updateRealizedItems();
 }
 
 void ThreadList::updateItems()
@@ -258,25 +256,34 @@ void ThreadList::updateItems()
     auto items = getItems<ThreadListItem>();
     for(ThreadListItem *item: items)
     {
-        update(*item);
+        updateItem(*item);
     }
-
-    updateRealizedItems();
 }
 
-void ThreadList::update(ThreadListItem &item)
+void ThreadList::updateItem(ThreadListItem &item)
 {
-    time_t time = item.getRawTime();
-    item.updateModel();
-    if(item.getRawTime() < time)
+    MsgThreadItemRef msgThread = m_App.getMsgEngine().getStorage().getThread(item.getThreadId());
+    if(!msgThread)
+    {
+        MSG_LOG_ERROR("msgThread is null");
+        return;
+    }
+
+    ThreadListItem *next = getNextItem<ThreadListItem>(item);
+    ThreadListItem *prev = getPrevItem<ThreadListItem>(item);
+    time_t threadTime = msgThread->getTime();
+
+    if((next && threadTime < next->getRawTime()) ||
+       (prev && threadTime > prev->getRawTime()))
     {
-        // TODO: JIRA issue TSAM-8683
+        auto newItem = new ThreadListItem(*msgThread, m_App);
+        item.destroy();
+        ListView::sortedInsertItem(*newItem);
     }
-    else if(item.getRawTime() > time)
+    else
     {
-        // TODO: JIRA issue TSAM-8683
+        item.update(*msgThread, true);
     }
-    item.update();
 }
 
 std::set<ThreadId> ThreadList::getThreadIdSet(const MsgIdList &idList)
@@ -311,18 +318,16 @@ void ThreadList::onListItemChecked(ListItem &listItem)
 void ThreadList::onMsgStorageThreadUpdate(const ThreadId &threadId)
 {
     MSG_LOG("");
-    auto* thread = getItem(threadId);
-    if(thread)
-        update(*thread);
+    auto* item = getItem(threadId);
+    if(item)
+        updateItem(*item);
 }
 
 void ThreadList::onMsgStorageThreadInsert(const ThreadId &threadId)
 {
     MSG_LOG("");
-
     insertItem(threadId);
     updateSelectAllItem();
-
     if(m_pListener)
         m_pListener->onThreadListChanged();
 }
index 6e59927..60514ec 100644 (file)
@@ -33,7 +33,7 @@ ThreadListItem::ThreadListItem(const MsgThreadItem &threadItem, App &app)
     : BaseThreadListItem(app)
     , m_ThreadId()
 {
-    updateModel(threadItem);
+    update(threadItem, false);
 }
 
 ThreadListItem::~ThreadListItem()
@@ -55,10 +55,9 @@ Evas_Object *ThreadListItem::getIcon()
     return makeUnreadIcon(m_UnreadCount);
 }
 
-void ThreadListItem::updateModel(const MsgThreadItem &threadItem)
+void ThreadListItem::update(const MsgThreadItem &threadItem, bool updateUi)
 {
     m_ThreadId = threadItem.getId();
-
     State state = NormalState;
 
     MsgConversationListRef convList = m_App.getMsgEngine().getStorage().getConversationList(m_ThreadId);
@@ -94,17 +93,11 @@ void ThreadListItem::updateModel(const MsgThreadItem &threadItem)
     }
 
     setState(state, false);
-
     updateMessage(threadItem);
     updateThumbnailAndName(threadItem, true);
     updateTime(threadItem.getTime());
-}
 
-void ThreadListItem::updateModel()
-{
-    MsgThreadItemRef msgThread = m_App.getMsgEngine().getStorage().getThread(m_ThreadId);
-    if(msgThread)
-        updateModel(*msgThread);
+    if(updateUi)
+        ListItem::update();
 }
 
-