phonebookui/cntcommonui/contactcard/cntcontactcardview_p.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
* Description:
hgs
parents:
diff changeset
    14
*
hgs
parents:
diff changeset
    15
*/
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
#include "cntcontactcardview_p.h"
hgs
parents:
diff changeset
    18
#include "cntthumbnailmanager.h"
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <QGraphicsLinearLayout>
hgs
parents:
diff changeset
    21
#include <QGraphicsSceneResizeEvent>
hgs
parents:
diff changeset
    22
#include <QStringList>
hgs
parents:
diff changeset
    23
#include <QStandardItemModel>
hgs
parents:
diff changeset
    24
#include <QKeyEvent>
hgs
parents:
diff changeset
    25
#include <QDir>
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include <cntservicescontact.h>
hgs
parents:
diff changeset
    28
#include <qtcontacts.h>
hgs
parents:
diff changeset
    29
#include <hbapplication.h>
hgs
parents:
diff changeset
    30
#include <hbscrollarea.h>
hgs
parents:
diff changeset
    31
#include <hblabel.h>
hgs
parents:
diff changeset
    32
#include <hbmenu.h>
hgs
parents:
diff changeset
    33
#include <hbview.h>
hgs
parents:
diff changeset
    34
#include <hbtoolbar.h>
hgs
parents:
diff changeset
    35
#include <hbgroupbox.h>
hgs
parents:
diff changeset
    36
#include <hbaction.h>
hgs
parents:
diff changeset
    37
#include <hbmessagebox.h>
hgs
parents:
diff changeset
    38
#include <hbicon.h>
hgs
parents:
diff changeset
    39
#include <hbparameterlengthlimiter.h>
hgs
parents:
diff changeset
    40
#include <hbframeitem.h>
hgs
parents:
diff changeset
    41
#include <hbframedrawer.h>
hgs
parents:
diff changeset
    42
#include <hbselectiondialog.h>
hgs
parents:
diff changeset
    43
#include <hblistview.h>
hgs
parents:
diff changeset
    44
#include <hblistviewitem.h>
hgs
parents:
diff changeset
    45
#include <shareui.h>
hgs
parents:
diff changeset
    46
#include <maptileservice.h>  //For maptile processing
hgs
parents:
diff changeset
    47
#include <qversitcontactexporter.h>
hgs
parents:
diff changeset
    48
#include <qversitwriter.h>
hgs
parents:
diff changeset
    49
#include <xqservicerequest.h>
hgs
parents:
diff changeset
    50
#include <QTimer>  //Progress indication icon
hgs
parents:
diff changeset
    51
#include <QApplication>
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
#include <cntdebug.h>
hgs
parents:
diff changeset
    54
#include "cntcontactcarddatacontainer.h"
hgs
parents:
diff changeset
    55
#include "cntcontactcardheadingitem.h"
hgs
parents:
diff changeset
    56
#include "cntcontactcarddataitem.h"
hgs
parents:
diff changeset
    57
#include "cntcontactcarddetailitem.h"
hgs
parents:
diff changeset
    58
#include "cntcontactcardcontextmenu.h"
hgs
parents:
diff changeset
    59
#include "cntmainwindow.h"
hgs
parents:
diff changeset
    60
#include "cntstringmapper.h"
hgs
parents:
diff changeset
    61
#include "cntdocumentloader.h"
hgs
parents:
diff changeset
    62
#include "cntimagelabel.h"
hgs
parents:
diff changeset
    63
#include "cntimageutility.h"
hgs
parents:
diff changeset
    64
#include "cntfavourite.h"
hgs
parents:
diff changeset
    65
#include "cntactionlauncher.h"
hgs
parents:
diff changeset
    66
#include "cntpresencelistener.h"
hgs
parents:
diff changeset
    67
#include "cntactionpopup.h"
hgs
parents:
diff changeset
    68
#include "cntvcarddetailhandler.h"
hgs
parents:
diff changeset
    69
#include "cntsavemanager.h"
hgs
parents:
diff changeset
    70
#include "cntextensionmanager.h"
hgs
parents:
diff changeset
    71
#include <cntabstractengine.h>
hgs
parents:
diff changeset
    72
#include <cntuiextensionfactory.h>
hgs
parents:
diff changeset
    73
#include <cntuicontactcardextension.h>
hgs
parents:
diff changeset
    74
#include <cntuisocialextension.h>
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
#define CNT_MAPTILE_PROGRESS_TIMER  100 // 100 msec
hgs
parents:
diff changeset
    77
#define CNT_UNKNOWN_MAPTILE_STATUS   -1
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
// A few list items (CntInitialPopulation) will be populated before the first view;
hgs
parents:
diff changeset
    80
// if there are more list items, they will be fetched and added one by one after the
hgs
parents:
diff changeset
    81
// first view has been shown to the user
hgs
parents:
diff changeset
    82
static const int CntListPopulationNotInProgress = -1;
hgs
parents:
diff changeset
    83
static const QEvent::Type ProcessPopulateListEvent = QEvent::User;
hgs
parents:
diff changeset
    84
static const int CntInitialPopulation = 8;
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
const char *CNT_CONTACTCARDVIEW_XML = ":/xml/contacts_contactcard.docml";
81
hgs
parents: 72
diff changeset
    87
const QString CNT_ACTIVITY_CONTACTCARD  = "ContactsCardView";
72
hgs
parents:
diff changeset
    88
const char *CNT_MAPTILE_INPROGRESS_ICON = "qtg_anim_small_loading_1";
hgs
parents:
diff changeset
    89
const char *CNT_MAPTILE_SEARCH_STOP_ICON = "qtg_mono_search_stop";
hgs
parents:
diff changeset
    90
/*!
hgs
parents:
diff changeset
    91
Constructor, initialize member variables.
hgs
parents:
diff changeset
    92
\a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0)
hgs
parents:
diff changeset
    93
*/
hgs
parents:
diff changeset
    94
CntContactCardViewPrivate::CntContactCardViewPrivate(bool isTemporary) :
hgs
parents:
diff changeset
    95
    QObject(),
hgs
parents:
diff changeset
    96
    mContainerLayout(NULL),
hgs
parents:
diff changeset
    97
    mContainerWidget(NULL),
hgs
parents:
diff changeset
    98
    mContact(NULL),
hgs
parents:
diff changeset
    99
    mDataContainer(NULL),
hgs
parents:
diff changeset
   100
    mAvatar(NULL),
hgs
parents:
diff changeset
   101
    mLoader(NULL),
hgs
parents:
diff changeset
   102
    mVCardIcon(NULL),
hgs
parents:
diff changeset
   103
    mShareUi(NULL),
hgs
parents:
diff changeset
   104
    mAcceptSendKey(true),
hgs
parents:
diff changeset
   105
    mPresenceListener(NULL),
hgs
parents:
diff changeset
   106
	mIsTemporary(isTemporary),
hgs
parents:
diff changeset
   107
	mIsExecutingAction(false),
hgs
parents:
diff changeset
   108
    mMyCardId(0),
hgs
parents:
diff changeset
   109
    mSaveManager(NULL),
hgs
parents:
diff changeset
   110
    mListPopulationProgress(CntListPopulationNotInProgress),
81
hgs
parents: 72
diff changeset
   111
    mStopListPopulation(false),
hgs
parents: 72
diff changeset
   112
    mFetchAvatar(false),
hgs
parents: 72
diff changeset
   113
    mSeparatorlabel(NULL)
72
hgs
parents:
diff changeset
   114
{
hgs
parents:
diff changeset
   115
    bool ok;
hgs
parents:
diff changeset
   116
    document()->load(CNT_CONTACTCARDVIEW_XML, &ok);
hgs
parents:
diff changeset
   117
    if (!ok) 
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
        qFatal("Unable to read :/xml/contacts_contactcard.docml");
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
    
hgs
parents:
diff changeset
   122
    mView = static_cast<HbView*>(document()->findWidget("view"));
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    //back button
hgs
parents:
diff changeset
   125
    mBackKey = new HbAction(Hb::BackNaviAction, mView);
hgs
parents:
diff changeset
   126
    mView->setNavigationAction(mBackKey);  
hgs
parents:
diff changeset
   127
    connect(mBackKey, SIGNAL(triggered()), this, SLOT(showPreviousView()));
hgs
parents:
diff changeset
   128
    
hgs
parents:
diff changeset
   129
    mProgressTimer = new QTimer(this);
hgs
parents:
diff changeset
   130
    mProgressTimer->setSingleShot(true);
hgs
parents:
diff changeset
   131
    connect(mProgressTimer, SIGNAL(timeout()),this, SLOT(updateSpinningIndicator()));
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    mMaptile = new MapTileService;
hgs
parents:
diff changeset
   134
    if( mMaptile->isLocationFeatureEnabled(MapTileService::AppTypeContacts) )
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
        //Connect for maptile status evenet
hgs
parents:
diff changeset
   137
        QObject::connect( mMaptile, SIGNAL(maptileFetchingStatusUpdate(int, 
hgs
parents:
diff changeset
   138
            int,int)),this,SLOT(mapTileStatusReceived(int,int,int)));
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
    
hgs
parents:
diff changeset
   141
    mScrollArea = static_cast<HbScrollArea*>(document()->findWidget(QString("scrollArea")));
hgs
parents:
diff changeset
   142
    mHeadingItem = static_cast<CntContactCardHeadingItem*>(document()->findWidget(QString("cnt_contactcard_heading")));
hgs
parents:
diff changeset
   143
    mImageLabel = static_cast<CntImageLabel*>(document()->findWidget("cnt_contactcard_image"));
hgs
parents:
diff changeset
   144
    
hgs
parents:
diff changeset
   145
    // presence listener
hgs
parents:
diff changeset
   146
    mPresenceListener = new CntPresenceListener();
hgs
parents:
diff changeset
   147
    connect(mPresenceListener, SIGNAL(fullPresenceUpdated(bool)), mHeadingItem, SLOT(setOnlineStatus(bool)));
hgs
parents:
diff changeset
   148
    connect(mPresenceListener, SIGNAL(accountPresenceUpdated(const QString&, bool)), 
hgs
parents:
diff changeset
   149
            this, SLOT(updateItemPresence(const QString&, bool)));
hgs
parents:
diff changeset
   150
    
hgs
parents:
diff changeset
   151
    
hgs
parents:
diff changeset
   152
    mSaveManager = new CntSaveManager();
hgs
parents:
diff changeset
   153
}
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
/*!
hgs
parents:
diff changeset
   156
Destructor
hgs
parents:
diff changeset
   157
*/
hgs
parents:
diff changeset
   158
CntContactCardViewPrivate::~CntContactCardViewPrivate()
hgs
parents:
diff changeset
   159
{
hgs
parents:
diff changeset
   160
    // stop the progress timer
hgs
parents:
diff changeset
   161
    if ( mProgressTimer && mProgressTimer->isActive())
hgs
parents:
diff changeset
   162
    {
hgs
parents:
diff changeset
   163
        mProgressTimer->stop();
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
    
81
hgs
parents: 72
diff changeset
   166
    if (mContainerLayout)
72
hgs
parents:
diff changeset
   167
    {
81
hgs
parents: 72
diff changeset
   168
        // Remove the separator obj from layout
hgs
parents: 72
diff changeset
   169
        mContainerLayout->removeItem(mSeparatorlabel);
72
hgs
parents:
diff changeset
   170
    }
81
hgs
parents: 72
diff changeset
   171
    delete mSeparatorlabel;
72
hgs
parents:
diff changeset
   172
    
hgs
parents:
diff changeset
   173
    mView->deleteLater();
hgs
parents:
diff changeset
   174
    
hgs
parents:
diff changeset
   175
    delete mContact;
hgs
parents:
diff changeset
   176
    mContact = NULL;
hgs
parents:
diff changeset
   177
    
hgs
parents:
diff changeset
   178
    delete mDataContainer;
hgs
parents:
diff changeset
   179
    mDataContainer = NULL;
hgs
parents:
diff changeset
   180
    
hgs
parents:
diff changeset
   181
    delete mAvatar;
hgs
parents:
diff changeset
   182
    mAvatar = NULL;
hgs
parents:
diff changeset
   183
    
hgs
parents:
diff changeset
   184
    delete mLoader;
hgs
parents:
diff changeset
   185
    mLoader = NULL;
hgs
parents:
diff changeset
   186
    
hgs
parents:
diff changeset
   187
    if (mVCardIcon) 
hgs
parents:
diff changeset
   188
    {
hgs
parents:
diff changeset
   189
        delete mVCardIcon;
hgs
parents:
diff changeset
   190
        mVCardIcon = NULL;
hgs
parents:
diff changeset
   191
    }
hgs
parents:
diff changeset
   192
    
hgs
parents:
diff changeset
   193
    if (mShareUi) 
hgs
parents:
diff changeset
   194
    {
hgs
parents:
diff changeset
   195
        delete mShareUi;
hgs
parents:
diff changeset
   196
        mShareUi = NULL;
hgs
parents:
diff changeset
   197
    }
hgs
parents:
diff changeset
   198
    
hgs
parents:
diff changeset
   199
    delete mPresenceListener;
hgs
parents:
diff changeset
   200
    mPresenceListener = NULL;
hgs
parents:
diff changeset
   201
    
hgs
parents:
diff changeset
   202
    delete mMaptile;
hgs
parents:
diff changeset
   203
    mMaptile = NULL;
hgs
parents:
diff changeset
   204
        
hgs
parents:
diff changeset
   205
    //delete maptile label memory
hgs
parents:
diff changeset
   206
    for ( int index = 0; index < mMaptileLabelList.count(); index++ )
hgs
parents:
diff changeset
   207
    {
hgs
parents:
diff changeset
   208
        if( mMaptileLabelList[index] )
hgs
parents:
diff changeset
   209
        {
hgs
parents:
diff changeset
   210
           delete mMaptileLabelList[index];
hgs
parents:
diff changeset
   211
           mMaptileLabelList[index] = NULL ;
hgs
parents:
diff changeset
   212
        }
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
    
hgs
parents:
diff changeset
   215
    delete mSaveManager;
hgs
parents:
diff changeset
   216
    mSaveManager = NULL;
hgs
parents:
diff changeset
   217
}
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
/*!
hgs
parents:
diff changeset
   220
Activates a previous view
hgs
parents:
diff changeset
   221
*/
hgs
parents:
diff changeset
   222
void CntContactCardViewPrivate::showPreviousView()
hgs
parents:
diff changeset
   223
{
hgs
parents:
diff changeset
   224
    // stop list population, if it is still in progress
hgs
parents:
diff changeset
   225
    mStopListPopulation = true;
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
    int returnValue = KCntServicesReturnValueContactNotModified;
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
    //save the contact if avatar has been changed.
hgs
parents:
diff changeset
   230
    QContact contact = contactManager()->contact(mContact->localId());
hgs
parents:
diff changeset
   231
    if ( contact != *mContact && contactManager()->error() == QContactManager::NoError)
hgs
parents:
diff changeset
   232
    {
hgs
parents:
diff changeset
   233
        disconnect(contactManager(), SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
hgs
parents:
diff changeset
   234
                    this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
hgs
parents:
diff changeset
   235
        CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mContact, contactManager());
hgs
parents:
diff changeset
   236
        
hgs
parents:
diff changeset
   237
        if (result != CntSaveManager::ENothingDone)
hgs
parents:
diff changeset
   238
            returnValue = KCntServicesReturnValueContactSaved;
hgs
parents:
diff changeset
   239
        else
hgs
parents:
diff changeset
   240
            returnValue = KCntServicesReturnValueContactNotModified;
hgs
parents:
diff changeset
   241
    }
hgs
parents:
diff changeset
   242
    
hgs
parents:
diff changeset
   243
    emit backPressed(returnValue);
hgs
parents:
diff changeset
   244
    
hgs
parents:
diff changeset
   245
    mViewManager->back( mArgs );
hgs
parents:
diff changeset
   246
}
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
/*!
hgs
parents:
diff changeset
   249
Activates the root view
hgs
parents:
diff changeset
   250
*/
hgs
parents:
diff changeset
   251
void CntContactCardViewPrivate::showRootView()
hgs
parents:
diff changeset
   252
{
hgs
parents:
diff changeset
   253
    // stop list population, if it is still in progress
hgs
parents:
diff changeset
   254
    mStopListPopulation = true;
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
    mViewManager->back( mArgs, true );
hgs
parents:
diff changeset
   257
}
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
/*!
hgs
parents:
diff changeset
   260
Handle extension action (tapping on activity stream button)
hgs
parents:
diff changeset
   261
*/
hgs
parents:
diff changeset
   262
void CntContactCardViewPrivate::handleExtensionAction()
hgs
parents:
diff changeset
   263
{
hgs
parents:
diff changeset
   264
    CNT_ENTRY
hgs
parents:
diff changeset
   265
    CntExtensionManager& mgr = mEngine->extensionManager();
hgs
parents:
diff changeset
   266
    for (int i = 0; i < mgr.pluginCount(); i++)
hgs
parents:
diff changeset
   267
    {
hgs
parents:
diff changeset
   268
        CntUiSocialExtension* socialExtension = mgr.pluginAt(i)->socialExtension();
hgs
parents:
diff changeset
   269
        if (socialExtension)
hgs
parents:
diff changeset
   270
        {
hgs
parents:
diff changeset
   271
            CntViewParameters params;
hgs
parents:
diff changeset
   272
            socialExtension->handleToolbarAction(params);
hgs
parents:
diff changeset
   273
            if (params.count())
hgs
parents:
diff changeset
   274
            {
hgs
parents:
diff changeset
   275
                QList<int> keys = params.keys();
hgs
parents:
diff changeset
   276
                for (int j = 0; j < keys.count(); j++)
hgs
parents:
diff changeset
   277
                {
hgs
parents:
diff changeset
   278
                    mArgs.insert(keys.at(j), params.value(keys.at(j)));
hgs
parents:
diff changeset
   279
                }
hgs
parents:
diff changeset
   280
                mViewManager->changeView(mArgs);
hgs
parents:
diff changeset
   281
                break;
hgs
parents:
diff changeset
   282
            }
hgs
parents:
diff changeset
   283
        }
hgs
parents:
diff changeset
   284
    }
hgs
parents:
diff changeset
   285
    
hgs
parents:
diff changeset
   286
    CNT_EXIT
hgs
parents:
diff changeset
   287
}
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
/*
hgs
parents:
diff changeset
   290
Activates a default view and setup name label texts
hgs
parents:
diff changeset
   291
*/
hgs
parents:
diff changeset
   292
void CntContactCardViewPrivate::activate(const CntViewParameters aArgs)
hgs
parents:
diff changeset
   293
{   
hgs
parents:
diff changeset
   294
    CNT_ENTRY
81
hgs
parents: 72
diff changeset
   295
72
hgs
parents:
diff changeset
   296
    mArgs = aArgs;
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
    mViewManager = &mEngine->viewManager();
hgs
parents:
diff changeset
   299
    mThumbnailManager = &mEngine->thumbnailManager();
hgs
parents:
diff changeset
   300
    connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)),
hgs
parents:
diff changeset
   301
            this, SLOT(thumbnailReady(QPixmap, void*, int, int)));
