201027
authorhgs
Wed, 21 Jul 2010 11:21:49 +0300
changeset 50 77bc263e1626
parent 49 74b30151afd6
child 51 81c360d47083
201027
contacts_plat/contacts_services_api/inc/cntservicescontact.h
contacts_plat/contacts_ui_api/inc/cntviewparams.h
contacts_plat/contacts_ui_extensions_api/inc/cntuigroupsupplier.h
contacts_plat/qt_mobility_contacts_api/qt_mobility_contacts_api.metaxml
inc/cntdebug.h
phonebookengines/cntactions/inc/cntaction.h
phonebookengines/cntactions/inc/cntemailaction.h
phonebookengines/cntactions/src/cntaction.cpp
phonebookengines/cntactions/src/cntemailaction.cpp
phonebookengines/cntfindplugin/group/cntfindplugin.mmp
phonebookengines/cntlistmodel/src/cntcache.cpp
phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_cntmaptileservice.pro
phonebookengines/cntsortplugin/group/cntsortplugin.mmp
phonebookui/pbkcommonui/inc/cntactionlauncher.h
phonebookui/pbkcommonui/inc/cntcollectionlistmodel.h
phonebookui/pbkcommonui/inc/cntcollectionlistmodelworker.h
phonebookui/pbkcommonui/inc/cntcollectionview.h
phonebookui/pbkcommonui/inc/cntcontactcardview_p.h
phonebookui/pbkcommonui/inc/cntdetaileditor.h
phonebookui/pbkcommonui/inc/cnteditview_p.h
phonebookui/pbkcommonui/inc/cnteditviewheadingitem.h
phonebookui/pbkcommonui/inc/cntgroupactionsview.h
phonebookui/pbkcommonui/inc/cntgroupmemberview.h
phonebookui/pbkcommonui/inc/cnthistoryview.h
phonebookui/pbkcommonui/inc/cnthistoryviewitem.h
phonebookui/pbkcommonui/inc/cntimageeditorview.h
phonebookui/pbkcommonui/inc/cntnamesview_p.h
phonebookui/pbkcommonui/inc/cntpresencelistener.h
phonebookui/pbkcommonui/inc/cntsavemanager.h
phonebookui/pbkcommonui/pbkcommonui.pro
phonebookui/pbkcommonui/resources/contacts_groupmembers.docml
phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml
phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.css
phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.widgetml
phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem_color.css
phonebookui/pbkcommonui/resources/style/cnthistoryviewitem.widgetml
phonebookui/pbkcommonui/src/cntactionlauncher.cpp
phonebookui/pbkcommonui/src/cntactionpopup_p.cpp
phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp
phonebookui/pbkcommonui/src/cntcollectionlistmodelworker.cpp
phonebookui/pbkcommonui/src/cntcollectionview.cpp
phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp
phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp
phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp
phonebookui/pbkcommonui/src/cntdetaileditor.cpp
phonebookui/pbkcommonui/src/cnteditview_p.cpp
phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp
phonebookui/pbkcommonui/src/cntfetchcontactsview.cpp
phonebookui/pbkcommonui/src/cntgroupactionsview.cpp
phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp
phonebookui/pbkcommonui/src/cntgroupmemberview.cpp
phonebookui/pbkcommonui/src/cnthistoryview.cpp
phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp
phonebookui/pbkcommonui/src/cntimageeditorview.cpp
phonebookui/pbkcommonui/src/cntimagelabel.cpp
phonebookui/pbkcommonui/src/cntimportsview.cpp
phonebookui/pbkcommonui/src/cntmycardview.cpp
phonebookui/pbkcommonui/src/cntnamesview_p.cpp
phonebookui/pbkcommonui/src/cntpresencelistener.cpp
phonebookui/pbkcommonui/src/cntsavemanager.cpp
phonebookui/phonebookapp/src/main.cpp
phonebookui/phonebookservices/inc/cntabstractserviceprovider.h
phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h
phonebookui/phonebookservices/inc/cntservicecontactcardview.h
phonebookui/phonebookservices/inc/cntservicecontactfetchview.h
phonebookui/phonebookservices/inc/cntservicecontactselectionview.h
phonebookui/phonebookservices/inc/cntserviceeditview.h
phonebookui/phonebookservices/inc/cntservicehandler.h
phonebookui/phonebookservices/inc/cntservicemainwindow.h
phonebookui/phonebookservices/inc/cntserviceprovideredit.h
phonebookui/phonebookservices/inc/cntserviceproviderfetch.h
phonebookui/phonebookservices/inc/cntserviceproviderold.h
phonebookui/phonebookservices/inc/cntserviceproviderold2.h
phonebookui/phonebookservices/inc/cntserviceproviderviewing.h
phonebookui/phonebookservices/inc/cntservices.h
phonebookui/phonebookservices/inc/cntservicestrings.h
phonebookui/phonebookservices/inc/cntservicesubeditview.h
phonebookui/phonebookservices/inc/cntserviceviewfactory.h
phonebookui/phonebookservices/inc/cntserviceviewmanager.h
phonebookui/phonebookservices/inc/cntserviceviewparams.h
phonebookui/phonebookservices/phonebookservices.pro
phonebookui/phonebookservices/service_conf.xml
phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp
phonebookui/phonebookservices/src/cntservicecontactcardview.cpp
phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp
phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp
phonebookui/phonebookservices/src/cntserviceeditview.cpp
phonebookui/phonebookservices/src/cntservicehandler.cpp
phonebookui/phonebookservices/src/cntservicemainwindow.cpp
phonebookui/phonebookservices/src/cntserviceprovideredit.cpp
phonebookui/phonebookservices/src/cntserviceproviderfetch.cpp
phonebookui/phonebookservices/src/cntserviceproviderold.cpp
phonebookui/phonebookservices/src/cntserviceproviderold2.cpp
phonebookui/phonebookservices/src/cntserviceproviderviewing.cpp
phonebookui/phonebookservices/src/cntservices.cpp
phonebookui/phonebookservices/src/cntservicesubeditview.cpp
phonebookui/phonebookservices/src/cntserviceviewfactory.cpp
phonebookui/phonebookservices/src/cntserviceviewmanager.cpp
phonebookui/phonebookservices/src/main.cpp
phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/main.cpp
phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp
phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h
phonebookui/rom/phonebook.iby
pimprotocols/pbap/group/bld.inf
pimprotocols/phonebooksync/group/bld.inf
--- a/contacts_plat/contacts_services_api/inc/cntservicescontact.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/contacts_plat/contacts_services_api/inc/cntservicescontact.h	Wed Jul 21 11:21:49 2010 +0300
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:
+* Description: Data container & constants for "phonebookservices" Qt Highway services.
 *
 */
 
@@ -22,21 +22,27 @@
 #include <QString>
 #include <xqserviceipcmarshal.h>
 
-/*Supported actions*/
+//Action filter definitions:
+
+/// Action filter that DOES NOT filter away based on supported action.
 const QString KCntActionAll("all");
+/// Action filter for showing only contacts that support calling.
 const QString KCntActionCall("call");
+/// Action filter for showing only contacts that suppport SMS sending.
 const QString KCntActionSms("sms");
+// Action filter for showing only contacts that support emailing.
 const QString KCntActionEmail("email");
 
-/*Supported filters*/
-const QString KCntFilterDisplayAll("all");
-const QString KCntFilterDisplayFavorites("favorites");
 
-/*Supported Fetch Selection Modes*/
-const QString KCntNoSelectionMode("No Selection");
-const QString KCntSingleSelectionMode("SingleSelect");
-const QString KCntMultiSelectionMode("MultiSelect");
+/// Return values from editing service
+const int KCntServicesReturnValueContactSaved       = 1;
+const int KCntServicesReturnValueContactDeleted     = -1;
+const int KCntServicesReturnValueContactNotModified = 0;
 
+
+/**
+ * A data container class to be used with "phonebookservices" Qt Highway services.
+ */
 class CntServicesContact
 {
 public:
@@ -70,6 +76,23 @@
 
 typedef QList<CntServicesContact> CntServicesContactList;
 
+//-------------------------------------------------------------------
+// These are DEPRECATED and will be removed soon:
+
+/// @deprecated
+const QString KCntFilterDisplayAll("all");
+/// @deprecated
+const QString KCntFilterDisplayFavorites("favorites");
+
+/// @deprecated
+const QString KCntNoSelectionMode("No Selection");
+/// @deprecated
+const QString KCntSingleSelectionMode("SingleSelect");
+/// @deprecated
+const QString KCntMultiSelectionMode("MultiSelect");
+
+//-------------------------------------------------------------------
+
 Q_DECLARE_USER_METATYPE(CntServicesContact)
 Q_DECLARE_USER_METATYPE_NO_OPERATORS(CntServicesContactList)
 
--- a/contacts_plat/contacts_ui_api/inc/cntviewparams.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/contacts_plat/contacts_ui_api/inc/cntviewparams.h	Wed Jul 21 11:21:49 2010 +0300
@@ -38,6 +38,7 @@
     ESelectedDetail,
     ESelectionMode,
     EMyCard,
+    EFinder,
 	ECustomParam = 100
 };
 
--- a/contacts_plat/contacts_ui_extensions_api/inc/cntuigroupsupplier.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/contacts_plat/contacts_ui_extensions_api/inc/cntuigroupsupplier.h	Wed Jul 21 11:21:49 2010 +0300
@@ -24,9 +24,18 @@
 /**
  * UI extension class that supplies groups to phonebook groups UI.
  */
-class CntUiGroupSupplier
+class CntUiGroupSupplier : public QObject
 {
- public:
+public:
+    CntUiGroupSupplier() {}
+
+    /**
+     * Returns true if this supplier should be handled asynchronously and
+     * false otherwise.
+     *
+     * @return bool, asynchronity
+     */  
+    virtual bool isAsynch() const = 0;
 
     /**
      * Returns number of groups provided by the extension.
@@ -49,6 +58,14 @@
     {
         return NULL;
     }
+
+signals:
+    /**
+     * Asynchronous suppliers should re-implement this signal and emit it
+     * once group loading is ready.
+     */  
+    void groupsReady();
+
 protected:
     // prevent deleting by client
     virtual ~CntUiGroupSupplier() {}
--- a/contacts_plat/qt_mobility_contacts_api/qt_mobility_contacts_api.metaxml	Wed Jul 21 11:09:07 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<api id="58ef187bb77e8e3bb353189b9b4a57aa" dataversion="2.0">
-  <name>Qt Mobility Contacts API</name>
-  <description>Qt Mobility Contacts API for managing contacts data.</description>
-  <type>c++</type>
-  <collection>phonebookengines</collection>
-  <libs>
-    <lib name="QtContacts.lib"/>
-  </libs>
-  <release category="platform" sinceversion="0.9"/>
-  <attributes>
-    <htmldocprovided>no</htmldocprovided>
-    <adaptation>no</adaptation>
-  </attributes>
-</api>
--- a/inc/cntdebug.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/inc/cntdebug.h	Wed Jul 21 11:21:49 2010 +0300
@@ -23,6 +23,7 @@
 #include <QtGlobal> // qDebug()
 
 // #define TRACK_MEMORY_LEAKS
+// #define CNT_TRACE2FILE
 
 /*!
     \def CNT_UNUSED(name)
@@ -349,8 +350,7 @@
     by the streaming operator <<.
 */
 
-
-#ifdef _DEBUG
+#if defined (_DEBUG) || defined (CNT_TRACE2FILE)
     #define CNT_UNUSED(name)
     #define CNT_STATIC_ENTRY qDebug() << __PRETTY_FUNCTION__ << "entry";
     #define CNT_STATIC_ENTRY_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << "entry," << args;
@@ -360,6 +360,9 @@
     #define CNT_EXIT_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << "exit," << args;
     #define CNT_LOG qDebug() << __PRETTY_FUNCTION__ << "this" << (void *)this;
     #define CNT_LOG_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << args;
+    #define CNT_WARNING(args) qWarning() << __PRETTY_FUNCTION__ << args;
+    #define CNT_CRITICAL(args) qCritical() << __PRETTY_FUNCTION__ << args;
+    #define CNT_FATAL(args) qFatal() << __PRETTY_FUNCTION__ << args;
 #else
     #define CNT_UNUSED(name) Q_UNUSED(name)
     #define CNT_STATIC_ENTRY
@@ -370,8 +373,11 @@
     #define CNT_EXIT_ARGS(args)
     #define CNT_LOG
     #define CNT_LOG_ARGS(args)
-#endif // _DEBUG
-
+    #define CNT_WARNING(args)
+    #define CNT_CRITICAL(args)
+    #define CNT_FATAL(args)
+#endif // _DEBUG || CNT_TRACE2FILE
+    
 // for tracing memory leaks
 #ifdef TRACK_MEMORY_LEAKS
     #include <hbapplication.h>
@@ -406,4 +412,68 @@
     #define CNT_TRACK_QOBJECTLIVES(obj)
 #endif
 
+// filter phonebook app traces
+#ifdef CNT_TRACE2FILE
+    #include <QFile>
+    #include <QTextStream>
+    static void cntCustomLog2File(QtMsgType type, const char *msg)
+    {   
+        QFile logFile("c:/cnt_logs.log");
+        if (!logFile.open(QIODevice::Append | QIODevice::Text))
+        {
+            qFatal("error opening c:/cnt_logs.log file");
+            return;
+        }
+
+        QTextStream out(&logFile);
+        switch (type)
+        {
+            case QtDebugMsg:
+                out << "[CNT] Debug: " << msg;
+                break;
+            case QtWarningMsg:
+                out << "[CNT] Warning: " << msg;
+                break;
+            case QtCriticalMsg:
+                out << "[CNT] Critical: " << msg;
+                break;
+            case QtFatalMsg:
+                out << "[CNT] Fatal: " << msg;
+                abort();
+                break;
+            default:
+                out << "[CNT] No Log Selection Type: " << msg;
+                break;
+        }
+    }
+    #define MSG_HANDLER cntCustomLog2File
+#else
+    #ifdef Q_OS_SYMBIAN
+        #include <e32debug.h>
+        static void cntCustomLog(QtMsgType type, const char *msg)
+        {
+            switch (type) {
+                case QtDebugMsg:
+                    RDebug::Printf("[CNT] Debug: %s\n", msg);
+                    break;
+                case QtWarningMsg:
+                    RDebug::Printf("[CNT] Warning: %s\n", msg);
+                    break;
+                case QtCriticalMsg:
+                    RDebug::Printf("[CNT] Critical: %s\n", msg);
+                    break;
+                case QtFatalMsg:
+                    RDebug::Printf("[CNT] Fatal: %s\n", msg);
+                    abort();
+                    break;
+                default:
+                    break;
+            }
+        }
+        #define MSG_HANDLER cntCustomLog
+    #else
+        #define MSG_HANDLER 0
+    #endif  // Q_OS_SYMBIAN
+#endif  // CNT_TRACE2FILE
+
 #endif // CNTDEBUG_H
--- a/phonebookengines/cntactions/inc/cntaction.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntactions/inc/cntaction.h	Wed Jul 21 11:21:49 2010 +0300
@@ -79,6 +79,7 @@
 	QVariantMap m_result; 		//result returned to client
 	QContact m_contact;    		//contact passed to invokeAction
 	QContactDetail m_detail; 	//detail passed to invokeAction
+	QVariantMap m_data; 	//data passed to invokeAction
 	QContactAction::State m_state;
 	XQAiwRequest* m_request;
     XQApplicationManager    m_AppManager;
--- a/phonebookengines/cntactions/inc/cntemailaction.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntactions/inc/cntemailaction.h	Wed Jul 21 11:21:49 2010 +0300
@@ -35,8 +35,6 @@
     QList<QContactDetail> supportedDetails(const QContact& contact) const;
     CntEmailAction* clone() const;
     void performAction();
-private:
-    XQAiwRequest    *mRequest;
 };
 
 #endif
--- a/phonebookengines/cntactions/src/cntaction.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntactions/src/cntaction.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -116,10 +116,11 @@
 }
 
 
