taskswitcher/activitytsplugin/src/activitytsmodel.cpp
author hgs
Mon, 18 Oct 2010 10:44:15 +0300
changeset 127 7b66bc3c6dc9
parent 125 26079c1bb561
permissions -rw-r--r--
201041
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) {
127
hgs
parents: 125
diff changeset
    91
        if(MTsRunningApplication::None == storage[i].HideMode()) {
hgs
parents: 125
diff changeset
    92
            mRunningAppsUid.append(storage[i].Uid().iUid);
hgs
parents: 125
diff changeset
    93
        }
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    94
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    95
    if(filterActivity()) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    96
        emit dataChanged();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    97
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    98
}
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
    99
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   100
bool ActivityTsModel::filterActivity()
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   101
{
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   102
    bool retVal(false);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   103
    mPublishedData.clear();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   104
    for (int i(0); i < mData.count(); ++i) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   105
        if(!mRunningAppsUid.contains(mData[i]->data().value(ActivityApplicationKeyword).toInt())) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   106
            mPublishedData.append(mData[i]);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   107
            retVal = true;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   108
        }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   109
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   110
    return retVal;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   111
}
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   112
119
hgs
parents:
diff changeset
   113
QList<QVariantHash> ActivityTsModel::taskList() const
hgs
parents:
diff changeset
   114
{
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   115
    return taskList(mPublishedData.count());
119
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
QList<QVariantHash> ActivityTsModel::taskList(int limit) const
hgs
parents:
diff changeset
   119
{
hgs
parents:
diff changeset
   120
    QList<QVariantHash> result;
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   121
    for (int i(0); i < limit && i < mPublishedData.count(); ++i) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   122
        result.append(mPublishedData[i]->data());
119
hgs
parents:
diff changeset
   123
    }
hgs
parents:
diff changeset
   124
    return result;
hgs
parents:
diff changeset
   125
}
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   126
119
hgs
parents:
diff changeset
   127
bool ActivityTsModel::openTask(const QVariant &id)
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
    foreach (const ActivityTsEntry *entry, mData) {
hgs
parents:
diff changeset
   130
        if (entry->data().value("TaskId") == id) {
hgs
parents:
diff changeset
   131
            QMetaObject::invokeMethod(mAfManager,
hgs
parents:
diff changeset
   132
                                  "launchActivity",
hgs
parents:
diff changeset
   133
                                  Q_ARG(QUrl, entry->data().value("Uri").toUrl()));
hgs
parents:
diff changeset
   134
            return true;
hgs
parents:
diff changeset
   135
        }
hgs
parents:
diff changeset
   136
    }
hgs
parents:
diff changeset
   137
    return false;
hgs
parents:
diff changeset
   138
}
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
bool ActivityTsModel::closeTask(const QVariant &id)
hgs
parents:
diff changeset
   141
{
hgs
parents:
diff changeset
   142
    // it's impossible to "close" activity
hgs
parents:
diff changeset
   143
    Q_UNUSED(id);
hgs
parents:
diff changeset
   144
    return false;
hgs
parents:
diff changeset
   145
}
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
void ActivityTsModel::getActivities()
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   148
{   
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   149
    QList<ActivityTsEntry*> oldData(mData);
119
hgs
parents:
diff changeset
   150
    mData.clear();
hgs
parents:
diff changeset
   151
    
hgs
parents:
diff changeset
   152
    QList<QVariantHash> activities;
hgs
parents:
diff changeset
   153
    QMetaObject::invokeMethod(mAfManager,
hgs
parents:
diff changeset
   154
                              "activitiesList",
hgs
parents:
diff changeset
   155
                              Q_RETURN_ARG(QList<QVariantHash>, activities),
hgs
parents:
diff changeset
   156
                              Q_ARG(int, mMaxItems));
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   157
119
hgs
parents:
diff changeset
   158
    foreach (const QVariantHash &activityEntry, activities) {
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   159
        ActivityTsEntry *reusableEntry = findEntryWithScreenshot(oldData, activityEntry);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   160
        if (reusableEntry) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   161
            mData.append(reusableEntry);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   162
            oldData.removeAll(reusableEntry);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   163
        } else {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   164
            mData.append(new ActivityTsEntry(activityEntry));
119
hgs
parents:
diff changeset
   165
        
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   166
            QMetaObject::invokeMethod(
119
hgs
parents:
diff changeset
   167
                mAfManager,
hgs
parents:
diff changeset
   168
                "getThumbnail",
hgs
parents:
diff changeset
   169
                Q_ARG(QString, activityEntry.value(ActivityScreenshotKeyword).toString()),
hgs
parents:
diff changeset
   170
                Q_ARG(void *, mData.last()));
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   171
        }
119
hgs
parents:
diff changeset
   172
    }
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   173
    qDeleteAll(oldData);
119
hgs
parents:
diff changeset
   174
    
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   175
    filterActivity();
119
hgs
parents:
diff changeset
   176
    emit dataChanged();
hgs
parents:
diff changeset
   177
}
hgs
parents:
diff changeset
   178
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   179
ActivityTsEntry *ActivityTsModel::findEntryWithScreenshot(const QList<ActivityTsEntry*> &entryList, const QVariantHash &activityEntry) 
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   180
{
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   181
    foreach (ActivityTsEntry *entry, entryList) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   182
        const QVariantHash data = entry->data();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   183
        if ((data.value(ActivityApplicationKeyword) == activityEntry.value(ActivityApplicationKeyword)) &&
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   184
            (data.value(ActivityActivityKeyword) == activityEntry.value(ActivityActivityKeyword)) &&
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   185
            (data.value("TaskTimestamp") == activityEntry.value(ActivityTimestamp)) &&
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   186
            (data.value("TaskScreenshot") != -1)) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   187
            return entry;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   188
        }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   189
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   190
    return 0;
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   191
}
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   192
119
hgs
parents:
diff changeset
   193
void ActivityTsModel::convertScreenshotToThumbnail(const QPixmap &thumbnail, void *userData)
hgs
parents:
diff changeset
   194
{
hgs
parents:
diff changeset
   195
    emit createThumbnail(thumbnail, 0, userData);
hgs
parents:
diff changeset
   196
}
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
void ActivityTsModel::thumbnailCreated(const QPixmap &thumbnail, const void *userData)
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   199
{
119
hgs
parents:
diff changeset
   200
    foreach (ActivityTsEntry *activity, mData) {
hgs
parents:
diff changeset
   201
        if (activity == userData) {
hgs
parents:
diff changeset
   202
            activity->setThumbnail(thumbnail.toSymbianCFbsBitmap());
hgs
parents:
diff changeset
   203
            emit dataChanged();
hgs
parents:
diff changeset
   204
            break;
hgs
parents:
diff changeset
   205
        }
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
}
125
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   208
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   209
void ActivityTsModel::setResources(MTsResourceManager& resources)
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   210
{
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   211
    if (mMonitor) {
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   212
        mMonitor->Cancel(*this);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   213
    }
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   214
    mMonitor = &resources.WsMonitor();
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   215
    mMonitor->SubscribeL(*this);
26079c1bb561 201039_01
hgs
parents: 119
diff changeset
   216
}