hgs
parents:
diff changeset
   302
       
hgs
parents:
diff changeset
   303
    HbMainWindow* window = mView->mainWindow();
hgs
parents:
diff changeset
   304
    if (window)
hgs
parents:
diff changeset
   305
    {
hgs
parents:
diff changeset
   306
        connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation)));
hgs
parents:
diff changeset
   307
        window->installEventFilter(this);
hgs
parents:
diff changeset
   308
        
hgs
parents:
diff changeset
   309
        setOrientation(window->orientation());
hgs
parents:
diff changeset
   310
    }
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
    qApp->installEventFilter(this);
hgs
parents:
diff changeset
   313
        
hgs
parents:
diff changeset
   314
    QContact contact = aArgs.value(ESelectedContact).value<QContact>();
hgs
parents:
diff changeset
   315
    mContact = new QContact( contact );
hgs
parents:
diff changeset
   316
    
hgs
parents:
diff changeset
   317
    //my card
hgs
parents:
diff changeset
   318
    mMyCardId = contactManager()->selfContactId();
hgs
parents:
diff changeset
   319
    
hgs
parents:
diff changeset
   320
    populateHeadingItem();
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
    populateListItems();
hgs
parents:
diff changeset
   323
    
hgs
parents:
diff changeset
   324
    bool myCard = mContact->localId() == mMyCardId;
hgs
parents:
diff changeset
   325
    if (myCard)
hgs
parents:
diff changeset
   326
    {
hgs
parents:
diff changeset
   327
        mView->menu()->clearActions();
hgs
parents:
diff changeset
   328
        mView->toolBar()->removeAction(static_cast<HbAction*>(document()->findObject(QString("cnt:history"))));
hgs
parents:
diff changeset
   329
    }
hgs
parents:
diff changeset
   330
    else
hgs
parents:
diff changeset
   331
    {
hgs
parents:
diff changeset
   332
        mView->toolBar()->removeAction(static_cast<HbAction*>(document()->findObject(QString("cnt:sendMyCard"))));
hgs
parents:
diff changeset
   333
    }
hgs
parents:
diff changeset
   334
    if (mIsTemporary)
hgs
parents:
diff changeset
   335
    {
hgs
parents:
diff changeset
   336
        mView->menu()->clearActions();
hgs
parents:
diff changeset
   337
        mView->toolBar()->clearActions();
hgs
parents:
diff changeset
   338
        mView->toolBar()->addAction(static_cast<HbAction*>(document()->findObject(QString("cnt:addtocontact"))));
hgs
parents:
diff changeset
   339
    }
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
    document()->findWidget("viewToolbar")->setParent(mView);
hgs
parents:
diff changeset
   342
    document()->findWidget("viewMenu")->setParent(mView);
hgs
parents:
diff changeset
   343
    
hgs
parents:
diff changeset
   344
    // Menu items
hgs
parents:
diff changeset
   345
    connectAction("cnt:sendbusinesscard", SLOT(sendBusinessCard()));
hgs
parents:
diff changeset
   346
    connectAction("cnt:deletecontact", SLOT(deleteContact()));
hgs
parents:
diff changeset
   347
    connectAction("cnt:setasfavorite", SLOT(setAsFavorite()));
hgs
parents:
diff changeset
   348
    connectAction("cnt:removefromfavorite", SLOT(removeFromFavorite()));
hgs
parents:
diff changeset
   349
    connectAction("cnt:placecontacttohs", SLOT(sendToHs()));
hgs
parents:
diff changeset
   350
    connectAction("cnt:edit", SLOT(editContact()));
hgs
parents:
diff changeset
   351
    connectAction("cnt:history", SLOT(viewHistory()));
hgs
parents:
diff changeset
   352
    connectAction("cnt:sendMyCard", SLOT(sendBusinessCard()));
hgs
parents:
diff changeset
   353
    connectAction("cnt:addtocontact", SLOT(onAddedToContacts()));
hgs
parents:
diff changeset
   354
    connectAction("cnt:activityStream", SLOT(handleExtensionAction()));
hgs
parents:
diff changeset
   355
    
hgs
parents:
diff changeset
   356
    CntExtensionManager& mgr = mEngine->extensionManager();
hgs
parents:
diff changeset
   357
    if (mgr.pluginCount())
hgs
parents:
diff changeset
   358
    {
hgs
parents:
diff changeset
   359
        for (int i = 0; i < mgr.pluginCount(); i++)
hgs
parents:
diff changeset
   360
        {
hgs
parents:
diff changeset
   361
            CntUiSocialExtension* socialExtension = mgr.pluginAt(i)->socialExtension();
hgs
parents:
diff changeset
   362
            if (socialExtension)
hgs
parents:
diff changeset
   363
            {
hgs
parents:
diff changeset
   364
                static_cast<HbAction*> (document()->findObject("cnt:activityStream"))->setEnabled(true);
hgs
parents:
diff changeset
   365
                break;
hgs
parents:
diff changeset
   366
            }
hgs
parents:
diff changeset
   367
            else
hgs
parents:
diff changeset
   368
            {
hgs
parents:
diff changeset
   369
                static_cast<HbAction*> (document()->findObject("cnt:activityStream"))->setEnabled(false);
hgs
parents:
diff changeset
   370
            }
hgs
parents:
diff changeset
   371
        }
hgs
parents:
diff changeset
   372
    }
hgs
parents:
diff changeset
   373
    else
hgs
parents:
diff changeset
   374
    {
hgs
parents:
diff changeset
   375
        static_cast<HbAction*> (document()->findObject("cnt:activityStream"))->setEnabled(false);
hgs
parents:
diff changeset
   376
    }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
        
hgs
parents:
diff changeset
   379
    connect(contactManager(), SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), 
hgs
parents:
diff changeset
   380
        this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
hgs
parents:
diff changeset
   381
    
hgs
parents:
diff changeset
   382
    emit viewActivated( mViewManager, aArgs );
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
    CNT_EXIT
hgs
parents:
diff changeset
   385
}
hgs
parents:
diff changeset
   386
81
hgs
parents: 72
diff changeset
   387
QString CntContactCardViewPrivate::externalize(QDataStream &stream)
hgs
parents: 72
diff changeset
   388
{   
hgs
parents: 72
diff changeset
   389
    // set activity parameters 
hgs
parents: 72
diff changeset
   390
    CntViewParameters viewParameters;
hgs
parents: 72
diff changeset
   391
    viewParameters.insert(EViewId, mArgs.value(EViewId).toInt());
hgs
parents: 72
diff changeset
   392
 
hgs
parents: 72
diff changeset
   393
    if (mArgs.value(ESelectedContact).isValid())
hgs
parents: 72
diff changeset
   394
    {
hgs
parents: 72
diff changeset
   395
        QContact contact = mArgs.value(ESelectedContact).value<QContact>();
hgs
parents: 72
diff changeset
   396
        viewParameters.insert(ESelectedContactId, contact.localId()); 
hgs
parents: 72
diff changeset
   397
    }
hgs
parents: 72
diff changeset
   398
    if (mArgs.value(ESelectedGroupContact).isValid())
hgs
parents: 72
diff changeset
   399
    {
hgs
parents: 72
diff changeset
   400
        QContact contact = mArgs.value(ESelectedGroupContact).value<QContact>();
hgs
parents: 72
diff changeset
   401
        viewParameters.insert(ESelectedGroupContactId, QVariant(contact.localId()));
hgs
parents: 72
diff changeset
   402
    }
hgs
parents: 72
diff changeset
   403
    if (mArgs.value(EMyCard).isValid())
hgs
parents: 72
diff changeset
   404
    {
hgs
parents: 72
diff changeset
   405
        viewParameters.insert(EMyCard, mArgs.value(EMyCard));
hgs
parents: 72
diff changeset
   406
    }
hgs
parents: 72
diff changeset
   407
    if (mArgs.value(EExtraAction).isValid())
hgs
parents: 72
diff changeset
   408
    {
hgs
parents: 72
diff changeset
   409
        viewParameters.insert(EExtraAction, mArgs.value(EExtraAction));
hgs
parents: 72
diff changeset
   410
    }
hgs
parents: 72
diff changeset
   411
    
hgs
parents: 72
diff changeset
   412
    stream << viewParameters;
hgs
parents: 72
diff changeset
   413
    
hgs
parents: 72
diff changeset
   414
    return CNT_ACTIVITY_CONTACTCARD;
hgs
parents: 72
diff changeset
   415
}
hgs
parents: 72
diff changeset
   416
hgs
parents: 72
diff changeset
   417
bool CntContactCardViewPrivate::internalize(QDataStream &stream, CntViewParameters &viewParameters)
hgs
parents: 72
diff changeset
   418
{
hgs
parents: 72
diff changeset
   419
    CntViewParameters tempViewParameters;
hgs
parents: 72
diff changeset
   420
    stream >> tempViewParameters;
hgs
parents: 72
diff changeset
   421
        
hgs
parents: 72
diff changeset
   422
    viewParameters.insert(EViewId, tempViewParameters.value(EViewId));
hgs
parents: 72
diff changeset
   423
    
hgs
parents: 72
diff changeset
   424
    if (tempViewParameters.value(ESelectedContactId).isValid())
hgs
parents: 72
diff changeset
   425
    {
hgs
parents: 72
diff changeset
   426
        QContact contact = contactManager()->contact(tempViewParameters.value(ESelectedContactId).toInt());
hgs
parents: 72
diff changeset
   427
        if (contact.isEmpty())
hgs
parents: 72
diff changeset
   428
        {
hgs
parents: 72
diff changeset
   429
            // a contact has been deleted.
hgs
parents: 72
diff changeset
   430
            return false;
hgs
parents: 72
diff changeset
   431
        }
hgs
parents: 72
diff changeset
   432
        else
hgs
parents: 72
diff changeset
   433
        {
hgs
parents: 72
diff changeset
   434
            QVariant var;
hgs
parents: 72
diff changeset
   435
            var.setValue(contact);      
hgs
parents: 72
diff changeset
   436
            viewParameters.insert(ESelectedContact, var);
hgs
parents: 72
diff changeset
   437
        }
hgs
parents: 72
diff changeset
   438
    }
hgs
parents: 72
diff changeset
   439
    if (tempViewParameters.value(ESelectedGroupContactId).isValid())
hgs
parents: 72
diff changeset
   440
    {
hgs
parents: 72
diff changeset
   441
        QVariant var;
hgs
parents: 72
diff changeset
   442
        var.setValue(contactManager()->contact(tempViewParameters.value(ESelectedGroupContactId).toInt()));      
hgs
parents: 72
diff changeset
   443
        viewParameters.insert(ESelectedGroupContact, var);
hgs
parents: 72
diff changeset
   444
    }
hgs
parents: 72
diff changeset
   445
    if (tempViewParameters.value(EMyCard).isValid())
hgs
parents: 72
diff changeset
   446
    {
hgs
parents: 72
diff changeset
   447
        viewParameters.insert(EMyCard, tempViewParameters.value(EMyCard));
hgs
parents: 72
diff changeset
   448
    }
hgs
parents: 72
diff changeset
   449
    if (tempViewParameters.value(EMyCard).isValid())
hgs
parents: 72
diff changeset
   450
    {
hgs
parents: 72
diff changeset
   451
        viewParameters.insert(EExtraAction, tempViewParameters.value(EExtraAction));
hgs
parents: 72
diff changeset
   452
    }
hgs
parents: 72
diff changeset
   453
     
hgs
parents: 72
diff changeset
   454
    return true;
hgs
parents: 72
diff changeset
   455
}
hgs
parents: 72
diff changeset
   456
72
hgs
parents:
diff changeset
   457
void CntContactCardViewPrivate::populateHeadingItem()
hgs
parents:
diff changeset
   458
{
hgs
parents:
diff changeset
   459
    CNT_ENTRY
hgs
parents:
diff changeset
   460
hgs
parents:
diff changeset
   461
    Q_ASSERT(mHeadingItem != NULL && mContact != NULL);
hgs
parents:
diff changeset
   462
    
hgs
parents:
diff changeset
   463
    mHeadingItem->setDetails(mContact);
hgs
parents:
diff changeset
   464
    
hgs
parents:
diff changeset
   465
    bool myCard = mContact->localId() == mMyCardId;
hgs
parents:
diff changeset
   466
    
hgs
parents:
diff changeset
   467
    if (!mIsTemporary)
hgs
parents:
diff changeset
   468
    {
hgs
parents:
diff changeset
   469
        connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&)), Qt::UniqueConnection);
hgs
parents:
diff changeset
   470
        connect(mHeadingItem, SIGNAL(passShortPressed(const QPointF&)), this, SLOT(doChangeImage()), Qt::UniqueConnection); 
hgs
parents:
diff changeset
   471
        connect(mImageLabel, SIGNAL(iconClicked()), this, SLOT(doChangeImage()), Qt::UniqueConnection);
hgs
parents:
diff changeset
   472
        connect(mImageLabel, SIGNAL(iconLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&)), Qt::UniqueConnection);
hgs
parents:
diff changeset
   473
    }
hgs
parents:
diff changeset
   474
    else
hgs
parents:
diff changeset
   475
    {
hgs
parents:
diff changeset
   476
        mHeadingItem->ungrabGesture(Qt::TapGesture);
hgs
parents:
diff changeset
   477
        mImageLabel->ungrabGesture(Qt::TapGesture);
hgs
parents:
diff changeset
   478
    }
81
hgs
parents: 72
diff changeset
   479
72
hgs
parents:
diff changeset
   480
    bool online;
hgs
parents:
diff changeset
   481
    mInitiialPrecenceData = mPresenceListener->initialPresences(*mContact, online);