-bool CntAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& /*parameters*/)
+bool CntAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& data)
 {
 	m_contact = contact;
 	m_detail  = detail;
+	m_data = data;
 	
 	QTimer::singleShot(1, this, SLOT(performAction()));
 	m_state = QContactAction::ActiveState;
@@ -159,28 +160,38 @@
 //common code to perform a call, videocall and message action
 void CntAction::performNumberAction(const QString &interface, const QString &operation)
 {
-    XQApplicationManager appMng;
     QVariantList args;
     QVariant retValue;
     
     // TODO: Using XQApplicationManager is not working with calls
     // The factory method cannot create a request. Find out why
-    bool isCallAction = m_actionName == "call";
+    bool isCallAction = (m_actionName == "call" || m_actionName == "videocall");
     XQServiceRequest snd(interface, operation, false);
 
     delete m_request;
     m_request = NULL;
-    m_request = appMng.create(interface, operation, false); // not embedded
+    m_request = m_AppManager.create(interface, operation, false); // not embedded
+    
     if (!isCallAction) {
         if (!m_request) {
             emitResult(GeneralError, retValue);
             return;
         }
     }
-	
+    
+    //QContactType == TypeGroup
+    if (QContactType::TypeGroup == m_contact.type()) {
+        QContactPhoneNumber conferenceCall = m_contact.detail<QContactPhoneNumber>();
+        args << conferenceCall.number() << m_contact.localId() << m_contact.displayLabel();
+        
+        // TODO remove once call action works
+        snd << conferenceCall.number() << m_contact.localId() << m_contact.displayLabel();
+        snd.send(retValue);
+        emitResult(snd.latestError(), retValue);
+    }
+    //QContactType == TypeContact
     //detail exist use it
-	if (m_detail.definitionName() == QContactPhoneNumber::DefinitionName)
-	{
+    else if (m_detail.definitionName() == QContactPhoneNumber::DefinitionName) {
 		const QContactPhoneNumber &phoneNumber = static_cast<const QContactPhoneNumber &>(m_detail);
 		
 		args << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel();
@@ -188,29 +199,29 @@
 		// TODO remove once call action works
 		if (isCallAction) {
             snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel();
-            emitResult(snd.send(retValue), retValue);
-	    } else {
+            snd.send(retValue);
+            emitResult(snd.latestError(), retValue);
+	    } 
+		else {
 	       m_request->setArguments(args);
-	       m_request->setSynchronous(true);
-           emitResult(m_request->send(retValue), retValue);
+	       m_request->send(retValue);
+           emitResult(m_request->lastError(), retValue);
 	    }
 	}
-	
-	//if no detail, pick preferred
-	else if(m_detail.isEmpty())
+    //QContactType == TypeContact
+    //if no detail, pick preferred
+	else if (m_detail.isEmpty())
 	{
 		QContactDetail detail = m_contact.preferredDetail(m_actionName);
 		QContactPhoneNumber phoneNumber;
 	
 		//if preferred is empty pick first phonenumber
-		if(detail.isEmpty())
-		{
+		if (detail.isEmpty()) {
 			phoneNumber = m_contact.detail<QContactPhoneNumber>();
 		}
 		
 		//if not empty, cast detail to phonenumber
-		else
-		{
+		else {
 			phoneNumber = static_cast<QContactPhoneNumber>(detail);
 		}
 		
@@ -219,17 +230,17 @@
         // TODO remove once call action works
         if (isCallAction) {
             snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel();
-            emitResult(snd.send(retValue), retValue);
-        } else {
+            snd.send(retValue);
+            emitResult(snd.latestError(), retValue);
+        }
+        else {
             m_request->setArguments(args);
-            m_request->setSynchronous(true);
-            emitResult(m_request->send(retValue), retValue);
+            m_request->send(retValue);
+            emitResult(m_request->lastError(), retValue);
         }
 	}
-	
 	//else return an error
-	else
-	{
+	else {
 		emitResult(GeneralError, retValue);
 	}
 }
@@ -244,11 +255,11 @@
         m_result.insert("XQAiwRequest Error", m_request->lastError());
 	}
 	
-	if (errorCode == 0){
+	if (errorCode == 0) {
 		m_state = QContactAction::FinishedState;
 	}
 	
-	else{
+	else {
 		m_state = QContactAction::FinishedWithErrorState;
 	}
 	
--- a/phonebookengines/cntactions/src/cntemailaction.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntactions/src/cntemailaction.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -29,12 +29,10 @@
 CntEmailAction::CntEmailAction() : 
     CntAction("email")
 {
-    mRequest = m_AppManager.create(XQI_EMAIL_MESSAGE_SEND, "send(QVariant)", true);
 }
 
 CntEmailAction::~CntEmailAction()
 {
-    delete mRequest;
 }
 
 QContactFilter CntEmailAction::contactFilter(const QVariant& value) const
@@ -65,61 +63,81 @@
 void CntEmailAction::performAction()
 {
     QVariant retValue;
-
-    if (mRequest)
-    {
+    delete m_request;
+    m_request = NULL;
+    m_request = m_AppManager.create(XQI_EMAIL_MESSAGE_SEND, "send(QVariant)", true);
+    
+    if (m_request) {
         QMap<QString, QVariant> map;
         QStringList recipients;
         QList<QVariant> data;
 
+        //QContactType == TypeGroup
+        if (QContactType::TypeGroup == m_contact.type()) {
+            QStringList emails;
+            QVariant value = m_data.value("email");
+            if (value.canConvert<QStringList>()) {
+                emails = value.toStringList();
+            }
+            
+            if (!emails.isEmpty()) {
+                for (int i=0;i<emails.count();i++) {
+                    recipients.append(emails.at(i));
+                }
+                map.insert(EMAIL_SEND_TO_KEY, recipients);
+                data.append(map);
+
+                m_request->setArguments(data);
+                m_request->send(retValue);
+                emitResult(m_request->lastError(), retValue);
+            }
+            else {
+                emitResult(GeneralError, retValue);
+            }
+        }
+        //QContactType == TypeContact
         // If detail exists use it.
-        if (m_detail.definitionName() == QContactEmailAddress::DefinitionName)
-        {
+        else if (m_detail.definitionName() == QContactEmailAddress::DefinitionName) {
             const QContactEmailAddress &email = static_cast<const QContactEmailAddress &>(m_detail);
 
             recipients.append(email.emailAddress());
             map.insert(EMAIL_SEND_TO_KEY, recipients);
             data.append(map);
 
-            mRequest->setArguments(data);
-            mRequest->send(retValue);
-            emitResult(mRequest->lastError(), retValue);
+            m_request->setArguments(data);
+            m_request->send(retValue);
+            emitResult(m_request->lastError(), retValue);
         }
 
         // If no detail, pick preferred.
         // Todo : Temporary fix. Remove setting preferred when selection popup feature available.
-        else if (m_detail.isEmpty())
-        {
+        else if (m_detail.isEmpty()) {
             QContactDetail detail = m_contact.preferredDetail(m_actionName);
             QContactEmailAddress email;
 
             // If preferred is empty pick first email.
-            if(detail.isEmpty())
-            {
+            if (detail.isEmpty()) {
                 email = m_contact.detail<QContactEmailAddress>();
             }
-            else
-            {
+            else {
                 email = static_cast<QContactEmailAddress>(detail);
             }
 
             recipients.append(email.emailAddress());
             map.insert(EMAIL_SEND_TO_KEY, recipients);
-            data.append(map);			
+            data.append(map);
 
-            mRequest->setArguments(data);
-            mRequest->send(retValue);
-            emitResult(mRequest->lastError(), retValue);
+            m_request->setArguments(data);
+            m_request->send(retValue);
+            emitResult(m_request->lastError(), retValue);
         }
-        else
-        {
+        else {
             emitResult(GeneralError, retValue);
         }
     }
 
     // Service not found.
-    else
-    {
+    else {
         emitResult(GeneralError, retValue);
     }
 }
--- a/phonebookengines/cntfindplugin/group/cntfindplugin.mmp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntfindplugin/group/cntfindplugin.mmp	Wed Jul 21 11:21:49 2010 +0300
@@ -33,8 +33,6 @@
 
 USERINCLUDE     ../group
 APP_LAYER_SYSTEMINCLUDE
-// Symbian uses #include <ecom.h> in cntviewfindconfig.h
-SYSTEMINCLUDE   /epoc32/include/ecom
 
 START RESOURCE  101f85f4.rss
 TARGET          cntfindplugin
--- a/phonebookengines/cntlistmodel/src/cntcache.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntlistmodel/src/cntcache.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -439,9 +439,9 @@
     bool foundContact = false;
 
     QContactFetchHint nameOnlyFetchHint;
-    QStringList details;
+    /*QStringList details;
     details << QContactDisplayLabel::DefinitionName;
-    nameOnlyFetchHint.setDetailDefinitionsHint(details);
+    nameOnlyFetchHint.setDetailDefinitionsHint(details);*/
     nameOnlyFetchHint.setOptimizationHints(QContactFetchHint::NoRelationships);
     QContact contact = mContactManager->contact(contactId, nameOnlyFetchHint);
     
@@ -648,7 +648,7 @@
 {
 	CNT_ENTRY
 
-    delete this;
+    deleteLater();
 
 	CNT_EXIT
 }
--- a/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_cntmaptileservice.pro	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_cntmaptileservice.pro	Wed Jul 21 11:21:49 2010 +0300
@@ -40,7 +40,6 @@
     :BLD_INF_RULES.prj_exports += "data/preferredaddressmap.png /epoc32/winscw/c/maptiletest/preferredaddressmap.png"
     :BLD_INF_RULES.prj_exports += "data/workaddressmap.png /epoc32/winscw/c/maptiletest/workaddressmap.png"
     :BLD_INF_RULES.prj_exports += "data/homeaddressmap.png /epoc32/winscw/c/maptiletest/homeaddressmap.png"
-    SYSTEMINCLUDEPATH += \epoc32\include\stdapis
 }
 
 SOURCES += src/testrunner.cpp
--- a/phonebookengines/cntsortplugin/group/cntsortplugin.mmp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookengines/cntsortplugin/group/cntsortplugin.mmp	Wed Jul 21 11:21:49 2010 +0300
@@ -34,8 +34,6 @@
 
 USERINCLUDE     ../group
 APP_LAYER_SYSTEMINCLUDE
-// Symbian uses #include <ecom.h> in cntviewsortplugin.h
-SYSTEMINCLUDE   /epoc32/include/ecom
 
 START RESOURCE  101f85a9.rss
 TARGET          cntsortplugin
--- a/phonebookui/pbkcommonui/inc/cntactionlauncher.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntactionlauncher.h	Wed Jul 21 11:21:49 2010 +0300
@@ -34,6 +34,7 @@
     
 public:
     bool execute( QContact aContact, QContactDetail aDetail );
+    bool execute( QContact aContact, QContactDetail aDetail, QVariantMap aParameters );
     bool execute( QContact aContact, QContactDetail aDetail, QContactActionDescriptor aActionDescriptor );
     
 signals:
--- a/phonebookui/pbkcommonui/inc/cntcollectionlistmodel.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntcollectionlistmodel.h	Wed Jul 21 11:21:49 2010 +0300
@@ -46,17 +46,25 @@
     CntCollectionListModel(QContactManager *manager, CntExtensionManager &extensionManager, QObject *parent = 0);
     ~CntCollectionListModel();
     
-public: // from QAbstractItemModel
+public:
+    // from QAbstractItemModel
     QVariant data(const QModelIndex& index, int role) const;
     int rowCount(const QModelIndex& parent = QModelIndex()) const;
     bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
+    bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
     
 public:
+    // removing and adding groups
     void removeGroup(int localId);
+    void addGroup(int localId);
+    
+    // extension (plugin) group handling
     bool isExtensionGroup(const QModelIndex &index);
     CntViewParameters extensionGroupActivated(int row);
     void extensionGroupLongPressed(int row, const QPointF& coords, CntExtensionGroupCallback* interface);
     
+    QModelIndex indexOfGroup(int localId);
+    
 private:
     void doConstruct();
     void initializeStaticGroups();
@@ -69,8 +77,9 @@
     bool validateRowIndex(const int index) const;
     
 private slots:
-    void informationUpdated(int row, const QString& secondRowText, int memberCount);
+    void informationUpdated(int id, const QString& secondRowText, int memberCount);
     void onIconReady(const QPixmap& pixmap, void *data, int id, int error);
+    void extensionGroupsReady();
     
 private:
     QSharedDataPointer<CntCollectionListModelData>  d;
--- a/phonebookui/pbkcommonui/inc/cntcollectionlistmodelworker.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntcollectionlistmodelworker.h	Wed Jul 21 11:21:49 2010 +0300
@@ -33,6 +33,7 @@
 class CntCollectionListModelWorker : public QThread
 {
     Q_OBJECT
+    friend class TestCntCollectionListModelWorker;
     
 public:
     CntCollectionListModelWorker(QString unnamed, QString noFavs, QString noMembers, int sortOrder);
@@ -41,14 +42,14 @@
     void run();
     bool event(QEvent *event);
     
-    void scheduleJob(int row, int id);
+    void scheduleJob(int id);
 
 private:
     void processJobs();
-    void fetchInformation(int row, int id);
+    void fetchInformation(int id);
     
 signals:
-    void fetchDone(int row, const QString& secondRowText, int memberCount);
+    void fetchDone(int id, const QString& secondRowText, int memberCount);
     
 private:
     bool                        mStarted;
@@ -56,7 +57,7 @@
     bool                        mStopped;
     QMutex                      mMutex;
     
-    QList< QPair<int,int> >     mJobs;
+    QList<int>                  mJobs;
 
     QContactManager            *mManager;
     
--- a/phonebookui/pbkcommonui/inc/cntcollectionview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntcollectionview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -58,6 +58,7 @@
 
 private slots:
     void showPreviousView();
+    void showNamesViewWithFinder();
     void openGroup(const QModelIndex &index);
     
     void showContextMenu(HbAbstractViewItem *item, const QPointF &coords);
@@ -70,7 +71,7 @@
     void refreshDataModel();
     
     void deleteGroup(QContact group);
-    void handleDeleteGroup(HbAction* action);
+    void handleDeleteGroup(int action);
     
     void deleteGroups();
     void handleDeleteGroups(HbAction* action);
--- a/phonebookui/pbkcommonui/inc/cntcontactcardview_p.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntcontactcardview_p.h	Wed Jul 21 11:21:49 2010 +0300
@@ -98,7 +98,7 @@
     void sendBusinessCard();
     void addToGroup();
     void deleteContact();
-    void handleDeleteContact(HbAction *action);
+    void handleDeleteContact(int action);
     void setAsFavorite();
     void removeFromFavorite();
     void actionExecuted(CntActionLauncher* aAction);
@@ -123,7 +123,9 @@
 	void setMaptileLabel( HbLabel*& mapLabel, const HbIcon& icon );
 	void updateMaptileImage();
 	HbLabel* loadMaptileLabel( int addressType );
-    
+	
+	// Presence related function
+	void updateItemPresence(const QString& accountUri, bool online);
 	    
 public:
     CntContactCardView* q_ptr;    
@@ -166,6 +168,8 @@
     QContactAvatar              *mAvatar;
     bool                        mIsHandlingMenu;
     QMap<QString, CntContactCardDetailItem*> mPreferredItems;
+    /// maps a QContactOnlineAccount (for example "sip:sip@sip.com") to a detail item
+    QMap<QString, CntContactCardDetailItem*> mPresenceItems;
     int                         mFavoriteGroupId;
     CntDocumentLoader           *mLoader;
     QContactAction              *mContactAction;
--- a/phonebookui/pbkcommonui/inc/cntdetaileditor.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntdetaileditor.h	Wed Jul 21 11:21:49 2010 +0300
@@ -31,6 +31,7 @@
 class HbView;
 class HbAction;
 class CntEditorFactory;
+class CntSaveManager;
 
 class CntDetailEditor : public QObject,
                         public CntAbstractView
@@ -47,6 +48,8 @@
     void insertField();
     void handleItemShown(const QModelIndex& aIndex );
     
+    void saveContact();
+    
 public:
     void setViewId( int aId );
     void setHeader( QString aHeader );
@@ -79,6 +82,7 @@
     HbAction                       *mSoftkey;
     HbAction                       *mCancel;
     CntViewParameters               mArgs;
+    CntSaveManager                 *mSaveManager; // own
     
     friend class TestCntDetailEditor;
     };
--- a/phonebookui/pbkcommonui/inc/cnteditview_p.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cnteditview_p.h	Wed Jul 21 11:21:49 2010 +0300
@@ -43,6 +43,7 @@
 class QAction;
 class HbMenu;
 class XQAiwRequest;
+class CntSaveManager;
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -76,7 +77,7 @@
     void addDetailItem();
     void handleAddDetailItem(HbAction *aAction);
     void deleteContact();
-    void handleDeleteContact(HbAction *action);
+    void handleDeleteContact(int action);
     void discardChanges();
     void saveChanges();
     
@@ -89,7 +90,6 @@
     void ringToneFetchHandleError(int errorCode, const QString& errorMessage);
     void ringToneFetchHandleOk(const QVariant &result);
 
-    
 private:
     void loadAvatar();
     HbMenu* createPopup( const QModelIndex aIndex, CntEditViewItem* aDetail );
@@ -97,7 +97,6 @@
     void editDetail( CntEditViewItem* aDetail );
     void removeDetail( CntEditViewItem* aDetail, const QModelIndex& aIndex );
     void setSelectedContact( QContact aContact );
-    void setPreferredDetails( QContact* aContact );
     void fetchTone();
     void changeEditorView();
     
@@ -128,6 +127,7 @@
     XQAiwRequest* mReq;
     XQApplicationManager mAppMgr;
     HbMenu *mMenu;
+    CntSaveManager* mSaveManager; // own
 
 };
 #endif /* CNTEDITVIEW_P_H_ */
--- a/phonebookui/pbkcommonui/inc/cnteditviewheadingitem.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cnteditviewheadingitem.h	Wed Jul 21 11:21:49 2010 +0300
@@ -76,6 +76,7 @@
     HbTextItem              *mLabel;
     HbTextItem              *mSecondLabel;
     HbFrameItem             *mFrameItem;
+    HbFrameItem             *mFocusItem;
     HbTouchArea             *mIconTouchArea;
 
     bool                     mIconFocused;
--- a/phonebookui/pbkcommonui/inc/cntgroupactionsview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntgroupactionsview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -30,6 +30,7 @@
 class HbAbstractViewItem;
 class QModelIndex;
 class QStandardItemModel;
+class CntActionLauncher;
 
 
 QTM_BEGIN_NAMESPACE
@@ -61,13 +62,17 @@
     
     void showPreviousView();
     void editGroup();
+    void listItemSelected(const QModelIndex &index);
+    void executeAction(QContact&, QContactDetail, QString);
+    void actionExecuted(CntActionLauncher* aAction);
+    void actionCancelled();
 
 #ifdef PBK_UNIT_TEST
 public:
 #else
 private:
 #endif      
-    void populatelist(QString label,HbIcon icon, QString secondaryText);
+    void populatelist(QString label,HbIcon icon, QString secondaryText, QString action);
    
 #ifdef PBK_UNIT_TEST
 public:
@@ -84,7 +89,8 @@
 
     HbAction*                   mSoftkey; // owned by view
     HbListView*                 mListView; // owned by layout
-
+    int                         mPopupCount;
+    QStringList                 mActionParams;
 };
 
 #endif // CNTGROUPACTIONSVIEW_H
--- a/phonebookui/pbkcommonui/inc/cntgroupmemberview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntgroupmemberview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -70,7 +70,7 @@
     void handleManageMembers();
     void editGroup();
     void deleteGroup();
-    void handleDeleteGroup(HbAction *action);
+    void handleDeleteGroup(int action);
     
     void showContextMenu(HbAbstractViewItem *item, const QPointF &coords);
     void handleMenu(HbAction* action);
--- a/phonebookui/pbkcommonui/inc/cnthistoryview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cnthistoryview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -51,7 +51,7 @@
 public slots:
     void updateScrollingPosition();
     void clearHistory();
-    void handleClearHistory(HbAction *action);
+    void handleClearHistory(int action);
     void itemActivated(const QModelIndex &index);
     void showPreviousView();
     void showClearHistoryMenu();
--- a/phonebookui/pbkcommonui/inc/cnthistoryviewitem.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cnthistoryviewitem.h	Wed Jul 21 11:21:49 2010 +0300
@@ -50,6 +50,7 @@
      * Overriden method to draw the custom item in the list view
      */
     void updateChildItems();
+    bool event(QEvent* e);
     
     bool getIncoming() const { return mIncoming; }
     bool isNewMessage() const { return mNewMessage; }
--- a/phonebookui/pbkcommonui/inc/cntimageeditorview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntimageeditorview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -31,6 +31,7 @@
 class HbAction;
 class QStandardItemModel;
 class QModelIndex;
+class CntSaveManager;
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -75,6 +76,7 @@
     void setOrientation(Qt::Orientation orientation);
     void listViewActivated(const QModelIndex &index);
     void handleError(int errorCode, const QString& errorMessage);
+    void saveContact();
 
 
 #ifdef PBK_UNIT_TEST
@@ -95,6 +97,7 @@
     HbDocumentLoader         mDocumentLoader;
     HbListView              *mListView; // owned by layout
     QStandardItemModel      *mModel; // own
+    CntSaveManager          *mSaveManager; // own
     
     CntViewParameters       mArgs;
 };
--- a/phonebookui/pbkcommonui/inc/cntnamesview_p.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntnamesview_p.h	Wed Jul 21 11:21:49 2010 +0300
@@ -70,9 +70,9 @@
     void showContextMenu(HbAbstractViewItem* aItem, QPointF aPoint);
     void showSettings();
     
-     void executeAction( QContact& aContact, QContactDetail aDetail, QString aAction );
+    void executeAction( QContact& aContact, QContactDetail aDetail, QString aAction );
     void actionExecuted( CntActionLauncher* aAction );
-    void handleDeleteContact( HbAction* aAction );
+    void handleDeleteContact( int aAction );
     void importSim();
     
     void handleContactAddition(const QList<QContactLocalId> & aAddedList);
--- a/phonebookui/pbkcommonui/inc/cntpresencelistener.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/inc/cntpresencelistener.h	Wed Jul 21 11:21:49 2010 +0300
@@ -31,6 +31,11 @@
 
 QTM_USE_NAMESPACE
 
+/**
+    Presence listener for contact card. It provides aggregated
+    presence information for a contact and separately for each
+    valid QContactOnlineAccount.
+*/
 class CntPresenceListener : public QObject
 {
     friend class TestCntPresenceListener;
@@ -50,7 +55,9 @@
     bool parsePresence(QList<PrcPresenceBuddyInfoQt*> buddyList);
     
 signals:
-    void accountPresenceUpdated(QString accountUri, bool online);
+    /// account-specific presence status
+    void accountPresenceUpdated(const QString& accountUri, bool online);
+    /// aggregated presence status for this contact
     void fullPresenceUpdated(bool online);
     
 private:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/pbkcommonui/inc/cntsavemanager.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,73 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTSAVEMANAGER_H
+#define CNTSAVEMANAGER_H
+
+#include <QObject>
+#include <qtcontacts.h>
+
+QTM_BEGIN_NAMESPACE
+class QContact;
+class QContactAvatar;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+/*!
+    Contact saving helper class. Used mainly in edit view for contact saving,
+    but should also be used in other (special) cases a contact needs to be saved.
+    For example "forcing" phonebook to shut down (end key, from task swapper etc..)
+    in detail editors.
+*/
+class CntSaveManager : public QObject
+{
+    friend class TestCntSaveManager;
+    Q_OBJECT
+    
+public:
+    enum CntSaveResult
+    {
+        ESaved = 0,
+        EUpdated,
+        EDeleted,
+        EFailed,
+        ENothingDone
+    };
+    
+    enum CntContactType
+    {
+        EContact = 0,
+        EMyCard,
+        EGroup
+    };
+    
+public:
+    CntSaveManager(CntContactType type = EContact, QObject* parent = NULL);
+    ~CntSaveManager();
+    
+    CntSaveResult saveContact(QContact* aContact, QContactManager* aManager);
+    
+private:
+    void setPreferredDetails(QContact* aContact);
+    
+private:
+    CntContactType   mContactType;
+    
+};
+
+#endif // CNTIMAGEEDITORVIEW_H
--- a/phonebookui/pbkcommonui/pbkcommonui.pro	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/pbkcommonui.pro	Wed Jul 21 11:21:49 2010 +0300
@@ -137,8 +137,8 @@
     inc/cntcommondetailviewitem.h \
     ../../inc/cntdebug.h \
     inc/cntactionpopup_p.h \
-    inc/cntactionpopup.h
-    
+    inc/cntactionpopup.h \
+    inc/cntsavemanager.h
     
     
 SOURCES += \
@@ -211,7 +211,8 @@
     src/cntsettingsmodel.cpp \
     src/cntcommondetailviewitem.cpp \
     src/cntactionpopup_p.cpp \
-    src/cntactionpopup.cpp
+    src/cntactionpopup.cpp \
+    src/cntsavemanager.cpp
     
 RESOURCES += resources\pbkcommonui.qrc
 
--- a/phonebookui/pbkcommonui/resources/contacts_groupmembers.docml	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/resources/contacts_groupmembers.docml	Wed Jul 21 11:21:49 2010 +0300
@@ -30,7 +30,7 @@
                 <string name="alignment" value="AlignCenter"/>
                 <string name="aspectRatioMode" value="KeepAspectRatio"/>
                 <sizehint height="30.5un" type="FIXED" width="30.5un"/>
-                <icon iconName="qtg_large_add_contact_picture" name="icon"/>
+                <icon iconName="qtg_large_add_group_picture" name="icon"/>
                 <sizepolicy horizontalPolicy="Fixed" horizontalStretch="0" verticalPolicy="Fixed" verticalStretch="0"/>
             </widget>
             
--- a/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml	Wed Jul 21 11:21:49 2010 +0300
@@ -5,9 +5,9 @@
     <meshitem src="icon" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-1un" />
     <meshitem src="icon" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="1un" />
 
-		<meshitem src="primary_text" srcEdge="LEFT" dst="icon" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" />
-		<meshitem src="primary_text" srcEdge="CENTERV" dst="" dstEdge="CENTERV" />
-		<meshitem src="primary_text" srcEdge="RIGHT" dst="secondary_icon" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)" />
+	 <meshitem src="primary_text" srcEdge="LEFT" dst="icon" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" />
+	 <meshitem src="primary_text" srcEdge="CENTERV" dst="" dstEdge="CENTERV" />
+	 <meshitem src="primary_text" srcEdge="RIGHT" dst="secondary_icon" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)" />
      
     <meshitem src="background" srcEdge="TOP" dst="" dstEdge="TOP" />
     <meshitem src="background" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
@@ -19,14 +19,14 @@
     <meshitem src="pictureArea" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="pictureArea" srcEdge="RIGHT" dst="icon" dstEdge="RIGHT" />
 
-		<meshitem src="secondary_icon" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)" />
+	 <meshitem src="secondary_icon" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)" />
     <meshitem src="secondary_icon" srcEdge="CENTERV" dst="primary_text" dstEdge="CENTERV" />
   </layout>
   
   <layout name="layout_one_row-landscape" type="mesh">
 	<meshitem src="primary_text" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)" />
-	<meshitem src="primary_text" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-1un" />
-	<meshitem src="primary_text" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="1un" />
+	<meshitem src="primary_text" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-var(hb-param-margin-gene-top)" />
+	<meshitem src="primary_text" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)" />
 	<meshitem src="primary_text" srcEdge="RIGHT" dst="secondary_icon" dstEdge="LEFT" spacing="var(hb-param-margin-gene-right)" />
     
     <meshitem src="background" srcEdge="TOP" dst="" dstEdge="TOP" />
@@ -34,7 +34,7 @@
     <meshitem src="background" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="background" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
 
-	<meshitem src="secondary_icon" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)" />
+	 <meshitem src="secondary_icon" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)" />
     <meshitem src="secondary_icon" srcEdge="CENTERV" dst="primary_text" dstEdge="CENTERV" />
   </layout>
   
--- a/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.css	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.css	Wed Jul 21 11:21:49 2010 +0300
@@ -46,6 +46,13 @@
     bottom:0.0un;
 }
 
+CntEditViewHeadingItem::highlight{
+    left:0.0un;
+    right:0.0un;
+    top:0.0un;
+    bottom:0.0un;
+}
+
 CntEditViewHeadingItem::iconArea{
     left:0.0un;
     right:0.0un;
--- a/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.widgetml	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.widgetml	Wed Jul 21 11:21:49 2010 +0300
@@ -22,6 +22,11 @@
     <meshitem src="iconArea" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
     <meshitem src="iconArea" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="iconArea" srcEdge="RIGHT" dst="icon" dstEdge="RIGHT" />
+    
+    <meshitem src="highlight" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+    <meshitem src="highlight" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    <meshitem src="highlight" srcEdge="TOP" dst="" dstEdge="TOP" />
+    <meshitem src="highlight" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
   </layout>
   
   <layout name="customLayoutNoSecondText" type="mesh">
@@ -42,6 +47,11 @@
     <meshitem src="iconArea" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
     <meshitem src="iconArea" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="iconArea" srcEdge="RIGHT" dst="icon" dstEdge="RIGHT" />
+    
+    <meshitem src="highlight" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+    <meshitem src="highlight" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    <meshitem src="highlight" srcEdge="TOP" dst="" dstEdge="TOP" />
+    <meshitem src="highlight" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
   </layout>
   
   <layout name="customLayoutNoText" type="mesh">
@@ -62,6 +72,11 @@
     <meshitem src="iconArea" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
     <meshitem src="iconArea" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="iconArea" srcEdge="RIGHT" dst="icon" dstEdge="RIGHT" />
+    
+    <meshitem src="highlight" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+    <meshitem src="highlight" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    <meshitem src="highlight" srcEdge="TOP" dst="" dstEdge="TOP" />
+    <meshitem src="highlight" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
   </layout>
 
   <layout name="customLayout-landscape" type="mesh">
@@ -78,6 +93,11 @@
     <meshitem src="background" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
     <meshitem src="background" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="background" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    
+    <meshitem src="highlight" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+    <meshitem src="highlight" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    <meshitem src="highlight" srcEdge="TOP" dst="" dstEdge="TOP" />
+    <meshitem src="highlight" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
   </layout>
 
   <layout name="customLayoutNoSecondText-landscape" type="mesh">
@@ -90,6 +110,11 @@
     <meshitem src="background" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
     <meshitem src="background" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="background" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    
+    <meshitem src="highlight" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+    <meshitem src="highlight" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    <meshitem src="highlight" srcEdge="TOP" dst="" dstEdge="TOP" />
+    <meshitem src="highlight" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
   </layout>
   
   <layout name="customLayoutNoText-landscape" type="mesh">
@@ -102,6 +127,11 @@
     <meshitem src="background" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
     <meshitem src="background" srcEdge="LEFT" dst="" dstEdge="LEFT" />
     <meshitem src="background" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    
+    <meshitem src="highlight" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+    <meshitem src="highlight" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+    <meshitem src="highlight" srcEdge="TOP" dst="" dstEdge="TOP" />
+    <meshitem src="highlight" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
   </layout>
 
 </hbwidget>
--- a/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem_color.css	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem_color.css	Wed Jul 21 11:21:49 2010 +0300
@@ -1,8 +1,16 @@
-CntEditViewHeadingItem::text{
+CntEditViewHeadingItem[state = "normal"]::text{
+    color: var(qtc_groupbox_normal);
+}
+
+CntEditViewHeadingItem[state = "normal"]::second_text{
     color: var(qtc_groupbox_normal);
 }
 
-CntEditViewHeadingItem::second_text{
-    color: var(qtc_groupbox_normal);
+CntEditViewHeadingItem[state = "pressed"]::text{
+    color: var(qtc_groupbox_pressed);
 }
 
+CntEditViewHeadingItem[state = "pressed"]::second_text{
+    color: var(qtc_groupbox_pressed);
+}
+
--- a/phonebookui/pbkcommonui/resources/style/cnthistoryviewitem.widgetml	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/resources/style/cnthistoryviewitem.widgetml	Wed Jul 21 11:21:49 2010 +0300
@@ -11,6 +11,7 @@
 
     <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)"/>
     <meshitem src="text-3" srcEdge="LEFT" dst="text-2" dstEdge="LEFT"/>
+    <meshitem src="text-3" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
 
     <meshitem src="icon-1" srcEdge="CENTERV" dst="" dstEdge="CENTERV"/>
     <meshitem src="icon-1" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)"/>
@@ -38,6 +39,7 @@
 
     <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)"/>
     <meshitem src="text-3" srcEdge="LEFT" dst="text-2" dstEdge="LEFT"/>
+    <meshitem src="text-3" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
 
     <meshitem src="icon-1" srcEdge="CENTERV" dst="" dstEdge="CENTERV"/>
     <meshitem src="icon-1" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-right)"/>
--- a/phonebookui/pbkcommonui/src/cntactionlauncher.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntactionlauncher.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -52,6 +52,28 @@
     
     return executed;
     }
+
+bool CntActionLauncher::execute( QContact aContact, QContactDetail aDetail, QVariantMap aParameters )
+    {
+    bool executed = false;
+    QList<QContactActionDescriptor> all = QContactAction::actionDescriptors(mAction, "symbian");
+    mContactAction = QContactAction::action( all.first() );
+    if ( mContactAction )
+        {
+        if (aContact.preferredDetail(mAction).isEmpty() && (mAction == "call" || mAction == "message" || mAction == "email"))
+            {
+            aContact.setPreferredDetail(mAction, aDetail);
+            //return value will be ignored because we cannot do anything if it fails.
+            mContactManager->saveContact(&aContact);
+            }
+        
+        connect(mContactAction, SIGNAL(stateChanged(QContactAction::State)),
+                this, SLOT(progress(QContactAction::State)));
+        executed = mContactAction->invokeAction( aContact, aDetail, aParameters );
+        }
+    
+    return executed;
+    }
  
 /*!
 Launch dynamic action
--- a/phonebookui/pbkcommonui/src/cntactionpopup_p.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntactionpopup_p.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -40,6 +40,7 @@
     mListView = new HbListView(this);
     mListModel = new QStandardItemModel(this);
     setAttribute(Qt::WA_DeleteOnClose, true);
+    mDataItemList.clear();
 }
 
 CntActionPopupPrivate::~CntActionPopupPrivate()
@@ -169,12 +170,13 @@
     {
         buildEmailActionPopup();
     }
-    else
+    
+    if(mDataItemList.count())
     {
-        return false;
+        showPopup();
+        return true;
     }
-    showPopup();
-    return true; 
+    return false; 
     
 }
 
@@ -194,6 +196,10 @@
     mListView->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum );
     
     QString contactName = mContact->displayLabel();
+    if (contactName.isEmpty())
+    {
+        contactName = hbTrId("txt_phob_list_unnamed");
+    }
     HbLabel *label = new HbLabel();
     label->setPlainText(contactName);
     
--- a/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -108,7 +108,7 @@
     
     if (!p->fetched)
     {
-        mThread->scheduleJob(row, p->id);
+        mThread->scheduleJob(p->id);
         p->fetched = true;
     }
     
@@ -163,6 +163,32 @@
 }
 
 /*!
+    Adds a row to the model. This is called from addGroup(int localId), so no
+    real logic in here.
+
+    \param row the first row which is added
+    \param count amount of rows to be added (not supported)
+    \param parent not used as all items share the same parent
+    \return success of the operation
+*/
+bool CntCollectionListModel::insertRows(int row, int count, const QModelIndex &parent)
+{
+    Q_UNUSED(count);
+    Q_UNUSED(parent);
+    
+    if ( !validateRowIndex(row) )
+    {
+        return false;
+    }
+    
+    beginInsertRows(parent, row, row);
+
+    endInsertRows();
+
+    return true;
+}
+
+/*!
     Remove given group from the model. Ignore plugin groups.
 
     \param localId QContactLocalId of the group that should be removed
@@ -184,6 +210,87 @@
 }
 
 /*!
+    Add a new group to the model. This also takes care of putting it in the
+    correct row.
+
+    \param localId QContactLocalId of the group that should be added
+*/
+void CntCollectionListModel::addGroup(int localId)
+{
+    CNT_ENTRY
+    
+    QContactDetailFilter groupFilter;
+    groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
+    groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup)));
+
+    QContactSortOrder sortOrderGroupName;
+    sortOrderGroupName.setDetailDefinitionName(QContactName::DefinitionName,
+        QContactName::FieldCustomLabel);
+    sortOrderGroupName.setCaseSensitivity(Qt::CaseInsensitive);
+
+    QList<QContactSortOrder> groupsOrder;
+    groupsOrder.append(sortOrderGroupName);
+
+    QList<QContactLocalId> groupContactIds = d->mContactManager->contactIds(groupFilter, groupsOrder);
+    
+    int row = 1;
+    
+    for (int i = 0;i < groupContactIds.count();i++)
+    {
+        if (groupContactIds.at(i) == localId)
+        {
+            row += d->mExtensions.count();
+            
+            CollectionItemPointer item(new CntCollectionItem());
+            
+            QContactFetchHint noRelationshipsFetchHint;
+            noRelationshipsFetchHint.setOptimizationHints(QContactFetchHint::NoRelationships);
+            
+            QContact contact = d->mContactManager->contact(groupContactIds.at(i), noRelationshipsFetchHint);
+            QContactName contactName = contact.detail<QContactName>();
+            QString groupName = contactName.customLabel();
+            
+            if (groupName.isNull())
+            {
+                item->groupName = hbTrId("txt_phob_dblist_unnamed");
+            }
+            else
+            {
+                item->groupName = groupName;
+            }
+
+            item->icon = HbIcon("qtg_large_custom");
+            
+            QList<QContactAvatar> details = contact.details<QContactAvatar>();
+            for (int k = 0;k < details.count();k++)
+            {
+                if (details.at(k).imageUrl().isValid())
+                {
+                    int id = d->mThumbnailManager->getThumbnail(details.at(k).imageUrl().toString());
+                    d->mIconRequests.insert(id, groupContactIds.at(i));
+                    break;
+                }
+            }
+            
+            // contact Id for identification
+            item->id = groupContactIds.at(i);
+            item->secondLineText = " ";
+            item->memberCount = -1;
+
+            d->mList.insert(row, item);
+            insertRow(row);
+            break;
+        }
+        else if (groupContactIds.at(i) != d->mFavoriteGroupId)
+        {
+            row++;
+        }
+    }
+    
+    CNT_EXIT
+}
+
+/*!
     Check if list item at given index is coming from an extension plugin or not.
 
     \param index the QModelIndex of the list item
@@ -247,6 +354,25 @@
 }
 
 /*!
+    Get the index for a given group id.
+
+    \param localId the id of the group
+    \return QModelIndex of the group
+*/
+QModelIndex CntCollectionListModel::indexOfGroup(int localId)
+{
+    for (int i = 0;i < d->mList.count();i++)
+    {
+        if (d->mList.at(i)->id == localId && !d->mList.at(i)->isPlugin)
+        {
+            return index(i);
+        }
+    }
+    
+    return QModelIndex();
+}
+
+/*!
     Initialize different groups.
 */
 void CntCollectionListModel::doConstruct()
@@ -295,24 +421,31 @@
         CntUiGroupSupplier* groupSupplier = d->mExtensionManager.pluginAt(i)->groupSupplier();
         if (groupSupplier)
         {
-            for(int j = 0;j < groupSupplier->groupCount();j++)
+            if (groupSupplier->isAsynch())
+            {
+                connect(groupSupplier, SIGNAL(groupsReady()), this, SLOT(extensionGroupsReady()));
+            }
+            else
             {
-                const CntUiExtensionGroup& group = groupSupplier->groupAt(j);
-                
-                CollectionItemPointer item(new CntCollectionItem());
-                
-                item->groupName = group.name();
-                item->secondLineText = group.extraText();
-                item->memberCount = group.memberCount();
-                item->icon = HbIcon(group.groupIcon());
-                item->secondaryIcon = HbIcon(group.extraIcon());
-                
-                item->id = group.serviceId();
-                item->isPlugin = true;
-                item->fetched = true;
-                
-                d->mExtensions.insert(rowCount(), groupSupplier);
-                d->mList.append(item);
+                for (int j = 0;j < groupSupplier->groupCount();j++)
+                {
+                    const CntUiExtensionGroup& group = groupSupplier->groupAt(j);
+                    
+                    CollectionItemPointer item(new CntCollectionItem());
+                    
+                    item->groupName = group.name();
+                    item->secondLineText = group.extraText();
+                    item->memberCount = group.memberCount();
+                    item->icon = HbIcon(group.groupIcon());
+                    item->secondaryIcon = HbIcon(group.extraIcon());
+                    
+                    item->id = group.serviceId();
+                    item->isPlugin = true;
+                    item->fetched = true;
+                    
+                    d->mExtensions.insert(rowCount(), groupSupplier);
+                    d->mList.append(item);
+                }
             }
         }
     }
@@ -371,7 +504,7 @@
                 if (details.at(k).imageUrl().isValid())
                 {
                     int id = d->mThumbnailManager->getThumbnail(details.at(k).imageUrl().toString());
-                    d->mIconRequests.insert(id, rowCount());
+                    d->mIconRequests.insert(id, groupContactIds.at(i));
                     break;
                 }
             }
@@ -450,17 +583,25 @@
     \param secondRowText text to be shown in the second row
     \param memberCount the amount of members the group has (shown in text-3 in HbListViewItem)
 */
-void CntCollectionListModel::informationUpdated(int row, const QString& secondRowText, int memberCount)
+void CntCollectionListModel::informationUpdated(int id, const QString& secondRowText, int memberCount)
 {
     CNT_ENTRY
     
-    CollectionItemPointer item = d->mList.at(row);
-    
-    item->secondLineText = secondRowText;
-    item->memberCount = memberCount;
-    
-    int idx = d->mList.indexOf(item);
-    emit dataChanged(index(idx, 0), index(idx, 0));
+    for (int i = 0;i < d->mList.count();i++)
+    {
+        if (d->mList.at(i)->id == id && !d->mList.at(i)->isPlugin)
+        {
+            CollectionItemPointer item = d->mList.at(i);
+            
+            item->secondLineText = secondRowText;
+            item->memberCount = memberCount;
+            
+            int idx = d->mList.indexOf(item);
+            emit dataChanged(index(idx, 0), index(idx, 0));
+            
+            break;
+        }
+    }
     
     CNT_EXIT
 }
@@ -482,15 +623,77 @@
     
     if (error == 0)
     {
-        int row = d->mIconRequests.take(id);
-        
-        CollectionItemPointer item = d->mList.at(row);
+        int localId = d->mIconRequests.take(id);
         
-        item->icon = HbIcon(pixmap);
-        
-        int idx = d->mList.indexOf(item);
-        emit dataChanged(index(idx, 0), index(idx, 0));
+        for (int i = 0;i < d->mList.count();i++)
+        {
+            if (d->mList.at(i)->id == localId && !d->mList.at(i)->isPlugin)
+            {
+                CollectionItemPointer item = d->mList.at(i);
+                
+                item->icon = HbIcon(pixmap);
+                
+                int idx = d->mList.indexOf(item);
+                emit dataChanged(index(idx, 0), index(idx, 0));
+                
+                break;
+            }
+        }
     }
 
     CNT_EXIT
 }
