phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp
branchRCL_3
changeset 62 5b6f26637ad3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp	Tue Aug 31 15:05:21 2010 +0300
@@ -0,0 +1,332 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "cntservicecontactfetchview.h"
+
+#include <cntservicescontact.h>
+#include <cntlistmodel.h>
+#include "cntserviceviewparams.h"
+
+#include <hbmenu.h>
+#include <hbview.h>
+#include <hblistview.h>
+#include <hbdocumentloader.h>
+#include <hbaction.h>
+#include "cntactionpopup.h"
+
+#include <QCoreApplication>
+
+CntServiceContactFetchView::CntServiceContactFetchView( CntAbstractServiceProvider& aServiceProvider ):
+CntBaseSelectionView(),
+mProvider( aServiceProvider )
+    {
+    HbAction* cancel = static_cast<HbAction*>( mDocument->findObject( "cnt:cancel" ) );
+    mView->menu()->addAction( cancel );
+    connect(cancel,  SIGNAL(triggered()), this, SLOT(cancelFetch()) );
+    connect( this, SIGNAL(viewClosed()), this, SLOT(closeFetchView()) );
+    connect( this, SIGNAL(viewOpened(CntAbstractViewManager*, const CntViewParameters)), this, SLOT(aboutToOpenView(CntAbstractViewManager*, const CntViewParameters)) );
+}
+
+CntServiceContactFetchView::~CntServiceContactFetchView()
+{
+}
+
+
+void CntServiceContactFetchView::cancelFetch()
+    {
+    CntServicesContactList serviceList;
+    QVariant variant;
+    variant.setValue(serviceList);
+    mProvider.CompleteServiceAndCloseApp(variant);
+    }
+
+
+
+void CntServiceContactFetchView::closeFetchView()
+{
+    QModelIndexList temp = mListView->selectionModel()->selection().indexes();
+    mIndex = 0;
+    for(int i = 0; i < temp.count(); i++ )
+    {
+        QContact contact = mListModel->contact(temp.at(i));
+        if (mAction == KCntActionCall)
+        {
+            serviceCallMessageAction(contact, KCntActionCall);
+        }
+        else if (mAction == KCntActionSms )
+        {
+            serviceCallMessageAction(contact, "message");
+        }
+        else if (mAction == KCntActionEmail)
+        {
+            serviceEmailAction(contact);
+        }
+        else
+        {
+            serviceAllAction(contact);
+        }
+    }
+    showPreviousView();
+}
+
+void CntServiceContactFetchView::serviceCallMessageAction(QContact& aContact, QString aAction)
+{
+    CntServicesContact servicesContact;
+    //get the phonenumber
+    QList<QContactPhoneNumber> phonenumbers = aContact.details<QContactPhoneNumber>();
+    
+    Q_ASSERT_X( phonenumbers.count() > 0, "serviceCallMessageAction", "Number count is zero");
+    
+    QContactDetail detail = aContact.preferredDetail(aAction);
+    if (!detail.isEmpty())
+    {
+        //Set preferred detail for services
+        QContactPhoneNumber number = detail;
+        servicesContact.mDisplayName = aContact.displayLabel();
+        servicesContact.mPhoneNumber = number.number();
+        servicesContact.mEmailAddress = "";
+        servicesContact.mContactId = aContact.localId();
+        mServiceList.append(servicesContact);
+    }
+    else 
+    {
+        // show popup for call numbers
+        CntActionPopup *actionPopup = new CntActionPopup(&aContact);
+        bool popup = actionPopup->showActionPopup(aAction);
+        if(popup)
+        {
+            //if call numbers are present wait for signals
+            mIndex++;
+            connect( actionPopup, SIGNAL(executeContactAction(QContact&,QContactDetail, QString)), this, 
+                    SLOT(popupContactAction(QContact&, QContactDetail, QString)));
+            connect( actionPopup, SIGNAL(actionPopupCancelPressed()), this, 
+                                SLOT(actionPopupCancelSlot()));
+        }
+        else 
+        {
+            //else delete popup if no call number present
+            delete actionPopup;
+        }
+    }
+}
+
+void CntServiceContactFetchView::serviceEmailAction(QContact& aContact)
+{
+    CntServicesContact servicesContact;
+    //get the email address
+    QList<QContactEmailAddress> emailAddresses = aContact.details<QContactEmailAddress>();
+    
+    Q_ASSERT_X( emailAddresses.count() > 0, "serviceEmailAction", "email address count is zero");
+    
+    QContactDetail detail = aContact.preferredDetail("email");
+    if (!detail.isEmpty())
+    {
+        //Set preferred detail for services
+        QContactEmailAddress email = detail;
+        servicesContact.mDisplayName = aContact.displayLabel();
+        servicesContact.mPhoneNumber = "";
+        servicesContact.mEmailAddress = email.emailAddress();
+        servicesContact.mContactId = aContact.localId();
+        mServiceList.append(servicesContact);
+        
+    }
+    else 
+    {
+        // show popup for email id's 
+        CntActionPopup *actionPopup = new CntActionPopup(&aContact);
+        bool popup = actionPopup->showActionPopup("email");
+        if(popup)
+        {
+            //if email id's are present wait for signals
+            mIndex++;
+            connect( actionPopup, SIGNAL(executeContactAction(QContact&,QContactDetail, QString)), this, 
+                    SLOT(popupContactAction(QContact&, QContactDetail, QString)));
+            connect( actionPopup, SIGNAL(actionPopupCancelPressed()), this, 
+                                SLOT(actionPopupCancelSlot()));
+        }
+        else 
+        {
+            //else delete popup if no email present
+            delete actionPopup;
+        }
+    }
+}
+
+void CntServiceContactFetchView::serviceAllAction(QContact& aContact)
+{
+    CntServicesContact servicesContact;
+    servicesContact.mDisplayName = aContact.displayLabel();
+    QContactDetail callDetail = aContact.preferredDetail("call");
+    //Check for preferredDetail from call
+    // if not present check for preferredDetail for message
+    // if not present pick first phone number
+    if (!callDetail.isEmpty())
+    {
+        QContactPhoneNumber number = callDetail;
+        servicesContact.mPhoneNumber = number.number();
+    }
+    else
+    {
+        QContactDetail smsDetail = aContact.preferredDetail("message");
+        if (!callDetail.isEmpty())
+        {
+            QContactPhoneNumber number = smsDetail;
+            servicesContact.mPhoneNumber = number.number();
+        }
+        else 
+        {
+            QList<QContactPhoneNumber> phonenumbers = aContact.details<QContactPhoneNumber>();
+            if(phonenumbers.count() > 0)
+            {
+            servicesContact.mPhoneNumber = phonenumbers.first().number();
+            }
+            else
+            {
+            servicesContact.mPhoneNumber = "";
+            }
+        }
+    }
+    
+    QContactDetail emailDetail = aContact.preferredDetail("email");
+    if (!emailDetail.isEmpty())
+    {
+        QContactEmailAddress email = emailDetail;
+        servicesContact.mEmailAddress = email.emailAddress();
+    }
+    else
+    {
+        //get first email address
+        QList<QContactEmailAddress> emailAddresses = aContact.details<QContactEmailAddress>();
+        if(emailAddresses.count() > 0)
+        {
+            servicesContact.mEmailAddress = emailAddresses.first().emailAddress();
+        }
+        else 
+        {
+            servicesContact.mEmailAddress = "";
+        }
+    }
+    servicesContact.mContactId = aContact.localId();
+    mServiceList.append(servicesContact);
+}
+
+void CntServiceContactFetchView::aboutToOpenView(CntAbstractViewManager* aMgr, const CntViewParameters aArgs)
+{
+    mMgr = aMgr;
+    
+    // Set title of the view.
+    QString title = aArgs.value(KCntServiceViewParamTitle).toString();
+    mView->setTitle(title);
+    
+    // Set action filter
+    mAction = aArgs.value(ESelectedAction).toString();
+    // ESelectedAction is defined in cntviewparams.h
+
+    // Has never been implemented.
+    //QString filterStr = aArgs.value(KCntServiceViewParamFilter).toString();
+    // KCntServiceViewParamFilter is defined in cntserviceviewparams.h
+
+    if (mAction == KCntActionSms)
+        {
+            QContactActionFilter actionFilter;
+            actionFilter.setActionName("message");
+            mListModel->setFilter(actionFilter);
+        }
+        else if (mAction == KCntActionCall)
+        {
+            QContactActionFilter actionFilter;
+            actionFilter.setActionName("call");
+            mListModel->setFilter(actionFilter);
+        }
+        else if (mAction == KCntActionEmail)
+        {
+            QContactActionFilter actionFilter;
+            actionFilter.setActionName("email");
+            mListModel->setFilter(actionFilter);
+        }
+        else
+        {
+            QContactDetailFilter filter;
+            filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
+            QString typeContact = QContactType::TypeContact;
+            filter.setValue(typeContact);
+            mListModel->setFilter(filter);
+        }
+
+        // hide my card if it's not set
+        if ( mListModel->myCardId() == 0 )
+        {
+            mListModel->showMyCard( false );
+        }
+}
+
+void CntServiceContactFetchView::popupContactAction(QContact& aContact,QContactDetail contactDetail, QString aAction)
+{
+    if (aAction.compare("call", Qt::CaseInsensitive) == 0 
+           || aAction.compare("message", Qt::CaseInsensitive) == 0 )
+       {       
+           CntServicesContact servicesContact;
+           QContactPhoneNumber number = static_cast<QContactPhoneNumber>(contactDetail);
+           QString name = aContact.displayLabel();
+           servicesContact.mDisplayName = aContact.displayLabel();
+           servicesContact.mPhoneNumber = number.number();
+           servicesContact.mEmailAddress = "";
+           servicesContact.mContactId = aContact.localId();
+           mServiceList.append(servicesContact);
+           mIndex--;
+       }
+       else if (aAction.compare("email", Qt::CaseInsensitive) == 0 )
+       {
+           CntServicesContact servicesContact;
+           QContactEmailAddress email = static_cast<QContactEmailAddress>(contactDetail);
+           servicesContact.mDisplayName = aContact.displayLabel();
+           servicesContact.mPhoneNumber = "";
+           servicesContact.mEmailAddress = email.emailAddress();
+           servicesContact.mContactId = aContact.localId();
+           mServiceList.append(servicesContact);
+           mIndex--;
+       }
+    
+    if (aContact.preferredDetail(aAction).isEmpty() && (aAction == "call" || aAction == "message" || aAction == "email"))
+    {
+        aContact.setPreferredDetail(aAction, contactDetail);
+        //return value will be ignored because we cannot do anything if it fails.
+        mEngine->contactManager(SYMBIAN_BACKEND).saveContact(&aContact);
+    }
+    
+    showPreviousView();
+}
+
+void CntServiceContactFetchView::actionPopupCancelSlot()
+{
+    mIndex--;
+    showPreviousView();
+}
+
+void CntServiceContactFetchView::showPreviousView()
+{
+    if(mIndex==0)
+    {
+        QVariant variant;
+        variant.setValue(mServiceList);
+        mProvider.CompleteServiceAndCloseApp(variant);
+        
+        CntViewParameters args;
+        mMgr->back( args );
+    }
+}
+// EOF