hgs
parents:
diff changeset
   482
    mHeadingItem->setOnlineStatus(online);
hgs
parents:
diff changeset
   483
81
hgs
parents: 72
diff changeset
   484
    if (!myCard)
hgs
parents: 72
diff changeset
   485
    {
72
hgs
parents:
diff changeset
   486
        bool setAsFavorite = CntFavourite::isMemberOfFavouriteGroup(contactManager(), mContact);
hgs
parents:
diff changeset
   487
        mHeadingItem->setFavoriteStatus(setAsFavorite); // if contact is part of favourites group
hgs
parents:
diff changeset
   488
        static_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible( !setAsFavorite );
hgs
parents:
diff changeset
   489
        static_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible( setAsFavorite );
hgs
parents:
diff changeset
   490
    }
hgs
parents:
diff changeset
   491
    
hgs
parents:
diff changeset
   492
    // avatar
hgs
parents:
diff changeset
   493
    QList<QContactAvatar> details = mContact->details<QContactAvatar>();
hgs
parents:
diff changeset
   494
    for (int i = 0;i < details.count();i++)
hgs
parents:
diff changeset
   495
    {
hgs
parents:
diff changeset
   496
        if (details.at(i).imageUrl().isValid())
hgs
parents:
diff changeset
   497
        {
81
hgs
parents: 72
diff changeset
   498
            if (!mAvatar || *mAvatar != details.at(i))
72
hgs
parents:
diff changeset
   499
            {
hgs
parents:
diff changeset
   500
                delete mAvatar;
hgs
parents:
diff changeset
   501
                mAvatar = new QContactAvatar(details.at(i));
81
hgs
parents: 72
diff changeset
   502
                mFetchAvatar = true;
72
hgs
parents:
diff changeset
   503
            }
hgs
parents:
diff changeset
   504
            break;
hgs
parents:
diff changeset
   505
        }
hgs
parents:
diff changeset
   506
    }
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
    CNT_EXIT
hgs
parents:
diff changeset
   509
}
hgs
parents:
diff changeset
   510
hgs
parents:
diff changeset
   511
void CntContactCardViewPrivate::populateListItems()
hgs
parents:
diff changeset
   512
{
hgs
parents:
diff changeset
   513
    CNT_ENTRY
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
    Q_ASSERT(mContact != NULL && mScrollArea != NULL);
hgs
parents:
diff changeset
   516
81
hgs
parents: 72
diff changeset
   517
    if (mListPopulationProgress == CntListPopulationNotInProgress)
hgs
parents: 72
diff changeset
   518
    {
72
hgs
parents:
diff changeset
   519
        mListPopulationProgress = 0;
hgs
parents:
diff changeset
   520
81
hgs
parents: 72
diff changeset
   521
        if (!mDataContainer)
hgs
parents: 72
diff changeset
   522
        {
72
hgs
parents:
diff changeset
   523
            mDataContainer = new CntContactCardDataContainer(
hgs
parents:
diff changeset
   524
                mMaptile,
hgs
parents:
diff changeset
   525
                mEngine->extensionManager(),
hgs
parents:
diff changeset
   526
                mView->mainWindow()->orientation());
hgs
parents:
diff changeset
   527
        }
hgs
parents:
diff changeset
   528
hgs
parents:
diff changeset
   529
        // fill the data container with contact details
hgs
parents:
diff changeset
   530
        mDataContainer->setContactData(mContact);
hgs
parents:
diff changeset
   531
        
81
hgs
parents: 72
diff changeset
   532
        if (mContainerLayout)
hgs
parents: 72
diff changeset
   533
        {
hgs
parents: 72
diff changeset
   534
            // Remove the separator obj from previous layout
hgs
parents: 72
diff changeset
   535
            // It needs to be reused
hgs
parents: 72
diff changeset
   536
            mContainerLayout->removeItem(mSeparatorlabel);
72
hgs
parents:
diff changeset
   537
        }
81
hgs
parents: 72
diff changeset
   538
        // initialize
hgs
parents: 72
diff changeset
   539
        mScrollArea->setScrollDirections(Qt::Vertical);
hgs
parents: 72
diff changeset
   540
        
hgs
parents: 72
diff changeset
   541
        mContainerWidget = new QGraphicsWidget();
hgs
parents: 72
diff changeset
   542
        mScrollArea->setContentWidget(mContainerWidget); // takes ownership.
hgs
parents: 72
diff changeset
   543
        
hgs
parents: 72
diff changeset
   544
        mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical);
hgs
parents: 72
diff changeset
   545
        mContainerLayout->setContentsMargins(0, 0, 0, 0);
hgs
parents: 72
diff changeset
   546
        mContainerLayout->setSpacing(0);
hgs
parents: 72
diff changeset
   547
        mContainerLayout->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
hgs
parents: 72
diff changeset
   548
        
hgs
parents: 72
diff changeset
   549
        mContainerWidget->setLayout(mContainerLayout);   // takes ownership.
72
hgs
parents:
diff changeset
   550
    }
hgs
parents:
diff changeset
   551
hgs
parents:
diff changeset
   552
hgs
parents:
diff changeset
   553
    do {
81
hgs
parents: 72
diff changeset
   554
        if (mListPopulationProgress == mDataContainer->itemCount() || mStopListPopulation)
hgs
parents: 72
diff changeset
   555
        {
hgs
parents: 72
diff changeset
   556
            if (!mStopListPopulation && mFetchAvatar)
hgs
parents: 72
diff changeset
   557
            {
hgs
parents: 72
diff changeset
   558
                // fetch the avatar if it has not yet been fetched
hgs
parents: 72
diff changeset
   559
                mFetchAvatar = false;
hgs
parents: 72
diff changeset
   560
                mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
hgs
parents: 72
diff changeset
   561
            }
72
hgs
parents:
diff changeset
   562
            // population of the list has completed
hgs
parents:
diff changeset
   563
            mListPopulationProgress = CntListPopulationNotInProgress;
hgs
parents:
diff changeset
   564
            mStopListPopulation = false;
hgs
parents:
diff changeset
   565
            disconnect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(populateListItems()));
81
hgs
parents: 72
diff changeset
   566
            CNT_EXIT_ARGS("population completed")
72
hgs
parents:
diff changeset
   567
            return;
hgs
parents:
diff changeset
   568
        }
hgs
parents:
diff changeset
   569
hgs
parents:
diff changeset
   570
        CntContactCardDataItem* dataItem = mDataContainer->dataItem(mListPopulationProgress);
hgs
parents:
diff changeset
   571
        int pos = dataItem->position();
hgs
parents:
diff changeset
   572
hgs
parents:
diff changeset
   573
        // communication methods
hgs
parents:
diff changeset
   574
        if (pos < CntContactCardDataItem::ESeparator && dataItem->isFocusable())
hgs
parents:
diff changeset
   575
        { 
hgs
parents:
diff changeset
   576
            CntContactCardDetailItem* item = new CntContactCardDetailItem(mListPopulationProgress, mContainerWidget);
hgs
parents:
diff changeset
   577
hgs
parents:
diff changeset
   578
            connect(item, SIGNAL(clicked()), this, SLOT(onItemActivated()));
hgs
parents:
diff changeset
   579
            
hgs
parents:
diff changeset
   580
            if (!mIsTemporary)
hgs
parents:
diff changeset
   581
            {
hgs
parents:
diff changeset
   582
                connect(item, SIGNAL(longPressed(const QPointF&)), this, SLOT(onLongPressed(const QPointF&)));
hgs
parents:
diff changeset
   583
            }
hgs
parents:
diff changeset
   584
            
hgs
parents:
diff changeset
   585
            if (mContact->isPreferredDetail(dataItem->action(), dataItem->detail()))
hgs
parents:
diff changeset
   586
            {
hgs
parents:
diff changeset
   587
                dataItem->setSecondaryIcon(HbIcon("qtg_mono_favourites"));
hgs
parents:
diff changeset
   588
                mPreferredItems.insert(dataItem->action(), item);
hgs
parents:
diff changeset
   589
            }
hgs
parents:
diff changeset
   590
            
hgs
parents:
diff changeset
   591
            if (dataItem->detail().definitionName() == QContactOnlineAccount::DefinitionName)
hgs
parents:
diff changeset
   592
            {
hgs
parents:
diff changeset
   593
                for (int i = 0;i < mInitiialPrecenceData.keys().count();i++)
hgs
parents:
diff changeset
   594
                {
hgs
parents:
diff changeset
   595
                    QString fullAccount = mInitiialPrecenceData.keys().at(i);
hgs
parents:
diff changeset
   596
                    QContactOnlineAccount account = dataItem->detail();
hgs
parents:
diff changeset
   597
                    QString currentFullAccount = account.serviceProvider() + ':' + account.accountUri();
hgs
parents:
diff changeset
   598
                    if (fullAccount == currentFullAccount)
hgs
parents:
diff changeset
   599
                    {
hgs
parents:
diff changeset
   600
                        if (mInitiialPrecenceData.values().at(i))
hgs
parents:
diff changeset
   601
                        {
hgs
parents:
diff changeset
   602
                            dataItem->setSecondaryIcon(HbIcon("qtg_small_online"));
hgs
parents:
diff changeset
   603
                        }
hgs
parents:
diff changeset
   604
                        mPresenceItems.insert(fullAccount, item);
hgs
parents:
diff changeset
   605
                        break;
hgs
parents:
diff changeset
   606
                    }
hgs
parents:
diff changeset
   607
                }
hgs
parents:
diff changeset
   608
            }
hgs
parents:
diff changeset
   609
         
hgs
parents:
diff changeset
   610
            item->setDetails(dataItem);
hgs
parents:
diff changeset
   611
            mContainerLayout->addItem(item);
hgs
parents:
diff changeset
   612
        }
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
        // separator
hgs
parents:
diff changeset
   615
        else if (pos == CntContactCardDataItem::ESeparator)
81
hgs
parents: 72
diff changeset
   616
        {
hgs
parents: 72
diff changeset
   617
            if (!mSeparatorlabel)
hgs
parents: 72
diff changeset
   618
            {
hgs
parents: 72
diff changeset
   619
                HbFrameItem* frameItem = new HbFrameItem(QString("qtg_fr_list_separator"), HbFrameDrawer::NinePieces);
hgs
parents: 72
diff changeset
   620
                mSeparatorlabel = static_cast<HbLabel*>(document()->findWidget(QString("separator")));
hgs
parents: 72
diff changeset
   621
                mSeparatorlabel->setPlainText(dataItem->titleText());
hgs
parents: 72
diff changeset
   622
                mSeparatorlabel->setBackgroundItem(frameItem); // takes ownership
hgs
parents: 72
diff changeset
   623
                mSeparatorlabel->setParent(this);
hgs
parents: 72
diff changeset
   624
            }
hgs
parents: 72
diff changeset
   625
            mContainerLayout->addItem(mSeparatorlabel);
72
hgs
parents:
diff changeset
   626
        }
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
        // details
hgs
parents:
diff changeset
   629
        else
hgs
parents:
diff changeset
   630
        {
hgs
parents:
diff changeset
   631
            //map support (image only)
hgs
parents:
diff changeset
   632
            if (pos >= CntContactCardDataItem::EAddress && pos <= CntContactCardDataItem::EAddressWork && !dataItem->icon().isNull())
hgs
parents:
diff changeset
   633
            {        
hgs
parents:
diff changeset
   634
                int addressType = MapTileService::AddressPreference;
hgs
parents:
diff changeset
   635
                
hgs
parents:
diff changeset
   636
                if( pos == CntContactCardDataItem::EAddressHome  )
hgs
parents:
diff changeset
   637
                {
hgs
parents:
diff changeset
   638
                    addressType  = MapTileService::AddressHome;
hgs
parents:
diff changeset
   639
                }
hgs
parents:
diff changeset
   640
                else if( pos == CntContactCardDataItem::EAddressWork )
hgs
parents:
diff changeset
   641
                {
hgs
parents:
diff changeset
   642
                    addressType  = MapTileService::AddressWork;
hgs
parents:
diff changeset
   643
                }
hgs
parents:
diff changeset
   644
                  
hgs
parents:
diff changeset
   645
                HbLabel* maptileLabel = loadMaptileLabel( addressType );
hgs
parents:
diff changeset
   646
                setMaptileLabel( maptileLabel, dataItem->icon() );
hgs
parents:
diff changeset
   647
                mContainerLayout->addItem(  maptileLabel );
hgs
parents:
diff changeset
   648
                mMaptileLabelList.insert( addressType, maptileLabel );
hgs
parents:
diff changeset
   649
            } 
hgs
parents:
diff changeset
   650
            //other details
hgs
parents:
diff changeset
   651
            else
hgs
parents:
diff changeset
   652
            {
hgs
parents:
diff changeset
   653
                CntContactCardDetailItem* item = new CntContactCardDetailItem(mListPopulationProgress, mContainerWidget, false);
hgs
parents:
diff changeset
   654
                
hgs
parents:
diff changeset
   655
                //To check whether maptile status  icon is set with the address 
hgs
parents:
diff changeset
   656
                if( ( dataItem->titleText() == hbTrId("txt_phob_formlabel_address") ||
hgs
parents:
diff changeset
   657
                      dataItem->titleText() == hbTrId("txt_phob_formlabel_address_home")||  
hgs
parents:
diff changeset
   658
                      dataItem->titleText() == hbTrId("txt_phob_formlabel_address_work") ) &&
hgs
parents:
diff changeset
   659
                      dataItem->secondaryIcon().iconName() == QString(CNT_MAPTILE_INPROGRESS_ICON) )
hgs
parents:
diff changeset
   660
                    
hgs
parents:
diff changeset
   661
                {
hgs
parents:
diff changeset
   662
                    //Information for displaying maptile fetching progress bar.
hgs
parents:
diff changeset
   663
                    //Memory will be deleted from the queue.
hgs
parents:
diff changeset
   664
                    CntContactCardMapTileDetail* detail = new CntContactCardMapTileDetail;
hgs
parents:
diff changeset
   665
                    detail->mContactId = mContact->localId();
hgs
parents:
diff changeset
   666
                        
hgs
parents:
diff changeset
   667
                    if( dataItem->titleText() == hbTrId("txt_phob_formlabel_address") )
hgs
parents:
diff changeset
   668
                    {
hgs
parents:
diff changeset
   669
                               detail->mAddressType = MapTileService::AddressPreference;
hgs
parents:
diff changeset
   670
                    }
hgs
parents:
diff changeset
   671
                    else if ( dataItem->titleText() ==  hbTrId("txt_phob_formlabel_address_home") )
hgs
parents:
diff changeset
   672
                    {
hgs
parents:
diff changeset
   673
                               detail->mAddressType = MapTileService::AddressHome;
hgs
parents:
diff changeset
   674
                    }
hgs
parents:
diff changeset
   675
                    else if( dataItem->titleText() ==  hbTrId("txt_phob_formlabel_address_work") )
hgs
parents:
diff changeset
   676
                        {
hgs
parents:
diff changeset
   677
                               detail->mAddressType = MapTileService::AddressWork;
hgs
parents:
diff changeset
   678
                    }
hgs
parents:
diff changeset
   679
                    
hgs
parents:
diff changeset
   680
                    detail->mProgressCount = 0;
hgs
parents:
diff changeset
   681
                    detail->mDetailItem =  item;
hgs
parents:
diff changeset
   682
                    detail->maptileStatus = CNT_UNKNOWN_MAPTILE_STATUS;
hgs
parents:
diff changeset
   683
                    mAddressList.append( detail );  
hgs
parents:
diff changeset
   684
                    
hgs
parents:
diff changeset
   685
                    //Update the spinning indicator
hgs
parents:
diff changeset
   686
                    updateSpinningIndicator();
hgs
parents:
diff changeset
   687
                    
hgs
parents:
diff changeset
   688
                }
hgs
parents:
diff changeset
   689
                item->setDetails(dataItem);
hgs
parents:
diff changeset
   690
                mContainerLayout->addItem(item);
hgs
parents:
diff changeset
   691
            }
hgs
parents:
diff changeset
   692
        }
hgs
parents:
diff changeset
   693
    
hgs
parents:
diff changeset
   694
        ++mListPopulationProgress;
hgs
parents:
diff changeset
   695
    } while (mListPopulationProgress < CntInitialPopulation);
hgs
parents:
diff changeset
   696