+
+/*!
+    Slot to handle asynchronously initiated extension groups. As
+    these are added right after the static favorites group, this takes
+    also care of updating the mapping between row and CntUiGroupSuppliers
+    in case there was already some synchronously loaded extension groups.
+*/
+void CntCollectionListModel::extensionGroupsReady()
+{
+    CntUiGroupSupplier* groupSupplier = static_cast<CntUiGroupSupplier*>(sender());
+    
+    int addedCount = groupSupplier->groupCount();
+    
+    if (addedCount > 0)
+    {
+        QList<int> rowList = d->mExtensions.keys();
+        QList<CntUiGroupSupplier*> supplierList = d->mExtensions.values();
+        
+        d->mExtensions.clear();
+        
+        for (int i = 0;i < rowList.count();i++)
+        {
+            int row = rowList.at(i) + addedCount;
+            CntUiGroupSupplier* supplier = supplierList.at(i);
+            
+            d->mExtensions.insert(row, supplier);
+        }
+        
+        
+        beginInsertRows(QModelIndex(), 1, groupSupplier->groupCount());
+        
+        for (int j = 0;j < groupSupplier->groupCount();j++)
+        {
+            const CntUiExtensionGroup& group = groupSupplier->groupAt(j);
+            
+            CollectionItemPointer item(new CntCollectionItem());
+            
+            item->groupName = group.name();
+            item->secondLineText = group.extraText();
+            item->memberCount = group.memberCount();
+            item->icon = HbIcon(group.groupIcon());
+            item->secondaryIcon = HbIcon(group.extraIcon());
+            
+            item->id = group.serviceId();
+            item->isPlugin = true;
+            item->fetched = true;
+            
+            d->mExtensions.insert(1 + j, groupSupplier);
+            d->mList.insert(1 + j, item);
+        }
+        
+        endInsertRows();
+    }
+}
--- a/phonebookui/pbkcommonui/src/cntcollectionlistmodelworker.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcollectionlistmodelworker.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -109,12 +109,11 @@
 }
 
 /*!
-    Schedule an asynch job for the given row (model) and contact id.
+    Schedule an asynch job for the given contact id.
 
-    \param row the row in the model
-    \param id the QContactLocalId of the group in the given row
+    \param id the QContactLocalId of the group
 */
-void CntCollectionListModelWorker::scheduleJob(int row, int id)
+void CntCollectionListModelWorker::scheduleJob(int id)
 {
     CNT_ENTRY
     
@@ -134,7 +133,7 @@
         HbApplication::instance()->postEvent(this, new QEvent(QEvent::User));
     }
 
-    mJobs.append(QPair<int,int>(row, id));
+    mJobs.append(id);
     
     mMutex.unlock();
     
@@ -163,12 +162,10 @@
         else
         {
             // get next job
-            QPair<int,int> pair = mJobs.takeFirst();
-            int row = pair.first;
-            int id = pair.second;
+            int id = mJobs.takeFirst();
 
             mMutex.unlock();
-            fetchInformation(row, id);
+            fetchInformation(id);
         }
 
         HbApplication::processEvents();
@@ -182,10 +179,9 @@
     and the amount of contacts in the group. Emits the result as a signal for
     CntCollectionListModel to handle.
 
-    \param row the row in the model
     \param id the QContactLocalId of the group in the given row
 */
-void CntCollectionListModelWorker::fetchInformation(int row, int id)
+void CntCollectionListModelWorker::fetchInformation(int id)
 {
     CNT_ENTRY
     
@@ -238,9 +234,9 @@
         for(int i = 0;i < groupMemberIds.count();i++)
         {
             QContactFetchHint nameOnlyFetchHint;
-            QStringList details;
+            /*QStringList details;
             details << QContactDisplayLabel::DefinitionName;
-            nameOnlyFetchHint.setDetailDefinitionsHint(details);
+            nameOnlyFetchHint.setDetailDefinitionsHint(details);*/
             nameOnlyFetchHint.setOptimizationHints(QContactFetchHint::NoRelationships);
 
             QContact contact = mManager->contact(groupMemberIds.at(i), nameOnlyFetchHint);
@@ -275,7 +271,7 @@
         }
     }
 
-    emit fetchDone(row, secondLineText, memberCount);
+    emit fetchDone(id, secondLineText, memberCount);
     
     CNT_EXIT
 }
--- a/phonebookui/pbkcommonui/src/cntcollectionview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcollectionview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -98,7 +98,7 @@
     groups->setChecked(true);
     
     mFindAction = static_cast<HbAction*>(mDocumentLoader.findObject("cnt:find"));
-    mFindAction->setEnabled(false);
+    connect(mFindAction, SIGNAL(triggered()), this, SLOT(showNamesViewWithFinder()));
     mExtensionAction = static_cast<HbAction*> (mDocumentLoader.findObject("cnt:activity"));
 }
 
@@ -159,9 +159,6 @@
     mModel = new CntCollectionListModel(getContactManager(), mExtensionManager, this);
     mListView->setModel(mModel);
     
-    mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
-    connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleNewGroupMembers()));
-    
     CNT_EXIT
 }
 
@@ -188,6 +185,16 @@
 }
 
 /*!
+Go back to previous view
+*/
+void CntCollectionView::showNamesViewWithFinder()
+{
+    CntViewParameters viewParameters;
+    viewParameters.insert(EFinder, "show");
+    mViewManager->back(viewParameters);
+}
+
+/*!
 Called after user clicked on the listview.
 */
 void CntCollectionView::openGroup(const QModelIndex &index)
@@ -257,7 +264,7 @@
     else
     {
         int id = item->modelIndex().data(Qt::UserRole).toInt();
-        QVariant data( item->modelIndex().row() );
+        QVariant data( id );
 
         int favoriteGrpId = CntFavourite::favouriteGroupId(mViewManager->contactManager(SYMBIAN_BACKEND));
         
@@ -280,22 +287,20 @@
 
 void CntCollectionView::handleMenu(HbAction* action)
 {
-    int row = action->data().toInt();
     HbMenu *menuItem = static_cast<HbMenu*>(sender());
-    QModelIndex index = mModel->index(row, 0);
-    
-    int id = index.data(Qt::UserRole).toInt();
     
     if ( action == menuItem->actions().first() )
-        {
+    {
+        int id = action->data().toInt();
+        QModelIndex index = mModel->indexOfGroup(id);
         openGroup(index);
-        }
+    }
     else if (action == menuItem->actions().at(1))
-        {
-        
+    {
+        int id = action->data().toInt();
         QContact groupContact = getContactManager()->contact(id);
         deleteGroup(groupContact);
-        }
+    }
 }
 
 
@@ -343,7 +348,17 @@
         QSet<QContactLocalId> contactsSet = contactsList.toSet();
 
         // Select some contact(s) to add to the group
-        QString groupNameCreated(mHandledContact->displayLabel());
+        QString groupNameCreated = mHandledContact->displayLabel();
+        if (groupNameCreated.isEmpty())
+        {
+            groupNameCreated = hbTrId("txt_phob_list_unnamed");
+        }
+        
+        if (!mFetchView)
+        {
+            mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
+            connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleNewGroupMembers()));
+        }
         mFetchView->setDetails(HbParameterLengthLimiter(hbTrId("txt_phob_title_members_of_1_group")).arg(groupNameCreated),
                                hbTrId("txt_common_button_save"));
         mFetchView->displayContacts(HbAbstractItemView::MultiSelection, contactsSet);
@@ -353,8 +368,12 @@
 void CntCollectionView::handleNewGroupMembers()
 {
     mSelectedContactsSet = mFetchView->getSelectedContacts();
+    
     if ( !mFetchView->wasCanceled() && mSelectedContactsSet.size() ) {
         saveNewGroup(mHandledContact);
+        
+        delete mFetchView;
+        mFetchView = NULL;
 
         CntViewParameters viewParameters;
         viewParameters.insert(EViewId, groupMemberView);
@@ -363,14 +382,23 @@
         viewParameters.insert(ESelectedGroupContact, var);
         mViewManager->changeView(viewParameters);
     }
+    else
+    {
+        // Add the new group 
+        mModel->addGroup(mHandledContact->localId());
+        mDeleteGroupsAction->setEnabled(true);
+        
+        delete mFetchView;
+        mFetchView = NULL;
+    }
     
-    QString groupNameCreated(mHandledContact->displayLabel());
+    QString groupNameCreated = mHandledContact->displayLabel();
+    if (groupNameCreated.isEmpty())
+    {
+        groupNameCreated = hbTrId("txt_phob_list_unnamed");
+    }
     HbNotificationDialog::launchDialog(HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_new_group_1_created")).arg(groupNameCreated));
 
-    // Refresh the page 
-    refreshDataModel();
-    mDeleteGroupsAction->setEnabled(true);
-
     delete mHandledContact;
     mHandledContact = NULL;
 }
@@ -388,20 +416,22 @@
 {
     mHandledContact = new QContact(group);
     QString name = mHandledContact->displayLabel();
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
 
     HbLabel *headingLabel = new HbLabel();
     headingLabel->setPlainText(HbParameterLengthLimiter(hbTrId("txt_phob_dialog_delete_1_group")).arg(name));
           
     HbMessageBox::question(hbTrId("txt_phob_dialog_only_group_will_be_removed_contac")
-            , this, SLOT(handleDeleteGroup(HbAction*)),
-                hbTrId("txt_common_button_delete"), hbTrId("txt_common_button_cancel"), headingLabel);
+            , this, SLOT(handleDeleteGroup(int)), HbMessageBox::Delete | HbMessageBox::Cancel,
+                headingLabel);
 }
 
-void CntCollectionView::handleDeleteGroup(HbAction* action)
+void CntCollectionView::handleDeleteGroup(int action)
 {
-    HbMessageBox *note = static_cast<HbMessageBox*>(sender());
-    
-    if (note && action == note->actions().first())
+    if (action == HbMessageBox::Delete)
     {
         getContactManager()->removeContact(mHandledContact->localId());
         mModel->removeGroup(mHandledContact->localId());
--- a/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -16,6 +16,7 @@
 */
 
 #include "cntcontactcardheadingitem.h"
+#include "cntdebug.h"
 
 #include <qtcontacts.h>
 #include <QGraphicsSceneMouseEvent>
@@ -30,6 +31,8 @@
 #include <hbaction.h>
 #include <hbmainwindow.h>
 #include <hbtapgesture.h>
+#include <hbeffect.h>
+#include <hbinstantfeedback.h>
 #include <cntuids.h>
 #include <xqsettingsmanager.h>
 #include <xqsettingskey.h>
@@ -48,6 +51,7 @@
     mIsFavorite(false),
     mIsOnline(false)
 {
+    HbEffect::add("icon", "groupbox_icon_click", "iconclick");
 }
 
 CntContactCardHeadingItem::~CntContactCardHeadingItem()
@@ -198,7 +202,7 @@
     if (!mFrameItem)
     {
         mFrameItem = new HbFrameItem(this);
-        mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox");
+        mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox_normal");
         mFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces);
         mFrameItem->setZValue(-2);
         style()->setItemName(mFrameItem, "background");
@@ -214,6 +218,10 @@
     {
         initGesture();
     }
+    else
+    {
+        ungrabGesture(Qt::TapGesture);
+    }
 }
 
 void CntContactCardHeadingItem::setIcon(const HbIcon newIcon)
@@ -354,16 +362,18 @@
     int setting = settingsMng.readItemValue(nameOrderKey, XQSettingsManager::TypeInt).toInt();
     
     QStringList nameList;
-    QString last;
+    QString last_first;
     
     switch( setting ) {
         case CntOrderLastFirst:
             nameList << name.prefix() << name.lastName() << name.firstName() << name.middleName() << name.suffix();
             break;
         case CntOrderLastCommaFirst:
-            if (!name.lastName().isEmpty())
-                last = name.lastName() + ",";
-            nameList << name.prefix() << last << name.firstName() << name.middleName() << name.suffix();
+            if (!name.firstName().isEmpty() && !name.lastName().isEmpty())
+                last_first = name.lastName() + ", " + name.firstName();
+            else
+                last_first = !name.firstName().isEmpty() ? name.firstName() : name.lastName();
+            nameList << name.prefix() << last_first << name.middleName() << name.suffix();
             break;
         default:    // Default to first name last name
             nameList << name.prefix() << name.firstName() << name.middleName() << name.lastName() << name.suffix();
@@ -432,9 +442,17 @@
             case Qt::GestureUpdated:
                 if (tap->tapStyleHint() == HbTapGesture::TapAndHold && mIcon->rect().contains(mapFromScene(tap->position()))) 
                 {
+                    HbEffect::cancel(mIcon, QString("iconclick"));
                     processLongPress(tap->position());
                 }
                 break;
+            case Qt::GestureStarted:
+                if (tap->tapStyleHint() == HbTapGesture::Tap && mIcon->rect().contains(mapFromScene(tap->position())))
+                {
+                    HbInstantFeedback::play(HbFeedback::Basic);
+                    HbEffect::start(mIcon, QString("icon"), QString("iconclick"));
+                }
+                
             default:
                 break;
         }
--- a/phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -247,8 +247,10 @@
     // presence listener
     mPresenceListener = new CntPresenceListener(*mContact);
     connect(mPresenceListener, SIGNAL(fullPresenceUpdated(bool)), mHeadingItem, SLOT(setOnlineStatus(bool)));
+    connect(mPresenceListener, SIGNAL(accountPresenceUpdated(const QString&, bool)), 
+            this, SLOT(updateItemPresence(const QString&, bool)));
     bool online;
-    mPresenceListener->initialPresences(online);
+    QMap<QString, bool> presences = mPresenceListener->initialPresences(online);
     mHeadingItem->setOnlineStatus(online);
 
     mImageLabel = static_cast<CntImageLabel*>(document()->findWidget("cnt_contactcard_image"));
@@ -302,6 +304,25 @@
                 dataItem->setSecondaryIcon(HbIcon("qtg_mono_favourites"));
                 mPreferredItems.insert(dataItem->action(), item);
             }
+            
+            if (dataItem->detail().definitionName() == QContactOnlineAccount::DefinitionName)
+            {
+                for (int i = 0;i < presences.keys().count();i++)
+                {
+                    QString fullAccount = presences.keys().at(i);
+                    QContactOnlineAccount account = dataItem->detail();
+                    QString currentFullAccount = account.serviceProvider() + ':' + account.accountUri();
+                    if (fullAccount == currentFullAccount)
+                    {
+                        if (presences.values().at(i))
+                        {
+                            dataItem->setSecondaryIcon(HbIcon("qtg_small_online"));
+                        }
+                        mPresenceItems.insert(fullAccount, item);
+                        break;
+                    }
+                }
+            }
          
             item->setDetails(dataItem);
             mContainerLayout->addItem(item);
@@ -644,6 +665,27 @@
     return maptileLabel;
 }
 
+/*
+* Update the presence status icon of action item with the given accountUri
+*/
+void CntContactCardViewPrivate::updateItemPresence(const QString& accountUri, bool online)
+{
+    CntContactCardDetailItem* item = mPresenceItems.value(accountUri);
+    
+    if (item)
+    {
+        if (online)
+        {
+            mDataContainer->dataItem(item->index())->setSecondaryIcon(HbIcon("qtg_small_online"));
+        }
+        else
+        {
+            mDataContainer->dataItem(item->index())->setSecondaryIcon(HbIcon());
+        }
+        item->setDetails(mDataContainer->dataItem(item->index()));
+    }
+}
+
 void CntContactCardViewPrivate::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error)
 {
     CNT_ENTRY
@@ -670,7 +712,7 @@
     QVariantHash preferences;
     preferences["contactId"] = mContact->id().localId();
     
-    XQServiceRequest snd("com.nokia.services.hsapplication.IHomeScreenClient",
+    XQServiceRequest snd("com.nokia.symbian.IHomeScreenClient",
                          "addWidget(QString,QVariantHash)"
                          ,false);
     snd << QString("contactwidgethsplugin");
@@ -722,21 +764,24 @@
 void CntContactCardViewPrivate::deleteContact()
 {    
     QString name = contactManager()->synthesizedDisplayLabel(*mContact);
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
     
-    HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(HbAction*)),
-            hbTrId("txt_common_button_delete"), hbTrId("txt_common_button_cancel"));
+    HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(int)),
+            HbMessageBox::Delete | HbMessageBox::Cancel);
 }
 
 /*!
 Handle action for deleting a contact
 */
-void CntContactCardViewPrivate::handleDeleteContact(HbAction *action)
+void CntContactCardViewPrivate::handleDeleteContact(int action)
 {
-    HbMessageBox *note = static_cast<HbMessageBox*>(sender());
-    
-    if (note && action == note->actions().first())
+    if (action == HbMessageBox::Delete)
     {
-        contactManager()->removeContact(mContact->localId());
+        contactManager()->removeContact(mContact->localId());  
+        emit backPressed();  
         mViewManager->back( mArgs );
     }
 }
--- a/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -209,24 +209,19 @@
     if (mOldView)
     {
         mOldView->deactivate();
-        
-        // Due to something strange in wk16, this check will fail occationally and cause
-        // a memory leak... most likely when opening edit view for the first time
-        if (mCurrent == NULL || !mOldView->view()->isVisible())
+
+        mMainWindow->removeView(mOldView->view());
+
+        if (!mOldView->isDefault())
         {
-            mMainWindow->removeView(mOldView->view());
-            
-            if (!mOldView->isDefault())
-            {
-                delete mOldView;
-                mOldView = NULL;
-            }
-            // If view id is not in defaults list, it means that view has changed
-            // its opinnion about preserving state to true.
-            else if ( !mDefaults.contains(mOldView->viewId()) ) 
-            {
-                mDefaults.insert( mOldView->viewId(), mOldView );
-            }
+            delete mOldView;
+            mOldView = NULL;
+        }
+        // If view id is not in defaults list, it means that view has changed
+        // its opinnion about preserving state to true.
+        else if ( !mDefaults.contains(mOldView->viewId()) ) 
+        {
+            mDefaults.insert( mOldView->viewId(), mOldView );
         }
     }
 
--- a/phonebookui/pbkcommonui/src/cntdetaileditor.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntdetaileditor.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -17,7 +17,9 @@
 #include "cntdetaileditor.h"
 #include "cnteditorfactory.h"
 #include "cntgroupeditormodel.h"
+#include "cntsavemanager.h"
 #include "cntglobal.h"
+
 #include <cntviewparams.h>
 #include <hbmenu.h>
 #include <hbaction.h>
@@ -29,6 +31,12 @@
 #include <hbinputeditorinterface.h>
 #include <hbinputstandardfilters.h>
 #include <cntdebug.h>
+#include <hbscrollarea.h>
+#include <hbscrollbar.h>
+#include <hbdevicenotificationdialog.h>
+#include <hbparameterlengthlimiter.h>
+
+#include <QApplication>
 
 const char *CNT_DETAILEDITOR_XML = ":/xml/contacts_detail_editor.docml";
 
@@ -41,7 +49,8 @@
     mLoader(NULL),   
     mViewManager(NULL),
     mEditorFactory(NULL),
-    mCancel(NULL)
+    mCancel(NULL),
+    mSaveManager(NULL)
 {
     bool ok;
     document()->load(CNT_DETAILEDITOR_XML, &ok);
@@ -57,16 +66,27 @@
     
     mSoftkey = new HbAction(Hb::BackNaviAction, mView);
     connect( mSoftkey, SIGNAL(triggered()), this, SLOT(saveChanges()) );
+    
+    // closing the application from task swapper or end key will cause the contact to be saved
+    connect( qApp, SIGNAL(aboutToQuit()), this, SLOT(saveContact()));
 }
 
 CntDetailEditor::~CntDetailEditor()
 {
     mView->deleteLater();
+    
     delete mDataForm;
+    mDataForm = NULL;
     delete mDataFormModel;
+    mDataFormModel = NULL;
     delete mHeader;
+    mHeader = NULL;
     delete mLoader;
+    mLoader = NULL;
     delete mEditorFactory;
+    mEditorFactory = NULL;
+    delete mSaveManager;
+    mSaveManager = NULL;
 }
 
 void CntDetailEditor::setViewId( int aId )
@@ -108,6 +128,24 @@
     }
     mEditorFactory->setupEditorView(*this, selectedContact);
     
+    QString myCard = mArgs.value( EMyCard ).toString();
+    QContactLocalId localId = selectedContact.localId();
+    QContactLocalId selfContactId = mViewManager->contactManager(SYMBIAN_BACKEND)->selfContactId();
+    bool isMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
+    
+    if (isMyCard)
+    {
+        mSaveManager = new CntSaveManager(CntSaveManager::EMyCard);
+    }
+    else if ( mId == groupEditorView )
+    {
+        mSaveManager = new CntSaveManager(CntSaveManager::EGroup);
+    }
+    else
+    {
+        mSaveManager = new CntSaveManager();
+    }
+    
     mDataForm->setItemRecycling(true);
 
     // add new field if required
@@ -115,6 +153,9 @@
     {
         mDataFormModel->insertDetailField();
     }
+    mDataForm->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAsNeeded); 
+    mDataForm->setScrollingStyle(HbScrollArea::PanWithFollowOn);
+    mDataForm->verticalScrollBar()->setInteractive(true);
 }
 
 void CntDetailEditor::deactivate()
@@ -160,6 +201,12 @@
             HbLineEdit* edit = static_cast<HbLineEdit*>( viewItem->dataItemContentWidget() );
             edit->setInputMethodHints( Qt::ImhDialableCharactersOnly );
         }
+        else
+        {
+            HbDataFormViewItem* viewItem = static_cast<HbDataFormViewItem*>(mDataForm->itemByIndex( aIndex ));
+            HbLineEdit* edit = static_cast<HbLineEdit*>( viewItem->dataItemContentWidget() );
+            edit->setInputMethodHints( Qt::ImhNoPredictiveText );
+        }
     }
     else
     {
@@ -184,6 +231,10 @@
     mViewManager->back( mArgs );
 }
 
+/*!
+    Saves all changes made to details (type of details depends on
+    in which editor we are) of a contact. Doesn't save the contact.
+*/
 void CntDetailEditor::saveChanges()
 {
     mDataFormModel->saveContactDetails();
@@ -208,6 +259,46 @@
     mViewManager->back( mArgs );
 }
 
+/*!
+    First saves all changes made to details (type of details depends on
+    in which editor we are) of a contact and then saves the contact. This
+    is only called when phonebook is being closed either from task swapper
+    or by end key.
+*/
+void CntDetailEditor::saveContact()
+{
+    mDataFormModel->saveContactDetails();
+    
+    QString name = mViewManager->contactManager(SYMBIAN_BACKEND)->synthesizedDisplayLabel(*mDataFormModel->contact());
+    
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
+    
+    CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mDataFormModel->contact(), mViewManager->contactManager(SYMBIAN_BACKEND));
+    
+    if (mId != groupEditorView)
+    {
+        switch (result)
+        {
+        case CntSaveManager::ESaved:
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contact_1_saved")).arg(name));
+            break;
+        case CntSaveManager::EUpdated:
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contacts_1_updated")).arg(name));
+            break;
+        case CntSaveManager::EFailed:
+            HbDeviceNotificationDialog::notification(QString(),hbTrId("SAVING FAILED!"));
+            break;
+        case CntSaveManager::EDeleted:
+        case CntSaveManager::ENothingDone:
+        default:
+            break;
+        }
+    }
+}
+
 void CntDetailEditor::setHeader(QString aHeader)
 {
     if (!mHeader) {
--- a/phonebookui/pbkcommonui/src/cnteditview_p.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cnteditview_p.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -21,6 +21,7 @@
 #include "cntdetailpopup.h"
 #include "cnteditviewheadingitem.h"
 #include "cntimagelabel.h"
+#include "cntsavemanager.h"
 #include "cntglobal.h"
 
 #include <qtcontacts.h>
@@ -39,17 +40,21 @@
 #include <hbdevicenotificationdialog.h>
 #include <xqaiwrequest.h>
 #include <xqaiwdecl.h>
-#include <QDir>
+#include <cntservicescontact.h>
+
+#include <QFileInfo>
+#include <QApplication>
 
 const char *CNT_EDIT_XML = ":/xml/contacts_ev.docml";
 
 CntEditViewPrivate::CntEditViewPrivate() :
-mModel( NULL ),
-mImageLabel( NULL ),
-mThumbnailManager( NULL ),
-mContact( NULL ),
-mReq(0),
-mMenu(NULL)
+    mModel( NULL ),
+    mImageLabel( NULL ),
+    mThumbnailManager( NULL ),
+    mContact( NULL ),
+    mReq(0),
+    mMenu(NULL),
+    mSaveManager(NULL)
 {
     mDocument = new CntDocumentLoader;
     
@@ -93,19 +98,30 @@
     connect( mHeading, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) );
     connect( mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(activated(const QModelIndex&)) );
     connect( mListView, SIGNAL(longPressed(HbAbstractViewItem*,const QPointF&)), this, SLOT(longPressed(HbAbstractViewItem*,const QPointF&)) );
+    
+    // closing the application from task swapper or end key will cause the contact to be saved
+    connect( qApp, SIGNAL(aboutToQuit()), this, SLOT(saveChanges()));
 }
 
 CntEditViewPrivate::~CntEditViewPrivate()
 {
     mView->deleteLater();
+    
     delete mDocument;
+    mDocument = NULL;
     delete mModel;
+    mModel = NULL;
     delete mContact;
+    mContact = NULL;
     if (mMenu) 
     {
         delete mMenu;
+        mMenu = NULL;
     }
     delete mThumbnailManager;
+    mThumbnailManager = NULL;
+    delete mSaveManager;
+    mSaveManager = NULL;
 }
 
 void CntEditViewPrivate::setOrientation(Qt::Orientation orientation)
@@ -150,7 +166,16 @@
     QContactLocalId localId = mContact->localId();
     QContactManager* cm = mMgr->contactManager(SYMBIAN_BACKEND);
     QContactLocalId selfContactId = cm->selfContactId();
-    mIsMyCard = ( localId == selfContactId && localId != 0 ) || myCard == "myCard";
+    mIsMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
+    
+    if (mIsMyCard)
+    {
+        mSaveManager = new CntSaveManager(CntSaveManager::EMyCard);
+    }
+    else
+    {
+        mSaveManager = new CntSaveManager();
+    }
     
     if ( mHeading )
         mHeading->setDetails( mContact, mIsMyCard );
@@ -423,25 +448,28 @@
     if ( mIsMyCard )
     {
         HbMessageBox::question(hbTrId("txt_phob_dialog_remove_all_personal_data_from_my_c"), this, 
-                SLOT(handleDeleteContact(HbAction*)), 
-                hbTrId("txt_common_button_yes"), 
-                hbTrId("txt_common_button_no"));
+                SLOT(handleDeleteContact(int)), 
+                HbMessageBox::Yes | HbMessageBox::No);
     }
     else
     {
         QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
         QString name = cm->synthesizedDisplayLabel( *mContact );
-        HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(HbAction*)), 
-                hbTrId("txt_common_button_delete"), hbTrId("txt_common_button_cancel"));
+        if (name.isEmpty())
+        {
+            name = hbTrId("txt_phob_list_unnamed");
+        }
+        
+        HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(int)), 
+                HbMessageBox::Delete | HbMessageBox::Cancel);
     }
 }
 
