taskswitcher/activitytsplugin/src/activitytsmodel.cpp
changeset 125 26079c1bb561
parent 119 50e220be30d1
child 127 7b66bc3c6dc9
--- a/taskswitcher/activitytsplugin/src/activitytsmodel.cpp	Mon Sep 27 11:31:59 2010 +0300
+++ b/taskswitcher/activitytsplugin/src/activitytsmodel.cpp	Wed Oct 06 16:00:22 2010 +0300
@@ -26,6 +26,10 @@
 #include <XQSettingsManager>
 
 #include "afstorageglobals.h"
+#include "tsrunningapp.h"
+#include "tsrunningappstorage.h"
+#include "tswindowgroupsmonitor.h"
+#include "tsresourcemanager.h"
 
 QTM_USE_NAMESPACE
 
@@ -36,7 +40,11 @@
     const int KItemsLimit = 0x00000001;
 }
 
-ActivityTsModel::ActivityTsModel(QObject *parent) : QObject(parent), mAfManager(0) , mMaxItems(10)
+ActivityTsModel::ActivityTsModel(QObject *parent) : 
+QObject(parent),
+mMonitor(0),
+mAfManager(0) , 
+mMaxItems(10)
 {
     {
         QServiceManager serviceManager;
@@ -67,23 +75,53 @@
 
 ActivityTsModel::~ActivityTsModel()
 {
+    if (mMonitor) {
+       mMonitor->Cancel(*this); 
+    }
     qDeleteAll(mData);
 }
 
+void ActivityTsModel::HandleWindowGroupChanged(
+                                  MTsResourceManager& resources, 
+                                  const MTsRunningApplicationStorage& storage)
+{
+    Q_UNUSED(resources);
+    mRunningAppsUid.clear();
+    for (int i(0); i < storage.Count(); ++i) {
+        mRunningAppsUid.append(storage[i].UidL().iUid);
+    }
+    if(filterActivity()) {
+        emit dataChanged();
+    }
+}
+
+bool ActivityTsModel::filterActivity()
+{
+    bool retVal(false);
+    mPublishedData.clear();
+    for (int i(0); i < mData.count(); ++i) {
+        if(!mRunningAppsUid.contains(mData[i]->data().value(ActivityApplicationKeyword).toInt())) {
+            mPublishedData.append(mData[i]);
+            retVal = true;
+        }
+    }
+    return retVal;
+}
+
 QList<QVariantHash> ActivityTsModel::taskList() const
 {
-    return taskList(mData.count());
+    return taskList(mPublishedData.count());
 }
 
 QList<QVariantHash> ActivityTsModel::taskList(int limit) const
 {
     QList<QVariantHash> result;
-    for (int i(0); i < limit && i < mData.count(); ++i) {
-        result.append(mData[i]->data());
+    for (int i(0); i < limit && i < mPublishedData.count(); ++i) {
+        result.append(mPublishedData[i]->data());
     }
     return result;
 }
-    
+
 bool ActivityTsModel::openTask(const QVariant &id)
 {
     foreach (const ActivityTsEntry *entry, mData) {
@@ -105,8 +143,8 @@
 }
 
 void ActivityTsModel::getActivities()
-{
-    qDeleteAll(mData);
+{   
+    QList<ActivityTsEntry*> oldData(mData);
     mData.clear();
     
     QList<QVariantHash> activities;
@@ -114,27 +152,49 @@
                               "activitiesList",
                               Q_RETURN_ARG(QList<QVariantHash>, activities),
                               Q_ARG(int, mMaxItems));
-                              
+
     foreach (const QVariantHash &activityEntry, activities) {
-        mData.append(new ActivityTsEntry(activityEntry));
+        ActivityTsEntry *reusableEntry = findEntryWithScreenshot(oldData, activityEntry);
+        if (reusableEntry) {
+            mData.append(reusableEntry);
+            oldData.removeAll(reusableEntry);
+        } else {
+            mData.append(new ActivityTsEntry(activityEntry));
         
-        QMetaObject::invokeMethod(
+            QMetaObject::invokeMethod(
                 mAfManager,
                 "getThumbnail",
                 Q_ARG(QString, activityEntry.value(ActivityScreenshotKeyword).toString()),
                 Q_ARG(void *, mData.last()));
+        }
     }
+    qDeleteAll(oldData);
     
+    filterActivity();
     emit dataChanged();
 }
 
+ActivityTsEntry *ActivityTsModel::findEntryWithScreenshot(const QList<ActivityTsEntry*> &entryList, const QVariantHash &activityEntry) 
+{
+    foreach (ActivityTsEntry *entry, entryList) {
+        const QVariantHash data = entry->data();
+        if ((data.value(ActivityApplicationKeyword) == activityEntry.value(ActivityApplicationKeyword)) &&
+            (data.value(ActivityActivityKeyword) == activityEntry.value(ActivityActivityKeyword)) &&
+            (data.value("TaskTimestamp") == activityEntry.value(ActivityTimestamp)) &&
+            (data.value("TaskScreenshot") != -1)) {
+            return entry;
+        }
+    }
+    return 0;
+}
+
 void ActivityTsModel::convertScreenshotToThumbnail(const QPixmap &thumbnail, void *userData)
 {
     emit createThumbnail(thumbnail, 0, userData);
 }
 
 void ActivityTsModel::thumbnailCreated(const QPixmap &thumbnail, const void *userData)
-{    
+{
     foreach (ActivityTsEntry *activity, mData) {
         if (activity == userData) {
             activity->setThumbnail(thumbnail.toSymbianCFbsBitmap());
@@ -143,3 +203,12 @@
         }
     }
 }
+
+void ActivityTsModel::setResources(MTsResourceManager& resources)
+{
+    if (mMonitor) {
+        mMonitor->Cancel(*this);
+    }
+    mMonitor = &resources.WsMonitor();
+    mMonitor->SubscribeL(*this);
+}