81
hgs
parents: 72
diff changeset
   697
    if (mListPopulationProgress <= CntInitialPopulation)
hgs
parents: 72
diff changeset
   698
    {
72
hgs
parents:
diff changeset
   699
        connect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(populateListItems()));
81
hgs
parents: 72
diff changeset
   700
    }
hgs
parents: 72
diff changeset
   701
    else
hgs
parents: 72
diff changeset
   702
    {
72
hgs
parents:
diff changeset
   703
        disconnect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(populateListItems()));
hgs
parents:
diff changeset
   704
        HbApplication::instance()->postEvent(this, new QEvent(ProcessPopulateListEvent));
81
hgs
parents: 72
diff changeset
   705
hgs
parents: 72
diff changeset
   706
        if (mFetchAvatar)
hgs
parents: 72
diff changeset
   707
        {
hgs
parents: 72
diff changeset
   708
            // initial view has been shown, so starting fetching the avatar
hgs
parents: 72
diff changeset
   709
            mFetchAvatar = false;
hgs
parents: 72
diff changeset
   710
            mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
hgs
parents: 72
diff changeset
   711
        }
72
hgs
parents:
diff changeset
   712
    }
hgs
parents:
diff changeset
   713
hgs
parents:
diff changeset
   714
    CNT_EXIT
hgs
parents:
diff changeset
   715
}
hgs
parents:
diff changeset
   716
hgs
parents:
diff changeset
   717
/*
hgs
parents:
diff changeset
   718
    Connects the action with a slot and also sets the view as the parent for the action.
hgs
parents:
diff changeset
   719
 */
hgs
parents:
diff changeset
   720
void CntContactCardViewPrivate::connectAction(QString actionName, const char* slot)
hgs
parents:
diff changeset
   721
{
hgs
parents:
diff changeset
   722
    HbAction *action = qobject_cast<HbAction *>(document()->findObject(actionName));
81
hgs
parents: 72
diff changeset
   723
    if (action)
hgs
parents: 72
diff changeset
   724
    {
72
hgs
parents:
diff changeset
   725
        action->setParent(mView);
81
hgs
parents: 72
diff changeset
   726
        if (slot != NULL)
hgs
parents: 72
diff changeset
   727
        {
72
hgs
parents:
diff changeset
   728
            connect(action, SIGNAL(triggered()), this, slot);
hgs
parents:
diff changeset
   729
        }
hgs
parents:
diff changeset
   730
    }
hgs
parents:
diff changeset
   731
}
hgs
parents:
diff changeset
   732
hgs
parents:
diff changeset
   733
/*
hgs
parents:
diff changeset
   734
    Updates the maptile fetching spinning indicator icon
hgs
parents:
diff changeset
   735
 */
hgs
parents:
diff changeset
   736
void CntContactCardViewPrivate::updateSpinningIndicator()
hgs
parents:
diff changeset
   737
{
81
hgs
parents: 72
diff changeset
   738
    CNT_ENTRY
hgs
parents: 72
diff changeset
   739
    
hgs
parents: 72
diff changeset
   740
    // Check all address details( Preferred, Home, Work )
hgs
parents: 72
diff changeset
   741
    for (int index = 0 ; index < mAddressList.count();)
72
hgs
parents:
diff changeset
   742
    {
81
hgs
parents: 72
diff changeset
   743
        // Maptile status not received update the rotating icon
hgs
parents: 72
diff changeset
   744
        if (mAddressList[index]->maptileStatus == CNT_UNKNOWN_MAPTILE_STATUS)
72
hgs
parents:
diff changeset
   745
        {
81
hgs
parents: 72
diff changeset
   746
            QString iconName("qtg_anim_small_loading_");
hgs
parents: 72
diff changeset
   747
            mAddressList[index]->mProgressCount = mAddressList[index]->mProgressCount % 10 + 1;
hgs
parents: 72
diff changeset
   748
            iconName.append(QVariant(mAddressList[index]->mProgressCount).toString());
72
hgs
parents:
diff changeset
   749
             
81
hgs
parents: 72
diff changeset
   750
            HbIcon icon(iconName);
hgs
parents: 72
diff changeset
   751
            mAddressList[index]->mDetailItem->setSecondaryIconItem(icon);
hgs
parents: 72
diff changeset
   752
            mAddressList[index]->mDetailItem->update();   
hgs
parents: 72
diff changeset
   753
            mProgressTimer->start(CNT_MAPTILE_PROGRESS_TIMER);
hgs
parents: 72
diff changeset
   754
            index++;
72
hgs
parents:
diff changeset
   755
        }
hgs
parents:
diff changeset
   756
        else
hgs
parents:
diff changeset
   757
        {
81
hgs
parents: 72
diff changeset
   758
            // Maptile status received. Show the maptile image if available
72
hgs
parents:
diff changeset
   759
            MapTileService::AddressType sourceAddressType =
81
hgs
parents: 72
diff changeset
   760
                    static_cast <MapTileService::AddressType>(mAddressList[index]->mAddressType);
72
hgs
parents:
diff changeset
   761
             
hgs
parents:
diff changeset
   762
            QContactLocalId contactId = mContact->localId();
hgs
parents:
diff changeset
   763
             
81
hgs
parents: 72
diff changeset
   764
            if (mAddressList[index] != NULL)
72
hgs
parents:
diff changeset
   765
            {
81
hgs
parents: 72
diff changeset
   766
                if (mAddressList[index]->maptileStatus == MapTileService::MapTileFetchingCompleted)
hgs
parents: 72
diff changeset
   767
                {
hgs
parents: 72
diff changeset
   768
                    // Read the maptile path and update the image
hgs
parents: 72
diff changeset
   769
                    QString imagePath;
hgs
parents: 72
diff changeset
   770
                    mMaptile->getMapTileImage( 
hgs
parents: 72
diff changeset
   771
                               contactId, sourceAddressType, imagePath, mView->mainWindow()->orientation());
72
hgs
parents:
diff changeset
   772
					 
81
hgs
parents: 72
diff changeset
   773
                    if (!imagePath.isEmpty())
hgs
parents: 72
diff changeset
   774
                    {
hgs
parents: 72
diff changeset
   775
                        //Empty icon. Clear the inprogress  icon
hgs
parents: 72
diff changeset
   776
                        HbIcon emptyIcon;
hgs
parents: 72
diff changeset
   777
                        mAddressList[index]->mDetailItem->setSecondaryIconItem(emptyIcon);
72
hgs
parents:
diff changeset
   778
                         
81
hgs
parents: 72
diff changeset
   779
                        HbIcon icon(imagePath);
72
hgs
parents:
diff changeset
   780
                         
81
hgs
parents: 72
diff changeset
   781
                        HbLabel* maptileLabel = loadMaptileLabel(sourceAddressType);
hgs
parents: 72
diff changeset
   782
                        setMaptileLabel(maptileLabel, icon);
hgs
parents: 72
diff changeset
   783
                        mMaptileLabelList.insert(sourceAddressType, maptileLabel);
hgs
parents: 72
diff changeset
   784
hgs
parents: 72
diff changeset
   785
                        //find the index of the item and insert maptile in the next index 
hgs
parents: 72
diff changeset
   786
                        for (int itemIndex = 0 ; itemIndex < mContainerLayout->count(); itemIndex++)
hgs
parents: 72
diff changeset
   787
                        {
hgs
parents: 72
diff changeset
   788
                            if (mContainerLayout->itemAt(itemIndex) == mAddressList[index]->mDetailItem)
hgs
parents: 72
diff changeset
   789
                            {
hgs
parents: 72
diff changeset
   790
                                mContainerLayout->insertItem(itemIndex + 1, maptileLabel);
hgs
parents: 72
diff changeset
   791
                                break;
hgs
parents: 72
diff changeset
   792
                            }
hgs
parents: 72
diff changeset
   793
                        }
hgs
parents: 72
diff changeset
   794
                    }
hgs
parents: 72
diff changeset
   795
                    else
hgs
parents: 72
diff changeset
   796
                    {
hgs
parents: 72
diff changeset
   797
                        //Maptile image not available. Show the search stop icon
hgs
parents: 72
diff changeset
   798
                        setMaptileSearchStopIcon(index);
hgs
parents: 72
diff changeset
   799
                    }
hgs
parents: 72
diff changeset
   800
                }
hgs
parents: 72
diff changeset
   801
                else
hgs
parents: 72
diff changeset
   802
                {
hgs
parents: 72
diff changeset
   803
                    //Maptile fetching failed. Show the search stop icon
hgs
parents: 72
diff changeset
   804
                    setMaptileSearchStopIcon(index);
hgs
parents: 72
diff changeset
   805
                }
72
hgs
parents:
diff changeset
   806
                 
81
hgs
parents: 72
diff changeset
   807
                delete mAddressList[index];
hgs
parents: 72
diff changeset
   808
                mAddressList.removeAt(index);
72
hgs
parents:
diff changeset
   809
            }
hgs
parents:
diff changeset
   810
            else
hgs
parents:
diff changeset
   811
            {
81
hgs
parents: 72
diff changeset
   812
                //increment the index now
hgs
parents: 72
diff changeset
   813
                index++;
72
hgs
parents:
diff changeset
   814
            }
hgs
parents:
diff changeset
   815
        }
hgs
parents:
diff changeset
   816
    }
hgs
parents:
diff changeset
   817
}
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
/*
hgs
parents:
diff changeset
   820
* Sets the search stop icon to secondary icon item
hgs
parents:
diff changeset
   821
*/
81
hgs
parents: 72
diff changeset
   822
void CntContactCardViewPrivate::setMaptileSearchStopIcon(int index)
72
hgs
parents:
diff changeset
   823
{
81
hgs
parents: 72
diff changeset
   824
    if (index < mAddressList.count())
72
hgs
parents:
diff changeset
   825
    {
hgs
parents:
diff changeset
   826
        QString iconName(CNT_MAPTILE_SEARCH_STOP_ICON);
hgs
parents:
diff changeset
   827
        HbIcon icon(iconName);
81
hgs
parents: 72
diff changeset
   828
        mAddressList[index]->mDetailItem->setSecondaryIconItem(icon);
72
hgs
parents:
diff changeset
   829
        mAddressList[index]->mDetailItem->update();  
hgs
parents:
diff changeset
   830
    }
hgs
parents:
diff changeset
   831
}
hgs
parents:
diff changeset
   832
81
hgs
parents: 72
diff changeset
   833
/*!
hgs
parents: 72
diff changeset
   834
    Slot to receive the maptile status information.
hgs
parents: 72
diff changeset
   835
 */
hgs
parents: 72
diff changeset
   836
void CntContactCardViewPrivate::mapTileStatusReceived(int contactid, int addressType, int status)
72
hgs
parents:
diff changeset
   837
{
81
hgs
parents: 72
diff changeset
   838
    // Update the maptile status information for all 3( Preferred, Work, Home ) address
hgs
parents: 72
diff changeset
   839
    for (int index = 0; index < mAddressList.count(); index++)
72
hgs
parents:
diff changeset
   840
    {
81
hgs
parents: 72
diff changeset
   841
        if (mAddressList[index]->mContactId == contactid &&  
hgs
parents: 72
diff changeset
   842
                mAddressList[index]->mAddressType == addressType)
72
hgs
parents:
diff changeset
   843
        {
hgs
parents:
diff changeset
   844
            mAddressList[index]->maptileStatus = status;
hgs
parents:
diff changeset
   845
        }
hgs
parents:
diff changeset
   846
    }
81
hgs
parents: 72
diff changeset
   847
72
hgs
parents:
diff changeset
   848
    updateSpinningIndicator();
hgs
parents:
diff changeset
   849
}
hgs
parents:
diff changeset
   850
81
hgs
parents: 72
diff changeset
   851
/*!
hgs
parents: 72
diff changeset
   852
    Updates correct maptile image when screen orientation changes.
hgs
parents: 72
diff changeset
   853
 */
72
hgs
parents:
diff changeset
   854
void CntContactCardViewPrivate::updateMaptileImage()
hgs
parents:
diff changeset
   855
{
81
hgs
parents: 72
diff changeset
   856
    // If there is no maptile displayed, return immediately
hgs
parents: 72
diff changeset
   857
    if (mMaptileLabelList.count() > 0)
72
hgs
parents:
diff changeset
   858
    {
hgs
parents:
diff changeset
   859
        QContactLocalId contactId = mContact->localId();
hgs
parents:
diff changeset
   860
        
hgs
parents:
diff changeset
   861
        QList<QContactAddress> addressDetails = mContact->details<QContactAddress>();
hgs
parents:
diff changeset
   862
        
hgs
parents:
diff changeset
   863
        //address
hgs
parents:
diff changeset
   864
        QString contextHome(QContactAddress::ContextHome.operator QString());
hgs
parents:
diff changeset
   865
        QString contextWork(QContactAddress::ContextWork.operator QString());
hgs
parents:
diff changeset
   866
        MapTileService::AddressType sourceAddressType 
81
hgs
parents: 72
diff changeset
   867
            = MapTileService::AddressPreference;
72
hgs
parents:
diff changeset
   868
        
hgs
parents:
diff changeset
   869
        QString imagePath;
hgs
parents:
diff changeset
   870
        
81
hgs
parents: 72
diff changeset
   871
        for (int i = 0; i < addressDetails.count(); i++)
72
hgs
parents:
diff changeset
   872
        {
81
hgs
parents: 72
diff changeset
   873
            if (!addressDetails[i].contexts().isEmpty() &&
hgs
parents: 72
diff changeset
   874
                   addressDetails[i].contexts().at(0) == contextHome)
72
hgs
parents:
diff changeset
   875
            {
hgs
parents:
diff changeset
   876
                sourceAddressType = MapTileService::AddressHome;
hgs
parents:
diff changeset
   877
            }
81
hgs
parents: 72
diff changeset
   878
            else if (!addressDetails[i].contexts().isEmpty() && 
hgs
parents: 72
diff changeset
   879
                        addressDetails[i].contexts().at(0) == contextWork)
72
hgs
parents:
diff changeset
   880
            {
hgs
parents:
diff changeset
   881
                sourceAddressType = MapTileService::AddressWork;
hgs
parents:
diff changeset
   882
            }
81
hgs
parents: 72
diff changeset
   883
72
hgs
parents:
diff changeset
   884
            int status = mMaptile->getMapTileImage( 
hgs
parents:
diff changeset
   885
                                             contactId, 
hgs
parents:
diff changeset
   886
                                             sourceAddressType, 
hgs
parents:
diff changeset
   887
                                             imagePath, 
81
hgs
parents: 72
diff changeset
   888
                                             mView->mainWindow()->orientation());
hgs
parents: 72
diff changeset
   889
            if (!imagePath.isEmpty())
72
hgs
parents:
diff changeset
   890
            {
81
hgs
parents: 72
diff changeset
   891
                HbIcon icon(imagePath);
hgs
parents: 72
diff changeset
   892
                HbLabel* label = mMaptileLabelList.value(sourceAddressType);
hgs
parents: 72
diff changeset
   893
                if (label)
72
hgs
parents:
diff changeset
   894
                {
81
hgs
parents: 72
diff changeset
   895
                    setMaptileLabel(label, icon);
72
hgs
parents:
diff changeset
   896
                }
hgs
parents:
diff changeset
   897
            }
hgs
parents:
diff changeset
   898
        }
hgs
parents:
diff changeset
   899
    }
hgs
parents:
diff changeset
   900
}
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
81
hgs
parents: 72
diff changeset
   903
/*!
hgs
parents: 72
diff changeset
   904
    Asscoiate the maptile label widget with maptile image.
hgs
parents: 72
diff changeset
   905
 */
hgs
parents: 72
diff changeset
   906
void CntContactCardViewPrivate::setMaptileLabel(HbLabel*& mapLabel, const HbIcon& icon)
72
hgs
parents:
diff changeset
   907
{
hgs
parents:
diff changeset
   908
    mapLabel->clear();
81
hgs
parents: 72
diff changeset
   909
    mapLabel->setIcon(icon);
hgs
parents: 72
diff changeset
   910
hgs
parents: 72
diff changeset
   911
    qreal leftMarginSize;
hgs
parents: 72
diff changeset
   912
    mapLabel->getContentsMargins(&leftMarginSize, 0, 0, 0);
hgs
parents: 72
diff changeset
   913
    mapLabel->setPreferredSize(QSizeF(icon.width() + leftMarginSize, icon.height()));
72
hgs
parents:
diff changeset
   914
}
hgs
parents:
diff changeset
   915