-void CntEditViewPrivate::handleDeleteContact(HbAction *action)
+void CntEditViewPrivate::handleDeleteContact(int action)
 {
     Q_Q(CntEditView);
-    
-    HbMessageBox *dlg = static_cast<HbMessageBox*>(sender());
-    if(dlg && action == dlg->actions().first())
+
+    if(action == HbMessageBox::Yes || action == HbMessageBox::Delete)
     {
         QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
 
@@ -473,141 +501,50 @@
 void CntEditViewPrivate::saveChanges()
 {
     Q_Q(CntEditView);
-
-    QContactManager* mgr = mMgr->contactManager( SYMBIAN_BACKEND );
-    bool isSavedContact = mContact->localId() > 0;
+    
+    QString name = mMgr->contactManager(SYMBIAN_BACKEND)->synthesizedDisplayLabel(*mContact);
     
-    // if the contact is really changed or a new one
-    if ( (*mContact) != mgr->contact(mContact->localId()) || !isSavedContact )
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
+    
+    CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mContact, mMgr->contactManager(SYMBIAN_BACKEND));
+    
+    QVariant var;
+    
+    switch (result)
     {
-        int detailCount = mContact->details().count();
-         
-        setPreferredDetails( mContact );
-        
-        // If its a new contact
-        if ( !isSavedContact )
-        {
-            if ( detailCount > 2 )
-            {
-                bool success = mgr->saveContact( mContact );
-                if ( success && mIsMyCard )
-                {
-                    mgr->setSelfContactId( mContact->localId() );
-                }
-                
-                QString name = mgr->synthesizedDisplayLabel( *mContact );
-                if (name.isEmpty())
-                {
-                    name = hbTrId("txt_phob_dblist_unnamed");
-                }
-                
-                if ( success )
-                {
-                    emit q->contactUpdated(1);
-                    HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contact_1_saved")).arg(name));
-                }
-                else
-                {
-                    emit q->contactUpdated(0);
-                    //TODO: localization is missing
-                    HbDeviceNotificationDialog::notification(QString(),qtTrId("SAVING FAILED!"));
-                }
-                
-                QVariant var;
-                var.setValue(*mContact);
-                mArgs.insert(ESelectedContact, var);
-                mArgs.insert(ESelectedAction, CNT_CREATE_ACTION);
-            }
-            else
-            {
-                // nothing happened to the contact. Flags should be used
-                emit q->contactUpdated(-2);
-            }
-        }
-        else
-        {
-            // contact details has been cleared out.
-            if ( detailCount <= 4 )
-            {
-                // get the contact from database, it should have the name still in it,
-                // and show the delete notification to user
-                QContact c = mgr->contact( mContact->localId() );
-                
-                bool success = mgr->removeContact( mContact->localId() );
-                emit q->contactRemoved(success);
-            }
-            else
-            {
-                bool success = mgr->saveContact(mContact);
-                
-                QString name = mgr->synthesizedDisplayLabel( *mContact );
-                if (name.isEmpty())
-                {
-                    name = hbTrId("txt_phob_dblist_unnamed");
-                }
-                
-                if ( success )
-                {   
-                    emit q->contactUpdated(1);
-                    HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contacts_1_updated")).arg(name));
-                    mArgs.insert(ESelectedAction, CNT_EDIT_ACTION);           
-                }
-                else
-                {
-                    emit q->contactUpdated(0);
-                    //TODO: localization is missing
-                    HbDeviceNotificationDialog::notification(QString(),qtTrId("SAVING FAILED!"));
-                }
-                
-                QVariant var;
-                var.setValue(*mContact);
-                mArgs.insert(ESelectedContact, var);           
-            }
-        }
-    }
-    else
-    {
-        emit q->changesDiscarded();
+    case CntSaveManager::ESaved:
+        emit q->contactUpdated(KCntServicesReturnValueContactSaved);
+        HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contact_1_saved")).arg(name));
+        var.setValue(*mContact);
+        mArgs.insert(ESelectedContact, var);
+        mArgs.insert(ESelectedAction, CNT_CREATE_ACTION);
+        break;
+    case CntSaveManager::EUpdated:
+        emit q->contactUpdated(KCntServicesReturnValueContactSaved);
+        HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contacts_1_updated")).arg(name));
+        var.setValue(*mContact);
+        mArgs.insert(ESelectedContact, var);
+        mArgs.insert(ESelectedAction, CNT_EDIT_ACTION);
+        break;
+    case CntSaveManager::EFailed:
+        emit q->contactUpdated(KCntServicesReturnValueContactNotModified);
+        HbDeviceNotificationDialog::notification(QString(),hbTrId("SAVING FAILED!"));
+        break;
+    case CntSaveManager::EDeleted:
+        emit q->contactUpdated(KCntServicesReturnValueContactDeleted);
+        break;
+    case CntSaveManager::ENothingDone:
+    default:
+        emit q->contactUpdated(KCntServicesReturnValueContactNotModified);
+        break;
     }
     
     mMgr->back( mArgs );
 }
 
-void CntEditViewPrivate::setPreferredDetails( QContact* aContact )
-{
-    QList<QContactPhoneNumber> numberList( aContact->details<QContactPhoneNumber>() );
-    //set preferred number for call if there is only one phone number
-    if ( aContact->preferredDetail("call").isEmpty() && numberList.count() == 1 )
-    {
-        aContact->setPreferredDetail( "call", numberList.first() );
-    }
-    //set preferred number for message if there is only one mobile phone number
-    if ( aContact->preferredDetail("message").isEmpty() && numberList.count() >= 1 )
-    {
-        int mobileNumbers = 0;
-        int mobileNumberIndex = -1;
-        for (int i = 0; i < numberList.count(); i++)
-        {
-            if (numberList.at(i).subTypes().count() && numberList.at(i).subTypes().first() == QContactPhoneNumber::SubTypeMobile)
-            {
-                mobileNumbers++;
-                mobileNumberIndex = i;
-            }      
-        }
-        if ( mobileNumbers == 1 )
-        {
-            aContact->setPreferredDetail( "message", numberList.at(mobileNumberIndex) );
-        }
-    }
-    QList<QContactEmailAddress> emailList( aContact->details<QContactEmailAddress>() );
-    //set preferred number for email if there is only one email address
-    if ( aContact->preferredDetail("email").isEmpty() && emailList.count() == 1 )
-    {
-        aContact->setPreferredDetail( "email", emailList.first() );
-    }   
-}
-
-
 void CntEditViewPrivate::openNameEditor()
 {
     QVariant var;
--- a/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -26,6 +26,7 @@
 #include <hbtoucharea.h>
 #include <hbinstantfeedback.h>
 #include <hbmainwindow.h>
+#include <hbeffect.h>
 #include <xqsettingsmanager.h>
 #include <xqsettingskey.h>
 #include <cntuids.h>
@@ -38,11 +39,13 @@
     mLabel(NULL),
     mSecondLabel(NULL),
     mFrameItem(NULL),
+    mFocusItem(NULL),
     mIconTouchArea(NULL),
     mIconFocused(false),
     mTextFocused(false)
 {
-
+    HbEffect::add("icon", "groupbox_icon_click", "iconclick");
+    setProperty("state", "normal");
 }
 
 CntEditViewHeadingItem::~CntEditViewHeadingItem()
@@ -113,12 +116,22 @@
     if (!mFrameItem)
     {
         mFrameItem = new HbFrameItem(this);
-        mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox");
+        mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox_normal");
         mFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces);
         mFrameItem->setZValue(-2);
         style()->setItemName(mFrameItem, "background");
     }
 
+    if (!mFocusItem)
+    {
+       mFocusItem = new HbFrameItem(this);
+       mFocusItem->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox_pressed");
+       mFocusItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces);
+       mFocusItem->setZValue(-1);
+       mFocusItem->setVisible(false);
+       style()->setItemName(mFocusItem, "highlight");
+    }
+    
     if (!mIconTouchArea)
     {
         mIconTouchArea = new HbTouchArea(this);
@@ -152,6 +165,20 @@
 void CntEditViewHeadingItem::updatePrimitives()
 {
     HbWidget::updatePrimitives();
+    if (mTextFocused)
+    {
+       mFocusItem->setVisible(true);
+       setProperty("state", "pressed");
+    }
+    else if (mIconFocused)
+    {
+       HbEffect::start(mIcon, QString("icon"), QString("iconclick"));
+    }
+    else
+    {
+       mFocusItem->setVisible(false);
+       setProperty("state", "normal");
+    }
 }
 
 void CntEditViewHeadingItem::setDetails(const QContact* contact, bool myCard)
@@ -171,16 +198,18 @@
                              KCntNameOrdering);
     int setting = settingsMng.readItemValue(nameOrderKey, XQSettingsManager::TypeInt).toInt();
     QStringList nameList = QStringList();
-    QString last;
+    QString last_first;
     
     switch( setting ) {
         case CntOrderLastFirst:
             nameList << name.prefix() << name.lastName() << name.firstName() << name.middleName() << name.suffix();
             break;
         case CntOrderLastCommaFirst:
-            if (!name.lastName().isEmpty())
-                last = name.lastName() + ",";
-            nameList << name.prefix() << last << name.firstName() << name.middleName() << name.suffix();
+            if (!name.firstName().isEmpty() && !name.lastName().isEmpty())
+                last_first = name.lastName() + ", " + name.firstName();
+            else
+                last_first = !name.firstName().isEmpty() ? name.firstName() : name.lastName();
+            nameList << name.prefix() << last_first << name.middleName() << name.suffix();
             break;
         default:    // Default to first name last name
             nameList << name.prefix() << name.firstName() << name.middleName() << name.lastName() << name.suffix();
@@ -231,10 +260,12 @@
     if (mIconTouchArea->rect().contains(event->pos()))
     {
         mIconFocused = true;
+        updatePrimitives();
     }
     else if (rect().contains(event->pos()))
     {
         mTextFocused = true;
+        updatePrimitives();
     }
 
     event->accept();
@@ -249,6 +280,7 @@
     else if ((!rect().contains(event->pos()) || mIconTouchArea->rect().contains(event->pos())) && mTextFocused)
     {
         mTextFocused = false;
+        updatePrimitives();
     }
     event->accept();
 }
@@ -259,11 +291,13 @@
     if (mIconTouchArea->rect().contains(event->pos()) && mIconFocused)
     {
         mIconFocused = false;
+        updatePrimitives();
         emit iconClicked();
     }
     else if (rect().contains(event->pos()) && !mIconTouchArea->rect().contains(event->pos()) && mTextFocused)
     {
         mTextFocused = false;
+        updatePrimitives();
         emit textClicked();
     }
     event->accept();
--- a/phonebookui/pbkcommonui/src/cntfetchcontactsview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntfetchcontactsview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -15,6 +15,13 @@
 *
 */
 
+#include "cntfetchcontactsview.h"
+
+#include <cntlistmodel.h>
+
+#include <QGraphicsLinearLayout>
+
+#include <qcontactid.h>
 #include <hbdialog.h>
 #include <hbscrollbar.h>
 #include <hbindexfeedback.h>
@@ -27,29 +34,25 @@
 #include <hblistview.h>
 #include <hbsearchpanel.h>
 #include <hbstaticvkbhost.h>
-#include <QGraphicsLinearLayout>
-#include <qcontactid.h>
-#include <cntlistmodel.h>
-#include "cntfetchcontactsview.h"
 
 /*!
 Given a contact manager, CntFetchContacts is responsible for 
 retrieving a set of contacts, if any were chosen by the user. 
 */
 CntFetchContacts::CntFetchContacts(QContactManager &aManager) :
-QObject(),
-mPopup(NULL),
-mCntModel(NULL),
-mListView(NULL),
-mEmptyListLabel(NULL),
-mSelectionMode(HbAbstractItemView::MultiSelection),
-mManager(&aManager),
-mWasCanceled(false),
-mLabel(NULL),
-mVirtualKeyboard(NULL),
-mPrimaryAction(NULL),
-mSecondaryAction(NULL),
-mIndexFeedback(NULL)
+    QObject(),
+    mPopup(NULL),
+    mCntModel(NULL),
+    mListView(NULL),
+    mEmptyListLabel(NULL),
+    mSelectionMode(HbAbstractItemView::MultiSelection),
+    mManager(&aManager),
+    mWasCanceled(false),
+    mLabel(NULL),
+    mVirtualKeyboard(NULL),
+    mPrimaryAction(NULL),
+    mSecondaryAction(NULL),
+    mIndexFeedback(NULL)
 {
     mSearchPanel = new HbSearchPanel();
     mSearchPanel->setVisible(false);
@@ -68,12 +71,6 @@
 {
     delete mCntModel;
     mCntModel = NULL;
-    
-    delete mVirtualKeyboard;
-    mVirtualKeyboard = NULL;
-    
-    delete mIndexFeedback;
-    mIndexFeedback = NULL;
 }
 
 /*!
@@ -92,6 +89,9 @@
     if (!mLabel) {
         mLabel = new HbLabel(aTitle);
     }
+    else {
+        mLabel->setPlainText(aTitle);
+    }
 }
 
 /*!
@@ -130,7 +130,7 @@
         if (mEmptyListLabel) {
             qreal searchHeight = mSearchPanel->size().height();
             HbLabel* heading = static_cast<HbLabel*>(mPopup->headingWidget());
-            qreal heightToSet =  mPopup->size().height() - mVirtualKeyboard->keyboardArea().height() - searchHeight - heading->size().height();
+            qreal heightToSet =  mPopup->size().height() - mVirtualKeyboard->keyboardArea().height() - searchHeight;
             mEmptyListLabel->setMaximumHeight(heightToSet);
             mEmptyListLabel->setVisible(true);
             mLayout->insertItem(0, mEmptyListLabel);
@@ -153,10 +153,10 @@
 {
     qreal searchHeight = mSearchPanel->size().height();
     HbLabel* heading = static_cast<HbLabel*>(mPopup->headingWidget());
-    qreal heightToSet =  mPopup->size().height() - mVirtualKeyboard->keyboardArea().height() - searchHeight - heading->size().height();
+    qreal heightToSet =  mPopup->size().height() - mVirtualKeyboard->keyboardArea().height() - searchHeight;
 
     if (mEmptyListLabel) {
-        mEmptyListLabel->setMaximumHeight( heightToSet - mEmptyListLabel->size().height() );
+        mEmptyListLabel->setMaximumHeight(heightToSet);
     }
     
     mListView->setMaximumHeight(heightToSet);
@@ -217,6 +217,8 @@
     // Check for the case where there is a cancel button only. If so, 
     // after selecting any contact, should dismiss the dialog immediately.
     if (mButtonText.isEmpty() && mSelectionMode == HbAbstractItemView::SingleSelection) {
+        disconnect(mVirtualKeyboard, SIGNAL(keypadOpened()), this, SLOT(handleKeypadOpen()));
+        disconnect(mVirtualKeyboard, SIGNAL(keypadClosed()), this, SLOT(handleKeypadClose()));
         mPopup->close();
     }
 }
@@ -229,6 +231,7 @@
 
     if (!mPopup) {
         mPopup = new HbDialog;
+        mPopup->setAttribute(Qt::WA_DeleteOnClose, true);
     }
 
     QContactDetailFilter contactsFilter;
@@ -311,12 +314,12 @@
     mPopup->setHeadingWidget(mLabel);
 
     if (!mButtonText.isEmpty() && !mPrimaryAction) {
-        mPrimaryAction = new HbAction(hbTrId(mButtonText.toAscii()));
+        mPrimaryAction = new HbAction(mButtonText, mPopup);
         mPopup->addAction(mPrimaryAction);
     }
     
     if (!mSecondaryAction) {
-        mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel"));
+        mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), mPopup);
         mPopup->addAction(mSecondaryAction);
     }
 
--- a/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -16,6 +16,10 @@
 */
 
 #include "cntgroupactionsview.h"
+#include "cntactionlauncher.h"
+#include "cntglobal.h"
+
+#include <cntactionpopup.h>
 
 #include <hblistview.h>
 #include <hbmenu.h>
@@ -39,7 +43,8 @@
 mGroupContact(NULL),
 mModel(NULL),
 mViewManager(NULL),
-mListView(NULL)
+mListView(NULL),
+mPopupCount(0)
 {
     bool ok = false;
     mDocumentLoader.load(CNT_GROUPACTIONSVIEW_XML, &ok);
@@ -120,9 +125,11 @@
     mGroupContact = new QContact(aArgs.value(ESelectedGroupContact).value<QContact>());
     mViewManager = aMgr;
 
-    QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName );
-    QString groupName(groupContactName.value( QContactName::FieldCustomLabel ));
-    
+    QString groupName = mGroupContact->displayLabel();
+    if (groupName.isEmpty())
+    {
+        groupName = hbTrId("txt_phob_list_unnamed");
+    }
     
     //group box
     HbGroupBox* groupBox = static_cast<HbGroupBox *>(mDocumentLoader.findWidget(QString("groupBox")));
@@ -145,24 +152,27 @@
     
     QContactPhoneNumber confCallNumber = mGroupContact->detail<QContactPhoneNumber>();
     if(!confCallNumber.number().isEmpty())
-        {
+    {
         /*
          * Internationalization support, activate the following code 
          * when support available from Orbit
          */
         //populatelist(hbTrId("txt_phob_dblist_conference_call"), HbIcon("qtg_large_call_group"),HbNumberGrouping::formatPhoneNumber(confCallNumber.number()));
-        populatelist(hbTrId("txt_phob_dblist_conference_call"), HbIcon("qtg_large_call_group"),confCallNumber.number());
-        }
+        populatelist(hbTrId("txt_phob_dblist_conference_call"), HbIcon("qtg_large_call_group"),confCallNumber.number(),"call");
+    }
       
-    populatelist(hbTrId("txt_phob_dblist_send_message"),HbIcon("qtg_large_message_group"),hbTrId("txt_phob_dblist_send_message_val_members"));
-    populatelist(hbTrId("txt_phob_dblist_email"),HbIcon("qtg_large_email_group"),hbTrId("txt_phob_dblist_send_message_val_members"));
+    populatelist(hbTrId("txt_phob_dblist_send_message"),HbIcon("qtg_large_message_group"),hbTrId("txt_phob_dblist_send_message_val_members"),"message");
+    populatelist(hbTrId("txt_phob_dblist_email"),HbIcon("qtg_large_email_group"),hbTrId("txt_phob_dblist_send_message_val_members"),"email");
     
     mListView->setModel(mModel);
     mListView->setSelectionMode(HbAbstractItemView::NoSelection);
     
+    connect(mListView, SIGNAL(activated(const QModelIndex&)),
+                this, SLOT(listItemSelected(const QModelIndex&)));
+    
 }
 
-void CntGroupActionsView:: populatelist(QString primaryText,HbIcon icon,QString secondaryText)
+void CntGroupActionsView::populatelist(QString primaryText,HbIcon icon,QString secondaryText,QString action)
 {
     QList<QStandardItem*> items;
     QStandardItem *labelItem = new QStandardItem();
@@ -173,7 +183,115 @@
     
     labelItem->setData(textList, Qt::DisplayRole);
     labelItem->setData(icon, Qt::DecorationRole);
+    labelItem->setData(action, Qt::UserRole+1);
     
     items << labelItem ;
     mModel->appendRow(items);
 }
+
+void CntGroupActionsView::listItemSelected(const QModelIndex &index)
+{
+    if (index.isValid()) {
+        //reset flags
+        mPopupCount=0;
+        mActionParams.clear();
+        
+        QString action = mModel->item(index.row())->data(Qt::UserRole+1).toString();
+        
+        //conference call
+        if (action.compare("call", Qt::CaseInsensitive) == 0 ) {
+            CntActionLauncher* other = new CntActionLauncher(*mViewManager->contactManager(SYMBIAN_BACKEND), action);
+            connect(other, SIGNAL(actionExecuted(CntActionLauncher*)), this, SLOT(actionExecuted(CntActionLauncher*)));
+            other->execute(*mGroupContact, QContactDetail());
+        }
+        //group email, message
+        else {
+            QContactRelationshipFilter relationshipFilter;
+            relationshipFilter.setRelationshipType(QContactRelationship::HasMember);
+            relationshipFilter.setRelatedContactRole(QContactRelationship::First);
+            relationshipFilter.setRelatedContactId(mGroupContact->id());   
+            QList<QContactLocalId> groupMembers = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(relationshipFilter);
+            
+            for (int i = 0;i<groupMembers.count();i++) {
+                QContact contact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(groupMembers.at(i));
+                QContactDetail preferredDetail = contact.preferredDetail(action);
+                //use preferred detail if exits
+                if (!preferredDetail.isEmpty()) {
+                    if(action.compare("message", Qt::CaseInsensitive) == 0) {
+                        QContactPhoneNumber phoneNumber = contact.detail<QContactPhoneNumber>();
+                        mActionParams.append(phoneNumber.number());
+                    }
+                    else {
+                        QContactEmailAddress email = contact.detail<QContactEmailAddress>();
+                        mActionParams.append(email.emailAddress());
+                    }
+                }
+                else {
+                    CntActionPopup *actionPopup = new CntActionPopup(&contact);
+                    if(actionPopup->showActionPopup(action)) {
+                        //increment actionpopup counter
+                        mPopupCount++;
+                        
+                        connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, 
+                                                    SLOT(executeAction(QContact&, QContactDetail, QString)));
+                        connect(actionPopup, SIGNAL(actionPopupCancelPressed()), this, SLOT(actionCancelled()));
+                    }
+                    else {
+                        delete actionPopup;
+                    }
+                }
+            }
+            //no popup dialog, execute action
+            if (mPopupCount==0) {
+                QVariantMap map;
+                QVariant params;
+                params.setValue(mActionParams);
+                map.insert(action,params);
+                CntActionLauncher* other = new CntActionLauncher(*mViewManager->contactManager(SYMBIAN_BACKEND), action);
+                connect(other, SIGNAL(actionExecuted(CntActionLauncher*)), this, SLOT(actionExecuted(CntActionLauncher*)));
+                other->execute(*mGroupContact, QContactDetail(), map);
+            }
+        }
+    }
+}
+
+void CntGroupActionsView::executeAction(QContact& contact, QContactDetail detail, QString action)
+{
+    Q_UNUSED(contact);
+    
+    if (action.compare("message", Qt::CaseInsensitive) == 0) {
+        QContactPhoneNumber phoneNumber = static_cast<QContactPhoneNumber>(detail);
+        mActionParams.append(phoneNumber.number());
+    }
+    else if (action.compare("email", Qt::CaseInsensitive) == 0) {
+        QContactEmailAddress email = static_cast<QContactEmailAddress>(detail);
+        mActionParams.append(email.emailAddress());
+    }
+    
+    //actionpopup executed, decrement counter
+    mPopupCount--;
+    if (mPopupCount==0) {
+        QVariantMap map;
+        QVariant params;
+        params.setValue(mActionParams);
+        map.insert(action,params);
+        
+        CntActionLauncher* other = new CntActionLauncher(*mViewManager->contactManager(SYMBIAN_BACKEND), action);
+        connect(other, SIGNAL(actionExecuted(CntActionLauncher*)), this, SLOT(actionExecuted(CntActionLauncher*)));
+        other->execute(*mGroupContact, QContactDetail(), map);
+        }
+}
+
+void CntGroupActionsView::actionCancelled()
+{
+    //actionpopup cancelled, decrement counter
+    mPopupCount--;
+}
+
+
+void CntGroupActionsView::actionExecuted(CntActionLauncher* aAction)
+{
+    //cleanup
+    aAction->deleteLater();
+}
+
--- a/phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -31,7 +31,7 @@
         nameDetails.append(emptyName);
     }
     
-    QList<QContactPhoneNumber> numberDetails = CntDetailOrderingHelper::getOrderedSupportedPhoneNumbers(*mContact);
+    QList<QContactPhoneNumber> numberDetails = mContact->details<QContactPhoneNumber>();
     if (numberDetails.isEmpty())
     {
         QContactPhoneNumber emptyNumber;
--- a/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -206,9 +206,6 @@
         QString name = getContactManager()->synthesizedDisplayLabel(*mGroupContact);
         HbNotificationDialog::launchDialog(HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_new_group_1_created").arg(name)));
     }
-    
-    mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
-    connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleManageMembers()));
 }
 
 void CntGroupMemberView::deactivate()
@@ -246,8 +243,12 @@
     mOriginalGroupMembers = getContactManager()->contactIds(membersFilter);
     
     QSet<QContactLocalId> contactsSet = mOriginalGroupMembers.toSet();
-    QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName );
-    QString groupName(groupContactName.value( QContactName::FieldCustomLabel ));
+
+    QString groupName = mGroupContact->displayLabel();
+    if (groupName.isEmpty())
+    {
+        groupName = hbTrId("txt_phob_list_unnamed");
+    }
     
     if (!mFetchView) {
         mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
@@ -286,6 +287,9 @@
     if (!removedMemberships.isEmpty()) {
         getContactManager()->removeRelationships(removedMemberships, &errors);
     }
+    
+    delete mFetchView;
+    mFetchView = 0;
 }
 
 void CntGroupMemberView::createModel()
@@ -311,18 +315,21 @@
 void CntGroupMemberView::deleteGroup()
 {
     QString groupName = mGroupContact->displayLabel();
+    if (groupName.isNull())
+    {
+        groupName = hbTrId("txt_phob_list_unnamed");
+    }
+    
     HbLabel *headingLabel = new HbLabel();
     headingLabel->setPlainText(HbParameterLengthLimiter(hbTrId("txt_phob_dialog_delete_1_group")).arg(groupName));
     
-    HbMessageBox::question(hbTrId("txt_phob_dialog_only_group_will_be_removed_contac"), this, SLOT(handleDeleteGroup(HbAction*)),
-            hbTrId("txt_common_button_delete"), hbTrId("txt_common_button_cancel"), headingLabel);
+    HbMessageBox::question(hbTrId("txt_phob_dialog_only_group_will_be_removed_contac"), this, SLOT(handleDeleteGroup(int)),
+            HbMessageBox::Delete | HbMessageBox::Cancel, headingLabel);
 }
 
-void CntGroupMemberView::handleDeleteGroup(HbAction *action)
+void CntGroupMemberView::handleDeleteGroup(int action)
 {
-    HbDialog *popup = static_cast<HbDialog*>(sender());
-    
-    if (popup && action == popup->actions().first())
+    if (action == HbMessageBox::Delete)
     {
         getContactManager()->removeContact(mGroupContact->localId());
         showPreviousView();
--- a/phonebookui/pbkcommonui/src/cnthistoryview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cnthistoryview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -112,7 +112,12 @@
     
     // Set history view heading
     HbGroupBox* groupBox = static_cast<HbGroupBox*>(docLoader()->findWidget(QString("groupBox")));
-    groupBox->setHeading(hbTrId("txt_phob_subtitle_history_with_1").arg(mContact->displayLabel()));
+    QString name = mContact->displayLabel();
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
+    groupBox->setHeading(hbTrId("txt_phob_subtitle_history_with_1").arg(name));
     
     //construct listview
     mHistoryListView = static_cast<HbListView*>(docLoader()->findWidget(QString("listView")));
@@ -171,19 +176,21 @@
 {
     // Ask the use if they want to clear the history
     QString name = mContact->displayLabel();
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
     
     HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_clear_communications_history_with_1")).arg(name), this, 
-            SLOT(handleClearHistory(HbAction*)), hbTrId("txt_common_button_delete"), hbTrId("txt_common_button_cancel"));
+            SLOT(handleClearHistory(int)), HbMessageBox::Delete | HbMessageBox::Cancel);
 }
 
 /*
 Handle the selected action for clearing history
 */
-void CntHistoryView::handleClearHistory(HbAction *action)
+void CntHistoryView::handleClearHistory(int action)
 {
-    HbMessageBox *note = static_cast<HbMessageBox*>(sender());
-    
-    if (note && action == note->actions().first())
+    if (action == HbMessageBox::Delete)
     {
         mHistoryModel->clearHistory();
     }
--- a/phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -20,6 +20,7 @@
 #include <cnthistorymodel.h>
 #include <hbframedrawer.h>
 #include <hbframeitem.h>
+#include <QGraphicsWidget>
 
 #define NEW_EVENT_FRAME "qtg_fr_list_new_item"
 #define INCOMING_FOCUS_FRAME "qtg_fr_convlist_received_pressed"
@@ -117,4 +118,26 @@
         }
     }
 }
+
+bool CntHistoryViewItem::event(QEvent* e)
+{
+    bool result;
+    if (e->type() == QEvent::GraphicsSceneResize)
+    {
+        // HbAbstractItemView has a performance improvement when drawing backrounds but seems
+        // to screw the layout of history view items. This workaround fixes the issue. There should
+        // be minimal performance drawbacks since GraphicsSceneResize events are quite few.
+        // TODO: Remove this once Orbit changes their implementation. Not known when
+        QGraphicsWidget *frame = static_cast<QGraphicsWidget*>(primitive("frame"));
+        QRectF frameGeometry = frame->geometry();
+        result = HbListViewItem::event(e);
+        frame->setGeometry(frameGeometry);
+    } 
+    else
+    {
+        result = HbListViewItem::event(e);
+    }
+    return result;
+}
+
 // EOF
--- a/phonebookui/pbkcommonui/src/cntimageeditorview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntimageeditorview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -17,12 +17,14 @@
 
 #include "cntimageeditorview.h"
 #include "cntimageutility.h"
+#include "cntsavemanager.h"
 
 #include <hblabel.h>
 #include <xqaiwrequest.h>
 #include <xqaiwdecl.h>
 
 #include "cntdebug.h"
+#include "cntglobal.h"
 
 #include <thumbnailmanager_qt.h>
 #include <hbaction.h>
@@ -31,8 +33,11 @@
 #include <hblistview.h>
 #include <hblistviewitem.h>
 #include <hbframebackground.h>
+#include <hbdevicenotificationdialog.h>
+#include <hbparameterlengthlimiter.h>
 
 #include <QStandardItemModel>
+#include <QApplication>
 
 const char *CNT_IMAGE_XML = ":/xml/contacts_if.docml";
 
@@ -40,13 +45,14 @@
 Constructor
 */
 CntImageEditorView::CntImageEditorView() :
-        mContact(NULL),
-        mAvatar(NULL),
-        mImageLabel(NULL),
-        mRequest(NULL),
-        mViewManager(NULL),
-        mListView(NULL),
-        mModel(NULL)
+    mContact(NULL),
+    mAvatar(NULL),
+    mImageLabel(NULL),
+    mRequest(NULL),
+    mViewManager(NULL),
+    mListView(NULL),
+    mModel(NULL),
+    mSaveManager(NULL)
 {
     bool ok = false;
     mDocumentLoader.load(CNT_IMAGE_XML, &ok);
@@ -76,6 +82,9 @@
     
     connect( mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)),
         this, SLOT(thumbnailReady(QPixmap, void*, int, int)) );
