phonebookui/cntcommonui/collections/cntcollectionlistmodelworker.cpp
author hgs
Fri, 15 Oct 2010 12:24:46 +0300
changeset 81 640d30f4fb64
parent 72 6abfb1094884
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
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 "cntcollectionlistmodelworker.h"
hgs
parents:
diff changeset
    19
#include "cntfavourite.h"
hgs
parents:
diff changeset
    20
#include "cntdebug.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <hbglobal.h>
hgs
parents:
diff changeset
    23
#include <hbapplication.h>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include <cntuids.h>
hgs
parents:
diff changeset
    26
#include <xqsettingskey.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// CONSTANTS
hgs
parents:
diff changeset
    29
const int CntNamesLengthLimit = 30;
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
/*!
hgs
parents:
diff changeset
    32
    Constructor
hgs
parents:
diff changeset
    33
*/
hgs
parents:
diff changeset
    34
CntCollectionListModelWorker::CntCollectionListModelWorker(QString unnamed, QString noFavs, QString noMembers, int sortOrder) :
hgs
parents:
diff changeset
    35
    mStarted(false),
hgs
parents:
diff changeset
    36
    mProcessingJobs(false),
hgs
parents:
diff changeset
    37
    mStopped(false),
hgs
parents:
diff changeset
    38
    mManager(NULL),
hgs
parents:
diff changeset
    39
    mUnnamed(unnamed),
hgs
parents:
diff changeset
    40
    mNoFavorites(noFavs),
hgs
parents:
diff changeset
    41
    mNoMembers(noMembers),
hgs
parents:
diff changeset
    42
    mSortOrder(sortOrder)
hgs
parents:
diff changeset
    43
{
hgs
parents:
diff changeset
    44
    CNT_ENTRY
hgs
parents:
diff changeset
    45
    
hgs
parents:
diff changeset
    46
    moveToThread(this);
hgs
parents:
diff changeset
    47
    
hgs
parents:
diff changeset
    48
    CNT_EXIT
hgs
parents:
diff changeset
    49
}
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
/*!
hgs
parents:
diff changeset
    52
    Destructor
hgs
parents:
diff changeset
    53
    
hgs
parents:
diff changeset
    54
    Clears any remaining jobs and waits until the last one gets completed.
hgs
parents:
diff changeset
    55
*/
hgs
parents:
diff changeset
    56