81
hgs
parents: 72
diff changeset
   916
/*!
hgs
parents: 72
diff changeset
   917
    Load the maptile label based on the address type.
hgs
parents: 72
diff changeset
   918
 */
hgs
parents: 72
diff changeset
   919
HbLabel* CntContactCardViewPrivate::loadMaptileLabel(int addressType)
72
hgs
parents:
diff changeset
   920
{
hgs
parents:
diff changeset
   921
    HbLabel* maptileLabel = NULL;
hgs
parents:
diff changeset
   922
    
81
hgs
parents: 72
diff changeset
   923
    if (addressType == MapTileService::AddressPreference)
72
hgs
parents:
diff changeset
   924
    {
hgs
parents:
diff changeset
   925
        maptileLabel = static_cast<HbLabel*>(document()->findWidget(QString("maptilePreferenceWidget")));
hgs
parents:
diff changeset
   926
    }
81
hgs
parents: 72
diff changeset
   927
    else if (addressType == MapTileService::AddressHome)
72
hgs
parents:
diff changeset
   928
    {
81
hgs
parents: 72
diff changeset
   929
        maptileLabel = static_cast<HbLabel*>(document()->findWidget(QString("maptileHomeWidget")));
72
hgs
parents:
diff changeset
   930
    }
81
hgs
parents: 72
diff changeset
   931
    else if (addressType == MapTileService::AddressWork)
72
hgs
parents:
diff changeset
   932
    {
81
hgs
parents: 72
diff changeset
   933
        maptileLabel = static_cast<HbLabel*>(document()->findWidget(QString("maptileWorkWidget")));
72
hgs
parents:
diff changeset
   934
    }
hgs
parents:
diff changeset
   935
                            
hgs
parents:
diff changeset
   936
    return maptileLabel;
hgs
parents:
diff changeset
   937
}
hgs
parents:
diff changeset
   938
hgs
parents:
diff changeset
   939
/*
hgs
parents:
diff changeset
   940
* Update the presence status icon of action item with the given accountUri
hgs
parents:
diff changeset
   941
*/
hgs
parents:
diff changeset
   942
void CntContactCardViewPrivate::updateItemPresence(const QString& accountUri, bool online)
hgs
parents:
diff changeset
   943
{
hgs
parents:
diff changeset
   944
    CntContactCardDetailItem* item = mPresenceItems.value(accountUri);
hgs
parents:
diff changeset
   945
    
hgs
parents:
diff changeset
   946
    if (item)
hgs
parents:
diff changeset
   947
    {
hgs
parents:
diff changeset
   948
        if (online)
hgs
parents:
diff changeset
   949
        {
hgs
parents:
diff changeset
   950
            mDataContainer->dataItem(item->index())->setSecondaryIcon(HbIcon("qtg_small_online"));
hgs
parents:
diff changeset
   951
        }
hgs
parents:
diff changeset
   952
        else
hgs
parents:
diff changeset
   953
        {
hgs
parents:
diff changeset
   954
            mDataContainer->dataItem(item->index())->setSecondaryIcon(HbIcon());
hgs
parents:
diff changeset
   955
        }
hgs
parents:
diff changeset
   956
        item->setDetails(mDataContainer->dataItem(item->index()));
hgs
parents:
diff changeset
   957
    }
hgs
parents:
diff changeset
   958
}
hgs
parents:
diff changeset
   959
hgs
parents:
diff changeset
   960
void CntContactCardViewPrivate::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error)
hgs
parents:
diff changeset
   961
{
hgs
parents:
diff changeset
   962
    CNT_ENTRY
hgs
parents:
diff changeset
   963
    
hgs
parents:
diff changeset
   964
    Q_UNUSED(data);
hgs
parents:
diff changeset
   965
    Q_UNUSED(id);
hgs
parents:
diff changeset
   966
    if (!error)
hgs
parents:
diff changeset
   967
    {
hgs
parents:
diff changeset
   968
        HbIcon icon(pixmap);
hgs
parents:
diff changeset
   969
        mHeadingItem->setIcon(icon);
hgs
parents:
diff changeset
   970
        mVCardIcon = new HbIcon(pixmap);
hgs
parents:
diff changeset
   971
        mImageLabel->clear();
hgs
parents:
diff changeset
   972
        mImageLabel->setIcon(pixmap);
hgs
parents:
diff changeset
   973
    }
hgs
parents:
diff changeset
   974
    
hgs
parents:
diff changeset
   975
    CNT_EXIT
hgs
parents:
diff changeset
   976
}
hgs
parents:
diff changeset
   977
hgs
parents:
diff changeset
   978
/*!
hgs
parents:
diff changeset
   979
Place contact to homescreen as widget
hgs
parents:
diff changeset
   980
*/  
hgs
parents:
diff changeset
   981
void CntContactCardViewPrivate::sendToHs()
hgs
parents:
diff changeset
   982
{
hgs
parents:
diff changeset
   983
    QVariantHash preferences;
hgs
parents:
diff changeset
   984
    preferences["contactId"] = mContact->localId();
hgs
parents:
diff changeset
   985
    
hgs
parents:
diff changeset
   986
    XQServiceRequest snd("com.nokia.symbian.IHomeScreenClient",
hgs
parents:
diff changeset
   987
                         "addWidget(QString,QVariantHash)"
hgs
parents:
diff changeset
   988
                         ,false);
hgs
parents:
diff changeset
   989
    snd << QString("contactwidgethsplugin");
hgs
parents:
diff changeset
   990
    snd << preferences;
hgs
parents:
diff changeset
   991
    snd.send();
hgs
parents:
diff changeset
   992
hgs
parents:
diff changeset
   993
    /* 
hgs
parents:
diff changeset
   994
    if (mRequest)
hgs
parents:
diff changeset
   995
    {
hgs
parents:
diff changeset
   996
        delete mRequest;
hgs
parents:
diff changeset
   997
        mRequest = 0;
hgs
parents:
diff changeset
   998
    }
hgs
parents:
diff changeset
   999
         
hgs
parents:
diff changeset
  1000
    mRequest = mAppManager.create("com.nokia.symbian.IHomeScreenClient", "addWidget(QString,QVariantHash)", false);
hgs
parents:
diff changeset
  1001
    
hgs
parents:
diff changeset
  1002
    if (mRequest)
hgs
parents:
diff changeset
  1003
    {
hgs
parents:
diff changeset
  1004
        QList<QVariant> args;
hgs
parents:
diff changeset
  1005
        QVariantHash preferences;
hgs
parents:
diff changeset
  1006
        preferences["contactId"] = mContact->localId();
hgs
parents:
diff changeset
  1007
        args << preferences;
hgs
parents:
diff changeset
  1008
        args << QString("contactwidgethsplugin");
hgs
parents:
diff changeset
  1009
        mRequest->setArguments(args);
hgs
parents:
diff changeset
  1010
        mRequest->send();
hgs
parents:
diff changeset
  1011
    }
hgs
parents:
diff changeset
  1012
    */
hgs
parents:
diff changeset
  1013
}
hgs
parents:
diff changeset
  1014
hgs
parents:
diff changeset
  1015
/*!
hgs
parents:
diff changeset
  1016
Launch contact editor 
hgs
parents:
diff changeset
  1017
*/
hgs
parents:
diff changeset
  1018
void CntContactCardViewPrivate::editContact()
hgs
parents:
diff changeset
  1019
{
hgs
parents:
diff changeset
  1020
    QVariant var;
hgs
parents:
diff changeset
  1021
    var.setValue(*mContact);
hgs
parents:
diff changeset
  1022
    
hgs
parents:
diff changeset
  1023
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
  1024
    mArgs.insert(EViewId, editView);
hgs
parents:
diff changeset
  1025
    
hgs
parents:
diff changeset
  1026
    mViewManager->changeView( mArgs );
hgs
parents:
diff changeset
  1027
}
hgs
parents:
diff changeset
  1028
hgs
parents:
diff changeset
  1029
void CntContactCardViewPrivate::addToGroup()
hgs
parents:
diff changeset
  1030
{
hgs
parents:
diff changeset
  1031
}
hgs
parents:
diff changeset
  1032
hgs
parents:
diff changeset
  1033
void CntContactCardViewPrivate::setAsFavorite()
hgs
parents:
diff changeset
  1034
{
hgs
parents:
diff changeset
  1035
    QContactId id = mContact->id();
hgs
parents:
diff changeset
  1036
    CntFavourite::addContactToFavouriteGroup( contactManager(), id );
hgs
parents:
diff changeset
  1037
    
hgs
parents:
diff changeset
  1038
    QContact c = contactManager()->contact(mContact->localId());
hgs
parents:
diff changeset
  1039
    
hgs
parents:
diff changeset
  1040
    delete mContact;
hgs
parents:
diff changeset
  1041
    mContact = NULL;
hgs
parents:
diff changeset
  1042
    
hgs
parents:
diff changeset
  1043
    mContact = new QContact(c);
hgs
parents:
diff changeset
  1044
    
hgs
parents:
diff changeset
  1045
    qobject_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible(true);
hgs
parents:
diff changeset
  1046
    qobject_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible(false);
hgs
parents:
diff changeset
  1047
    mHeadingItem->setFavoriteStatus(true);  
hgs
parents:
diff changeset
  1048
}
hgs
parents:
diff changeset
  1049
hgs
parents:
diff changeset
  1050
void CntContactCardViewPrivate::removeFromFavorite()
hgs
parents:
diff changeset
  1051
{
hgs
parents:
diff changeset
  1052
    QContactId id = mContact->id();   
hgs
parents:
diff changeset
  1053
    CntFavourite::removeContactFromFavouriteGroup( contactManager(), id );
hgs
parents:
diff changeset
  1054
    
hgs
parents:
diff changeset
  1055
    QContact c = contactManager()->contact(mContact->localId());
hgs
parents:
diff changeset
  1056
    
hgs
parents:
diff changeset
  1057
    delete mContact;
hgs
parents:
diff changeset
  1058
    mContact = NULL;
hgs
parents:
diff changeset
  1059
    
hgs
parents:
diff changeset
  1060
    mContact = new QContact(c);
hgs
parents:
diff changeset
  1061
hgs
parents:
diff changeset
  1062
    qobject_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible(false);
hgs
parents:
diff changeset
  1063
    qobject_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible(true);
hgs
parents:
diff changeset
  1064
    mHeadingItem->setFavoriteStatus(false); 
hgs
parents:
diff changeset
  1065
}
hgs
parents:
diff changeset
  1066
hgs
parents:
diff changeset
  1067
/*!
hgs
parents:
diff changeset
  1068
Delete contact
hgs
parents:
diff changeset
  1069
*/
hgs
parents:
diff changeset
  1070
void CntContactCardViewPrivate::deleteContact()
hgs
parents:
diff changeset
  1071
{    
hgs
parents:
diff changeset
  1072
    QString name = contactManager()->synthesizedContactDisplayLabel(*mContact);
hgs
parents:
diff changeset
  1073
    if (name.isEmpty())
hgs
parents:
diff changeset
  1074
    {
hgs
parents:
diff changeset
  1075
        name = hbTrId("txt_phob_list_unnamed");
hgs
parents:
diff changeset
  1076
    }
hgs
parents:
diff changeset
  1077
    
81
hgs
parents: 72
diff changeset
  1078
    HbMessageBox::question(HbParameterLengthLimiter("txt_phob_info_delete_1").arg(name), this, SLOT(handleDeleteContact(int)),
72
hgs
parents:
diff changeset
  1079
            HbMessageBox::Delete | HbMessageBox::Cancel);
hgs
parents:
diff changeset
  1080
}
hgs
parents:
diff changeset
  1081
hgs
parents:
diff changeset
  1082
/*!
hgs
parents:
diff changeset
  1083
Handle action for deleting a contact
hgs
parents:
diff changeset
  1084
*/
hgs
parents:
diff changeset
  1085