+    
+    // closing the application from task swapper or end key will cause the contact to be saved
+    connect( qApp, SIGNAL(aboutToQuit()), this, SLOT(saveContact()));
 }
 
 /*!
@@ -88,15 +97,17 @@
     mView->deleteLater();
 
     delete mAvatar;
-    mAvatar = 0;
+    mAvatar = NULL;
     delete mContact;
-    mContact = 0;
+    mContact = NULL;
     delete mRequest;
-    mRequest = 0;
+    mRequest = NULL;
     delete mRemoveImage;
-    mRemoveImage = 0;
+    mRemoveImage = NULL;
     delete mModel;
-    mModel = 0;
+    mModel = NULL;
+    delete mSaveManager;
+    mSaveManager = NULL;
     
     CNT_EXIT
 }
@@ -121,6 +132,24 @@
     
     mContact = new QContact(mArgs.value(ESelectedContact).value<QContact>());
     
+    QString myCard = mArgs.value( EMyCard ).toString();
+    QContactLocalId localId = mContact->localId();
+    QContactLocalId selfContactId = mViewManager->contactManager(SYMBIAN_BACKEND)->selfContactId();
+    bool isMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
+    
+    if (isMyCard)
+    {
+        mSaveManager = new CntSaveManager(CntSaveManager::EMyCard);
+    }
+    else if (mContact->type() == QContactType::TypeGroup)
+    {
+        mSaveManager = new CntSaveManager(CntSaveManager::EGroup);
+    }
+    else
+    {
+        mSaveManager = new CntSaveManager();
+    }
+    
     // set the correct image if the contact already has an image set
     mImageLabel = static_cast<HbLabel*>(mDocumentLoader.findWidget(QString("cnt_image_label")));
     QList<QContactAvatar> details = mContact->details<QContactAvatar>();
@@ -196,7 +225,7 @@
         mRequest = 0;
     }
     
-    mRequest = mAppManager.create(XQI_CAMERA_CAPTURE, "capture(int,QVariantMap)", false);
+    mRequest = mAppManager.create(XQI_CAMERA_CAPTURE, XQOP_CAMERA_CAPTURE, false);
     if ( mRequest ) 
     {
         int mode = 0; //image mode
@@ -385,6 +414,47 @@
 
 void CntImageEditorView::handleError(int errorCode, const QString& errorMessage)
 {
+    Q_UNUSED(errorCode);
+    Q_UNUSED(errorMessage);
     CNT_LOG_ARGS("error code = " << errorCode << "errorMessage=" << errorMessage)
 }
 
+void CntImageEditorView::saveContact()
+{
+    mContact->saveDetail(mAvatar);
+
+    if ( mAvatar->imageUrl().isEmpty())
+    {
+        mContact->removeDetail(mAvatar);
+    }
+    
+    QString name = mViewManager->contactManager(SYMBIAN_BACKEND)->synthesizedDisplayLabel(*mContact);
+    
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
+    
+    CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mContact, mViewManager->contactManager(SYMBIAN_BACKEND));
+    
+    if (mContact->type() != QContactType::TypeGroup)
+    {
+        switch (result)
+        {
+        case CntSaveManager::ESaved:
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contact_1_saved")).arg(name));
+            break;
+        case CntSaveManager::EUpdated:
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contacts_1_updated")).arg(name));
+            break;
+        case CntSaveManager::EFailed:
+            HbDeviceNotificationDialog::notification(QString(),hbTrId("SAVING FAILED!"));
+            break;
+        case CntSaveManager::EDeleted:
+        case CntSaveManager::ENothingDone:
+        default:
+            break;
+        }
+    }
+}
+
--- a/phonebookui/pbkcommonui/src/cntimagelabel.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntimagelabel.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -19,12 +19,14 @@
 
 #include <hbinstantfeedback.h>
 #include <hbtapgesture.h>
+#include <hbeffect.h>
 #include <QGraphicsSceneMouseEvent>
 
 CntImageLabel::CntImageLabel(QGraphicsItem *parent) :
     HbLabel(parent)
 {
     grabGesture(Qt::TapGesture);
+    HbEffect::add(this, "groupbox_icon_click", "iconclick");
 }
 
 CntImageLabel::~CntImageLabel()
@@ -38,6 +40,9 @@
     {    
         switch (tap->state()) 
         {
+            case Qt::GestureStarted:
+                HbEffect::start(this, QString("iconclick"));
+                break;
             case Qt::GestureFinished:
                 if (tap->tapStyleHint() == HbTapGesture::Tap)
                 {
@@ -48,8 +53,9 @@
             case Qt::GestureUpdated:
                 if (tap->tapStyleHint() == HbTapGesture::TapAndHold) 
                 {
+                    HbEffect::cancel(this, QString("iconclick"));
                     emit iconLongPressed(tap->scenePosition());
-                }
+                }      
                 break;
             default:
                 break;
--- a/phonebookui/pbkcommonui/src/cntimportsview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntimportsview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -168,7 +168,7 @@
                     mAdnStorePresent = true;
                     mAdnEntriesPresent = true;
                     mWaitingForAdnCache = true;
-                    connect(mAdnSimUtility, SIGNAL(adnCacheStatusReady(SimUtility::CacheStatus&, int)), this, SLOT(adnCacheStatusReady(SimUtility::CacheStatus&, int)));
+                    connect(mAdnSimUtility, SIGNAL(adnCacheStatusReady(CntSimUtility::CacheStatus&, int)), this, SLOT(adnCacheStatusReady(CntSimUtility::CacheStatus&, int)));
                     if (!mAdnSimUtility->notifyAdnCacheStatus()) {
                         mAdnStorePresent = false;
                         mAdnEntriesPresent = false;
@@ -322,6 +322,7 @@
 
 bool CntImportsView::startSimImport()
 {
+
     bool started = false;
 
     delete mFetchRequestADN;
--- a/phonebookui/pbkcommonui/src/cntmycardview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntmycardview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -98,11 +98,6 @@
     {
         chooseButton->setEnabled(false);
     }
-    
-    if (!mFetchView) {
-        mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
-        connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleMultiCardSelection()));
-    }
 }
 
 void CntMyCardView::deactivate()
@@ -144,6 +139,10 @@
 void CntMyCardView::openMyCardSelectionView()
 {
     // Display a list of contacts to choose a mycard from.
+    if (!mFetchView) {
+        mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
+        connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleMultiCardSelection()));
+    }
     mFetchView->setDetails(hbTrId("txt_phob_title_select_contact"), "");
     QSet<QContactLocalId> emptyContactsSet;
     mFetchView->displayContacts(HbAbstractItemView::SingleSelection, emptyContactsSet);
@@ -163,6 +162,10 @@
         manager->setSelfContactId( contact.localId() );
         showPreviousView();
     }
+    else {
+        delete mFetchView;
+        mFetchView = NULL;
+    }
 }
 
 void CntMyCardView::removeFromGroup(const QContact* aContact)
--- a/phonebookui/pbkcommonui/src/cntnamesview_p.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntnamesview_p.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -144,6 +144,9 @@
 {
     CNT_ENTRY
     
+    delete mFetchView;
+    mFetchView = NULL;
+    
     delete mListModel;
     mListModel = NULL;
 
@@ -212,6 +215,11 @@
         setScrollPosition(aArgs.value(ESelectedContact).value<QContact>().localId());
     }
    
+    if ( aArgs.value( EFinder ).toString() == "show" )
+    {
+        showFinder();
+    }
+
     CNT_EXIT
 }
 
@@ -219,9 +227,13 @@
 {
     CNT_ENTRY
     
-    if (!(mView->visibleItems() & Hb::AllItems))
+    // in UTs there is no mainwindow and therefore calling HbView::visibleItems() would cause a crash
+    if (mView->mainWindow() != NULL)
     {
-        hideFinder();
+        if (!(mView->visibleItems() & Hb::AllItems))
+        {
+            hideFinder();
+        }
     }
 
     delete mMenuBuilder;
@@ -398,11 +410,15 @@
     
     QContactManager* manager = mViewManager->contactManager( SYMBIAN_BACKEND );
     QString name = manager->synthesizedDisplayLabel(aContact);
+    if (name.isEmpty())
+    {
+        name = hbTrId("txt_phob_list_unnamed");
+    }
     
     mHandledContactId = aContact.localId();
     
-    HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(HbAction*)),
-            hbTrId("txt_common_button_delete"), hbTrId("txt_common_button_cancel"));
+    HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(int)),
+            HbMessageBox::Delete | HbMessageBox::Cancel);
     
     CNT_EXIT
 }
@@ -514,13 +530,11 @@
     CNT_EXIT
 }
 
-void CntNamesViewPrivate::handleDeleteContact( HbAction* aAction )
+void CntNamesViewPrivate::handleDeleteContact( int aAction )
 {
     CNT_ENTRY
     
-    HbMessageBox *note = static_cast<HbMessageBox*>(sender());
-    
-    if (note && aAction == note->actions().first())
+    if (aAction == HbMessageBox::Delete)
     {
         mViewManager->contactManager( SYMBIAN_BACKEND )->removeContact(mHandledContactId);
     }
--- a/phonebookui/pbkcommonui/src/cntpresencelistener.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntpresencelistener.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -20,6 +20,11 @@
 #include <prcpresencebuddyinfo_qt.h>
 #include <prcpresencereader_qt.h>
 
+/*!
+    Presence listener for contact card. It provides aggregated
+    presence information for a contact and separately for each
+    valid QContactOnlineAccount.
+*/
 CntPresenceListener::CntPresenceListener(const QContact& contact, QObject* parent) :
     QObject(parent),
     mReader(NULL),
@@ -30,12 +35,22 @@
                            this, SLOT(handlePresenceUpdate(bool, PrcPresenceBuddyInfoQt*)));
 }
 
+/*!
+    Destructor
+*/
 CntPresenceListener::~CntPresenceListener()
 {
     delete mReader;
     mReader = NULL;
 }
 
+/*!
+    Subscribes all valid QContactOnlineAccounts to receive status updates from presence cache and
+    returns initial presence statuses for each of the accounts.
+
+    \param combinedOnlineStatus aggregated online status
+    \return QMap with account specific (for example "sip:sip@sip.com") online information
+*/
 QMap<QString, bool> CntPresenceListener::initialPresences(bool &combinedOnlineStatus)
 {
     QMap<QString, bool> initialMap;
@@ -67,7 +82,14 @@
     
     return initialMap;
 }
+
+/*!
+    Private slot that handles emitting changes for separate accounts along
+    with the aggregated information.
     
+    \param aSuccess information if the request/update was succesful
+    \param aPresenceBuddyInfo the account that got updated
+*/
 void CntPresenceListener::handlePresenceUpdate(bool aSuccess, PrcPresenceBuddyInfoQt* aPresenceBuddyInfo)
 {
     if (aSuccess && aPresenceBuddyInfo != NULL)
@@ -90,14 +112,20 @@
                 }
             }
             
-            // emit the combined presence status
+            // emit the aggregated presence status
             emit fullPresenceUpdated(parsePresence(buddies));
             
             qDeleteAll(buddies);
         }
     }
 }
-    
+
+/*!
+    Returns the aggregated online status.
+
+    \param buddyList list of accounts to parse the aggregated status from
+    \return bool true if any of the accounts is online
+*/
 bool CntPresenceListener::parsePresence(QList<PrcPresenceBuddyInfoQt*> buddyList)
 {
     foreach (PrcPresenceBuddyInfoQt* buddy, buddyList)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/pbkcommonui/src/cntsavemanager.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,154 @@
+/*
+* 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 "cntsavemanager.h"
+#include "cntdebug.h"
+
+/*!
+    Contact saving helper class. Used mainly in edit view for contact saving,
+    but should also be used in other (special) cases a contact needs to be saved.
+    For example "forcing" phonebook to shut down (end key, from task swapper etc..)
+    in detail editors.
+*/
+CntSaveManager::CntSaveManager(CntContactType type, QObject* parent) :
+    QObject(parent),
+    mContactType(type)
+{
+    CNT_ENTRY
+    
+    CNT_EXIT
+}
+
+/*!
+    Destructor
+*/
+CntSaveManager::~CntSaveManager()
+{
+    CNT_ENTRY
+    
+    CNT_EXIT
+}
+
+/*!
+    Saves the given QContact to the given QContactManager. Also takes care of checking
+    if the contact is MyCard or a group and behaves different accordingly.
+
+    \param aContact the contact to be saved, ownership not taken
+    \param aManager the QContactManager which should be used for saving the contact, ownership not taken
+    \return CntSaveResult enum to describe what was done to the contact (saved, updated etc...)
+*/
+CntSaveManager::CntSaveResult CntSaveManager::saveContact(QContact* aContact, QContactManager* aManager)
+{
+    CNT_ENTRY
+    
+    CntSaveResult result = ENothingDone;
+    bool isSavedContact = aContact->localId() > 0;
+    
+    // if the contact is really changed or a new one
+    if ( (*aContact) != aManager->contact(aContact->localId()) || !isSavedContact )
+    {
+        int detailCount = aContact->details().count();
+        
+        // Don't set preferred details for a group
+        if (mContactType != EGroup)
+        {
+            setPreferredDetails( aContact );
+        }
+        
+        // If its a new contact
+        if ( !isSavedContact )
+        {
+            // if a new contact has 2 or less details, it's still considered empty
+            if ( detailCount > 2 )
+            {
+                bool success = aManager->saveContact( aContact );
+                if ( success && mContactType == EMyCard )
+                {
+                    aManager->setSelfContactId( aContact->localId() );
+                }
+                
+                result = success ? ESaved : EFailed;
+            }
+        }
+        else
+        {
+            // Contact details has been cleared out, a symbian QContact with 
+            // 4 or less details is in reality empty.
+            if ( detailCount <= 4 )
+            {
+                bool success = aManager->removeContact( aContact->localId() );
+                
+                result = success ? EDeleted : EFailed;
+            }
+            else
+            {
+                bool success = aManager->saveContact(aContact);
+                
+                result = success ? EUpdated : EFailed;     
+            }
+        }
+    }
+    
+    CNT_EXIT_ARGS(result)
+    
+    return result;
+}
+
+/*!
+    Set the preferred call, sms and email details for a contact if possible
+    and needed.
+
+    \param aContact the contact being handled
+*/
+void CntSaveManager::setPreferredDetails( QContact* aContact )
+{
+    CNT_ENTRY
+    
+    QList<QContactPhoneNumber> numberList( aContact->details<QContactPhoneNumber>() );
+    //set preferred number for call if there is only one phone number
+    if ( aContact->preferredDetail("call").isEmpty() && numberList.count() == 1 )
+    {
+        aContact->setPreferredDetail( "call", numberList.first() );
+    }
+    //set preferred number for message if there is only one mobile phone number
+    if ( aContact->preferredDetail("message").isEmpty() && numberList.count() >= 1 )
+    {
+        int mobileNumbers = 0;
+        int mobileNumberIndex = -1;
+        for (int i = 0; i < numberList.count(); i++)
+        {
+            QStringList subTypes = numberList.at(i).subTypes();
+            if (subTypes.count() && subTypes.first() == QContactPhoneNumber::SubTypeMobile)
+            {
+                mobileNumbers++;
+                mobileNumberIndex = i;
+            }      
+        }
+        if ( mobileNumbers == 1 )
+        {
+            aContact->setPreferredDetail( "message", numberList.at(mobileNumberIndex) );
+        }
+    }
+    QList<QContactEmailAddress> emailList( aContact->details<QContactEmailAddress>() );
+    //set preferred number for email if there is only one email address
+    if ( aContact->preferredDetail("email").isEmpty() && emailList.count() == 1 )
+    {
+        aContact->setPreferredDetail( "email", emailList.first() );
+    }
+    
+    CNT_EXIT
+}
--- a/phonebookui/phonebookapp/src/main.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookapp/src/main.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -21,9 +21,11 @@
 #include "cntmainwindow.h"
 #include "cntappservicehandler.h"
 #include "cntglobal.h"
+#include "cntdebug.h"
 
 int main(int argc, char **argv)
 {
+    qInstallMsgHandler(MSG_HANDLER);
 
     HbApplication a( argc, argv );
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntabstractserviceprovider.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,39 @@
+/*
+ * 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: Abstract interface for highway providers used in phonebookservices.
+ *
+ */
+
+#ifndef CNTABSTRACTSERVICEPROVIDER_H
+#define CNTABSTRACTSERVICEPROVIDER_H
+
+
+QTM_USE_NAMESPACE
+
+/*!
+ * Abstract interface for highway providers used in phonebookservices.
+ */
+class CntAbstractServiceProvider
+{
+public:
+
+    /*!
+     Complete the Qt Highway service (through a QqServiceProvider instance).
+     Closes the app after the completing is done (message sending to client is done).
+     */
+    virtual void CompleteServiceAndCloseApp(const QVariant& retValue) = 0;
+
+};
+
+#endif /* CNTABSTRACTSERVICEPROVIDER_H */
--- a/phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -25,6 +25,7 @@
 
 class CntServiceHandler;
 class CntAbstractViewManager;
+class CntAbstractServiceProvider;
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -47,13 +48,13 @@
     void doViewActivated(CntAbstractViewManager* aMgr, const CntViewParameters aArgs);
 
 public:
-    CntServiceAssignContactCardView(CntServiceHandler *aServiceHandler);
+    CntServiceAssignContactCardView( CntAbstractServiceProvider& aServiceController );
     ~CntServiceAssignContactCardView();
 
     int viewId() const { return serviceAssignContactCardView; }
 
 private:
-    CntServiceHandler       *mServiceHandler;
+    CntAbstractServiceProvider& mProvider;
     CntAbstractViewManager  *mViewManager;
     QContact                mContact;
     QContactDetail          mDetail;
--- a/phonebookui/phonebookservices/inc/cntservicecontactcardview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntservicecontactcardview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -22,23 +22,23 @@
 #include "cntcontactcardview.h"
 
 class CntServiceHandler;
+class CntAbstractServiceProvider;
 
 class CntServiceContactCardView : public CntContactCardView
 {
     Q_OBJECT
 
-private slots:
-
-    void doShowPreviousView();
-
 public:
-    CntServiceContactCardView(CntServiceHandler *aServiceHandler);
+    CntServiceContactCardView( CntAbstractServiceProvider& aServiceProvider );
     ~CntServiceContactCardView();
 
     int viewId() const { return serviceContactCardView; }
     
+private slots:
+    void closeContactCard();
+
 private:
-    CntServiceHandler *mServiceHandler;
+    CntAbstractServiceProvider& mProvider;
    
 };
 
--- a/phonebookui/phonebookservices/inc/cntservicecontactfetchview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntservicecontactfetchview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -21,26 +21,26 @@
 #include <QObject>
 
 #include "cntbaseselectionview.h"
+#include "cntabstractserviceprovider.h"
 
-class CntServiceHandler;
 
 class CntServiceContactFetchView : public CntBaseSelectionView
 {
     Q_OBJECT
 
 public:
-    CntServiceContactFetchView( CntServiceHandler *aServiceHandler );
+    CntServiceContactFetchView( CntAbstractServiceProvider& aServiceProvider );
     ~CntServiceContactFetchView();
 
     int viewId() const { return serviceContactFetchView; }
     
 public slots:
     void aboutToOpenView(CntAbstractViewManager* aMgr, const CntViewParameters viewParameters);
-    void aboutToCloseView();
+    void closeFetchView();
     void cancelFetch();
 
 private:
-    CntServiceHandler *mServiceHandler;
+    CntAbstractServiceProvider& mProvider;
 };
 
 #endif /* CNTSERVICECONTACTFETCHVIEW_H */
--- a/phonebookui/phonebookservices/inc/cntservicecontactselectionview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntservicecontactselectionview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -21,6 +21,7 @@
 #include <QObject>
 
 #include "cntbaseselectionview.h"
+#include "cntabstractserviceprovider.h"
 
 class QModelIndex;
 class CntServiceHandler;
@@ -30,7 +31,7 @@
     Q_OBJECT
 
 public:
-    CntServiceContactSelectionView(CntServiceHandler *aServiceHandler);
+    CntServiceContactSelectionView( CntAbstractServiceProvider& aServiceProvider );
     ~CntServiceContactSelectionView();
 
     int viewId() const { return serviceContactSelectionView; }
@@ -41,7 +42,7 @@
     void aboutToCloseView();
         
 private:
-    CntServiceHandler *mServiceHandler;
+    CntAbstractServiceProvider& mProvider;
     QContactDetail     mDetail;
 };
 
--- a/phonebookui/phonebookservices/inc/cntserviceeditview.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntserviceeditview.h	Wed Jul 21 11:21:49 2010 +0300
@@ -20,6 +20,7 @@
 
 #include <QObject>
 #include "cnteditview.h"
+#include "cntabstractserviceprovider.h"
 
 class CntServiceHandler;
 
@@ -30,7 +31,7 @@
 
 public:
 
-    CntServiceEditView(CntServiceHandler *aServiceHandler );
+    CntServiceEditView( CntAbstractServiceProvider& aServiceProvider );
     ~CntServiceEditView();
 
     int viewId() const { return serviceEditView; }
@@ -41,7 +42,7 @@
     void doChangesDiscarded();
 
 private:
-    CntServiceHandler *mServiceHandler;
+    CntAbstractServiceProvider& mProvider;
     
 };
 
--- a/phonebookui/phonebookservices/inc/cntservicehandler.h	Wed Jul 21 11:09:07 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/*
- * 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:
- *
- */
-
-#ifndef CNTSERVICEHANDLER_H
-#define CNTSERVICEHANDLER_H
-
-#include <cntservicescontact.h>
-#include <xqserviceprovider.h>
-#include <cntviewparams.h>
-#include <qtcontacts.h>
-
-QTM_USE_NAMESPACE
-
-class CntServiceHandler : public XQServiceProvider
-{
-    Q_OBJECT
-public:
-    CntServiceHandler(QObject *parent = 0);
-    ~CntServiceHandler();
-    
-    enum CntServiceViewParams
-    {
-        ETitle = ECustomParam,
-        EFilter,
-        EAction
-    };
-
-public:
-    void completeFetch(const CntServicesContactList &contactList);
-    void completeEdit(int result);
-
-public slots:
-    // Services offered to clients
-    void fetch(const QString &title,
-               const QString &action,
-               const QString &filter);
-    
-    void Dofetch(const QString &title,
-                 const QString &action,
-                 const QString &filter,
-                 const QString &mode = KCntNoSelectionMode);
-
-    void editCreateNew(const QString &definitionName, const QString &value);
-    void editCreateNew(const QString &vCardFile);
-    void editUpdateExisting(const QString &definitionName, const QString &value);
-    void open(int contactId);
-    void open(const QString &definitionName, const QString &value);
-
-signals:
-    void launchFetch(const QString &title,
-                     const QString &action,
-                     const QString &filter);
-    
-    void launchFetchVerified(const QString &title,
-                             const QString &action,
-                             const QString &filter,
-                             const QString &mode);
-    
-    void launchEditor(QContact contact);
-    void launchContactSelection(QContactDetail detail);
-    void launchContactCard(QContact contact);
-    void launchAssignContactCard(QContact contact, QContactDetail detail);
-    
-private:
-    void removeNotSupportedFields(QContact& contact);
-    void removeNotSupportedDetails(QContact& contact);
-
-private:
-    int mCurrentRequestIndex;
-    QStringList m_definitionNames;
-};
-
-#endif /* CNTSERVICEHANDLER_H */
--- a/phonebookui/phonebookservices/inc/cntservicemainwindow.h	Wed Jul 21 11:09:07 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef CNTSERVICEMAINWINDOW_H
-#define CNTSERVICEMAINWINDOW_H
-
-#include <QObject>
-#include "cntmainwindow.h"
-
-class CntServiceHandler;
-class CntServiceViewManager;
-
-class CntServiceMainWindow : public CntMainWindow
-{
-    Q_OBJECT
-
-public:
-    CntServiceMainWindow(CntServiceHandler *handler, QWidget *parent=0);
-    ~CntServiceMainWindow();
-
-private:
-    CntServiceHandler       *mServiceHandler;
-    CntServiceViewManager   *mServiceViewManager;
-};
-
-#endif // CNTSERVICEMAINWINDOW_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntserviceprovideredit.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,79 @@
+/*
+ * 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: This class offers contact editing UI services.
+ *
+ */
+
+#ifndef CNTSERVICEPROVIDEREDIT_H
+#define CNTSERVICEPROVIDEREDIT_H
+
+#include <cntservicescontact.h>
+#include <xqserviceprovider.h>
+#include <cntviewparams.h>
+#include <qtcontacts.h>
+
+#include "cntabstractserviceprovider.h"
+
+class CntServices;
+
+QTM_USE_NAMESPACE
+
+/*!
+  This class offers contact editing UI services.
+*/
+class CntServiceProviderEdit : public XQServiceProvider, public CntAbstractServiceProvider
+{
+    Q_OBJECT
+public:
+    CntServiceProviderEdit(CntServices& aServices, QObject *parent = 0);
+    ~CntServiceProviderEdit();
+
+public slots:  // operations offered to clients
+
+    /**
+     * Launch editor for creating a new contact with a given detail.
+     * @param definitionName The field type
+     * @param value The value for the field.
+     */
+    void editCreateNew(const QString& definitionName, const QString& value);
+
+    /**
+     * Launch editor for creating a new contact based on vCard file indicated in arg.
+     * @param vCardFile The vCard file name and path.
+     */
+    void editCreateNewFromVCard(const QString &vCardFile);
+    
+    /**
+     * Open the editor for an existing contact.'
+     * @param contactId
+     */
+    void editExisting(int contactId);
+    
+    /**
+     * User can first choose a contact, and then an editor is opened.
+     * A new detail is provided by caller and it will be prefilled in the editor.
+     * @param definitionName The field type
+     * @param value The value for the field.
+     */
+    void editUpdateExisting(const QString &definitionName, const QString &value);
+
+private: // from CntAbstractServiceProvider
+    void CompleteServiceAndCloseApp(const QVariant& retValue);
+
+private:
+    CntServices& mServices;
+    int mCurrentRequestIndex;
+};
+
+#endif /* CNTSERVICEPROVIDEREDIT_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntserviceproviderfetch.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,68 @@
+/*
+ * 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:
+ *
+ */
+
+#ifndef CNTSERVICEPROVIDERFETCH_H
+#define CNTSERVICEPROVIDERFETCH_H
+
+#include <cntservicescontact.h>
+#include <xqserviceprovider.h>
+#include <cntviewparams.h>
+#include <qtcontacts.h>
+
+#include "cntabstractserviceprovider.h"
+
+class CntServices;
+
+QTM_USE_NAMESPACE
+
+/*!
+  This class offers services through the old interface name & old signatures.
+*/
+class CntServiceProviderFetch : public XQServiceProvider, public CntAbstractServiceProvider
+{
+    Q_OBJECT
+public:
+    CntServiceProviderFetch(CntServices& aServices, QObject *parent = 0);
+    ~CntServiceProviderFetch();
+
+public slots:  // operations offered to clients
+
+    /**
+     * Opens contact selection view where multiple contacts can be selected.
+     * @param title The view title
+     * @param action Filter definition for filtering contacts based on supported action. Can be left empty.
+     */
+    void multiFetch(const QString &title,
+               const QString &action );
+
+    /**
+     * Opens contact selection view where multiple contacts can be selected.
+     * @param title The view title
+     * @param action Filter definition for filtering contacts based on supported action. Can be left empty.
+     */
+    void singleFetch(const QString &title,
+               const QString &action );
+
+private: // from CntAbstractServiceProvider
+    void CompleteServiceAndCloseApp(const QVariant& retValue);
+
+private:
+    CntServices& mServices;
+    int mCurrentRequestIndex;
+};
+
+#endif /* CNTSERVICEPROVIDERFETCH_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntserviceproviderold.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,120 @@
+/*
+ * 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:
+ *
+ */
+
+#ifndef CNTSERVICEPROVIDEROLD_H
+#define CNTSERVICEPROVIDEROLD_H
+
+#include <cntservicescontact.h>
+#include <xqserviceprovider.h>
+#include <cntviewparams.h>
+#include <qtcontacts.h>
+
+#include "cntabstractserviceprovider.h"
+
+class CntServices;
+
+QTM_USE_NAMESPACE
+
+/*!
+  This class offers services through the old interface name & old signatures.
+*/
+class CntServiceProviderOld : public XQServiceProvider, public CntAbstractServiceProvider
+{
+    Q_OBJECT
+public:
+    CntServiceProviderOld(CntServices& aServices, QObject *parent = 0);
+    ~CntServiceProviderOld();
+
+public slots:  // operations offered to clients
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      multiFetch(QString, QString, QString)
+     *      com.nokia.symbian.IContactFetch.
+     */
+    void fetch(const QString &title,
+               const QString &action,
+               const QString &filter);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      singleFetch(QString, QString, QString)
+     *      com.nokia.symbian.IContactFetch.
+     */
+    void Dofetch(const QString &title,
+                 const QString &action,
+                 const QString &filter,
+                 const QString &mode = KCntNoSelectionMode);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      editCreateNew(QString, QString)
+     *      com.nokia.symbian.IContactEdit
+     */
+    void editCreateNew(const QString& definitionName, const QString& value);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      editCreateNewFromVCard(QString)
+     *      com.nokia.symbian.IContactEdit
+     */
+    void editCreateNew(const QString& vCardFile);
+    
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      editUpdateExisting(QString, QString)
+     *      com.nokia.symbian.IContactEdit
+     */
+    void editUpdateExisting(const QString& definitionName, const QString& value);
+    
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      openContactCard(int contactId)
+     *      com.nokia.symbian.IContactView
+     */
+    void open(int contactId);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      openContactCard(QString, QString)
+     *      com.nokia.symbian.IContactView
+     */
+    void open(const QString& definitionName, const QString& value);
+
+private: // from CntAbstractServiceProvider
+    void CompleteServiceAndCloseApp(const QVariant& retValue);
+
+private:
+    CntServices& mServices;
+    int mCurrentRequestIndex;
+};
+
+#endif /* CNTSERVICEPROVIDEROLD_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntserviceproviderold2.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,119 @@
+/*
+ * 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:
+ *
+ */
+
+#ifndef CNTSERVICEPROVIDEROLD2_H
+#define CNTSERVICEPROVIDEROLD2_H
+
+#include <cntservicescontact.h>
+#include <xqserviceprovider.h>
+#include <cntviewparams.h>
+#include <qtcontacts.h>
+
+#include "cntabstractserviceprovider.h"
+
+class CntServices;
+
+QTM_USE_NAMESPACE
+
+/*!
+  This class offers services through the old interface name & old signatures.
+*/
+class CntServiceProviderOld2 : public XQServiceProvider, public CntAbstractServiceProvider
+{
+    Q_OBJECT
+public:
+    CntServiceProviderOld2(CntServices& aServices, QObject *parent = 0);
+    ~CntServiceProviderOld2();
+
+public slots:  // operations offered to clients
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      multiFetch(QString, QString, QString)
+     *      com.nokia.symbian.IContactFetch.
+     */
+    void fetch(const QString &title,
+               const QString &action,
+               const QString &filter);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      singleFetch(QString, QString, QString)
+     *      com.nokia.symbian.IContactFetch.
+     */
+    void Dofetch(const QString &title,
+                 const QString &action,
+                 const QString &filter,
+                 const QString &mode = KCntNoSelectionMode);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      editCreateNew(QString, QString)
+     *      com.nokia.symbian.IContactEdit
+     */
+    void editCreateNew(const QString& definitionName, const QString& value);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      editCreateNewFromVCard(QString)
+     *      com.nokia.symbian.IContactEdit
+     */
+    void editCreateNew(const QString& vCardFile);
+    
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      editUpdateExisting(QString, QString)
+     *      com.nokia.symbian.IContactEdit
+     */
+    void editUpdateExisting(const QString& definitionName, const QString& value);
+    
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      openContactCard(int contactId)
+     *      com.nokia.symbian.IContactView
+     */
+    void open(int contactId);
+
+    /**
+     * Interface name has changed (see other impl. class)
+     * @deprecated
+     * Replaced with:
+     *      openContactCard(QString, QString)
+     *      com.nokia.symbian.IContactView
+     */
+    void open(const QString& definitionName, const QString& value);
+
+private: // from CntAbstractServiceProvider
+    void CompleteServiceAndCloseApp(const QVariant& retValue);
+
+private:
+    CntServices& mServices;
+    int mCurrentRequestIndex;
+};
+
+#endif /* CNTSERVICEPROVIDEROLD2_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntserviceproviderviewing.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,65 @@
+/*
+ * 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: This class offers contact viewing UI services.
+ *
+ */
+
+#ifndef CNTSERVICEPROVIDERVIEW_H
+#define CNTSERVICEPROVIDERVIEW_H
+
+#include <cntservicescontact.h>
+#include <xqserviceprovider.h>
+#include <cntviewparams.h>
+#include <qtcontacts.h>
+
+#include "cntabstractserviceprovider.h"
+
+class CntServices;
+
+QTM_USE_NAMESPACE
+
+/*!
+  This class offers contact viewing UI services.
+*/
+class CntServiceProviderViewing : public XQServiceProvider, public CntAbstractServiceProvider
+{
+    Q_OBJECT
+public:
+    CntServiceProviderViewing(CntServices& aServices, QObject *parent = 0);
+    ~CntServiceProviderViewing();
+
+public slots:  // operations offered to clients
+
+    /**
+     * Opens Contact Card.
+     * @param aContactId
+     */
+    void openContactCard( int aContactId );
+
+    /**
+     * Opens Contact Card for non-saved contact which is not saved yet.
+     * @param aFieldName
+     * @param aValue The value for the field.
+     */
+    void openTemporaryContactCard( QString aFieldName, QString aFieldValue );
+
+private: // from CntAbstractServiceProvider
+    void CompleteServiceAndCloseApp(const QVariant& retValue);
+
+private:
+    CntServices& mServices;
+    int mCurrentRequestIndex;
+};
+
+#endif /* CNTSERVICEPROVIDERVIEW_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntservices.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,140 @@
+/*
+ * 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:
+ *
+ */
+
+#ifndef CNTSERVICES_H
+#define CNTSERVICES_H
+
+#include <cntviewparams.h>
+#include <qtcontacts.h>
+
+#include "cntabstractserviceprovider.h"
+
+class CntAbstractViewManager;
+class XQServiceProvider;
+
+QTM_USE_NAMESPACE
+
+class CntServices : public QObject, public CntAbstractServiceProvider
+{
+    Q_OBJECT
+    
+public:
+    CntServices();
+    ~CntServices();
+
+public:
+
+    void setViewManager( CntAbstractViewManager& aViewManager );
+    
+    /**
+     * Opens contact selection view where multiple contacts can be selected.
+     * @param title The view title
+     * @param action Filter definition for filtering contacts based on supported action. Can be left empty.
+     * @param aServiceProvider The service provider
+     */
+    void singleFetch(const QString &title,
+                const QString &action,
+                CntAbstractServiceProvider& aServiceProvider  );
+
+    /**
+     * Opens contact selection view where multiple contacts can be selected.
+     * @param title The view title
+     * @param action Filter definition for filtering contacts based on supported action. Can be left empty.
+     * @param aServiceProvider The service provider
+     */
+    void multiFetch(const QString &title,
+                const QString &action,
+                CntAbstractServiceProvider& aServiceProvider  );
+
+    /**
+     * Launch editor for creating a new contact with a given detail.
+     * @param definitionName The field type
+     * @param value The value for the field.
+     * @param aServiceProvider The service provider
+     */
+    void editCreateNew(const QString &definitionName, const QString &value,
+        CntAbstractServiceProvider& aServiceProvider );
+
+    /**
+     * Launch editor for creating a new contact based on vCard file indicated in arg.
+     * @param vCardFile The vCard file name and path.
+     * @param aServiceProvider The service provider
+     */
+    void editCreateNewFromVCard(const QString &vCardFile,
+        CntAbstractServiceProvider& aServiceProvider );
+
+    /**
+     * User can first choose a contact, and then an editor is opened.
+     * A new detail is provided by caller and it will be prefilled in the editor.
+     * @param definitionName The field type
+     * @param value The value for the field.
+     * @param aServiceProvider The service provider
+     */
+    void editUpdateExisting(const QString &definitionName, const QString &value,
+        CntAbstractServiceProvider& aServiceProvider );
+
+    /**
+     * Open the editor for an existing contact.'
+     * @param contactId
+     * @param aServiceProvider The service provider
+     */
+    void editExisting(int contactId,
+        CntAbstractServiceProvider& aServiceProvider);
+
+    /**
+     * Opens Contact Card.
+     * @param contactId The contact ID
+     * @param aServiceProvider The service provider
+     */
+    void launchContactCard(int contactId,
+        CntAbstractServiceProvider& aServiceProvider );
+
+    /**
+     * Opens Contact Card for non-saved contact.
+     * @param definitionName Field name.
+     * @param value The field value.
+     * @param aServiceProvider The service provider
+     */
+    void launchTemporaryContactCard(const QString &definitionName, const QString &value,
+        CntAbstractServiceProvider& aServiceProvider );
+    
+    /**
+     * Set the flag that allows quiting the application explicitly
+     * using the quitApp slot. By default the value is always true.
+     */
+    void setQuitable(bool quitable);
+        
+public slots:
+    /**
+     * Quit the application
+     */
+    void quitApp();
+    
+private:
+    void removeNotSupportedFields(QContact& contact);
+    void removeNotSupportedDetails(QContact& contact);
+
+private: // from CntAbstractServiceProvider
+    void CompleteServiceAndCloseApp(const QVariant& retValue);
+private:
+    CntAbstractViewManager* mViewManager; // not owned
+    QStringList m_definitionNames;
+    CntAbstractServiceProvider* mCurrentProvider; // not owned
+    bool mIsQuitable;
+};
+
+#endif /* CNTSERVICES_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntservicestrings.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,27 @@
+/*
+ * 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: Contacts highway service interface strings.
+ *
+ */
+
+#ifndef CNTSERVICESTRINGS_H
+#define CNTSERVICESTRINGS_H
+
+// Full interface names. The beginning part "phonebookservices" is the service name.
+#define KCntServiceInterfaceView  "phonebookservices.com.nokia.symbian.IContactsView"
+#define KCntServiceInterfaceFetch "phonebookservices.com.nokia.symbian.IContactsFetch"
+#define KCntServiceInterfaceEdit  "phonebookservices.com.nokia.symbian.IContactsEdit"
+
+
+#endif /* CNTSERVICESTRINGS_H */
--- a/phonebookui/phonebookservices/inc/cntservicesubeditview.h	Wed Jul 21 11:09:07 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef CNTSERVICESUBEDITVIEW_H
-#define CNTSERVICESUBEDITVIEW_H
-
-#include <QObject>
-#include "cnteditview.h"
-
-class CntServiceHandler;
-
-class CntServiceSubEditView : public CntEditView
-{
-
-Q_OBJECT
-
-public:
-
-    CntServiceSubEditView( CntServiceHandler *aServiceHandler );
-    ~CntServiceSubEditView();
-
-    int viewId() const { return serviceSubEditView; }
-
-//public slots:
-//    void aboutToCloseView();
-//    int handleExecutedCommand(QString aCommand, const QContact &aContact);
-//    void discardAllChanges();
-
-private:
-    CntServiceHandler *mServiceHandler;
-    
-};
-
-#endif //CNTSERVICESUBEDITVIEW_H
-// EOF
--- a/phonebookui/phonebookservices/inc/cntserviceviewfactory.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntserviceviewfactory.h	Wed Jul 21 11:21:49 2010 +0300
@@ -21,18 +21,18 @@
 #include "cntabstractviewfactory.h"
 
 class CntAbstractView;