CntCollectionListModelWorker::~CntCollectionListModelWorker()
hgs
parents:
diff changeset
    57
{
hgs
parents:
diff changeset
    58
    CNT_ENTRY
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    mMutex.lock();
hgs
parents:
diff changeset
    61
    
hgs
parents:
diff changeset
    62
    mJobs.clear();
hgs
parents:
diff changeset
    63
    
hgs
parents:
diff changeset
    64
    mMutex.unlock();
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
    exit();
hgs
parents:
diff changeset
    67
    
hgs
parents:
diff changeset
    68
    // Ugly as hell, but needed for UTs or otherwise they'll freeze
hgs
parents:
diff changeset
    69
#ifndef PBK_UNIT_TEST
hgs
parents:
diff changeset
    70
    wait();
hgs
parents:
diff changeset
    71
#else
hgs
parents:
diff changeset
    72
    wait(5000);
hgs
parents:
diff changeset
    73
#endif
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    CNT_EXIT
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
/*!
hgs
parents:
diff changeset
    79
    Re-implemented from QThread, start the event loop.
hgs
parents:
diff changeset
    80
*/
hgs
parents:
diff changeset
    81
void CntCollectionListModelWorker::run()
hgs
parents:
diff changeset
    82
{
hgs
parents:
diff changeset
    83
    CNT_ENTRY
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
    exec();
hgs
parents:
diff changeset
    86
    
hgs
parents:
diff changeset
    87
    delete mManager;
hgs
parents:
diff changeset
    88
    mManager = NULL;
hgs
parents:
diff changeset
    89
    
hgs
parents:
diff changeset
    90
    CNT_EXIT
hgs
parents:
diff changeset
    91
}
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
/*!
hgs
parents:
diff changeset
    94
    Re-implemented from QThread to capture QEvent::User type events
hgs
parents:
diff changeset
    95
    in order to start the job processing loop.
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
    \param event the event sent to this object
hgs
parents:
diff changeset
    98
    \return bool
hgs
parents:
diff changeset
    99
*/
hgs
parents:
diff changeset
   100
bool CntCollectionListModelWorker::event(QEvent *event)
hgs
parents:
diff changeset
   101
{
hgs
parents:
diff changeset
   102
    if (event->type() == QEvent::User)
hgs
parents:
diff changeset
   103
    {
hgs
parents:
diff changeset
   104
        processJobs();
hgs
parents:
diff changeset
   105
        return true;
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
    return QThread::event(event);
hgs
parents:
diff changeset
   109
}
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
/*!
hgs
parents:
diff changeset
   112
    Schedule an asynch job for the given contact id.
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    \param id the QContactLocalId of the group
hgs
parents:
diff changeset
   115
*/
hgs
parents:
diff changeset
   116
void CntCollectionListModelWorker::scheduleJob(int id)
hgs
parents:
diff changeset
   117
{
hgs
parents:
diff changeset
   118
    CNT_ENTRY
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
    mMutex.lock();
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    if (!mStarted) {
hgs
parents:
diff changeset
   123
        // starting the event loop; minimum priority is used as this thread
hgs
parents:
diff changeset
   124
        // should interfere as little as possible with more time-critical tasks,
hgs
parents:
diff changeset
   125
        // like updating the UI during scrolling
hgs
parents:
diff changeset
   126
        start(QThread::IdlePriority);
hgs
parents:
diff changeset
   127
        mStarted = true;
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
    if (!mProcessingJobs) {
hgs
parents:
diff changeset
   131
        // new job => start processing jobs
hgs
parents:
diff changeset
   132
        mProcessingJobs = true;
hgs
parents:
diff changeset
   133
        HbApplication::instance()->postEvent(this, new QEvent(QEvent::User));
hgs
parents:
diff changeset
   134
    }
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
    mJobs.append(id);
hgs
parents:
diff changeset
   137
    
hgs
parents:
diff changeset
   138
    mMutex.unlock();
hgs
parents:
diff changeset
   139
    
hgs
parents:
diff changeset
   140
    CNT_EXIT
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
/*!
hgs
parents:
diff changeset
   144
    Job processing loop. Loops forever until there are no more jobs left.
hgs
parents:
diff changeset
   145
    If jobs exist, takes the first one from the list and processes it.
hgs
parents:
diff changeset
   146
*/
hgs
parents:
diff changeset
   147
void CntCollectionListModelWorker::processJobs()
hgs
parents:
diff changeset
   148
{
hgs
parents:
diff changeset
   149
    CNT_ENTRY
hgs
parents:
diff changeset
   150
    
hgs
parents:
diff changeset
   151
    forever
hgs
parents:
diff changeset
   152
    {
hgs
parents:
diff changeset
   153
        mMutex.lock();
hgs
parents:
diff changeset
   154
        int jobCount = mJobs.count();
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
        if (jobCount == 0)
hgs
parents:
diff changeset
   157
        {
hgs
parents:
diff changeset
   158
            mProcessingJobs = false;
hgs
parents:
diff changeset
   159
            mMutex.unlock();
hgs
parents:
diff changeset
   160
            break;
hgs
parents:
diff changeset
   161
        }
hgs
parents:
diff changeset
   162
        else
hgs
parents:
diff changeset
   163
        {
hgs
parents:
diff changeset
   164
            // get next job
hgs
parents:
diff changeset
   165
            int id = mJobs.takeFirst();
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
            mMutex.unlock();
hgs
parents:
diff changeset
   168
            fetchInformation(id);
hgs
parents:
diff changeset
   169
        }
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
        HbApplication::processEvents();
hgs
parents:
diff changeset
   172
    }
hgs
parents:
diff changeset
   173
    
hgs
parents:
diff changeset
   174
    CNT_EXIT
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
/*!
hgs
parents:
diff changeset
   178
    Fetch the second row text (member names or placeholder text if no members exist)
hgs
parents:
diff changeset
   179
    and the amount of contacts in the group. Emits the result as a signal for
hgs
parents:
diff changeset
   180
    CntCollectionListModel to handle.
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
    \param id the QContactLocalId of the group in the given row
hgs
parents:
diff changeset
   183
*/
hgs
parents:
diff changeset
   184
void CntCollectionListModelWorker::fetchInformation(int id)
hgs
parents:
diff changeset
   185
{
hgs
parents:
diff changeset
   186
    CNT_ENTRY
hgs
parents:
diff changeset
   187
    
hgs
parents:
diff changeset
   188
    if (!mManager)
hgs
parents:
diff changeset
   189
    {
hgs
parents:
diff changeset
   190
        mManager = new QContactManager("symbian");
hgs
parents:
diff changeset
   191
    }
hgs
parents:
diff changeset
   192
    
hgs
parents:
diff changeset
   193
    QContact contact = mManager->contact(id);
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
    int favoriteGroupId = CntFavourite::favouriteGroupId( mManager );
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
    QString secondLineText;
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
    QContactRelationshipFilter rFilter;
hgs
parents:
diff changeset
   200
    rFilter.setRelationshipType(QContactRelationship::HasMember);
hgs
parents:
diff changeset
   201
    rFilter.setRelatedContactRole(QContactRelationship::First);
hgs
parents:
diff changeset
   202
    rFilter.setRelatedContactId(contact.id());
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
    QContactSortOrder sortOrderFirstName;
hgs
parents:
diff changeset
   205
    sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName,
hgs
parents:
diff changeset
   206
            QContactName::FieldFirstName);
hgs
parents:
diff changeset
   207
    sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive);
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
    QContactSortOrder sortOrderLastName;
hgs
parents:
diff changeset
   210
    sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName,
hgs
parents:
diff changeset
   211
            QContactName::FieldLastName);
hgs
parents:
diff changeset
   212
    sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive);
hgs
parents:
diff changeset
   213
    
hgs
parents:
diff changeset
   214
    QList<QContactSortOrder> sortOrders;
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
    if (mSortOrder == CntOrderFirstLast)
hgs
parents:
diff changeset
   217
    {
hgs
parents:
diff changeset
   218
        sortOrders.append(sortOrderFirstName);
hgs
parents:
diff changeset
   219
        sortOrders.append(sortOrderLastName);
hgs
parents:
diff changeset
   220
    } 
hgs
parents:
diff changeset
   221
    else
hgs
parents:
diff changeset
   222
    {
hgs
parents:
diff changeset
   223
        sortOrders.append(sortOrderLastName);
hgs
parents:
diff changeset
   224
        sortOrders.append(sortOrderFirstName);
hgs
parents:
diff changeset
   225
    }
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
    // group members and their count
hgs
parents:
diff changeset
   228
    QList<QContactLocalId> groupMemberIds = mManager->contactIds(rFilter, sortOrders);
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
    if (!groupMemberIds.isEmpty())
hgs
parents:
diff changeset
   231
    {
hgs
parents:
diff changeset
   232
        QStringList nameList;
hgs
parents:
diff changeset
   233
        for(int i = 0;i < groupMemberIds.count();i++)
hgs
parents:
diff changeset
   234
        {
hgs
parents:
diff changeset
   235
            QContactFetchHint nameOnlyFetchHint;
81
hgs
parents: 72
diff changeset
   236
            QStringList details(QContactDisplayLabel::DefinitionName);
hgs
parents: 72
diff changeset
   237
            nameOnlyFetchHint.setDetailDefinitionsHint(details);
72
hgs
parents:
diff changeset
   238
            nameOnlyFetchHint.setOptimizationHints(QContactFetchHint::NoRelationships);
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
            QContact contact = mManager->contact(groupMemberIds.at(i), nameOnlyFetchHint);
hgs
parents:
diff changeset
   241
            QString memberName = contact.displayLabel();
hgs
parents:
diff changeset
   242
            if (memberName.isEmpty())
hgs
parents:
diff changeset
   243
            {
hgs
parents:
diff changeset
   244
                memberName = mUnnamed;
hgs
parents:
diff changeset
   245
            }
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
            // Incase the format is LastnameCommaFirstname, remove the commas
hgs
parents:
diff changeset
   248
            memberName = memberName.replace(", ", " ");
hgs
parents:
diff changeset
   249
            nameList << memberName;
hgs
parents:
diff changeset
   250
            if (nameList.join(", ").length() > CntNamesLengthLimit)
hgs
parents:
diff changeset
   251
            {
hgs
parents:
diff changeset
   252
                break;
hgs
parents:
diff changeset
   253
            }
hgs
parents:
diff changeset
   254
        }
hgs
parents:
diff changeset
   255
        QString names = nameList.join(", ").trimmed();
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
        secondLineText = names;
hgs
parents:
diff changeset
   258
    }
hgs
parents:
diff changeset
   259
    else
hgs
parents:
diff changeset
   260
    {
hgs
parents:
diff changeset
   261
        if (id == favoriteGroupId)
hgs
parents:
diff changeset
   262
        {
hgs
parents:
diff changeset
   263
            secondLineText = mNoFavorites;
hgs
parents:
diff changeset
   264
        }
hgs
parents:
diff changeset
   265
        else
hgs
parents:
diff changeset
   266
        {
hgs
parents:
diff changeset
   267
            secondLineText = mNoMembers;
hgs
parents:
diff changeset
   268
        }
hgs
parents:
diff changeset
   269
    }
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
    emit fetchDone(id, secondLineText, groupMemberIds);
hgs
parents:
diff changeset
   272
    
hgs
parents:
diff changeset
   273
    CNT_EXIT
hgs
parents:
diff changeset
   274
}
hgs
parents:
diff changeset
   275