void CntContactCardViewPrivate::handleDeleteContact(int action)
hgs
parents:
diff changeset
  1086
{
hgs
parents:
diff changeset
  1087
    if (action == HbMessageBox::Delete)
hgs
parents:
diff changeset
  1088
    {
hgs
parents:
diff changeset
  1089
        disconnect(contactManager(), SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
hgs
parents:
diff changeset
  1090
                this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
hgs
parents:
diff changeset
  1091
        
hgs
parents:
diff changeset
  1092
        bool success = contactManager()->removeContact(mContact->localId());
hgs
parents:
diff changeset
  1093
        
hgs
parents:
diff changeset
  1094
        int returnValue = success ? KCntServicesReturnValueContactDeleted : KCntServicesReturnValueContactNotModified;
hgs
parents:
diff changeset
  1095
        
hgs
parents:
diff changeset
  1096
        emit backPressed(returnValue);  
hgs
parents:
diff changeset
  1097
        
hgs
parents:
diff changeset
  1098
        mViewManager->back( mArgs, true );
hgs
parents:
diff changeset
  1099
    }
hgs
parents:
diff changeset
  1100
}
hgs
parents:
diff changeset
  1101
hgs
parents:
diff changeset
  1102
/*!
hgs
parents:
diff changeset
  1103
Launch history view 
hgs
parents:
diff changeset
  1104
*/
hgs
parents:
diff changeset
  1105
void CntContactCardViewPrivate::viewHistory()
hgs
parents:
diff changeset
  1106
{
hgs
parents:
diff changeset
  1107
    QVariant var;
hgs
parents:
diff changeset
  1108
    var.setValue(*mContact);
hgs
parents:
diff changeset
  1109
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
  1110
    mArgs.insert(EViewId, historyView);
hgs
parents:
diff changeset
  1111
    
hgs
parents:
diff changeset
  1112
    mViewManager->changeView( mArgs );
hgs
parents:
diff changeset
  1113
}
hgs
parents:
diff changeset
  1114
hgs
parents:
diff changeset
  1115
/*!
hgs
parents:
diff changeset
  1116
Deactivate the view
hgs
parents:
diff changeset
  1117
*/
hgs
parents:
diff changeset
  1118
void CntContactCardViewPrivate::deactivate()
hgs
parents:
diff changeset
  1119
{
hgs
parents:
diff changeset
  1120
}
hgs
parents:
diff changeset
  1121
hgs
parents:
diff changeset
  1122
/*!
hgs
parents:
diff changeset
  1123
Send the business card / my card 
hgs
parents:
diff changeset
  1124
*/
hgs
parents:
diff changeset
  1125
void CntContactCardViewPrivate::sendBusinessCard()
hgs
parents:
diff changeset
  1126
{
hgs
parents:
diff changeset
  1127
    CNT_ENTRY
hgs
parents:
diff changeset
  1128
    
hgs
parents:
diff changeset
  1129
    // Check if the contact has an image.
hgs
parents:
diff changeset
  1130
    QList<QContactAvatar> avatars = mContact->details<QContactAvatar>();
hgs
parents:
diff changeset
  1131
    bool imageExists( false );
hgs
parents:
diff changeset
  1132
    /*foreach(QContactAvatar a, mContact->details<QContactAvatar>())
hgs
parents:
diff changeset
  1133
    {
hgs
parents:
diff changeset
  1134
        if (!a.imageUrl().isEmpty())
hgs
parents:
diff changeset
  1135
        {
hgs
parents:
diff changeset
  1136
            imageExists = true;
hgs
parents:
diff changeset
  1137
            HbMessageBox *note = new HbMessageBox(
hgs
parents:
diff changeset
  1138
                    hbTrId("txt_phob_info_add_contact_card_image_to_business_c"),
hgs
parents:
diff changeset
  1139
                    HbMessageBox::MessageTypeQuestion);
hgs
parents:
diff changeset
  1140
            note->setIcon(*mVCardIcon);
hgs
parents:
diff changeset
  1141
            note->clearActions();
hgs
parents:
diff changeset
  1142
            
hgs
parents:
diff changeset
  1143
            HbAction* ok = new HbAction(hbTrId("txt_common_button_ok"), note);
hgs
parents:
diff changeset
  1144
            HbAction* cancel = new HbAction(hbTrId("txt_common_button_cancel"), note);
hgs
parents:
diff changeset
  1145
            
hgs
parents:
diff changeset
  1146
            ok->setObjectName( "ok" );
hgs
parents:
diff changeset
  1147
            cancel->setObjectName( "cancel" );
hgs
parents:
diff changeset
  1148
             
hgs
parents:
diff changeset
  1149
            note->addAction( ok );
hgs
parents:
diff changeset
  1150
            note->addAction( cancel );
hgs
parents:
diff changeset
  1151
            
hgs
parents:
diff changeset
  1152
            note->setModal( true );
hgs
parents:
diff changeset
  1153
            note->setAttribute(Qt::WA_DeleteOnClose, true );
hgs
parents:
diff changeset
  1154
            note->open( this, SLOT(handleSendBusinessCard(HbAction*)));
hgs
parents:
diff changeset
  1155
            break;
hgs
parents:
diff changeset
  1156
        }
hgs
parents:
diff changeset
  1157
    }*/
hgs
parents:
diff changeset
  1158
    
hgs
parents:
diff changeset
  1159
    if ( !imageExists )
hgs
parents:
diff changeset
  1160
    {
hgs
parents:
diff changeset
  1161
        CNT_LOG_ARGS("snd vCard without image")
hgs
parents:
diff changeset
  1162
        handleSendBusinessCard( NULL ); // no image
hgs
parents:
diff changeset
  1163
    }
hgs
parents:
diff changeset
  1164
    
hgs
parents:
diff changeset
  1165
    CNT_EXIT
hgs
parents:
diff changeset
  1166
}
hgs
parents:
diff changeset
  1167
hgs
parents:
diff changeset
  1168
/*!
hgs
parents:
diff changeset
  1169
Set orientation of the view
hgs
parents:
diff changeset
  1170
*/
hgs
parents:
diff changeset
  1171
void CntContactCardViewPrivate::setOrientation(Qt::Orientation orientation)
hgs
parents:
diff changeset
  1172
{
hgs
parents:
diff changeset
  1173
    if (orientation == Qt::Vertical) 
hgs
parents:
diff changeset
  1174
    {
hgs
parents:
diff changeset
  1175
        // reading "portrait" section
hgs
parents:
diff changeset
  1176
        document()->load(CNT_CONTACTCARDVIEW_XML, "portrait");
hgs
parents:
diff changeset
  1177
    } 
hgs
parents:
diff changeset
  1178
    else 
hgs
parents:
diff changeset
  1179
    {
hgs
parents:
diff changeset
  1180
        // reading "landscape" section
hgs
parents:
diff changeset
  1181
        document()->load(CNT_CONTACTCARDVIEW_XML, "landscape");
hgs
parents:
diff changeset
  1182
    }
hgs
parents:
diff changeset
  1183
	//Update the maptile image
hgs
parents:
diff changeset
  1184
	updateMaptileImage();
hgs
parents:
diff changeset
  1185
}
hgs
parents:
diff changeset
  1186
hgs
parents:
diff changeset
  1187
/*!
hgs
parents:
diff changeset
  1188
Called after user clicked on the listview.
hgs
parents:
diff changeset
  1189
*/
hgs
parents:
diff changeset
  1190
void CntContactCardViewPrivate::onItemActivated()
hgs
parents:
diff changeset
  1191
{
hgs
parents:
diff changeset
  1192
    CntContactCardDetailItem *item = qobject_cast<CntContactCardDetailItem*>(sender());
hgs
parents:
diff changeset
  1193
    int index = item->index();
hgs
parents:
diff changeset
  1194
    CntContactCardDataItem& dataItem = *mDataContainer->dataItem(index);
hgs
parents:
diff changeset
  1195
    QString action = mDataContainer->dataItem(index)->action();
hgs
parents:
diff changeset
  1196
    CntUiContactCardExtension* extension = dataItem.contactCardExtension();
hgs
parents:
diff changeset
  1197
    if (!extension)
hgs
parents:
diff changeset
  1198
    {
hgs
parents:
diff changeset
  1199
        //It's not an extension action.
hgs
parents:
diff changeset
  1200
        // Check if action is internal
hgs
parents:
diff changeset
  1201
        QList<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(action, "symbian", 1);
hgs
parents:
diff changeset
  1202
        if (0 < actionDescriptors.count())
hgs
parents:
diff changeset
  1203
        {
hgs
parents:
diff changeset
  1204
            // These actions are considered internal(vendor=symbian and version=1)
hgs
parents:
diff changeset
  1205
            executeAction(*mContact, dataItem.detail(), action, item);
hgs
parents:
diff changeset
  1206
        }
hgs
parents:
diff changeset
  1207
        else
hgs
parents:
diff changeset
  1208
        {
hgs
parents:
diff changeset
  1209
            //Handle dynamic actions differently
hgs
parents:
diff changeset
  1210
            executeDynamicAction(*mContact, dataItem.detail(), dataItem.actionDescriptor());
hgs
parents:
diff changeset
  1211
        }
hgs
parents:
diff changeset
  1212
    } else {
hgs
parents:
diff changeset
  1213
        // The action is from an extension
hgs
parents:
diff changeset
  1214
        int indexWithinPlugin = dataItem.contactCardExtensionActionIndex();
hgs
parents:
diff changeset
  1215
        extension->handleShortPress(indexWithinPlugin);
hgs
parents:
diff changeset
  1216
    }
hgs
parents:
diff changeset
  1217
}
hgs
parents:
diff changeset
  1218
hgs
parents:
diff changeset
  1219
/*!
hgs
parents:
diff changeset
  1220
Execute the call / message / email action
hgs
parents:
diff changeset
  1221
*/
hgs
parents:
diff changeset
  1222
void CntContactCardViewPrivate::executeAction(QContact& aContact, const QContactDetail& aDetail, const QString& aAction, CntContactCardDetailItem* aItem)
hgs
parents:
diff changeset
  1223
{
hgs
parents:
diff changeset
  1224
    if (mIsExecutingAction)
hgs
parents:
diff changeset
  1225
    {
hgs
parents:
diff changeset
  1226
        return;
hgs
parents:
diff changeset
  1227
    }
hgs
parents:
diff changeset
  1228
    else
hgs
parents:
diff changeset
  1229
    {
hgs
parents:
diff changeset
  1230
        mIsExecutingAction = true;
hgs
parents:
diff changeset
  1231
    }
hgs
parents:
diff changeset
  1232
    
hgs
parents:
diff changeset
  1233
    CntActionLauncher* other = new CntActionLauncher(*contactManager(), aAction);
hgs
parents:
diff changeset
  1234
    connect(other, SIGNAL(actionExecuted(CntActionLauncher*)), this, SLOT(actionExecuted(CntActionLauncher*)));
hgs
parents:
diff changeset
  1235
    if (aItem && aContact.preferredDetail(aAction).isEmpty())
hgs
parents:
diff changeset
  1236
    {
hgs
parents:
diff changeset
  1237
        setPreferredAction(aAction, aDetail, aItem);
hgs
parents:
diff changeset
  1238
    }
hgs
parents:
diff changeset
  1239
    other->execute(aContact, aDetail);  
hgs
parents:
diff changeset
  1240
}
hgs
parents:
diff changeset
  1241
hgs
parents:
diff changeset
  1242
hgs
parents:
diff changeset
  1243
/*!
hgs
parents:
diff changeset
  1244
Execute the call / message / email action
hgs
parents:
diff changeset
  1245
*/
hgs
parents:
diff changeset
  1246
void CntContactCardViewPrivate::executeAction(QContact& aContact, const QContactDetail& aDetail, const QString& aAction)
hgs
parents:
diff changeset
  1247
{ 
hgs
parents:
diff changeset
  1248
    //TODO: need refactoring
hgs
parents:
diff changeset
  1249
    CntContactCardDetailItem* detailItem = NULL;
hgs
parents:
diff changeset
  1250
    for (int index = 0; index < mDataContainer->itemCount(); index++)
hgs
parents:
diff changeset
  1251
    {
hgs
parents:
diff changeset
  1252
        QContactDetail detail = mDataContainer->dataItem(index)->detail();
hgs
parents:
diff changeset
  1253
        QString action = mDataContainer->dataItem(index)->action();
hgs
parents:
diff changeset
  1254
        if (detail == aDetail && action == aAction)
hgs
parents:
diff changeset
  1255
        {
hgs
parents:
diff changeset
  1256
            detailItem = static_cast<CntContactCardDetailItem*>(mContainerLayout->itemAt(index));
hgs
parents:
diff changeset
  1257
            break;
hgs
parents:
diff changeset
  1258
        }
hgs
parents:
diff changeset
  1259
    }
hgs
parents:
diff changeset
  1260
    executeAction(aContact, aDetail, aAction, detailItem);
hgs
parents:
diff changeset
  1261
    mAcceptSendKey=true;
hgs
parents:
diff changeset
  1262
}
hgs
parents:
diff changeset
  1263
hgs
parents:
diff changeset
  1264
/*!
hgs
parents:
diff changeset
  1265
Execute dynamic action
hgs
parents:
diff changeset
  1266
*/
hgs
parents:
diff changeset
  1267
void CntContactCardViewPrivate::executeDynamicAction(QContact& aContact, QContactDetail aDetail, QContactActionDescriptor aActionDescriptor)
hgs
parents:
diff changeset
  1268
{
hgs
parents:
diff changeset
  1269
    if (mIsExecutingAction)
hgs
parents:
diff changeset
  1270
    {
hgs
parents:
diff changeset
  1271
        return;
hgs
parents:
diff changeset
  1272
    }
hgs
parents:
diff changeset
  1273
    else
hgs
parents:
diff changeset
  1274
    {
hgs
parents:
diff changeset
  1275
        mIsExecutingAction = true;
hgs
parents:
diff changeset
  1276
    }
hgs
parents:
diff changeset
  1277
    
hgs
parents:
diff changeset
  1278
    CntActionLauncher* other = new CntActionLauncher(*contactManager());
hgs
parents:
diff changeset
  1279
    connect(other, SIGNAL(actionExecuted(CntActionLauncher*)), this, SLOT(actionExecuted(CntActionLauncher*)));
hgs
parents:
diff changeset
  1280
    other->execute(aContact, aDetail, aActionDescriptor);
hgs
parents:
diff changeset
  1281
}
hgs
parents:
diff changeset
  1282
hgs
parents:
diff changeset
  1283
void CntContactCardViewPrivate::actionExecuted(CntActionLauncher* aAction)
hgs
parents:
diff changeset
  1284
{
hgs
parents:
diff changeset
  1285
    aAction->deleteLater();
hgs
parents:
diff changeset
  1286
    mIsExecutingAction = false;
hgs
parents:
diff changeset
  1287
}
hgs
parents:
diff changeset
  1288
hgs
parents:
diff changeset
  1289
/*!
hgs
parents:
diff changeset
  1290
Item specific menu
hgs
parents:
diff changeset
  1291
*/
hgs
parents:
diff changeset
  1292
void CntContactCardViewPrivate::onLongPressed(const QPointF &aCoords)
hgs
parents:
diff changeset
  1293
{
hgs
parents:
diff changeset
  1294
    CntContactCardDetailItem *item = qobject_cast<CntContactCardDetailItem*>(sender());
hgs
parents:
diff changeset
  1295
    int index = item->index();
hgs
parents:
diff changeset
  1296
    
hgs
parents:
diff changeset
  1297
    CntContactCardContextMenu *menu = new CntContactCardContextMenu( item );
hgs
parents:
diff changeset
  1298
    HbAction *communicationAction = 0;
hgs
parents:
diff changeset
  1299
    HbAction *dynamicAction = 0;
hgs
parents:
diff changeset
  1300
    HbAction *videoCommunicationAction = 0;
hgs
parents:
diff changeset
  1301
    HbAction *preferredAction = 0;
hgs
parents:
diff changeset
  1302
    CntStringMapper stringMapper;
hgs
parents:
diff changeset
  1303
    
hgs
parents:
diff changeset
  1304
    QString action = mDataContainer->dataItem(index)->action();
hgs
parents:
diff changeset
  1305
    QContactDetail detail = mDataContainer->dataItem(index)->detail();
hgs
parents:
diff changeset
  1306
    
hgs
parents:
diff changeset
  1307
    if (action.compare("call", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1308
    {       
hgs
parents:
diff changeset
  1309
        QContactDetail detail = mDataContainer->dataItem(index)->detail();
hgs
parents:
diff changeset
  1310
        if (detail.definitionName() == QContactPhoneNumber::DefinitionName)
hgs
parents:
diff changeset
  1311
        {
hgs
parents:
diff changeset
  1312
            QContactPhoneNumber number = static_cast<QContactPhoneNumber>(detail);
hgs
parents:
diff changeset
  1313
            QString context = number.contexts().isEmpty() ? QString() : number.contexts().first();
hgs
parents:
diff changeset
  1314
            QString subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first();
hgs
parents:
diff changeset
  1315
hgs
parents:
diff changeset
  1316
            communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(subtype, context));
hgs
parents:
diff changeset
  1317
            videoCommunicationAction = menu->addAction(hbTrId("txt_phob_menu_call_video_number"));
hgs
parents:
diff changeset
  1318
        }        
hgs
parents:
diff changeset
  1319
    }
hgs
parents:
diff changeset
  1320
    else if (action.compare("message", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1321
    {
hgs
parents:
diff changeset
  1322
        communicationAction = menu->addAction(hbTrId("txt_phob_menu_send_message"));
hgs
parents:
diff changeset
  1323
    }
hgs
parents:
diff changeset
  1324
    else if (action.compare("email", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1325
    {
hgs
parents:
diff changeset
  1326
        if (!detail.contexts().isEmpty())
hgs
parents:
diff changeset
  1327
        {
hgs
parents:
diff changeset
  1328
            communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), detail.contexts().first()));
hgs
parents:
diff changeset
  1329
        }
hgs
parents:
diff changeset
  1330
        else
hgs
parents:
diff changeset
  1331
        {
hgs
parents:
diff changeset
  1332
            communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), QString()));
hgs
parents:
diff changeset
  1333
        }
hgs
parents:
diff changeset
  1334
    }
hgs
parents:
diff changeset
  1335
    else if (action.compare("url", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1336
    {
hgs
parents:
diff changeset
  1337
        if (!detail.contexts().isEmpty())
hgs
parents:
diff changeset
  1338
        {
hgs
parents:
diff changeset
  1339
            communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), detail.contexts().first()));
hgs
parents:
diff changeset
  1340
        }
hgs
parents:
diff changeset
  1341
        else
hgs
parents:
diff changeset
  1342
        {
hgs
parents:
diff changeset
  1343
            communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), QString()));
hgs
parents:
diff changeset
  1344
        }
hgs
parents:
diff changeset
  1345
    }
hgs
parents:
diff changeset
  1346
    else if (1 > QContactAction::actionDescriptors(action, "symbian", 1).count())
hgs
parents:
diff changeset
  1347
    {
hgs
parents:
diff changeset
  1348
        // Do verification that action is not internal type(vendor=symbian and version=1)
hgs
parents:
diff changeset
  1349
        // If hard coded action is not found, fetch localization from dynamic action
hgs
parents:
diff changeset
  1350
        // and create dynamic action item.
hgs
parents:
diff changeset
  1351
        dynamicAction = menu->addAction(mDataContainer->dataItem(index)->longPressText());
hgs
parents:
diff changeset
  1352
    }
hgs
parents:
diff changeset
  1353
    
