taskswitcher/activitytsplugin/src/activitytsmodel.cpp
author hgs
Wed, 06 Oct 2010 16:00:22 +0300
changeset 125 26079c1bb561
parent 119 50e220be30d1
child 127 7b66bc3c6dc9
permissions -rw-r--r--
201039_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
119
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "activitytsmodel.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <stdexcept>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <QPixmap>
hgs
parents:
diff changeset
    23
#include <QUrl>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include <QServiceManager>
hgs
parents:
diff changeset
    26
#include <XQSettingsManager>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#include "afstorageglobals.h"
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    29
#include "tsrunningapp.h"
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    30
#include "tsrunningappstorage.h"
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    31
#include "tswindowgroupsmonitor.h"
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    32
#include "tsresourcemanager.h"
119
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
QTM_USE_NAMESPACE
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
namespace {
hgs
parents:
diff changeset
    37
    const char KActivityManager[] = "com.nokia.qt.activities.ActivityManager";
hgs
parents:
diff changeset
    38
    
hgs
parents:
diff changeset
    39
    const int KTsDeviceDialogUid = 0x2002677F;
hgs
parents:
diff changeset
    40
    const int KItemsLimit = 0x00000001;
hgs
parents:
diff changeset
    41
}
hgs
parents:
diff changeset
    42
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    43
ActivityTsModel::ActivityTsModel(QObject *parent) : 
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    44
QObject(parent),
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    45
mMonitor(0),
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    46
mAfManager(0) , 
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    47
mMaxItems(10)
119
hgs
parents:
diff changeset
    48
{
hgs
parents:
diff changeset
    49
    {
hgs
parents:
diff changeset
    50
        QServiceManager serviceManager;
hgs
parents:
diff changeset
    51
        mAfManager = serviceManager.loadInterface(KActivityManager);
hgs
parents:
diff changeset
    52
        if (mAfManager) {
hgs
parents:
diff changeset
    53
            mAfManager->setParent(this);
hgs
parents:
diff changeset
    54
        } else {
hgs
parents:
diff changeset
    55
            throw std::runtime_error("Cannot create critical com.nokia.qt.activities.ActivityManager service");
hgs
parents:
diff changeset
    56
        }
hgs
parents:
diff changeset
    57
    }
hgs
parents:
diff changeset
    58
    
hgs
parents:
diff changeset
    59
    {
hgs
parents:
diff changeset
    60
        XQSettingsManager crManager;
hgs
parents:
diff changeset
    61
        QVariant itemsNumberVariant = crManager.readItemValue(XQCentralRepositorySettingsKey(KTsDeviceDialogUid, KItemsLimit), XQSettingsManager::TypeInt);
hgs
parents:
diff changeset
    62
        if (!itemsNumberVariant.isNull()) {
hgs
parents:
diff changeset
    63
            int number = itemsNumberVariant.toInt();
hgs
parents:
diff changeset
    64
            if (number > 0) {
hgs
parents:
diff changeset
    65
                mMaxItems = number;
hgs
parents:
diff changeset
    66
            }
hgs
parents:
diff changeset
    67
        }
hgs
parents:
diff changeset
    68
    }
hgs
parents:
diff changeset
    69
    
hgs
parents:
diff changeset
    70
    connect(mAfManager, SIGNAL(dataChanged()), SLOT(getActivities()));
hgs
parents:
diff changeset
    71
    connect(mAfManager, SIGNAL(thumbnailReady(QPixmap,void*)), SLOT(convertScreenshotToThumbnail(QPixmap,void*)));
hgs
parents:
diff changeset
    72
    
hgs
parents:
diff changeset
    73
    getActivities();
hgs
parents:
diff changeset
    74
}
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
ActivityTsModel::~ActivityTsModel()
hgs
parents:
diff changeset
    77
{
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    78
    if (mMonitor) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    79
       mMonitor->Cancel(*this); 
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    80
    }
119
hgs
parents:
diff changeset
    81
    qDeleteAll(mData);
hgs
parents:
diff changeset
    82
}
hgs
parents:
diff changeset
    83
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    84
void ActivityTsModel::HandleWindowGroupChanged(
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    85
                                  MTsResourceManager& resources, 
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    86
                                  const MTsRunningApplicationStorage& storage)
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    87
{
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    88
    Q_UNUSED(resources);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    89
    mRunningAppsUid.clear();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    90
    for (int i(0); i < storage.Count(); ++i) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    91
        mRunningAppsUid.append(storage[i].UidL().iUid);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    92
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    93
    if(filterActivity()) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    94
        emit dataChanged();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    95
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    96
}
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    97
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    98
bool ActivityTsModel::filterActivity()
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    99
{
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   100
    bool retVal(false);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   101
    mPublishedData.clear();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   102
    for (int i(0); i < mData.count(); ++i) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   103
        if(!mRunningAppsUid.contains(mData[i]->data().value(ActivityApplicationKeyword).toInt())) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   104
            mPublishedData.append(mData[i]);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   105
            retVal = true;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   106
        }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   107
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   108
    return retVal;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   109
}
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   110
119
hgs
parents:
diff changeset
   111
QList<QVariantHash> ActivityTsModel::taskList() const
hgs
parents:
diff changeset
   112
{
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   113
    return taskList(mPublishedData.count());
119
hgs
parents:
diff changeset
   114
}
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
QList<QVariantHash> ActivityTsModel::taskList(int limit) const
hgs
parents:
diff changeset
   117
{
hgs
parents:
diff changeset
   118
    QList<QVariantHash> result;
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   119
    for (int i(0); i < limit && i < mPublishedData.count(); ++i) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   120
        result.append(mPublishedData[i]->data());
119
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
    return result;
hgs
parents:
diff changeset
   123
}
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   124
119
hgs
parents:
diff changeset
   125