-class CntServiceHandler;
+class CntAbstractServiceProvider;
 
 class CntServiceViewFactory : public CntDefaultViewFactory
 {
 public:
-    CntServiceViewFactory( CntServiceHandler* aService ); 
+    CntServiceViewFactory( CntAbstractServiceProvider& aServiceProvider ); 
     ~CntServiceViewFactory();
     
 public:
     CntAbstractView* createView( int aViewId );
     
 private:
-    CntServiceHandler* mService;
+    CntAbstractServiceProvider& mProvider;
 };
 #endif /* CNTSERVICEVIEWFACTORY_H_ */
--- a/phonebookui/phonebookservices/inc/cntserviceviewmanager.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntserviceviewmanager.h	Wed Jul 21 11:21:49 2010 +0300
@@ -26,28 +26,17 @@
 
 class CntBaseView;
 class CntServiceHandler;
+class CntAbstractServiceProvider;
 
 class CntServiceViewManager : public CntDefaultViewManager
 {
     Q_OBJECT
 
 public:
-    CntServiceViewManager(HbMainWindow *mainWindow, CntServiceHandler *aHandler);
+    CntServiceViewManager(HbMainWindow *mainWindow, CntAbstractServiceProvider& aProvider );
     ~CntServiceViewManager();
-    
-public slots:
-    void handleFetch(const QString &title, const QString &action, const QString &filter);
-    void launchFetch(const QString &title, const QString &action, const QString &filter, const QString &mode = KCntMultiSelectionMode);
-    void launchEditor(QContact contact);
-    void launchContactSelection(QContactDetail detail);
-    void launchContactCard(QContact contact);
-    void launchAssignContactCard(QContact contact, QContactDetail detail);
-
 protected slots:
     virtual void closeApp();
-
-private:
-    CntServiceHandler *mServiceHandler;
 };
 
 #endif // CNTSERVICEVIEWMANAGER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/inc/cntserviceviewparams.h	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,32 @@
+/*
+ * 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: View parameter constants used internally in phonebookservices.
+ *
+ */
+
+#ifndef CNTSERVICEVIEWPARAMS_H
+#define CNTSERVICEVIEWPARAMS_H
+
+
+#include <cntservicescontact.h>
+
+/// View parameters used inside phonebookservices.
+enum CntServiceViewParams
+    {
+    /// Specifies the title string for a service view
+    KCntServiceViewParamTitle = ECustomParam
+    };
+
+
+#endif /* CNTSERVICEVIEWPARAMS_H */
--- a/phonebookui/phonebookservices/phonebookservices.pro	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/phonebookservices.pro	Wed Jul 21 11:21:49 2010 +0300
@@ -23,35 +23,44 @@
 INCLUDEPATH += ../../phonebookengines/cntimageutility/inc
 
 INCLUDEPATH += . \
-    inc
+    inc \
+    ../../inc
 
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
 
 MOC_DIR = moc
 
 # Input
-HEADERS += inc/cntservicemainwindow.h \
-           inc/cntserviceviewmanager.h \
-           inc/cntservicehandler.h \
+HEADERS += inc/cntserviceviewmanager.h \
+           inc/cntserviceproviderold.h \
+           inc/cntserviceproviderold2.h \
            inc/cntservicecontactfetchview.h \
            inc/cntservicecontactselectionview.h \
            inc/cntserviceeditview.h \
            inc/cntservicecontactcardview.h \
-           inc/cntservicesubeditview.h \
            inc/cntserviceassigncontactcardview.h \
-           inc/cntserviceviewfactory.h 
+           inc/cntserviceviewfactory.h \
+           inc/cntservices.h \
+           inc/cntabstractserviceprovider.h \
+           inc/cntserviceproviderfetch.h \
+           inc/cntserviceproviderviewing.h \
+           inc/cntserviceprovideredit.h \
+           inc/cntserviceviewparams.h
 
 SOURCES += src/main.cpp \
-           src/cntservicemainwindow.cpp \
            src/cntserviceviewmanager.cpp \
-           src/cntservicehandler.cpp \
+           src/cntserviceproviderold.cpp \
+           src/cntserviceproviderold2.cpp \
            src/cntservicecontactfetchview.cpp \
            src/cntservicecontactselectionview.cpp \
            src/cntserviceeditview.cpp \
            src/cntservicecontactcardview.cpp \
-           src/cntservicesubeditview.cpp \
            src/cntserviceassigncontactcardview.cpp \
-           src/cntserviceviewfactory.cpp
+           src/cntserviceviewfactory.cpp \
+           src/cntservices.cpp \
+           src/cntserviceproviderfetch.cpp \
+           src/cntserviceproviderviewing.cpp \
+           src/cntserviceprovideredit.cpp
 
 # capability
 TARGET.CAPABILITY = CAP_APPLICATION
--- a/phonebookui/phonebookservices/service_conf.xml	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/service_conf.xml	Wed Jul 21 11:21:49 2010 +0300
@@ -1,7 +1,32 @@
 <?xml version="1.0" encoding="utf-8" ?>
-<service name="com.nokia.services.phonebookservices"  filepath="must-not-be-empty" >
-  <description>Phonebook service</description>
-  <interface name="Fetch" version="1.0" capabilities="">
+<service>
+  <name>phonebookservices</name>
+  <filepath>No path</filepath>
+  <description>xPhonebook services</description>
+  <interface>
+    <name>com.nokia.symbian.IContactsFetch</name>
+    <version>1.0</version>
+    <description>Fetch interface</description>
+  </interface>
+  <interface>
+    <name>phonebookservices.Fetch</name>
+    <version>1.0</version>
     <description>Fetch interface</description>
   </interface>
+  <interface>
+    <name>Fetch</name>
+    <version>1.0</version>
+    <description>Fetch interface</description>
+    <customproperty key="deprecatedsn">com.nokia.services.phonebookservices</customproperty>
+  </interface>
+  <interface>
+    <name>com.nokia.symbian.IContactsView</name>
+    <version>1.0</version>
+    <description>Contact viewing interface</description>
+  </interface>
+  <interface>
+    <name>com.nokia.symbian.IContactsEdit</name>
+    <version>1.0</version>
+    <description>Contact editing interface</description>
+  </interface>
 </service>
\ No newline at end of file
--- a/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -16,7 +16,8 @@
 */
 
 #include "cntserviceassigncontactcardview.h"
-#include "cntservicehandler.h"
+#include "cntabstractserviceprovider.h"
+#include "cntdebug.h"
 
 #include <hbaction.h>
 #include <hbdialog.h>
@@ -32,14 +33,16 @@
 Constructor, initialize member variables.
 \a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0)
 */
-CntServiceAssignContactCardView::CntServiceAssignContactCardView(CntServiceHandler *aServiceHandler) : 
+CntServiceAssignContactCardView::CntServiceAssignContactCardView( CntAbstractServiceProvider& aServiceProvider ) : 
     CntContactCardView(),
-    mServiceHandler(aServiceHandler)
+mProvider( aServiceProvider )
 {
+    CNT_ENTRY
     connect(this, SIGNAL(backPressed()), this, SLOT(doCloseView()));
     connect(this, SIGNAL(viewActivated(CntAbstractViewManager*, QContactDetail)), this, SLOT(doViewActivated(CntAbstractViewManager*,QContactDetail)));
     
     addActionsToToolBar();
+    CNT_EXIT
 }
 
 /*!
@@ -47,7 +50,8 @@
 */
 CntServiceAssignContactCardView::~CntServiceAssignContactCardView()
 {
-
+    CNT_ENTRY
+    CNT_EXIT
 }
 
 /*!
@@ -55,9 +59,11 @@
 */
 void CntServiceAssignContactCardView::addActionsToToolBar()
 {
+    CNT_ENTRY
     view()->toolBar()->clearActions();  
     HbAction* addToContact = view()->toolBar()->addAction("txt_phob_button_add_to_contacts");
     connect(addToContact, SIGNAL(triggered()), this, SLOT(addToContacts()));
+    CNT_EXIT
 }
 
 /*!
@@ -65,6 +71,7 @@
 */
 void CntServiceAssignContactCardView::addToContacts()
 {  
+    CNT_ENTRY
     HbDialog *popup = new HbDialog();
     popup->setDismissPolicy(HbDialog::NoDismiss);
     popup->setHeadingWidget(new HbLabel(hbTrId("txt_phob_title_add_to_contacts"), popup));
@@ -82,6 +89,7 @@
     popup->setContentWidget(buttonWidget);
     
     popup->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), popup));
+    CNT_EXIT
 }
 
 /*!
@@ -89,12 +97,14 @@
 */
 void CntServiceAssignContactCardView::saveNew()
 {
+    CNT_ENTRY
     CntViewParameters viewParameters;
     viewParameters.insert(EViewId, serviceEditView);
     QVariant var;
     var.setValue(mContact);
     viewParameters.insert(ESelectedContact, var);
     mViewManager->changeView(viewParameters);
+    CNT_EXIT
 }
 
 /*!
@@ -102,12 +112,14 @@
 */
 void CntServiceAssignContactCardView::updateExisting()
 {
+    CNT_ENTRY
     CntViewParameters viewParameters;
     viewParameters.insert(EViewId, serviceContactSelectionView);
     QVariant var;
     var.setValue(mDetail);
     viewParameters.insert(ESelectedDetail, var);
     mViewManager->changeView(viewParameters);
+    CNT_EXIT
 }
 
 /*!
@@ -115,9 +127,11 @@
 */
 void CntServiceAssignContactCardView::doViewActivated(CntAbstractViewManager* aMgr, const CntViewParameters aArgs)
 {
+    CNT_ENTRY
     mViewManager = aMgr;
     mContact = aArgs.value(ESelectedContact).value<QContact>();
     mDetail = aArgs.value(ESelectedDetail).value<QContactDetail>();
+    CNT_EXIT
 }
 
 /*!
@@ -125,7 +139,9 @@
 */
 void CntServiceAssignContactCardView::doCloseView()
 {
+    CNT_ENTRY
     qApp->quit();
+    CNT_EXIT
 }
 
 // end of file
--- a/phonebookui/phonebookservices/src/cntservicecontactcardview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntservicecontactcardview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -16,18 +16,20 @@
 */
 
 #include "cntservicecontactcardview.h"
-#include "cntservicehandler.h"
-#include <QCoreApplication>
+#include "cntabstractserviceprovider.h"
+#include "cntdebug.h"
 
 /*!
 Constructor, initialize member variables.
 \a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0)
 */
-CntServiceContactCardView::CntServiceContactCardView(CntServiceHandler *aServiceHandler) : 
+CntServiceContactCardView::CntServiceContactCardView( CntAbstractServiceProvider& aServiceProvider ) : 
     CntContactCardView(),
-    mServiceHandler(aServiceHandler)
+    mProvider( aServiceProvider )
 {
-    connect(this, SIGNAL(backPressed()), this, SLOT(doShowPreviousView()));
+    CNT_ENTRY
+    connect(this, SIGNAL(backPressed()), this, SLOT(closeContactCard()));
+    CNT_EXIT
 }
 
 /*!
@@ -35,17 +37,21 @@
 */
 CntServiceContactCardView::~CntServiceContactCardView()
 {
-
+    CNT_ENTRY
+    CNT_EXIT
 }
 
 /*!
 Close the view (quits the service as well)
 */
-void CntServiceContactCardView::doShowPreviousView()
+void CntServiceContactCardView::closeContactCard()
 {
-    int result = -2;
-    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-    mServiceHandler->completeEdit(result);
+    CNT_ENTRY
+    int retValue = -2; // Dummy return value. Not relevant.
+    QVariant variant;
+    variant.setValue(retValue);
+    mProvider.CompleteServiceAndCloseApp(variant);
+    CNT_EXIT
 }
 
 // end of file
--- a/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -19,7 +19,7 @@
 
 #include <cntservicescontact.h>
 #include <cntlistmodel.h>
-#include "cntservicehandler.h"
+#include "cntserviceviewparams.h"
 
 #include <hbmenu.h>
 #include <hbview.h>
@@ -29,15 +29,15 @@
 
 #include <QCoreApplication>
 
-CntServiceContactFetchView::CntServiceContactFetchView(CntServiceHandler *aServiceHandler):
+CntServiceContactFetchView::CntServiceContactFetchView( CntAbstractServiceProvider& aServiceProvider ):
 CntBaseSelectionView(),
-mServiceHandler(aServiceHandler)
-{
+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(aboutToCloseView()) );
+    connect( this, SIGNAL(viewClosed()), this, SLOT(closeFetchView()) );
     connect( this, SIGNAL(viewOpened(CntAbstractViewManager*, const CntViewParameters)), this, SLOT(aboutToOpenView(CntAbstractViewManager*, const CntViewParameters)) );
 }
 
@@ -47,13 +47,16 @@
 
 
 void CntServiceContactFetchView::cancelFetch()
-{
-    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
+    {
     CntServicesContactList serviceList;
-    mServiceHandler->completeFetch(serviceList);
-}
+    QVariant variant;
+    variant.setValue(serviceList);
+    mProvider.CompleteServiceAndCloseApp(variant);
+    }
 
-void CntServiceContactFetchView::aboutToCloseView()
+
+
+void CntServiceContactFetchView::closeFetchView()
 {
     CntServicesContactList serviceList;
     QContactManager* mgr = mMgr->contactManager(SYMBIAN_BACKEND);
@@ -90,8 +93,9 @@
         serviceList.append(servicesContact);
     }
 
-    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-    mServiceHandler->completeFetch(serviceList);
+    QVariant variant;
+    variant.setValue(serviceList);
+    mProvider.CompleteServiceAndCloseApp(variant);
 }
 
 void CntServiceContactFetchView::aboutToOpenView(CntAbstractViewManager* aMgr, const CntViewParameters aArgs)
@@ -99,12 +103,17 @@
     mMgr = aMgr;
     
     // Set title of the view.
-    QString title = aArgs.value(CntServiceHandler::ETitle).toString();
+    QString title = aArgs.value(KCntServiceViewParamTitle).toString();
     mView->setTitle(title);
     
     // Set action filter