hgs
parents:
diff changeset
  1354
    if (action.compare("call", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1355
    {
hgs
parents:
diff changeset
  1356
        preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_number"));
hgs
parents:
diff changeset
  1357
    }
hgs
parents:
diff changeset
  1358
    else if (action.compare("message", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1359
    {
hgs
parents:
diff changeset
  1360
        preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_number"));
hgs
parents:
diff changeset
  1361
    }
hgs
parents:
diff changeset
  1362
    else if (action.compare("email", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1363
    {
hgs
parents:
diff changeset
  1364
        preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_email"));
hgs
parents:
diff changeset
  1365
    }
hgs
parents:
diff changeset
  1366
      
hgs
parents:
diff changeset
  1367
    if (mContact->isPreferredDetail(action, detail) && preferredAction)
hgs
parents:
diff changeset
  1368
    {
hgs
parents:
diff changeset
  1369
        preferredAction->setEnabled(false);
hgs
parents:
diff changeset
  1370
    }
hgs
parents:
diff changeset
  1371
   
hgs
parents:
diff changeset
  1372
    if ( communicationAction )
hgs
parents:
diff changeset
  1373
    {
hgs
parents:
diff changeset
  1374
        communicationAction->setObjectName( "communicationAction" );
hgs
parents:
diff changeset
  1375
    }
hgs
parents:
diff changeset
  1376
    if ( videoCommunicationAction )
hgs
parents:
diff changeset
  1377
    {
hgs
parents:
diff changeset
  1378
        videoCommunicationAction->setObjectName( "videoCommunicationAction" );
hgs
parents:
diff changeset
  1379
    }
hgs
parents:
diff changeset
  1380
   
hgs
parents:
diff changeset
  1381
    if ( dynamicAction )
hgs
parents:
diff changeset
  1382
    {
hgs
parents:
diff changeset
  1383
        dynamicAction->setObjectName( "dynamicAction" );
hgs
parents:
diff changeset
  1384
    }
hgs
parents:
diff changeset
  1385
    
hgs
parents:
diff changeset
  1386
    if ( preferredAction )
hgs
parents:
diff changeset
  1387
    {
hgs
parents:
diff changeset
  1388
        preferredAction->setObjectName( "preferredAction" );
hgs
parents:
diff changeset
  1389
        menu->insertSeparator(preferredAction);
hgs
parents:
diff changeset
  1390
    }
hgs
parents:
diff changeset
  1391
   
hgs
parents:
diff changeset
  1392
    menu->setPreferredPos( aCoords );
hgs
parents:
diff changeset
  1393
    menu->setAttribute( Qt::WA_DeleteOnClose, true );
hgs
parents:
diff changeset
  1394
    menu->open( this, SLOT(handleMenuAction(HbAction*)) );
hgs
parents:
diff changeset
  1395
}
hgs
parents:
diff changeset
  1396
hgs
parents:
diff changeset
  1397
void CntContactCardViewPrivate::handleMenuAction(HbAction* aAction)
hgs
parents:
diff changeset
  1398
{
hgs
parents:
diff changeset
  1399
    CntContactCardContextMenu* menu = static_cast<CntContactCardContextMenu*>(sender());
hgs
parents:
diff changeset
  1400
    CntContactCardDetailItem *item = menu->item();
hgs
parents:
diff changeset
  1401
    int index = item->index();
hgs
parents:
diff changeset
  1402
       
hgs
parents:
diff changeset
  1403
    QString action = mDataContainer->dataItem(index)->action();
hgs
parents:
diff changeset
  1404
    QContactDetail detail = mDataContainer->dataItem(index)->detail();
hgs
parents:
diff changeset
  1405
        
hgs
parents:
diff changeset
  1406
    QString name = aAction->objectName();
hgs
parents:
diff changeset
  1407
    
hgs
parents:
diff changeset
  1408
    if ( name == "communicationAction" )
hgs
parents:
diff changeset
  1409
    {
hgs
parents:
diff changeset
  1410
        executeAction(*mContact, detail, action, item);
hgs
parents:
diff changeset
  1411
    }
hgs
parents:
diff changeset
  1412
hgs
parents:
diff changeset
  1413
    if ( name == "videoCommunicationAction" )
hgs
parents:
diff changeset
  1414
    {
hgs
parents:
diff changeset
  1415
        //service name latter on should come from service table.
hgs
parents:
diff changeset
  1416
        executeAction(*mContact, detail, "videocall", item);
hgs
parents:
diff changeset
  1417
    }
hgs
parents:
diff changeset
  1418
    if ( name == "dynamicAction" )
hgs
parents:
diff changeset
  1419
    {             
hgs
parents:
diff changeset
  1420
        executeDynamicAction(*mContact, detail, mDataContainer->dataItem(index)->actionDescriptor());
hgs
parents:
diff changeset
  1421
    }
hgs
parents:
diff changeset
  1422
    
hgs
parents:
diff changeset
  1423
    if ( name == "preferredAction" )
hgs
parents:
diff changeset
  1424
    {
hgs
parents:
diff changeset
  1425
        setPreferredAction(action, detail, item);
hgs
parents:
diff changeset
  1426
    }
hgs
parents:
diff changeset
  1427
}
hgs
parents:
diff changeset
  1428
hgs
parents:
diff changeset
  1429
/*!
hgs
parents:
diff changeset
  1430
Set selected detail as preferred for selected action in detail item
hgs
parents:
diff changeset
  1431
*/
hgs
parents:
diff changeset
  1432
void CntContactCardViewPrivate::setPreferredAction(const QString &aAction, const QContactDetail &aDetail, CntContactCardDetailItem *aDetailItem)
hgs
parents:
diff changeset
  1433
{
hgs
parents:
diff changeset
  1434
    if (aAction == "call" || aAction == "message" || aAction == "email")
hgs
parents:
diff changeset
  1435
    {
hgs
parents:
diff changeset
  1436
        mContact->setPreferredDetail(aAction, aDetail);
hgs
parents:
diff changeset
  1437
        contactManager()->saveContact(mContact);
hgs
parents:
diff changeset
  1438
        if (mPreferredItems.contains(aAction))
hgs
parents:
diff changeset
  1439
        {
hgs
parents:
diff changeset
  1440
           CntContactCardDetailItem *oldItem = mPreferredItems.value(aAction);
hgs
parents:
diff changeset
  1441
           mDataContainer->dataItem(oldItem->index())->setSecondaryIcon(HbIcon());
hgs
parents:
diff changeset
  1442
           oldItem->setDetails(mDataContainer->dataItem(oldItem->index()));
hgs
parents:
diff changeset
  1443
        }
hgs
parents:
diff changeset
  1444
        
hgs
parents:
diff changeset
  1445
        mDataContainer->dataItem(aDetailItem->index())->setSecondaryIcon(HbIcon("qtg_mono_favourites"));
hgs
parents:
diff changeset
  1446
        aDetailItem->setDetails(mDataContainer->dataItem(aDetailItem->index()));
hgs
parents:
diff changeset
  1447
        
hgs
parents:
diff changeset
  1448
        mPreferredItems.insert(aAction, aDetailItem);
hgs
parents:
diff changeset
  1449
    }
hgs
parents:
diff changeset
  1450
}
hgs
parents:
diff changeset
  1451
hgs
parents:
diff changeset
  1452
hgs
parents:
diff changeset
  1453
void CntContactCardViewPrivate::handleSendBusinessCard( HbAction* aAction )
hgs
parents:
diff changeset
  1454
{
hgs
parents:
diff changeset
  1455
    CNT_ENTRY
hgs
parents:
diff changeset
  1456
    Q_UNUSED(aAction);
hgs
parents:
diff changeset
  1457
    
hgs
parents:
diff changeset
  1458
    QList<QContact> list;
hgs
parents:
diff changeset
  1459
    /*if ( aAction && aAction->objectName() == "cancel" )
hgs
parents:
diff changeset
  1460
    {
hgs
parents:
diff changeset
  1461
        QContact tmpContact( *mContact );
hgs
parents:
diff changeset
  1462
        foreach ( QContactAvatar a, tmpContact.details<QContactAvatar>() )
hgs
parents:
diff changeset
  1463
        {
hgs
parents:
diff changeset
  1464
            tmpContact.removeDetail( &a );
hgs
parents:
diff changeset
  1465
        }
hgs
parents:
diff changeset
  1466
        list.append( tmpContact );
hgs
parents:
diff changeset
  1467
    }
hgs
parents:
diff changeset
  1468
    else
hgs
parents:
diff changeset
  1469
    {
hgs
parents:
diff changeset
  1470
        list.append( *mContact );
hgs
parents:
diff changeset
  1471
    }*/
hgs
parents:
diff changeset
  1472
    QContact tmpContact( *mContact );
hgs
parents:
diff changeset
  1473
    foreach ( QContactAvatar a, tmpContact.details<QContactAvatar>() )
hgs
parents:
diff changeset
  1474
    {
hgs
parents:
diff changeset
  1475
        tmpContact.removeDetail( &a );
hgs
parents:
diff changeset
  1476
    }
hgs
parents:
diff changeset
  1477
    
hgs
parents:
diff changeset
  1478
    //temproral solution for a contact without name - add an empty name,
hgs
parents:
diff changeset
  1479
    //so vcard construction doesn't fail
hgs
parents:
diff changeset
  1480
    //TODO: use custom handler again when new QVersitContactExporterDetailHandlerV2
hgs
parents:
diff changeset
  1481
    //(part of QtVersit) is available in the platform
hgs
parents:
diff changeset
  1482
    QList<QContactName> names = tmpContact.details<QContactName>();
hgs
parents:
diff changeset
  1483
    if (names.count() > 0)
hgs
parents:
diff changeset
  1484
    {
hgs
parents:
diff changeset
  1485
        QContactName name = names.at(0);
hgs
parents:
diff changeset
  1486
        if (name.firstName().isEmpty() && name.lastName().isEmpty())
hgs
parents:
diff changeset
  1487
        {
hgs
parents:
diff changeset
  1488
            //empty first and last names - update with empty string
hgs
parents:
diff changeset
  1489
            name.setFirstName(QString(""));
hgs
parents:
diff changeset
  1490
            tmpContact.saveDetail(&name);
hgs
parents:
diff changeset
  1491
        }
hgs
parents:
diff changeset
  1492
    }
hgs
parents:
diff changeset
  1493
    else
hgs
parents:
diff changeset
  1494
    {
hgs
parents:
diff changeset
  1495
        //no name detail - create one
hgs
parents:
diff changeset
  1496
        QContactName name;
hgs
parents:
diff changeset
  1497
        name.setFirstName(QString(""));
hgs
parents:
diff changeset
  1498
        tmpContact.saveDetail(&name);
hgs
parents:
diff changeset
  1499
    } //temproral solution for a contact without name - add an empty name,
hgs
parents:
diff changeset
  1500
      //so vcard construction doesn't fail - end
hgs
parents:
diff changeset
  1501
    
hgs
parents:
diff changeset
  1502
    list.append( tmpContact );
hgs
parents:
diff changeset
  1503
    
hgs
parents:
diff changeset
  1504
    QString tempDir = QDir::tempPath().append("/tempcntvcard");
hgs
parents:
diff changeset
  1505
    QDir dir(tempDir);
hgs
parents:
diff changeset
  1506
           
hgs
parents:
diff changeset
  1507
    // Temporary directory to store the vCard file
hgs
parents:
diff changeset
  1508
    if (!dir.exists()) 
hgs
parents:
diff changeset
  1509
    {
hgs
parents:
diff changeset
  1510
        // Create a temp directory
hgs
parents:
diff changeset
  1511
        if (!QDir::temp().mkdir("tempcntvcard"))
hgs
parents:
diff changeset
  1512
        {
hgs
parents:
diff changeset
  1513
            return;
hgs
parents:
diff changeset
  1514
        }
hgs
parents:
diff changeset
  1515
    } 
hgs
parents:
diff changeset
  1516
    else 
hgs
parents:
diff changeset
  1517
    {    
hgs
parents:
diff changeset
  1518
        // Empty the temp directory since the other vCards are not required
hgs
parents:
diff changeset
  1519
        QStringList l = dir.entryList();
hgs
parents:
diff changeset
  1520
        foreach(QString s, l) 
hgs
parents:
diff changeset
  1521
        {
hgs
parents:
diff changeset
  1522
            if (dir.exists(s))
hgs
parents:
diff changeset
  1523
            {
hgs
parents:
diff changeset
  1524
                dir.remove(s);
hgs
parents:
diff changeset
  1525
            }    
hgs
parents:
diff changeset
  1526
        }   
hgs
parents:
diff changeset
  1527
    }
hgs
parents:
diff changeset
  1528
           
hgs
parents:
diff changeset
  1529
    QString vCardName;
hgs
parents:
diff changeset
  1530
    if ( mContact->displayLabel().isEmpty() ) {
hgs
parents:
diff changeset
  1531
        vCardName = hbTrId("txt_phob_list_unnamed").append(".vcf");
hgs
parents:
diff changeset
  1532
    } 
hgs
parents:
diff changeset
  1533
    else {
hgs
parents:
diff changeset
  1534
        // Remove invalid characters from file name
hgs
parents:
diff changeset
  1535
        QString filename = mContact->displayLabel().trimmed();
hgs
parents:
diff changeset
  1536
        QString invalidChars("?*<>/\"|\\:");
hgs
parents:
diff changeset
  1537
        QChar replaceChar('_');
hgs
parents:
diff changeset
  1538
        QChar *data = filename.data();
hgs
parents:
diff changeset
  1539
        int count(0);
hgs
parents:
diff changeset
  1540
        while ( !data->isNull() ) {
hgs
parents:
diff changeset
  1541
            if ( invalidChars.contains(*data) ) {
hgs
parents:
diff changeset
  1542
                *data = replaceChar;
hgs
parents:
diff changeset
  1543
                count++;
hgs
parents:
diff changeset
  1544
            }
hgs
parents:
diff changeset
  1545
            ++data;
hgs
parents:
diff changeset
  1546
        }
hgs
parents:
diff changeset
  1547
        
hgs
parents:
diff changeset
  1548
        // Check if filename contains only special characters
hgs
parents:
diff changeset
  1549
        if ( count == filename.count() )
hgs
parents:
diff changeset
  1550
            filename = "_";
hgs
parents:
diff changeset
  1551
        vCardName = filename.append(".vcf");
hgs
parents:
diff changeset
  1552
    }
hgs
parents:
diff changeset
  1553
        
hgs
parents:
diff changeset
  1554
    
hgs
parents:
diff changeset
  1555
    QString vCardPath = dir.absolutePath().append(QDir::separator());
hgs
parents:
diff changeset
  1556
    vCardPath.append(vCardName);
hgs
parents:
diff changeset
  1557
    vCardPath = QDir::toNativeSeparators(vCardPath);
hgs
parents:
diff changeset
  1558
    
hgs
parents:
diff changeset
  1559
    QVersitContactExporter exporter;
hgs
parents:
diff changeset
  1560
    //TODO: use custom handler again when new QVersitContactExporterDetailHandlerV2
hgs
parents:
diff changeset
  1561
    //(part of QtVersit) is available in the platform
hgs
parents:
diff changeset
  1562
    //CntVCardDetailHandler hanlder;
hgs
parents:
diff changeset
  1563
    //exporter.setDetailHandler(&hanlder);
hgs
parents:
diff changeset
  1564
    // The vCard version needs to be 2.1 due to backward compatiblity when sending 
hgs
parents:
diff changeset
  1565
    if (exporter.exportContacts(list, QVersitDocument::VCard21Type))
hgs
parents:
diff changeset
  1566
    {
hgs
parents:
diff changeset
  1567
        CNT_LOG_ARGS("VCard21Type");
hgs
parents:
diff changeset
  1568
        QList<QVersitDocument> docs = exporter.documents();
hgs
parents:
diff changeset
  1569
        QFile f(vCardPath);
hgs
parents:
diff changeset
  1570
        if ( f.open(QIODevice::WriteOnly) ) 
hgs
parents:
diff changeset
  1571
        {
hgs
parents:
diff changeset
  1572
            CNT_LOG_ARGS("write VCard");
hgs
parents:
diff changeset
  1573
            // Start creating the vCard
hgs
parents:
diff changeset
  1574
            QVersitWriter writer;
hgs
parents:
diff changeset
  1575
            writer.setDevice(&f);
hgs
parents:
diff changeset
  1576
        
hgs
parents:
diff changeset
  1577
            bool ret = writer.startWriting(docs);
hgs
parents:
diff changeset
  1578
            ret = writer.waitForFinished();
hgs
parents:
diff changeset
  1579
        
hgs
parents:
diff changeset
  1580
            // Create the vCard and send it to messaging service
hgs
parents:
diff changeset
  1581
            if (!mShareUi) {
hgs
parents:
diff changeset
  1582
                mShareUi = new ShareUi();
hgs
parents:
diff changeset
  1583
            }
hgs
parents:
diff changeset
  1584
            QStringList l;
hgs
parents:
diff changeset
  1585
            l << vCardPath;
hgs
parents:
diff changeset
  1586
            mShareUi->send(l, true);
hgs
parents:
diff changeset
  1587
        }
hgs
parents:
diff changeset
  1588
    }
hgs
parents:
diff changeset
  1589
    
hgs
parents:
diff changeset
  1590
    CNT_EXIT
hgs
parents:
diff changeset
  1591
}
hgs
parents:
diff changeset
  1592
hgs
parents:
diff changeset
  1593
hgs
parents:
diff changeset
  1594
/*!
hgs
parents:
diff changeset
  1595
Called after the user clicked "Change Image" from popup menu after 
hgs
parents:
diff changeset
  1596
longpressing the image in this view.
hgs
parents:
diff changeset
  1597
*/
hgs
parents:
diff changeset
  1598
void CntContactCardViewPrivate::doChangeImage()
hgs
parents:
diff changeset
  1599
{
hgs
parents:
diff changeset
  1600
    QVariant var;
hgs
parents:
diff changeset
  1601
    var.setValue(*mContact);
hgs
parents:
diff changeset
  1602
    
hgs
parents:
diff changeset
  1603
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
  1604
    mArgs.insert(EViewId, imageEditorView);
hgs
parents:
diff changeset
  1605
        
hgs
parents:
diff changeset
  1606
    mViewManager->changeView( mArgs );
hgs
parents:
diff changeset
  1607
}
hgs
parents:
diff changeset
  1608
hgs
parents:
diff changeset
  1609
/*!
hgs
parents:
diff changeset
  1610
Called after the user clicked "Remove Image" from popup menu after 
hgs
parents:
diff changeset
  1611
longpressing the image in this view.
hgs
parents:
diff changeset
  1612
*/
hgs
parents:
diff changeset
  1613
void CntContactCardViewPrivate::doRemoveImage()
hgs
parents:
diff changeset
  1614
{
hgs
parents:
diff changeset
  1615
    if (mAvatar) 
hgs
parents:
diff changeset
  1616
    {
hgs
parents:
diff changeset
  1617
        CntImageUtility imageUtility;
hgs
parents:
diff changeset
  1618
        QString filePath=mAvatar->imageUrl().toString();
hgs
parents:
diff changeset
  1619
        
hgs
parents:
diff changeset
  1620
        bool success = mContact->removeDetail(mAvatar);
hgs
parents:
diff changeset
  1621
        if (success) 
hgs
parents:
diff changeset
  1622
        { 
hgs
parents:
diff changeset
  1623
            if (!filePath.isEmpty())
hgs
parents:
diff changeset
  1624
            {
hgs
parents:
diff changeset
  1625
                // Check if image removable.
hgs
parents:
diff changeset
  1626
                CntImageUtility imageUtility;
hgs
parents:
diff changeset
  1627
                if(imageUtility.isImageRemovable(filePath))
hgs
parents:
diff changeset
  1628
                {
hgs
parents:
diff changeset
  1629
                    imageUtility.removeImage(filePath);
hgs
parents:
diff changeset
  1630
                }
hgs
parents:
diff changeset
  1631
            }
hgs
parents:
diff changeset
  1632
            mAvatar->setImageUrl(QUrl());
hgs
parents:
diff changeset
  1633
            mImageLabel->clear();
hgs
parents:
diff changeset
  1634
            mImageLabel->setAvatarIcon(HbIcon("qtg_large_add_contact_picture"));
hgs
parents:
diff changeset
  1635
            mHeadingItem->setIcon(HbIcon("qtg_large_add_contact_picture"));
hgs
parents:
diff changeset
  1636
            
hgs
parents:
diff changeset
  1637
            disconnect(contactManager(), SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
hgs
parents:
diff changeset
  1638
                                this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
hgs
parents:
diff changeset
  1639
            CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mContact, contactManager());
hgs
parents:
diff changeset
  1640
        }
hgs
parents:
diff changeset
  1641
    }
hgs
parents:
diff changeset
  1642
}
hgs
parents:
diff changeset
  1643
hgs
parents:
diff changeset
  1644
/*!
hgs
parents:
diff changeset
  1645
Draw the image specific content menu
hgs
parents:
diff changeset
  1646
*/
hgs
parents:
diff changeset
  1647
void CntContactCardViewPrivate::drawMenu(const QPointF &aCoords)
hgs
parents:
diff changeset
  1648
{
hgs
parents:
diff changeset
  1649
    HbMenu *menu = new HbMenu();
hgs
parents:
diff changeset
  1650
    menu->addAction(hbTrId("txt_phob_menu_change_picture"), this, SLOT(doChangeImage()) );
hgs
parents:
diff changeset
  1651
    if (mAvatar && !mAvatar->imageUrl().isEmpty())
hgs
parents:
diff changeset
  1652
    {
hgs
parents:
diff changeset
  1653
        menu->addAction(hbTrId("txt_phob_menu_remove_image"), this, SLOT(doRemoveImage()) );
hgs
parents:
diff changeset
  1654
    }
hgs
parents:
diff changeset
  1655
    menu->setAttribute( Qt::WA_DeleteOnClose );
hgs
parents:
diff changeset
  1656
    menu->setPreferredPos( aCoords );
hgs
parents:
diff changeset
  1657
    menu->open();
hgs
parents:
diff changeset
  1658
}
hgs
parents:
diff changeset
  1659
hgs
parents:
diff changeset
  1660
/*!
hgs
parents:
diff changeset
  1661
Return the pointer to the document loader
hgs
parents:
diff changeset
  1662
*/
hgs
parents:
diff changeset
  1663
CntDocumentLoader* CntContactCardViewPrivate::document()
hgs
parents:
diff changeset
  1664
{
hgs
parents:
diff changeset
  1665
    if (!mLoader) 
hgs
parents:
diff changeset
  1666
    {
hgs
parents:
diff changeset
  1667
        mLoader = new CntDocumentLoader();
hgs
parents:
diff changeset
  1668
    }
hgs
parents:
diff changeset
  1669
    return mLoader;
hgs
parents:
diff changeset
  1670
}
hgs
parents:
diff changeset
  1671
hgs
parents:
diff changeset
  1672
/*!
hgs
parents:
diff changeset
  1673
Return pointer to the contact manager
hgs
parents:
diff changeset
  1674
*/
hgs
parents:
diff changeset
  1675
QContactManager* CntContactCardViewPrivate::contactManager()
hgs
parents:
diff changeset
  1676
{
hgs
parents:
diff changeset
  1677
    return &mEngine->contactManager(SYMBIAN_BACKEND);
hgs
parents:
diff changeset
  1678
}
hgs
parents:
diff changeset
  1679
hgs
parents:
diff changeset
  1680
bool CntContactCardViewPrivate::eventFilter(QObject *obj, QEvent *event)
hgs
parents:
diff changeset
  1681
{
hgs
parents:
diff changeset
  1682
    if (event->type() == ProcessPopulateListEvent && obj == this) {
hgs
parents:
diff changeset
  1683
        populateListItems();
hgs
parents:
diff changeset
  1684
        return true;
hgs
parents:
diff changeset
  1685
    }
hgs
parents:
diff changeset
  1686
hgs
parents:
diff changeset
  1687
    if (event->type() == QEvent::KeyPress && obj == mView->mainWindow())
hgs
parents:
diff changeset
  1688
    {
hgs
parents:
diff changeset
  1689
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
hgs
parents:
diff changeset
  1690
        if (keyEvent->key() == Qt::Key_Yes)
hgs
parents:
diff changeset
  1691
        {
hgs
parents:
diff changeset
  1692
            return sendKeyPressed();
hgs
parents:
diff changeset
  1693
        }
hgs
parents:
diff changeset
  1694
    }
hgs
parents:
diff changeset
  1695
    
hgs
parents:
diff changeset
  1696
    // Update the contact only when the application is in the backgound
hgs
parents:
diff changeset
  1697
    // This avoids flickering when the contact card is in focus
hgs
parents:
diff changeset
  1698
    if ( event->type() == QEvent::ApplicationActivate ) 
hgs
parents:
diff changeset
  1699
    {
hgs
parents:
diff changeset
  1700
        CNT_LOG_ARGS("app activated")
hgs
parents:
diff changeset
  1701
hgs
parents:
diff changeset
  1702
        disconnect(contactManager(), SIGNAL(contactsChanged(const QList<QContactLocalId>&)),
hgs
parents:
diff changeset
  1703
                this, SLOT(contactUpdatedFromOtherSource(const QList<QContactLocalId>&)));
hgs
parents:
diff changeset
  1704
        
hgs
parents:
diff changeset
  1705
        QContact c = contactManager()->contact(mContact->localId());
hgs
parents:
diff changeset
  1706
        
hgs
parents:
diff changeset
  1707
        QContactTimestamp latestTimeStamp = c.detail<QContactTimestamp>();
hgs
parents:
diff changeset
  1708
        QContactTimestamp localTimeStamp = mContact->detail<QContactTimestamp>();
hgs
parents:
diff changeset
  1709
        
hgs
parents:
diff changeset
  1710
        // Once we regain focus check if the contact was modified in the background
hgs
parents:
diff changeset
  1711
        if (contactManager()->error() == QContactManager::NoError 
hgs
parents:
diff changeset
  1712
            && latestTimeStamp.lastModified() > localTimeStamp.lastModified())
hgs
parents:
diff changeset
  1713
        {
81
hgs
parents: 72
diff changeset
  1714
            mListPopulationProgress = CntListPopulationNotInProgress;
hgs
parents: 72
diff changeset
  1715
            
72
hgs
parents:
diff changeset
  1716
            if (mContact)
hgs
parents:
diff changeset
  1717
                delete mContact;
hgs
parents:
diff changeset
  1718
            mContact = new QContact(c);
hgs
parents:
diff changeset
  1719
                
hgs
parents:
diff changeset
  1720
            populateHeadingItem();
hgs
parents:
diff changeset
  1721
            populateListItems();
hgs
parents:
diff changeset
  1722
        }
hgs
parents:
diff changeset
  1723
    }
hgs
parents:
diff changeset
  1724
    
hgs
parents:
diff changeset
  1725
    if ( event->type() == QEvent::ApplicationDeactivate )
hgs
parents:
diff changeset
  1726
    {
hgs
parents:
diff changeset
  1727
        CNT_LOG_ARGS("app deactivated")
hgs
parents:
diff changeset
  1728
hgs
parents:
diff changeset
  1729
        connect(contactManager(), SIGNAL(contactsChanged(const QList<QContactLocalId>&)), 
hgs
parents:
diff changeset
  1730
            this, SLOT(contactUpdatedFromOtherSource(const QList<QContactLocalId>&)), Qt::UniqueConnection);
hgs
parents:
diff changeset
  1731
    }
hgs
parents:
diff changeset
  1732
    
hgs
parents:
diff changeset
  1733
    return false;
hgs
parents:
diff changeset
  1734
}
hgs
parents:
diff changeset
  1735
hgs
parents:
diff changeset
  1736
bool CntContactCardViewPrivate::sendKeyPressed()
hgs
parents:
diff changeset
  1737
{   
hgs
parents:
diff changeset
  1738
    int count = 0;
hgs
parents:
diff changeset
  1739
    bool keyConsumed = false;
hgs
parents:
diff changeset
  1740
    
hgs
parents:
diff changeset
  1741
    for (int index = 0; index < mDataContainer->itemCount(); index++)
hgs
parents:
diff changeset
  1742
    {
hgs
parents:
diff changeset
  1743
        CntContactCardDataItem* dataItem = mDataContainer->dataItem(index);
hgs
parents:
diff changeset
  1744
        if (dataItem->action().compare("call", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
  1745
        {
hgs
parents:
diff changeset
  1746
            count++;
hgs
parents:
diff changeset
  1747
        }
hgs
parents:
diff changeset
  1748
    }
hgs
parents:
diff changeset
  1749
hgs
parents:
diff changeset
  1750
    if (count)
hgs
parents:
diff changeset
  1751
    {
hgs
parents:
diff changeset
  1752
        QContactDetail preferredDetail = mContact->preferredDetail("call");
hgs
parents:
diff changeset
  1753
        if (!preferredDetail.isEmpty())
hgs
parents:
diff changeset
  1754
        {
hgs
parents:
diff changeset
  1755
            keyConsumed = true;
hgs
parents:
diff changeset
  1756
            executeAction(*mContact, preferredDetail, "call");
hgs
parents:
diff changeset
  1757
        }
hgs
parents:
diff changeset
  1758
        else if (count == 1 )
hgs
parents:
diff changeset
  1759
        {
hgs
parents:
diff changeset
  1760
            keyConsumed = true;
hgs
parents:
diff changeset
  1761
            executeAction( *mContact, mContact->details<QContactPhoneNumber>().first(), "call"); 
hgs
parents:
diff changeset
  1762
        }
hgs
parents:
diff changeset
  1763
        else if(count >= 2 && mAcceptSendKey)
hgs
parents:
diff changeset
  1764
        {
hgs
parents:
diff changeset
  1765
            keyConsumed = true;
hgs
parents:
diff changeset
  1766
            mAcceptSendKey = false;
hgs
parents:
diff changeset
  1767
            CntActionPopup *actionPopup = new CntActionPopup(mContact);
hgs
parents:
diff changeset
  1768
            actionPopup->showActionPopup("call");
hgs
parents:
diff changeset
  1769
            connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, 
hgs
parents:
diff changeset
  1770
                    SLOT(executeAction(QContact&, QContactDetail, QString)));   
hgs
parents:
diff changeset
  1771
            connect( actionPopup, SIGNAL(actionPopupCancelPressed()), this, 
hgs
parents:
diff changeset
  1772
                    SLOT(sendKeyCancelSlot()));
hgs
parents:
diff changeset
  1773
        }
hgs
parents:
diff changeset
  1774
        else
hgs
parents:
diff changeset
  1775
        {
hgs
parents:
diff changeset
  1776
            //ignore
hgs
parents:
diff changeset
  1777
        }
hgs
parents:
diff changeset
  1778
    }
hgs
parents:
diff changeset
  1779
    
hgs
parents:
diff changeset
  1780
    return keyConsumed;
hgs
parents:
diff changeset
  1781
}
hgs
parents:
diff changeset
  1782
hgs
parents:
diff changeset
  1783
void CntContactCardViewPrivate::sendKeyCancelSlot()
hgs
parents:
diff changeset
  1784
{
hgs
parents:
diff changeset
  1785
    mAcceptSendKey = true;
hgs
parents:
diff changeset
  1786
}
hgs
parents:
diff changeset
  1787
hgs
parents:
diff changeset
  1788
void CntContactCardViewPrivate::onAddedToContacts()
hgs
parents:
diff changeset
  1789
{
hgs
parents:
diff changeset
  1790
    emit addToContacts();
hgs
parents:
diff changeset
  1791
}
hgs
parents:
diff changeset
  1792
hgs
parents:
diff changeset
  1793
void CntContactCardViewPrivate::contactDeletedFromOtherSource(const QList<QContactLocalId>& contactIds)
hgs
parents:
diff changeset
  1794
{
hgs
parents:
diff changeset
  1795
    if ( contactIds.contains(mContact->localId()) )
hgs
parents:
diff changeset
  1796
    {
hgs
parents:
diff changeset
  1797
        // Do not switch to the previous view immediately. List views are
hgs
parents:
diff changeset
  1798
        // not updated properly if this is not done in the event loop
hgs
parents:
diff changeset
  1799
        QTimer::singleShot(0, this, SLOT(showRootView()));
hgs
parents:
diff changeset
  1800
    }
hgs
parents:
diff changeset
  1801
}
hgs
parents:
diff changeset
  1802
hgs
parents:
diff changeset
  1803
void CntContactCardViewPrivate::contactUpdatedFromOtherSource(const QList<QContactLocalId>& contactIds)
hgs
parents:
diff changeset
  1804
{
hgs
parents:
diff changeset
  1805
    if ( contactIds.contains(mContact->localId()) )
hgs
parents:
diff changeset
  1806
    {
hgs
parents:
diff changeset
  1807
        QContact c = contactManager()->contact(mContact->localId());
hgs
parents:
diff changeset
  1808
        if (contactManager()->error() == QContactManager::NoError)
hgs
parents:
diff changeset
  1809
        {
81
hgs
parents: 72
diff changeset
  1810
            mListPopulationProgress = CntListPopulationNotInProgress;
hgs
parents: 72
diff changeset
  1811
            
72
hgs
parents:
diff changeset
  1812
            if (mContact)
hgs
parents:
diff changeset
  1813
                delete mContact;
hgs
parents:
diff changeset
  1814
            mContact = new QContact(c);
hgs
parents:
diff changeset
  1815
            
hgs
parents:
diff changeset
  1816
            populateHeadingItem();
hgs
parents:
diff changeset
  1817
            populateListItems();
hgs
parents:
diff changeset
  1818
        }
hgs
parents:
diff changeset
  1819
    }
hgs
parents:
diff changeset
  1820
}
hgs
parents:
diff changeset
  1821
hgs
parents:
diff changeset
  1822
// end of file