bool ActivityTsModel::openTask(const QVariant &id)
hgs
parents:
diff changeset
   126
{
hgs
parents:
diff changeset
   127
    foreach (const ActivityTsEntry *entry, mData) {
hgs
parents:
diff changeset
   128
        if (entry->data().value("TaskId") == id) {
hgs
parents:
diff changeset
   129
            QMetaObject::invokeMethod(mAfManager,
hgs
parents:
diff changeset
   130
                                  "launchActivity",
hgs
parents:
diff changeset
   131
                                  Q_ARG(QUrl, entry->data().value("Uri").toUrl()));
hgs
parents:
diff changeset
   132
            return true;
hgs
parents:
diff changeset
   133
        }
hgs
parents:
diff changeset
   134
    }
hgs
parents:
diff changeset
   135
    return false;
hgs
parents:
diff changeset
   136
}
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
bool ActivityTsModel::closeTask(const QVariant &id)
hgs
parents:
diff changeset
   139
{
hgs
parents:
diff changeset
   140
    // it's impossible to "close" activity
hgs
parents:
diff changeset
   141
    Q_UNUSED(id);
hgs
parents:
diff changeset
   142
    return false;
hgs
parents:
diff changeset
   143
}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
void ActivityTsModel::getActivities()
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   146
{   
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   147
    QList<ActivityTsEntry*> oldData(mData);
119
hgs
parents:
diff changeset
   148
    mData.clear();
hgs
parents:
diff changeset
   149
    
hgs
parents:
diff changeset
   150
    QList<QVariantHash> activities;
hgs
parents:
diff changeset
   151
    QMetaObject::invokeMethod(mAfManager,
hgs
parents:
diff changeset
   152
                              "activitiesList",
hgs
parents:
diff changeset
   153
                              Q_RETURN_ARG(QList<QVariantHash>, activities),
hgs
parents:
diff changeset
   154
                              Q_ARG(int, mMaxItems));
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   155
119
hgs
parents:
diff changeset
   156
    foreach (const QVariantHash &activityEntry, activities) {
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   157
        ActivityTsEntry *reusableEntry = findEntryWithScreenshot(oldData, activityEntry);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   158
        if (reusableEntry) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   159
            mData.append(reusableEntry);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   160
            oldData.removeAll(reusableEntry);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   161
        } else {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   162
            mData.append(new ActivityTsEntry(activityEntry));
119
hgs
parents:
diff changeset
   163
        
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   164
            QMetaObject::invokeMethod(
119
hgs
parents:
diff changeset
   165
                mAfManager,
hgs
parents:
diff changeset
   166
                "getThumbnail",
hgs
parents:
diff changeset
   167
                Q_ARG(QString, activityEntry.value(ActivityScreenshotKeyword).toString()),
hgs
parents:
diff changeset
   168
                Q_ARG(void *, mData.last()));
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   169
        }
119
hgs
parents:
diff changeset
   170
    }
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   171
    qDeleteAll(oldData);
119
hgs
parents:
diff changeset
   172
    
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   173
    filterActivity();
119
hgs
parents:
diff changeset
   174
    emit dataChanged();
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   177
ActivityTsEntry *ActivityTsModel::findEntryWithScreenshot(const QList<ActivityTsEntry*> &entryList, const QVariantHash &activityEntry) 
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   178
{
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   179
    foreach (ActivityTsEntry *entry, entryList) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   180
        const QVariantHash data = entry->data();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   181
        if ((data.value(ActivityApplicationKeyword) == activityEntry.value(ActivityApplicationKeyword)) &&
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   182
            (data.value(ActivityActivityKeyword) == activityEntry.value(ActivityActivityKeyword)) &&
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   183
            (data.value("TaskTimestamp") == activityEntry.value(ActivityTimestamp)) &&
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   184
            (data.value("TaskScreenshot") != -1)) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   185
            return entry;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   186
        }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   187
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   188
    return 0;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   189
}
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   190
119
hgs
parents:
diff changeset
   191
void ActivityTsModel::convertScreenshotToThumbnail(const QPixmap &thumbnail, void *userData)
hgs
parents:
diff changeset
   192
{
hgs
parents:
diff changeset
   193
    emit createThumbnail(thumbnail, 0, userData);
hgs
parents:
diff changeset
   194
}
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
void ActivityTsModel::thumbnailCreated(const QPixmap &thumbnail, const void *userData)
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   197
{
119
hgs
parents:
diff changeset
   198
    foreach (ActivityTsEntry *activity, mData) {
hgs
parents:
diff changeset
   199
        if (activity == userData) {
hgs
parents:
diff changeset
   200
            activity->setThumbnail(thumbnail.toSymbianCFbsBitmap());
hgs
parents:
diff changeset
   201
            emit dataChanged();
hgs
parents:
diff changeset
   202
            break;
hgs
parents:
diff changeset
   203
        }
hgs
parents:
diff changeset
   204
    }
hgs
parents:
diff changeset
   205
}
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   206
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   207
void ActivityTsModel::setResources(MTsResourceManager& resources)
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   208
{
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   209
    if (mMonitor) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   210
        mMonitor->Cancel(*this);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   211
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   212
    mMonitor = &resources.WsMonitor();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   213
    mMonitor->SubscribeL(*this);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   214
}