-    QString filter = aArgs.value(CntServiceHandler::EFilter).toString();
-    QString action = aArgs.value(CntServiceHandler::EAction).toString();
+    QString action = 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 (action == KCntActionSms)
         {
             QContactActionFilter actionFilter;
--- a/phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -17,15 +17,15 @@
 
 #include "cntservicecontactselectionview.h"
 
+#include <cntservicescontact.h>
 #include <QCoreApplication>
 #include <QModelIndex>
-#include "cntservicehandler.h"
 #include <hblistview.h>
 #include <cntlistmodel.h>
 
-CntServiceContactSelectionView::CntServiceContactSelectionView(CntServiceHandler *aServiceHandler):
+CntServiceContactSelectionView::CntServiceContactSelectionView( CntAbstractServiceProvider& aServiceProvider ):
 CntBaseSelectionView(),
-mServiceHandler(aServiceHandler)
+mProvider( aServiceProvider )
 {
     connect(mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(onListViewActivated(const QModelIndex&)));
     connect( this, SIGNAL(viewClosed()), this, SLOT(aboutToCloseView()) );
@@ -37,6 +37,7 @@
 
 }
 
+// An item in the selection list has been clicked
 void CntServiceContactSelectionView::onListViewActivated(const QModelIndex &aIndex)
 {
     QContact contact = mListModel->contact(aIndex);
@@ -52,8 +53,9 @@
 
 void CntServiceContactSelectionView::aboutToCloseView()
 {
-    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-    mServiceHandler->completeEdit(0);
+    QVariant variant;
+    variant.setValue(KCntServicesReturnValueContactNotModified);
+    mProvider.CompleteServiceAndCloseApp(variant);
 }
 
 void CntServiceContactSelectionView::aboutToOpenView(CntAbstractViewManager* aMgr, const CntViewParameters viewParameters)
--- a/phonebookui/phonebookservices/src/cntserviceeditview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntserviceeditview.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -16,11 +16,13 @@
 */
 
 #include "cntserviceeditview.h"
-#include "cntservicehandler.h"
+#include <cntservicescontact.h>
 #include <QCoreApplication>
 
-CntServiceEditView::CntServiceEditView(CntServiceHandler *aServiceHandler ) : CntEditView(),
-mServiceHandler(aServiceHandler)
+
+CntServiceEditView::CntServiceEditView( CntAbstractServiceProvider& aServiceProvider )
+: CntEditView(),
+mProvider( aServiceProvider )
 {   
     connect( this, SIGNAL(contactUpdated(int)), this, SLOT(doContactUpdated(int)) );
     connect( this, SIGNAL(contactRemoved(bool)), this, SLOT(doContactRemoved(bool)) );
@@ -33,67 +35,25 @@
 
 void CntServiceEditView::doContactUpdated(int aSuccess)
 {
-    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-    mServiceHandler->completeEdit(aSuccess);
+    int retValue = aSuccess ? KCntServicesReturnValueContactSaved : KCntServicesReturnValueContactNotModified;
+    QVariant variant;
+    variant.setValue(retValue);
+    mProvider.CompleteServiceAndCloseApp(variant);
 }
 
 void CntServiceEditView::doContactRemoved(bool aSuccess)
 {
-    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-    int retValue = aSuccess ? -1 : 0;
-    mServiceHandler->completeEdit(retValue);
+    int retValue = aSuccess ? KCntServicesReturnValueContactDeleted : KCntServicesReturnValueContactNotModified;
+    QVariant variant;
+    variant.setValue(retValue);
+    mProvider.CompleteServiceAndCloseApp(variant);
 }
 
 void CntServiceEditView::doChangesDiscarded()
 {
-    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-    mServiceHandler->completeEdit(0);
+    QVariant variant;
+    variant.setValue(KCntServicesReturnValueContactNotModified);
+    mProvider.CompleteServiceAndCloseApp(variant);
 }
 
-//
-///*!
-//Saves the contact
-//*/
-//void CntServiceEditView::aboutToCloseView()
-//{
-//    int result = 0;
-//    // save contact if there is one
-//    if (contact() && !contact()->isEmpty())
-//    {
-//        bool isSaved = contactManager()->saveContact(contact());
-//        if (isSaved)
-//        {
-//            result = 1;
-//        }
-//    }
-//    
-//    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-//    mServiceHandler->completeEdit(result);
-//}
-//
-///*!
-//Cancel all changes made and return to the application editor was opened from
-//*/
-//void CntServiceEditView::discardAllChanges()
-//{
-//    connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-//    mServiceHandler->completeEdit(0);
-//}
-//
-///*
-//Handle signals emitted from CntCommands, only used for delete command for now.
-//*/
-//int CntServiceEditView::handleExecutedCommand(QString aCommand, const QContact &aContact)
-//{
-//    Q_UNUSED(aContact);
-//    int result=-1;
-//    if (aCommand == "delete")
-//    {
-//        connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-//        mServiceHandler->completeEdit(result);
-//        result = 0;
-//    }
-//    return result;
-//}
-
 // EOF
--- a/phonebookui/phonebookservices/src/cntservicehandler.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,351 +0,0 @@
-/*
- * 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 "cntservicehandler.h"
-#include "cntimageutility.h"
-
-#include <qversitreader.h>
-#include <qversitcontactimporter.h>
-#include <qversitdocument.h>
-
-#include <QPixmap>
-#include <QFile>
-#include <QUrl>
-
-/* NOTE! THIS SERVICE WILL BE RENAMED TO com.nokia.services.phonebook.Services */
-CntServiceHandler::CntServiceHandler(QObject *parent):
-    XQServiceProvider(QLatin1String("com.nokia.services.phonebookservices.Fetch"), parent),
-    mCurrentRequestIndex(0)
-{
-    publishAll();
-    
-    // Definition names supported in symbian back-end
-    m_definitionNames << QContactName::DefinitionName;
-    m_definitionNames << QContactNickname::DefinitionName;
-    m_definitionNames << QContactPhoneNumber::DefinitionName;
-    m_definitionNames << QContactEmailAddress::DefinitionName;
-    m_definitionNames << QContactAddress::DefinitionName;
-    m_definitionNames << QContactUrl::DefinitionName;
-    m_definitionNames << QContactBirthday::DefinitionName;
-    m_definitionNames << QContactOrganization::DefinitionName;
-    m_definitionNames << QContactSyncTarget::DefinitionName;
-    m_definitionNames << QContactNote::DefinitionName;
-    m_definitionNames << QContactFamily::DefinitionName;
-    m_definitionNames << QContactAvatar::DefinitionName;
-    m_definitionNames << QContactAnniversary::DefinitionName;
-    m_definitionNames << QContactGeoLocation::DefinitionName;
-    m_definitionNames << QContactGender::DefinitionName;
-    m_definitionNames << QContactOnlineAccount::DefinitionName;
-}
-
-CntServiceHandler::~CntServiceHandler()
-{
-}
-
-/*
-Complete the fetch and return the list selected contacts
-*/
-void CntServiceHandler::completeFetch( const CntServicesContactList &contactList )
-{
-    QVariant retValue;
-    retValue.setValue(contactList);
-    completeRequest(mCurrentRequestIndex, retValue);
-    mCurrentRequestIndex = 0;
-}
-
-/*
-Complete edit and return if contact wasn't modified (-2), was deleted (-1), saved (1) or if saving failed (0)
-*/
-void CntServiceHandler::completeEdit(int result)
-{
-    QVariant retValue(result);
-    completeRequest(mCurrentRequestIndex, retValue);
-    mCurrentRequestIndex = 0;
-}
-
-/*
-Launch fetch service with given parameters
-*/
-void CntServiceHandler::fetch(const QString &title, const QString &action, const QString &filter)
-{
-    emit launchFetch(title, action, filter);
-    mCurrentRequestIndex = setCurrentRequestAsync();
-}
-
-/*
-Launch fetch service with given parameters. Fetching mode is No-select by default.
-*/
-void CntServiceHandler::Dofetch(const QString &title, const QString &action, const QString &filter, const QString &mode)
-{
-    emit launchFetchVerified(title, action, filter, mode);
-    mCurrentRequestIndex = setCurrentRequestAsync();
-}
-
-/*
-Launch new contact editor with a given detail
-*/
-void CntServiceHandler::editCreateNew(const QString &definitionName, const QString &value)
-{
-    QContact contact;
-    
-    if (definitionName == QContactPhoneNumber::DefinitionName)
-    {
-        QContactPhoneNumber phoneNumber;
-        phoneNumber.setNumber(value);
-        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-        contact.saveDetail(&phoneNumber);
-    }
-    else if (definitionName == QContactEmailAddress::DefinitionName)
-    {
-        QContactEmailAddress email;
-        email.setEmailAddress(value);
-        contact.saveDetail(&email);
-    }
-    else if (definitionName == QContactOnlineAccount::DefinitionName)
-    {
-        QContactOnlineAccount account;
-        account.setAccountUri(value);
-        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
-        contact.saveDetail(&account);
-    }    
-    
-    emit launchEditor(contact);
-
-    mCurrentRequestIndex = setCurrentRequestAsync();
-}
-
-/*
-Launch new contact editor with a given vCard filename
-*/
-void CntServiceHandler::editCreateNew(const QString &vCardFile)
-{
-    CntImageUtility imageUtility;
-    QContact contact;
-    QVersitReader reader;
-    QFile file(vCardFile);
-
-    if (!file.open(QIODevice::ReadOnly))
-        return;
-    reader.setDevice(&file);
-    reader.startReading();
-    reader.waitForFinished();
-
-    // Use the resulting document(s)...
-    QVersitContactImporter importer;
-    QList<QVersitDocument> versitDocuments = reader.results();
-    if (versitDocuments.count() > 0 
-        && importer.importDocuments(versitDocuments))
-    {
-        QList<QContact> contacts = importer.contacts();
-        if (contacts.count() > 0)
-            contact = contacts.first();
-    }
-    file.close();
-    
-    // Save thumbnail images
-    QList<QContactThumbnail> details = contact.details<QContactThumbnail>();
-    for (int i = 0;i < details.count();i++)
-    {
-        if (!details.at(i).thumbnail().isNull())
-        {
-            QString imagepath;
-            QPixmap pixmap = QPixmap::fromImage(details.at(i).thumbnail());
-            if (imageUtility.createImage(pixmap,imagepath))
-            {
-                // Update contact detail
-                QContactAvatar detail=details.at(i);
-                detail.setImageUrl(imagepath);
-                contact.saveDetail(&detail);
-            }
-        }
-    }
-    
-    removeNotSupportedDetails(contact);
-    removeNotSupportedFields(contact);
-    emit launchEditor(contact);
-
-    mCurrentRequestIndex = setCurrentRequestAsync();
-}
-
-/*
-* Remove details not supported in symbian back-end.
-*/
-void CntServiceHandler::removeNotSupportedDetails(QContact& contact)
-{
-    // Check definition map, remove details not supported
-    for (int i=0; i < contact.details().count(); i++)
-    {
-        if (!m_definitionNames.contains(contact.details().at(i).definitionName()))
-        {
-            QContactDetail detail= contact.details().at(i);
-            contact.removeDetail(&detail);
-        }
-    }
-}
-/*
-* Remove fields not supported in symbian back-end.
-*/
-void CntServiceHandler::removeNotSupportedFields(QContact& contact)
-{
-    QContactManager cm("symbian");
-    
-    // Not all fields are supported in symbian back-end
-    // Remove not supported fields
-    for (int i=0; i < contact.details().count(); i++)
-    {
-        QContactDetail detail = contact.details().at(i);
-        if (detail.definitionName() == QContactAddress::DefinitionName)
-        {
-            QContactAddress addrDetail = static_cast<QContactAddress>(detail);
-            
-            // Sub-types not supported
-            if (detail.removeValue(QContactAddress::FieldSubTypes))
-                contact.saveDetail(&detail);
-        }
-        else if (detail.definitionName() == QContactAnniversary::DefinitionName)
-        {
-            QContactAnniversary annivDetail = static_cast<QContactAnniversary>(detail);
-            
-            // Sub-types not supported
-            if (detail.removeValue(QContactAnniversary::FieldSubType))
-                contact.saveDetail(&detail);
-            
-            // Context not supported
-            if (detail.removeValue(QContactDetail::FieldContext))
-                contact.saveDetail(&detail);
-        }
-        else if (detail.definitionName() == QContactPhoneNumber::DefinitionName)
-        {
-            QContactPhoneNumber phoneDetail = static_cast<QContactPhoneNumber>(detail);
-            
-            if (phoneDetail.subTypes().size() == 0)
-            {
-                // No Sub-type found, set as SubTypeMobile
-                phoneDetail.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-                contact.saveDetail(&phoneDetail);
-            }
-            else if (phoneDetail.subTypes().size() > 0 )
-            {
-                // Sub-types not supported
-                if (phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeVoice)
-                    || phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeMessagingCapable)
-                    || phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeVideo))
-                {
-                    // Replace as SubTypeMobile
-                    phoneDetail.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-                    contact.saveDetail(&phoneDetail);
-                }
-            }
-        }
-        else if (detail.definitionName() == QContactUrl::DefinitionName)
-        {
-            QContactUrl urlDetail = static_cast<QContactUrl>(detail);
-            
-            QString stype=QContactUrl::SubTypeHomePage;
-            if (urlDetail.subType().compare(stype) != 0)
-            {
-                detail.removeValue(QContactUrl::FieldSubType);
-                contact.saveDetail(&detail);
-            }
-        }
-    }
-}
-/*
-Launch contact selection view with a given detail (selecting detail there opens the editor and adds the new detail)
-*/
-void CntServiceHandler::editUpdateExisting(const QString &definitionName, const QString &value)
-{
-    QContactDetail detail;
-    
-    if (definitionName == QContactPhoneNumber::DefinitionName)
-    {
-        QContactPhoneNumber phoneNumber;
-        phoneNumber.setNumber(value);
-        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-        detail = phoneNumber;
-    }
-    else if (definitionName == QContactEmailAddress::DefinitionName)
-    {
-        QContactEmailAddress email;
-        email.setEmailAddress(value);
-        detail = email;
-    }
-    else if (definitionName == QContactOnlineAccount::DefinitionName)
-    {
-        QContactOnlineAccount account;
-        account.setAccountUri(value);
-        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
-        detail = account;
-    }
-    
-    emit launchContactSelection(detail);
-
-    mCurrentRequestIndex = setCurrentRequestAsync();
-}
-
-/*
-Launch communication launcher view for the contact with the given ID (QContactLocalId -> int)
-*/
-void CntServiceHandler::open(int contactId)
-{
-    QContactManager manager("symbian");
-    QContact contact = manager.contact(contactId);
-
-    emit launchContactCard(contact);
-
-    mCurrentRequestIndex = setCurrentRequestAsync();
-}
-
-/*
-Launch temporary communication launcher view with the given detail
-*/
-void CntServiceHandler::open(const QString &definitionName, const QString &value)
-{
-    QContact contact;
-    QContactDetail detail;
-    
-    if (definitionName == QContactPhoneNumber::DefinitionName)
-    {
-        QContactPhoneNumber phoneNumber;
-        phoneNumber.setNumber(value);
-        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-        contact.saveDetail(&phoneNumber);
-        detail = phoneNumber;
-    }
-    else if (definitionName == QContactEmailAddress::DefinitionName)
-    {
-        QContactEmailAddress email;
-        email.setEmailAddress(value);
-        contact.saveDetail(&email);
-        detail = email;
-    }
-    else if (definitionName == QContactOnlineAccount::DefinitionName)
-    {
-        QContactOnlineAccount account;
-        account.setAccountUri(value);
-        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
-        contact.saveDetail(&account);
-        detail = account;
-    }
-    
-    emit launchAssignContactCard(contact, detail);
-
-    mCurrentRequestIndex = setCurrentRequestAsync();
-}
-
-Q_IMPLEMENT_USER_METATYPE(CntServicesContact)
-Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList)
--- a/phonebookui/phonebookservices/src/cntservicemainwindow.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
-* 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 "cntservicemainwindow.h"
-#include "cntservicehandler.h"
-#include "cntserviceviewmanager.h"
-#include "cntviewnavigator.h"
-
-CntServiceMainWindow::CntServiceMainWindow(CntServiceHandler *handler, QWidget *parent):
-    CntMainWindow(parent, noView),
-    mServiceHandler(handler),
-    mServiceViewManager(0)
-{   
-    CntViewNavigator* navigator = new CntViewNavigator( this );
-    navigator->addException( serviceEditView, noView );
-
-    mServiceViewManager = new CntServiceViewManager(this, mServiceHandler);
-    mServiceViewManager->setViewNavigator( navigator );
-}
-
-CntServiceMainWindow::~CntServiceMainWindow()
-{
-    delete mServiceViewManager;
-    mServiceViewManager = 0;
-    delete mServiceHandler;
-    mServiceHandler = 0;
-}
-
-// end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/src/cntserviceprovideredit.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,96 @@
+/*
+ * 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: This class offers contact viewing UI services.
+ *
+ */
+
+#include "cntserviceprovideredit.h"
+#include "cntservices.h"
+#include "cntservicestrings.h"
+#include "cntdebug.h"
+
+#include <qapplication.h>
+#include <QPixmap>
+#include <QFile>
+#include <QUrl>
+
+CntServiceProviderEdit::CntServiceProviderEdit(CntServices& aServices, QObject *parent):
+    XQServiceProvider(QLatin1String(KCntServiceInterfaceEdit), parent),
+    mServices(aServices),
+    mCurrentRequestIndex(0)
+{
+    CNT_ENTRY
+    publishAll();
+    connect(this, SIGNAL(clientDisconnected()), &mServices, SLOT(quitApp()));
+    CNT_EXIT
+}
+
+CntServiceProviderEdit::~CntServiceProviderEdit()
+{
+    CNT_ENTRY
+    CNT_EXIT
+}
+
+void CntServiceProviderEdit::editCreateNew(const QString& definitionName, const QString& value)
+    {
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editCreateNew( definitionName, value, *this );
+    CNT_EXIT
+    }
+
+void CntServiceProviderEdit::editCreateNewFromVCard(const QString &vCardFile)
+    {
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editCreateNewFromVCard( vCardFile, *this );
+    CNT_EXIT
+    }
+
+void CntServiceProviderEdit::editExisting(int contactId)
+    {
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editExisting( contactId, *this );
+    CNT_EXIT
+    }
+
+void CntServiceProviderEdit::editUpdateExisting(const QString &definitionName, const QString &value)
+    {
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editUpdateExisting( definitionName, value, *this );
+    CNT_EXIT
+    }
+
+
+void CntServiceProviderEdit::CompleteServiceAndCloseApp(const QVariant& retValue)
+    {
+    CNT_ENTRY
+    connect(this, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
+    if ( mCurrentRequestIndex != 0 )
+        {
+        const bool success = completeRequest(mCurrentRequestIndex, retValue);
+        if ( !success )
+        {
+            CNT_LOG_ARGS("Failed to complete highway request.");
+        }
+        mCurrentRequestIndex = 0;
+        }
+    CNT_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/src/cntserviceproviderfetch.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,78 @@
+/*
+ * 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 "cntserviceproviderfetch.h"
+#include "cntservices.h"
+#include "cntservicestrings.h"
+#include "cntdebug.h"
+
+#include <qapplication.h>
+#include <QPixmap>
+#include <QFile>
+#include <QUrl>
+
+CntServiceProviderFetch::CntServiceProviderFetch(CntServices& aServices, QObject *parent):
+    XQServiceProvider(QLatin1String(KCntServiceInterfaceFetch), parent),
+    mServices(aServices),
+    mCurrentRequestIndex(0)
+{
+    CNT_ENTRY
+    publishAll();
+    connect(this, SIGNAL(clientDisconnected()), &mServices, SLOT(quitApp()));
+    CNT_EXIT
+}
+
+CntServiceProviderFetch::~CntServiceProviderFetch()
+{
+    CNT_ENTRY
+    CNT_EXIT
+}
+
+void CntServiceProviderFetch::multiFetch(const QString &title, const QString &action )
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.multiFetch( title, action, *this );
+    CNT_EXIT
+}
+
+void CntServiceProviderFetch::singleFetch(const QString &title, const QString &action )
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.singleFetch( title, action, *this );
+    CNT_EXIT
+}
+
+void CntServiceProviderFetch::CompleteServiceAndCloseApp(const QVariant& retValue)
+{
+    CNT_ENTRY
+    connect(this, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
+    if ( mCurrentRequestIndex != 0 )
+    {
+        const bool success = completeRequest(mCurrentRequestIndex, retValue);
+        if ( !success )
+        {
+            CNT_LOG_ARGS("Failed to complete highway request.");
+        }
+        mCurrentRequestIndex = 0;
+    }
+    CNT_EXIT
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/src/cntserviceproviderold.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,149 @@
+/*
+ * 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 "cntserviceproviderold.h"
+#include "cntservices.h"
+#include "cntdebug.h"
+
+#include <qapplication.h>
+#include <QPixmap>
+#include <QFile>
+#include <QUrl>
+
+CntServiceProviderOld::CntServiceProviderOld(CntServices& aServices, QObject *parent):
+    XQServiceProvider(QLatin1String("com.nokia.services.phonebookservices.Fetch"), parent),
+    mServices(aServices),
+    mCurrentRequestIndex(0)
+{
+    CNT_ENTRY
+    publishAll();
+    connect(this, SIGNAL(clientDisconnected()), &mServices, SLOT(quitApp()));
+    CNT_EXIT
+}
+
+CntServiceProviderOld::~CntServiceProviderOld()
+{
+    CNT_ENTRY
+    CNT_EXIT
+}
+
+/*!
+Launch fetch service with given parameters. OLD INTERFACE.
+*/
+void CntServiceProviderOld::fetch(const QString &title, const QString &action, const QString& /*filter*/)
+{
+    CNT_ENTRY
+    // Ignore the filter parameter
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.multiFetch( title, action, *this );
+    CNT_EXIT
+}
+
+
+/*
+Launch fetch service with given parameters. Fetching mode is No-select by default. OLD INTERFACE.
+*/
+void CntServiceProviderOld::Dofetch(const QString &title, const QString &action, const QString& /*filter*/, const QString& /*mode*/)
+{
+    CNT_ENTRY
+    // Ignore the filter parameter
+    // Ignoring fourth argument, because it's not needed. DoFetch() by old contract is only for single-fetching.
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.singleFetch( title, action, *this );
+    CNT_EXIT
+}
+
+
+/*
+Launch new contact editor with a given detail
+*/
+void CntServiceProviderOld::editCreateNew(const QString& definitionName, const QString& value)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editCreateNew( definitionName, value, *this );
+    CNT_EXIT
+}
+
+void CntServiceProviderOld::editCreateNew(const QString &vCardFile)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editCreateNewFromVCard( vCardFile, *this );
+    CNT_EXIT
+}
+
+
+/*!
+Launch contact selection view with a given detail (selecting detail there opens the editor and adds the new detail)
+*/
+void CntServiceProviderOld::editUpdateExisting(const QString &definitionName, const QString &value)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editUpdateExisting( definitionName, value, *this );
+    CNT_EXIT
+}
+
+
+/*!
+Launch communication launcher view for the contact with the given ID (QContactLocalId -> int)
+*/
+void CntServiceProviderOld::open(int contactId)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.launchContactCard( contactId, *this );
+    CNT_EXIT
+}
+
+/*!
+  Launch temporary communication launcher view with the given detail.
+*/
+void CntServiceProviderOld::open(const QString &definitionName, const QString &value)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.launchTemporaryContactCard( definitionName, value, *this ); // definitionName = field type      value = actual field value for prefilling editor
+    CNT_EXIT
+}
+
+
+void CntServiceProviderOld::CompleteServiceAndCloseApp(const QVariant& retValue)
+{
+    CNT_ENTRY
+    connect(this, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
+    if ( mCurrentRequestIndex != 0 )
+    {
+        const bool success = completeRequest(mCurrentRequestIndex, retValue);
+        if ( !success )
+        {
+            CNT_LOG_ARGS("Failed to complete highway request.");
+        }
+        mCurrentRequestIndex = 0;
+    }
+    CNT_EXIT
+}
+
+// end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/src/cntserviceproviderold2.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,150 @@
+/*
+ * 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 "cntserviceproviderold2.h"
+#include "cntservices.h"
+#include "cntdebug.h"
+
+#include <qapplication.h>
+#include <QPixmap>
+#include <QFile>
+#include <QUrl>
+
+CntServiceProviderOld2::CntServiceProviderOld2(CntServices& aServices, QObject *parent):
+    XQServiceProvider(QLatin1String("phonebookservices.Fetch"), parent),
+    mServices(aServices),
+    mCurrentRequestIndex(0)
+{
+    CNT_ENTRY
+    publishAll();
+    connect(this, SIGNAL(clientDisconnected()), &mServices, SLOT(quitApp()));
+    CNT_EXIT
+}
+
+CntServiceProviderOld2::~CntServiceProviderOld2()
+{
+    CNT_ENTRY
+    CNT_EXIT
+}
+
+/*!
+Launch fetch service with given parameters. OLD INTERFACE.
+*/
+void CntServiceProviderOld2::fetch(const QString &title, const QString &action, const QString& /*filter*/)
+{
+    CNT_ENTRY
+    // Ignore the filter parameter
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.multiFetch( title, action, *this );
+    CNT_EXIT
+}
+
+
+/*
+Launch fetch service with given parameters. Fetching mode is No-select by default. OLD INTERFACE.
+*/
+void CntServiceProviderOld2::Dofetch(const QString &title, const QString &action, const QString& /*filter*/, const QString& /*mode*/)
+{
+    CNT_ENTRY
+    // Ignore the filter parameter
+    // Ignoring fourth argument, because it's not needed. DoFetch() by old contract is only for single-fetching.
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.singleFetch( title, action, *this );
+    CNT_EXIT
+}
+
+
+/*
+Launch new contact editor with a given detail
+*/
+void CntServiceProviderOld2::editCreateNew(const QString& definitionName, const QString& value)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editCreateNew( definitionName, value, *this );
+}
+
+void CntServiceProviderOld2::editCreateNew(const QString &vCardFile)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editCreateNewFromVCard( vCardFile, *this );
+    CNT_EXIT
+}
+
+
+/*!
+Launch contact selection view with a given detail (selecting detail there opens the editor and adds the new detail)
+*/
+void CntServiceProviderOld2::editUpdateExisting(const QString &definitionName, const QString &value)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.editUpdateExisting( definitionName, value, *this );
+    CNT_EXIT
+}
+
+
+/*!
+Launch communication launcher view for the contact with the given ID (QContactLocalId -> int)
+*/
+void CntServiceProviderOld2::open(int contactId)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.launchContactCard( contactId, *this );
+    CNT_EXIT
+}
+
+/*!
+  Launch temporary communication launcher view with the given detail.
+*/
+void CntServiceProviderOld2::open(const QString &definitionName, const QString &value)
+{
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.launchTemporaryContactCard( definitionName, value, *this ); // definitionName = field type      value = actual field value for prefilling editor
+    CNT_EXIT
+}
+
+
+void CntServiceProviderOld2::CompleteServiceAndCloseApp(const QVariant& retValue)
+{
+    CNT_ENTRY
+    connect(this, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
+    if ( mCurrentRequestIndex != 0 )
+    {
+        CNT_LOG_ARGS("next, completing request.")
+        const bool success = completeRequest(mCurrentRequestIndex, retValue);
+        if ( !success )
+        {
+            CNT_LOG_ARGS("Failed to complete highway request.");
+        }
+        mCurrentRequestIndex = 0;
+    }
+    CNT_EXIT
+}
+
+
+// end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/src/cntserviceproviderviewing.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,77 @@
+/*
+ * 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: This class offers contact viewing UI services.
+ *
+ */
+
+#include "cntserviceproviderviewing.h"
+#include "cntservices.h"
+#include "cntservicestrings.h"
+#include "cntdebug.h"
+
+#include <qapplication.h>
+#include <QPixmap>
+#include <QFile>
+#include <QUrl>
+
+CntServiceProviderViewing::CntServiceProviderViewing(CntServices& aServices, QObject *parent):
+    XQServiceProvider(QLatin1String(KCntServiceInterfaceView), parent),
+    mServices(aServices),
+    mCurrentRequestIndex(0)
+{
+    CNT_ENTRY
+    publishAll();
+    connect(this, SIGNAL(clientDisconnected()), &mServices, SLOT(quitApp()));
+    CNT_EXIT
+}
+
+CntServiceProviderViewing::~CntServiceProviderViewing()
+{
+    CNT_ENTRY
+    CNT_EXIT
+}
+
+void CntServiceProviderViewing::openContactCard( int aContactId )
+    {
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.launchContactCard( aContactId, *this );
+    CNT_EXIT
+    }
+
+void CntServiceProviderViewing::openTemporaryContactCard( QString aFieldName, QString aFieldValue )
+    {
+    CNT_ENTRY
+    mCurrentRequestIndex = setCurrentRequestAsync();
+    mServices.setQuitable(requestInfo().isEmbedded());
+    mServices.launchTemporaryContactCard( aFieldName, aFieldValue, *this );
+    CNT_EXIT
+    }
+
+void CntServiceProviderViewing::CompleteServiceAndCloseApp(const QVariant& retValue)
+    {
+    CNT_ENTRY
+    connect(this, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
+    if ( mCurrentRequestIndex != 0 )
+        {
+        const bool success = completeRequest(mCurrentRequestIndex, retValue);
+        if ( !success )
+        {
+            CNT_LOG_ARGS("Failed to complete highway request.");
+        }
+        mCurrentRequestIndex = 0;
+        }
+    CNT_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/src/cntservices.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -0,0 +1,451 @@
+/*
+ * 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 "cntservices.h"
+#include "cntglobal.h"
+#include "cntdebug.h"
+#include <cntabstractviewmanager.h>
+#include "cntimageutility.h"
+#include "cntserviceviewparams.h"
+
+#include <hbview.h>
+#include <hblistview.h>
+#include <qversitreader.h>
+#include <qversitcontactimporter.h>
+#include <qversitdocument.h>
+#include <xqserviceprovider.h>
+
+#include <QApplication>
+#include <QPixmap>
+#include <QFile>
+#include <QUrl>
+
+CntServices::CntServices() :
+mViewManager(NULL),
+mCurrentProvider(NULL),
+mIsQuitable(true)
+{
+    CNT_ENTRY
+
+    // Definition names supported in symbian back-end
+    m_definitionNames << QContactName::DefinitionName;
+    m_definitionNames << QContactNickname::DefinitionName;
+    m_definitionNames << QContactPhoneNumber::DefinitionName;
+    m_definitionNames << QContactEmailAddress::DefinitionName;
+    m_definitionNames << QContactAddress::DefinitionName;
+    m_definitionNames << QContactUrl::DefinitionName;
+    m_definitionNames << QContactBirthday::DefinitionName;
+    m_definitionNames << QContactOrganization::DefinitionName;
+    m_definitionNames << QContactSyncTarget::DefinitionName;
+    m_definitionNames << QContactNote::DefinitionName;
+    m_definitionNames << QContactFamily::DefinitionName;
+    m_definitionNames << QContactAvatar::DefinitionName;
+    m_definitionNames << QContactAnniversary::DefinitionName;
+    m_definitionNames << QContactGeoLocation::DefinitionName;
+    m_definitionNames << QContactGender::DefinitionName;
+    m_definitionNames << QContactOnlineAccount::DefinitionName;
+    
+    CNT_EXIT
+}
+
+
+CntServices::~CntServices()
+{
+    CNT_LOG
+}
+
+
+void CntServices::setViewManager( CntAbstractViewManager& aViewManager )
+{
+    CNT_LOG
+    mViewManager = &aViewManager;
+}
+
+
+void CntServices::singleFetch(
+    const QString &title, const QString &action,
+    CntAbstractServiceProvider& aServiceProvider )
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    CntViewParameters params;
+    params.insert(EViewId, serviceContactFetchView);
+    params.insert(ESelectedAction, action);
+    params.insert(KCntServiceViewParamTitle, title);
+    // SINGLE fetch
+    params.insert(ESelectionMode, HbAbstractItemView::SingleSelection);
+
+    mViewManager->changeView(params);
+    CNT_EXIT
+}
+
+
+void CntServices::multiFetch(
+    const QString &title, const QString &action,
+    CntAbstractServiceProvider& aServiceProvider )
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    CntViewParameters params;
+    params.insert(EViewId, serviceContactFetchView);
+    params.insert(ESelectedAction, action);
+    params.insert(KCntServiceViewParamTitle, title);
+    // MULTI fetch
+    params.insert(ESelectionMode, HbAbstractItemView::MultiSelection);
+    mViewManager->changeView(params);
+    CNT_EXIT
+}
+
+
+void CntServices::editCreateNew(const QString &definitionName, const QString &value,
+    CntAbstractServiceProvider& aServiceProvider)
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    QContact contact;
+    
+    if (definitionName == QContactPhoneNumber::DefinitionName)
+        {
+        QContactPhoneNumber phoneNumber;
+        phoneNumber.setNumber(value);
+        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+        contact.saveDetail(&phoneNumber);
+        }
+    else if (definitionName == QContactEmailAddress::DefinitionName)
+        {
+        QContactEmailAddress email;
+        email.setEmailAddress(value);
+        contact.saveDetail(&email);
+        }
+    else if (definitionName == QContactOnlineAccount::DefinitionName)
+        {
+        QContactOnlineAccount account;
+        account.setAccountUri(value);
+        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
+        contact.saveDetail(&account);
+        }    
+
+    // Launch editor now
+    CntViewParameters params;
+    params.insert(EViewId, serviceEditView);
+    QVariant var;
+    var.setValue(contact);
+    params.insert(ESelectedContact, var);
+    mViewManager->changeView(params);
+    CNT_EXIT
+}
+
+
+void CntServices::editCreateNewFromVCard(const QString &vCardFile,
+    CntAbstractServiceProvider& aServiceProvider )
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    CntImageUtility imageUtility;
+    QContact contact;
+    QVersitReader reader;
+    QFile file(vCardFile);
+    if (!file.open(QIODevice::ReadOnly))
+        return;
+    reader.setDevice(&file);
+    
+    reader.startReading();
+    reader.waitForFinished();
+    // Use the resulting document(s)...
+    QVersitContactImporter importer;
+    QList<QVersitDocument> versitDocuments = reader.results();
+    if(versitDocuments.count() > 0 
+       && importer.importDocuments(versitDocuments))
+        {
+        QList<QContact> contacts = importer.contacts();
+        if(contacts.count() > 0)
+            contact = contacts.first();
+        }
+    file.close();
+    
+    // Save thumbnail images
+    QList<QContactThumbnail> details = contact.details<QContactThumbnail>();
+    for (int i = 0;i < details.count();i++)
+        {
+        if (!details.at(i).thumbnail().isNull())
+            {
+            QString imagepath;
+            QPixmap pixmap = QPixmap::fromImage(details.at(i).thumbnail());
+            if(imageUtility.createImage(pixmap,imagepath))
+                {
+                // Update contact detail
+                QContactAvatar detail=details.at(i);
+                detail.setImageUrl(imagepath);
+                contact.saveDetail(&detail);
+                }
+            }
+        }
+    
+    removeNotSupportedDetails(contact);
+    removeNotSupportedFields(contact);
+
+    // Launch editor now
+    CntViewParameters params;
+    params.insert(EViewId, serviceEditView);
+    QVariant var;
+    var.setValue(contact);
+    params.insert(ESelectedContact, var);
+    mViewManager->changeView(params);
+    CNT_EXIT
+}
+
+
+void CntServices::editUpdateExisting(const QString &definitionName, const QString &value,
+    CntAbstractServiceProvider& aServiceProvider )
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    QContactDetail detail;
+    
+    if (definitionName == QContactPhoneNumber::DefinitionName)
+    {
+        QContactPhoneNumber phoneNumber;
+        phoneNumber.setNumber(value);
+        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+        detail = phoneNumber;
+    }
+    else if (definitionName == QContactEmailAddress::DefinitionName)
+    {
+        QContactEmailAddress email;
+        email.setEmailAddress(value);
+        detail = email;
+    }
+    else if (definitionName == QContactOnlineAccount::DefinitionName)
+    {
+        QContactOnlineAccount account;
+        account.setAccountUri(value);
+        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
+        detail = account;
+    }
+
+    CntViewParameters params;
+    params.insert(EViewId, serviceContactSelectionView);
+    QVariant var;
+    var.setValue(detail);
+    params.insert(ESelectedDetail, var);
+    mViewManager->changeView(params);
+    CNT_EXIT
+}
+
+void CntServices::editExisting(int contactId,
+CntAbstractServiceProvider& aServiceProvider)
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    // Give parameters for launching editor.
+    CntViewParameters params;
+    params.insert(EViewId, serviceEditView);
+
+    QContact contact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(contactId);
+    QVariant varContact;
+    varContact.setValue(contact);
+    params.insert(ESelectedContact, varContact);
+    mViewManager->changeView(params);
+    CNT_EXIT
+}
+
+
+void CntServices::launchContactCard(int aContactId,
+    CntAbstractServiceProvider& aServiceProvider )
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    QContactManager manager("symbian");
+    QContact contact = manager.contact(aContactId);
+
+    // Launch Contact Card view
+    CntViewParameters params;
+    params.insert(EViewId, serviceContactCardView);
+    QVariant var;
+    var.setValue(contact);
+    params.insert(ESelectedContact, var);
+    mViewManager->changeView( params );
+    CNT_EXIT
+}
+
+
+void CntServices::launchTemporaryContactCard(const QString &definitionName, const QString &value,
+    CntAbstractServiceProvider& aServiceProvider )
+{
+    CNT_ENTRY
+    mCurrentProvider = &aServiceProvider;
+
+    QContact contact;
+    QContactDetail detail;
+    
+    if (definitionName == QContactPhoneNumber::DefinitionName)
+    {
+        QContactPhoneNumber phoneNumber;
+        phoneNumber.setNumber(value);
+        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+        contact.saveDetail(&phoneNumber);
+        detail = phoneNumber;
+    }
+    else if (definitionName == QContactEmailAddress::DefinitionName)
+    {
+        QContactEmailAddress email;
+        email.setEmailAddress(value);
+        contact.saveDetail(&email);
+        detail = email;
+    }
+    else if (definitionName == QContactOnlineAccount::DefinitionName)
+    {
+        QContactOnlineAccount account;
+        account.setAccountUri(value);
+        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
+        contact.saveDetail(&account);
+        detail = account;
+    }
+
+    // Launch the view
+    CntViewParameters params;
+    params.insert(EViewId, serviceAssignContactCardView);
+    QVariant var;
+    var.setValue(contact);
+    params.insert(ESelectedContact, var);
+    QVariant varDetail;
+    varDetail.setValue(detail);
+    params.insert(ESelectedDetail, varDetail);
+    mViewManager->changeView(params);
+    CNT_EXIT
+}
+
+
+void CntServices::removeNotSupportedDetails(QContact& contact)
+{
+    CNT_ENTRY
+    // Check definition map, remove details not supported
+    for (int i=0; i < contact.details().count(); i++)
+    {
+        if (!m_definitionNames.contains(contact.details().at(i).definitionName()))
+        {
+            QContactDetail detail= contact.details().at(i);
+            contact.removeDetail(&detail);
+        }
+    }
+    CNT_EXIT
+}
+
+
+
+void CntServices::removeNotSupportedFields(QContact& contact)
+{
+    CNT_ENTRY
+    QContactManager cm("symbian");
+    QList<QContactDetail>   removeList;
+    
+    // Not all fields are supported in symbian back-end
+    // Remove not supported fields
+    for (int i=0; i < contact.details().count(); i++)
+    {
+        QContactDetail detail = contact.details().at(i);
+        if(detail.definitionName() == QContactAddress::DefinitionName)
+        {
+            QContactAddress addrDetail = static_cast<QContactAddress>(detail);
+            
+            // Sub-types not supported
+            if(detail.removeValue(QContactAddress::FieldSubTypes))
+                contact.saveDetail(&detail);
+        }
+        else if(detail.definitionName() == QContactAnniversary::DefinitionName)
+        {
+            QContactAnniversary annivDetail = static_cast<QContactAnniversary>(detail);
+            
+            // Sub-types not supported
+            if(detail.removeValue(QContactAnniversary::FieldSubType))
+                contact.saveDetail(&detail);
+            
+            // Context not supported
+            if(detail.removeValue(QContactDetail::FieldContext))
+                contact.saveDetail(&detail);
+        }
+        else if(detail.definitionName() == QContactPhoneNumber::DefinitionName)
+        {
+            QContactPhoneNumber phoneDetail = static_cast<QContactPhoneNumber>(detail);
+            
+            if(phoneDetail.subTypes().size() > 0 )
+            {
+                // Sub-types not supported
+                if(phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeVoice)
+                   || phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeMessagingCapable))
+                {
+                    detail.removeValue(QContactPhoneNumber::FieldSubTypes);
+                    contact.saveDetail(&detail);
+                }
+            }
+        }
+        else if(detail.definitionName() == QContactUrl::DefinitionName)
+        {
+            QContactUrl urlDetail = static_cast<QContactUrl>(detail);
+            
+            QString stype=QContactUrl::SubTypeHomePage;
+            if(urlDetail.subType().compare(stype) != 0)
+            {
+                detail.removeValue(QContactUrl::FieldSubType);
+                contact.saveDetail(&detail);
+            }
+        }
+    }
+    CNT_EXIT
+}
+
+// This method is inherited from CntAbstractServiceProvider
+void CntServices::CompleteServiceAndCloseApp(const QVariant& retValue)
+{
+    CNT_ENTRY
+    if (  mCurrentProvider )
+        {
+        mCurrentProvider->CompleteServiceAndCloseApp( retValue );
+        }
+    CNT_EXIT
+}
+
+void CntServices::setQuitable(bool quitable)
+{
+    mIsQuitable = quitable;
+}
+
+void CntServices::quitApp()
+{
+    CNT_ENTRY
+   
+    // Only embedded applications should be exited once a client
+    // disconnects. At the moments QtHighWay has unresolved issues
+    // when closing non-embedded applications. Error ou1cimx1#472852
+    // has more info
+    if ( mIsQuitable ) 
+    {
+       qApp->quit();
+    }
+   
+    CNT_EXIT
+}
+
+Q_IMPLEMENT_USER_METATYPE(CntServicesContact)
+Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList)
--- a/phonebookui/phonebookservices/src/cntservicesubeditview.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-    /*
-* 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 "cntservicesubeditview.h"
-#include "cntservicehandler.h"
-
-CntServiceSubEditView::CntServiceSubEditView(CntServiceHandler *aServiceHandler) : CntEditView(),
-mServiceHandler(aServiceHandler)
-{   
-
-}
-
-CntServiceSubEditView::~CntServiceSubEditView()
-{
-
-}
-    
-///*!
-//Saves the contact
-//*/
-//void CntServiceSubEditView::aboutToCloseView()
-//{
-//    // save contact if there is one
-//    if (contact())
-//    {
-//        contactManager()->saveContact(contact());
-//    }
-//    
-//    CntViewParameters viewParameters;
-//    QVariant var;
-//    var.setValue(*contact());
-//    viewParameters.insert(ESelectedContact, var);
-//    viewManager()->back(viewParameters);
-//}
-//
-///*!
-//Cancel all changes made and return to comm launcher view
-//*/
-//void CntServiceSubEditView::discardAllChanges()
-//{
-//    QContact oldContact = contactManager()->contact(contact()->localId());
-//    
-//    CntViewParameters viewParameters;
-//    QVariant var;
-//    var.setValue(oldContact);
-//    viewParameters.insert(ESelectedContact, var);
-//    viewManager()->back(viewParameters);
-//}
-//
-///*
-//Handle signals emitted from CntCommands, only used for delete command for now.
-//*/
-//int CntServiceSubEditView::handleExecutedCommand(QString aCommand, const QContact &aContact)
-//{
-//    Q_UNUSED(aContact);
-//    int result = -1;
-//    if (aCommand == "delete")
-//    {
-//        connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit()));
-//        mServiceHandler->completeEdit(result);
-//        result = 0;
-//    }
-//    return result;
-//}
-
-// EOF
--- a/phonebookui/phonebookservices/src/cntserviceviewfactory.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntserviceviewfactory.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -17,16 +17,19 @@
 
 #include "cntserviceviewfactory.h"
 #include "cntabstractview.h"
+
+
 #include "cntserviceeditview.h"
-#include "cntservicesubeditview.h"
+#include "cntservicecontactselectionview.h"
+
+#include "cntservicecontactcardview.h"
 #include "cntservicecontactfetchview.h"
-#include "cntservicecontactselectionview.h"
-#include "cntservicecontactcardview.h"
 #include "cntserviceassigncontactcardview.h"
 
-CntServiceViewFactory::CntServiceViewFactory(CntServiceHandler* aHandler) : 
+
+CntServiceViewFactory::CntServiceViewFactory( CntAbstractServiceProvider& aServiceProvider ) : 
 CntDefaultViewFactory(),
-mService( aHandler )
+mProvider( aServiceProvider )
 {
 }
 
@@ -38,26 +41,23 @@
 {
     switch ( aViewId )
     {
-    // contact fetch service view (fetching contacts from for example messaging)
+    // contact fetch service view (for eg. requested by messaging)
     case serviceContactFetchView:
-        return new CntServiceContactFetchView( mService );
-    
+        return new CntServiceContactFetchView( mProvider );
+
     // contact selection service view (selecting contact to edit when updating existing contact)
     case serviceContactSelectionView:
-        return new CntServiceContactSelectionView( mService );
+        return new CntServiceContactSelectionView( mProvider );
             
     case serviceEditView:
-        return new CntServiceEditView( mService );
-        
-    case serviceSubEditView:
-        return new CntServiceSubEditView( mService );
-    
+        return new CntServiceEditView( mProvider );
+
     case serviceContactCardView:
-        return new CntServiceContactCardView( mService );
+        return new CntServiceContactCardView( mProvider );
             
     case serviceAssignContactCardView:
-        return new CntServiceAssignContactCardView( mService );
-        
+        return new CntServiceAssignContactCardView( mProvider );
+
     default:
         return CntDefaultViewFactory::createView( aViewId );
     }
--- a/phonebookui/phonebookservices/src/cntserviceviewmanager.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntserviceviewmanager.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -16,40 +16,18 @@
 */
 
 #include "cntserviceviewmanager.h"
-
-#include "cntservicehandler.h"
-
-#include "cntservicecontactfetchview.h"
-#include "cntservicecontactselectionview.h"
-#include "cntserviceeditview.h"
-#include "cntservicecontactcardview.h"
-#include "cntservicesubeditview.h"
-#include "cntserviceassigncontactcardview.h"
 #include "cntserviceviewfactory.h"
 
-#include <hbabstractitemview.h>
 /*!
 Constructor
 */
-CntServiceViewManager::CntServiceViewManager(HbMainWindow *mainWindow, CntServiceHandler *aHandler):
-    CntDefaultViewManager(mainWindow),
-    mServiceHandler(aHandler)
-{
-    
-    setViewFactory( new CntServiceViewFactory(mServiceHandler) );
-    connect(mServiceHandler, SIGNAL(launchFetch(const QString&, const QString&, const QString&)), 
-            this, SLOT(handleFetch(const QString&, const QString&, const QString&)));
-    
-    // Handles signal with mode selected.
-    connect(mServiceHandler, SIGNAL(launchFetchVerified(const QString&, const QString&, const QString&, const QString&)), 
-            this, SLOT(launchFetch(const QString&, const QString&, const QString&, const QString&)));
-    
-    connect(mServiceHandler, SIGNAL(launchEditor(QContact)), this, SLOT(launchEditor(QContact)));
-    connect(mServiceHandler, SIGNAL(launchContactSelection(QContactDetail)), this, SLOT(launchContactSelection(QContactDetail)));
-    connect(mServiceHandler, SIGNAL(launchContactCard(QContact)), this, SLOT(launchContactCard(QContact)));
-    connect(mServiceHandler, SIGNAL(launchAssignContactCard(QContact, QContactDetail)), this, 
-            SLOT(launchAssignContactCard(QContact, QContactDetail)));
-}
+CntServiceViewManager::CntServiceViewManager( HbMainWindow *mainWindow,
+    CntAbstractServiceProvider& aProvider ):
+    CntDefaultViewManager(mainWindow)
+    {
+    // ownership of the factory is given to the base class.
+    setViewFactory( new CntServiceViewFactory( aProvider ) );
+    }
 
 /*!
 Destructor
@@ -65,87 +43,4 @@
     // from service handler, see constructor.
 }
 
-/*!
-Launch fetch service view.
-*/
-void CntServiceViewManager::handleFetch(const QString &title, const QString &action, const QString &filter)
-{
-    launchFetch(title,action,filter);
-}
-
-/*!
-Launch fetch service view. Uses a mode to determine fetching type.
-*/
-void CntServiceViewManager::launchFetch(const QString &title, const QString &action, const QString &filter, const QString &mode)
-{
-    CntViewParameters params;
-    params.insert(EViewId, serviceContactFetchView);
-    params.insert(CntServiceHandler::EAction, action);
-    params.insert(CntServiceHandler::EFilter, filter);
-    params.insert(CntServiceHandler::ETitle, title);
-
-    if (!mode.compare(KCntSingleSelectionMode, Qt::CaseSensitive)) {
-        params.insert(ESelectionMode, HbAbstractItemView::SingleSelection);
-    }
-    else {
-        params.insert(ESelectionMode, HbAbstractItemView::MultiSelection);
-    }
-    changeView(params);
-}
-
-/*!
-Launch editor service view
-*/
-void CntServiceViewManager::launchEditor(QContact contact)
-{
-    CntViewParameters params;
-    params.insert(EViewId, serviceEditView);
-    QVariant var;
-    var.setValue(contact);
-    params.insert(ESelectedContact, var);
-    changeView(params);
-}
-
-/*!
-Launch contact selection service view (update existing contact with detail)
-*/
-void CntServiceViewManager::launchContactSelection(QContactDetail detail)
-{
-    CntViewParameters params;
-    params.insert(EViewId, serviceContactSelectionView);
-    QVariant var;
-    var.setValue(detail);
-    params.insert(ESelectedDetail, var);
-    changeView(params);
-}
-
-/*!
-Launch contact card service view
-*/
-void CntServiceViewManager::launchContactCard(QContact contact)
-{
-    CntViewParameters params;
-    params.insert(EViewId, serviceContactCardView);
-    QVariant var;
-    var.setValue(contact);
-    params.insert(ESelectedContact, var);
-    changeView(params);
-}
-
-/*!
-Launch assign (temporary) contact card service view
-*/
-void CntServiceViewManager::launchAssignContactCard(QContact contact, QContactDetail detail)
-{
-    CntViewParameters params;
-    params.insert(EViewId, serviceAssignContactCardView);
-    QVariant var;
-    var.setValue(contact);
-    params.insert(ESelectedContact, var);
-    QVariant varDetail;
-    varDetail.setValue(detail);
-    params.insert(ESelectedDetail, varDetail);
-    changeView(params);
-}
-
 // end of file
--- a/phonebookui/phonebookservices/src/main.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/src/main.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -18,8 +18,17 @@
 #include <hbapplication.h>
 #include <QTranslator>
 #include <QLocale>
-#include "cntservicemainwindow.h"
-#include "cntservicehandler.h"
+#include "cntmainwindow.h"
+#include "cntserviceproviderold.h"
+#include "cntserviceproviderold2.h"
+#include "cntserviceproviderfetch.h"
+#include "cntserviceproviderold2.h"
+#include "cntserviceproviderviewing.h"
+#include "cntserviceprovideredit.h"
+#include "cntservices.h"
+#include "cntserviceviewmanager.h"
+#include "cntviewnavigator.h"
+#include <cntviewparams.h>
 
 int main(int argc, char **argv)
 {
@@ -30,9 +39,29 @@
     QString path = "z:/resource/qt/translations/";
     translator.load(path + "contacts_" + lang);
     a.installTranslator(&translator);
-    
-    CntServiceHandler *handler = new CntServiceHandler();
-    CntServiceMainWindow mainWindow(handler);
+
+    CntMainWindow mainWindow(NULL, noView); // no parent & "noView" as default view
+
+    CntViewNavigator* navigator = new CntViewNavigator( &mainWindow );
+    navigator->addException( serviceEditView, noView );
+
+    // This object actually executes the services
+    CntServices* services = new CntServices();
+    services->setParent( &mainWindow ); // for ownership
+
+    CntServiceViewManager* viewManager = new CntServiceViewManager(
+        &mainWindow,
+        *services ); // as CntAbstractServiceProvider
+    viewManager->setViewNavigator( navigator );
+
+    services->setViewManager( *viewManager );
+
+    // These objects talk with QT Highway (send/receive)
+    CntServiceProviderOld* serviceProviderOld = new CntServiceProviderOld( *services, &mainWindow ); // com.nokia.services.phonebookservices.Fetch
+    CntServiceProviderOld2* serviceProviderOld2 = new CntServiceProviderOld2( *services, &mainWindow ); // phonebookservices.Fetch
+    CntServiceProviderFetch* serviceProviderFetch = new CntServiceProviderFetch( *services, &mainWindow ); // phonebookservices.com.nokia.symbian.IContactFetch
+    CntServiceProviderViewing* serviceProviderViewing = new CntServiceProviderViewing( *services, &mainWindow ); // phonebookservices.com.nokia.symbian.IContactView
+    CntServiceProviderEdit* serviceProviderEdit = new CntServiceProviderEdit( *services, &mainWindow ); // phonebookservices.com.nokia.symbian.IContactEdit
 
     mainWindow.show();
 
--- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/main.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/main.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -88,6 +88,14 @@
     mainLayout->addItem(button, row, 1);
     row++;
 
+    button = new HbPushButton("Edit create new - number with subtype");
+    QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditCreateNew_numberWithSubtype()));
+    mainLayout->addItem(button, row, 0);
+    button = new HbPushButton("old");
+    QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditCreateNew_numberWithSubtype_old()));
+    mainLayout->addItem(button, row, 1);
+    row++;    
+    
     button = new HbPushButton("Edit create new - email");
     QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditCreateNew_email()));
     mainLayout->addItem(button, row, 0);
@@ -104,6 +112,14 @@
     mainLayout->addItem(button, row, 1);
     row++;
 
+    button = new HbPushButton("Edit create new - onlineAccount with subtype");
+    bool res = QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditCreateNew_onlineAccountWithSubtype()));
+    mainLayout->addItem(button, row, 0);
+    button = new HbPushButton("old");
+    res = QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditCreateNew_onlineAccountWithSubtype_old()));
+    mainLayout->addItem(button, row, 1);
+    row++;
+    
     button = new HbPushButton("Launch editor with vCard");
     QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditorVCard()));
     mainLayout->addItem(button, row, 0);
@@ -121,6 +137,14 @@
     QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditUpdateExisting_number_old()));
     mainLayout->addItem(button, row, 1);
     row++;
+    
+    button = new HbPushButton("Edit/update existing - number with subtype");
+    QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditUpdateExisting_numberWithSubtype()));
+    mainLayout->addItem(button, row, 0);
+    button = new HbPushButton("old");
+    QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditUpdateExisting_numberWithSubtype_old()));
+    mainLayout->addItem(button, row, 1);
+    row++;
 
     button = new HbPushButton("Edit/update existing - email");
     QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditUpdateExisting_email()));
@@ -138,6 +162,14 @@
     mainLayout->addItem(button, row, 1);
     row++;
 
+    button = new HbPushButton("Edit/update existing - onlineAccount with subtype");
+    QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditUpdateExisting_onlineAccountWithSubtype()));
+    mainLayout->addItem(button, row, 0);
+    button = new HbPushButton("old");
+    QObject::connect(button, SIGNAL(pressed()), service, SLOT(launchEditUpdateExisting_onlineAccountWithSubtype_old()));
+    mainLayout->addItem(button, row, 1);
+    row++;
+    
     // CONTACT CARD ==========================================================
 
     button = new HbPushButton("Launch contact card");
--- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp	Wed Jul 21 11:21:49 2010 +0300
@@ -138,6 +138,28 @@
     CNT_EXIT
 }
 
+void testPbkServices::launchEditCreateNew_numberWithSubtype()
+{
+    CNT_ENTRY
+    launchEditCreateNew(
+        true,                                // aNewInterface
+        QContactPhoneNumber::DefinitionName, // aDetailType
+        "1234567",                           // aFieldContent
+        QContactPhoneNumber::SubTypeLandline); //aDetailSubtype
+    CNT_EXIT
+}
+
+void testPbkServices::launchEditCreateNew_numberWithSubtype_old()
+{
+    CNT_ENTRY
+    launchEditCreateNew(
+        false,                               // aNewInterface
+        QContactPhoneNumber::DefinitionName, // aDetailType
+        "1234567",                          // aFieldContent
+        QContactPhoneNumber::SubTypeLandline); //aDetailSubtype
+    CNT_EXIT
+}
+
 void testPbkServices::launchEditCreateNew_email()
 {
     CNT_ENTRY
@@ -178,6 +200,28 @@
     CNT_EXIT
 }
 
+void testPbkServices::launchEditCreateNew_onlineAccountWithSubtype()
+{
+    CNT_ENTRY
+    launchEditCreateNew(
+        true,                                  // aNewInterface
+        QContactOnlineAccount::DefinitionName, // aDetailType
+        "provider:account@provider.com",                // aFieldContent
+        QContactOnlineAccount::SubTypeImpp); // aDetailSubtype
+    CNT_EXIT
+}
+
+void testPbkServices::launchEditCreateNew_onlineAccountWithSubtype_old()
+{
+    CNT_ENTRY
+    launchEditCreateNew(
+        false,                                  // aNewInterface
+        QContactOnlineAccount::DefinitionName, // aDetailType
+        "provider:account@provider.com",                // aFieldContent
+        QContactOnlineAccount::SubTypeImpp); // aDetailSubtype
+    CNT_EXIT
+}
+
 void testPbkServices::launchEditorVCard()
 {
     CNT_ENTRY
@@ -214,6 +258,28 @@
     CNT_EXIT
 }
 
+void testPbkServices::launchEditUpdateExisting_numberWithSubtype()
+{
+    CNT_ENTRY
+    launchEditUpdateExisting(
+        true,                                // aNewInterface
+        QContactPhoneNumber::DefinitionName, // aDetailType
+        "1234567",                           // aDetailValue
+        QContactPhoneNumber::SubTypeLandline);// aDetailSubtype 
+    CNT_EXIT
+}
+
+void testPbkServices::launchEditUpdateExisting_numberWithSubtype_old()
+{
+    CNT_ENTRY
+    launchEditUpdateExisting(
+        false,                               // aNewInterface
+        QContactPhoneNumber::DefinitionName, // aDetailType
+        "1234567",                           // aDetailValue
+        QContactPhoneNumber::SubTypeLandline);// aDetailSubtype    
+    CNT_EXIT
+}
+
 void testPbkServices::launchEditUpdateExisting_email()
 {
     CNT_ENTRY
@@ -254,6 +320,28 @@
     CNT_EXIT
 }
 
+void testPbkServices::launchEditUpdateExisting_onlineAccountWithSubtype()
+{
+    CNT_ENTRY
+    launchEditUpdateExisting(
+        true,                                  // aNewInterface
+        QContactOnlineAccount::DefinitionName, // aDetailType
+        "provider:account@provider.com",       // aDetailValue
+        QContactOnlineAccount::SubTypeImpp); // aDetailSubtype              
+    CNT_EXIT
+}
+
+void testPbkServices::launchEditUpdateExisting_onlineAccountWithSubtype_old()
+{
+    CNT_ENTRY
+    launchEditUpdateExisting(
+        false,                                 // aNewInterface
+        QContactOnlineAccount::DefinitionName, // aDetailType
+        "provider:account@provider.com",       // aDetailValue
+        QContactOnlineAccount::SubTypeImpp); // aDetailSubtype    
+    CNT_EXIT
+}
+
 void testPbkServices::launchContactCard()
 {
     CNT_ENTRY
@@ -431,8 +519,8 @@
     XQApplicationManager appMng;
     if ( aNewInterface )
     {
-        QString interface("com.nokia.symbian.IContactFetch"); 
-        QString operation("multiFetch(QString,QString,QString)");
+        QString interface("com.nokia.symbian.IContactsFetch"); 
+        QString operation("multiFetch(QString,QString)");
         // There are two kinds of create() methods in XQApplicationManager. The one with four arguments
         // takes the service name also. The one with three arguments (used below) does not take the service name.
         // The interface name is enough for finding the correct provider at run time.
@@ -477,8 +565,8 @@
     XQApplicationManager appMng;
     if ( aNewInterface )
     {
-        QString interface("com.nokia.symbian.IContactFetch"); 
-        QString operation("singleFetch(QString,QString,QString)");
+        QString interface("com.nokia.symbian.IContactsFetch"); 
+        QString operation("singleFetch(QString,QString)");
         // There are two kinds of create() methods in XQApplicationManager. The one with four arguments
         // takes the service name also. The one with three arguments (used below) does not take the service name.
         // The interface name is enough for finding the correct provider at run time.
@@ -517,7 +605,7 @@
     CNT_EXIT
 }
 
-void testPbkServices::launchEditCreateNew( bool aNewInterface, QString aDetailType, QString aFieldContent )
+void testPbkServices::launchEditCreateNew( bool aNewInterface, QString aDetailType, QString aFieldContent, QString aDetailSubtype )
 {
     CNT_ENTRY
     delete mRequest;
@@ -526,9 +614,14 @@
     QVariantList args; 
     XQApplicationManager appMng;
     QString operation("editCreateNew(QString,QString)");
+    if ( !aDetailSubtype.isEmpty() )
+    {
+        operation = "editCreateNew(QString,QString,QString)";
+    }
+    
     if ( aNewInterface )
     {
-        QString interface("com.nokia.symbian.IContactFetch"); 
+        QString interface("com.nokia.symbian.IContactsFetch"); 
         // service name is not needed
         mRequest = appMng.create( interface, operation, true); // embedded
     }
@@ -548,6 +641,10 @@
         
         args << aDetailType;
         args << aFieldContent;
+        if ( !aDetailSubtype.isEmpty() )
+        {
+            args << aDetailSubtype;
+        }
         
         mRequest->setArguments(args); 
         mRequest->send();
@@ -570,7 +667,7 @@
     XQApplicationManager appMng;
     if ( aNewInterface )
     {
-        QString interface("com.nokia.symbian.IContactEdit"); 
+        QString interface("com.nokia.symbian.IContactsEdit"); 
         QString operation("editCreateNewFromVCard(QString)");
         // service name is not needed
         mRequest = appMng.create( interface, operation, true); // embedded 
@@ -603,7 +700,7 @@
     CNT_EXIT
 }
 
-void testPbkServices::launchEditUpdateExisting( bool aNewInterface, QString aDetailType, QString aDetailValue )
+void testPbkServices::launchEditUpdateExisting( bool aNewInterface, QString aDetailType, QString aDetailValue, QString aDetailSubtype )
 {
     CNT_ENTRY
     delete mRequest;
@@ -612,9 +709,14 @@
     QVariantList args; 
     XQApplicationManager appMng;
     QString operation("editUpdateExisting(QString,QString)");
+    if ( !aDetailSubtype.isEmpty() )
+    {
+        operation = "editUpdateExisting(QString,QString,QString)";
+    }
+        
     if ( aNewInterface )
     {
-        QString interface("com.nokia.symbian.IContactEdit");
+        QString interface("com.nokia.symbian.IContactsEdit");
         // service name is not needed
         mRequest = appMng.create(interface, operation, true); // embedded 
     }
@@ -633,6 +735,10 @@
         
         args << aDetailType;
         args << aDetailValue;
+        if ( !aDetailSubtype.isEmpty() )
+        {
+            args << aDetailSubtype;
+        }
         
         mRequest->setArguments(args); 
         mRequest->send();
@@ -670,7 +776,7 @@
     XQApplicationManager appMng;
     if ( aNewInterface )
     {
-        QString interface("com.nokia.symbian.IContactView");
+        QString interface("com.nokia.symbian.IContactsView");
         QString operation("openContactCard(int)");
         // interface name is not needed
         mRequest = appMng.create( interface, operation, true); // embedded 
@@ -711,8 +817,8 @@
     XQApplicationManager appMng;
     if ( aNewInterface )
     {
-        QString interface("com.nokia.symbian.IContactView");
-        QString operation("openContactCard(QString,QString)");
+        QString interface("com.nokia.symbian.IContactsView");
+        QString operation("openTemporaryContactCard(QString,QString)");
         // service name is not needed
         mRequest = appMng.create(interface, operation, true); // embedded 
     }
--- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h	Wed Jul 21 11:21:49 2010 +0300
@@ -47,20 +47,28 @@
     // EDIT - create new
     void launchEditCreateNew_number();
     void launchEditCreateNew_number_old();
+    void launchEditCreateNew_numberWithSubtype();
+    void launchEditCreateNew_numberWithSubtype_old();    
     void launchEditCreateNew_email();
     void launchEditCreateNew_email_old();
     void launchEditCreateNew_onlineAccount();
     void launchEditCreateNew_onlineAccount_old();
+    void launchEditCreateNew_onlineAccountWithSubtype();
+    void launchEditCreateNew_onlineAccountWithSubtype_old();
     void launchEditorVCard();
     void launchEditorVCard_old();
 
     // EDIT - update existing
     void launchEditUpdateExisting_number();
     void launchEditUpdateExisting_number_old();
+    void launchEditUpdateExisting_numberWithSubtype();
+    void launchEditUpdateExisting_numberWithSubtype_old();    
     void launchEditUpdateExisting_email();
     void launchEditUpdateExisting_email_old();
     void launchEditUpdateExisting_onlineAccount();
     void launchEditUpdateExisting_onlineAccount_old();
+    void launchEditUpdateExisting_onlineAccountWithSubtype();
+    void launchEditUpdateExisting_onlineAccountWithSubtype_old();
 
     // CONTACT CARD
     void launchContactCard();
@@ -82,9 +90,9 @@
 private:
     void launchMultiFetch( bool aNewInterface, QString aAction );
     void launchSingleFetch( bool aNewInterface, QString aAction );
-    void launchEditCreateNew( bool aNewInterface, QString aDetailType, QString aFieldContent );
+    void launchEditCreateNew( bool aNewInterface, QString aDetailType, QString aFieldContent, QString aDetailSubtype = QString() );
     void launchEditorVCard( bool aNewInterface );
-    void launchEditUpdateExisting( bool aNewInterface, QString aDetailType, QString aDetailValue );
+    void launchEditUpdateExisting( bool aNewInterface, QString aDetailType, QString aDetailValue, QString aDetailSubtype = QString());
     void launchContactCard( bool aNewInterface );
     void launchContactCard( bool aNewInterface, QString aDetailType, QString aDetailValue );
 
--- a/phonebookui/rom/phonebook.iby	Wed Jul 21 11:09:07 2010 +0300
+++ b/phonebookui/rom/phonebook.iby	Wed Jul 21 11:21:49 2010 +0300
@@ -30,7 +30,6 @@
 file=ABI_DIR\BUILD_DIR\cntmaptileservice.dll             SHARED_LIB_DIR\cntmaptileservice.dll UNPAGED
 file=ABI_DIR\BUILD_DIR\cntsimutility.dll            		SHARED_LIB_DIR\cntsimutility.dll UNPAGED
 file=ABI_DIR\BUILD_DIR\cntimageutility.dll            	SHARED_LIB_DIR\cntimageutility.dll UNPAGED
-file=ABI_DIR\BUILD_DIR\cntsettingsutility.dll            	SHARED_LIB_DIR\cntsettingsutility.dll UNPAGED
 
 // UI
 file=ABI_DIR\BUILD_DIR\pbkcommonui.dll                	SHARED_LIB_DIR\pbkcommonui.dll UNPAGED
--- a/pimprotocols/pbap/group/bld.inf	Wed Jul 21 11:09:07 2010 +0300
+++ b/pimprotocols/pbap/group/bld.inf	Wed Jul 21 11:21:49 2010 +0300
@@ -14,7 +14,7 @@
 //
 
 PRJ_EXPORTS
-../client/pbapcli.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(pbapcli.h)
+../client/pbapcli.h APP_LAYER_PLATFORM_EXPORT_PATH(pbapcli.h)
 
 pbap.iby  	/epoc32/rom/include/pbap.iby
 
--- a/pimprotocols/phonebooksync/group/bld.inf	Wed Jul 21 11:09:07 2010 +0300
+++ b/pimprotocols/phonebooksync/group/bld.inf	Wed Jul 21 11:21:49 2010 +0300
@@ -17,7 +17,7 @@
 
 PRJ_EXPORTS
 ../group/phbksync.iby	        		/epoc32/rom/include/phbksync.iby
-../Client/phbksync.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(phbksync.h)
+../Client/phbksync.h APP_LAYER_PUBLIC_EXPORT_PATH(phbksync.h)
 
 
 PRJ_TESTEXPORTS