phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp
changeset 37 fd64c38c277d
parent 31 2a11b5b00470
child 40 b46a585f6909
--- a/phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp	Fri May 14 15:42:23 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp	Thu May 27 12:45:19 2010 +0300
@@ -19,6 +19,8 @@
 #include <QGraphicsLinearLayout>
 #include <QGraphicsSceneResizeEvent>
 #include <QStringList>
+#include <QDebug>
+
 #include <qtcontacts.h>
 #include <hbscrollarea.h>
 #include <hblabel.h>
@@ -38,6 +40,7 @@
 #include <qversitcontactexporter.h>
 #include <qversitwriter.h>
 #include <xqservicerequest.h>
+
 #include "cntcontactcarddatacontainer.h"
 #include "cntcontactcarddetailitem.h"
 #include "cntcontactcardheadingitem.h"
@@ -48,6 +51,7 @@
 #include "cntdocumentloader.h"
 #include "cntimagelabel.h"
 #include "cntimageutility.h"
+#include "cntfavourite.h"
 
 const char *CNT_CONTACTCARDVIEW_XML = ":/xml/contacts_contactcard.docml";
 
@@ -65,11 +69,8 @@
     mDataContainer(NULL),
     mHeadingItem(NULL),
     mThumbnailManager(NULL),
-    mGroupContact(NULL),
     mAvatar(NULL),
-    mIsGroupMember(false),
     mIsHandlingMenu(false),
-    mIsPreviousImageEditorView(false),
     mFavoriteGroupId(-1),
     mLoader(NULL),
     mContactAction(NULL),
@@ -111,9 +112,6 @@
     delete mDataContainer;
     mDataContainer = NULL;
     
-    delete mGroupContact;
-    mGroupContact = NULL;
-    
     delete mAvatar;
     mAvatar = NULL;
     
@@ -131,8 +129,9 @@
 {
     emit backPressed();
     
-    //save an avatar
-    if (mIsPreviousImageEditorView)
+    //save the contact if avatar has been changed.
+    QContact contact = contactManager()->contact(mContact->localId());
+    if ( contact != *mContact )
     {
         QList<QContactAvatar> details = mContact->details<QContactAvatar>();
         for (int i = 0; i < details.count(); i++)
@@ -145,14 +144,7 @@
         }
     }
        
-    CntViewParameters viewParameters;
-    if (mIsGroupMember)
-    {
-        QVariant var;
-        var.setValue(*mGroupContact);
-        viewParameters.insert(ESelectedContact, var);
-    }
-    mViewManager->back(viewParameters);
+    mViewManager->back( mArgs );
 }
 
 /*
@@ -160,24 +152,20 @@
 */
 void CntContactCardViewPrivate::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs)
 {   
-    mView->installEventFilter(this);
+    mViewManager = aMgr;
+    mArgs = aArgs;
     
-    mViewManager = aMgr;
+    mView->installEventFilter(this);
     
     HbMainWindow* window = mView->mainWindow();
     connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation)));
     setOrientation(window->orientation());
         
-    if (aArgs.value(ECustomParam).toInt() == imageEditorView)
-    {    
-        mIsPreviousImageEditorView = true;   
-    }
-    
     QContact contact = aArgs.value(ESelectedContact).value<QContact>();
-    mContact = new QContact(contact);
-
+    mContact = new QContact( contact );
     //my card
-    if (mContact->localId() == contactManager()->selfContactId())
+    bool myCard = mContact->localId() == contactManager()->selfContactId();
+    if (myCard)
     {
         mView->menu()->clearActions();
         mView->toolBar()->removeAction(static_cast<HbAction*>(document()->findObject(QString("cnt:history"))));
@@ -187,24 +175,18 @@
         mView->toolBar()->removeAction(static_cast<HbAction*>(document()->findObject(QString("cnt:sendMyCard"))));
     }
     
-    if (aArgs.value(ESelectedAction).toString() == "FromGroupMemberView")
-    {
-        mIsGroupMember = true;
-        QContact groupContact = aArgs.value(ESelectedGroupContact).value<QContact>();
-        mGroupContact = new QContact(groupContact);
-    }
     // add heading widget to the content
     QGraphicsWidget *c = document()->findWidget(QString("content"));
     QGraphicsLinearLayout* l = static_cast<QGraphicsLinearLayout*>(c->layout());
 
     mHeadingItem = static_cast<CntContactCardHeadingItem*>(document()->findWidget(QString("cnt_contactcard_heading")));
     mHeadingItem->setDetails(mContact);
-    mHeadingItem->setSecondaryIcon(isFavoriteGroupContact());
-    
     connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&)));
+    connect(mHeadingItem, SIGNAL(passShortPressed(const QPointF&)), this, SLOT(doChangeImage()));
 
     mImageLabel = static_cast<CntImageLabel*>(document()->findWidget("cnt_contactcard_image"));
     connect(mImageLabel, SIGNAL(iconClicked()), this, SLOT(doChangeImage()));
+    connect(mImageLabel, SIGNAL(iconLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&)));
     
     // avatar
     QList<QContactAvatar> details = mContact->details<QContactAvatar>();
@@ -219,7 +201,7 @@
     }
     
     // data
-    mDataContainer = new CntContactCardDataContainer(mContact);
+    mDataContainer = new CntContactCardDataContainer(mContact, NULL, myCard);
 
     // scroll area + container widget
     mScrollArea = static_cast<HbScrollArea*>(document()->findWidget(QString("scrollArea")));
@@ -296,38 +278,15 @@
         }
     }
     
-    bool setAsFavorite = false;
-    if(isFavoriteGroupCreated())
+    bool setAsFavorite( false );
+    QContactLocalId favouriteGroupId = CntFavourite::favouriteGroupId( contactManager() );
+    if( favouriteGroupId != 0 )
     {
-        QContact favoriteGroup = contactManager()->contact(mFavoriteGroupId);
-        // Use relationship filter to get list of contacts in the relationship (if any)
-        QContactRelationshipFilter filter;
-        filter.setRelationshipType(QContactRelationship::HasMember);
-        filter.setRelatedContactRole(QContactRelationship::First); 
-        filter.setRelatedContactId(favoriteGroup.id());
-        
-        QList<QContactLocalId> mContactsList = contactManager()->contactIds(filter);
-        int count = mContactsList.count();
-        if (count)
-        {
-            for (int i = 0 ; i < count ; i++)
-            {
-                if (mContactsList.at(i) == mContact->localId())
-                {
-                setAsFavorite = true;
-                }
-            }
-        }
+        setAsFavorite = CntFavourite::isMemberOfFavouriteGroup( contactManager(), mContact );
+        mHeadingItem->setSecondaryIcon( setAsFavorite ); // if contact is part of favourites group
     }
-    
-    if (setAsFavorite)
-    {
-        qobject_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible(false);
-    }
-    else
-    {
-        qobject_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible(false);
-    }
+    qobject_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible( !setAsFavorite );
+    qobject_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible( setAsFavorite );
         
     // Menu items
     connect(qobject_cast<HbAction *>(document()->findObject("cnt:sendbusinesscard")), SIGNAL(triggered()),
@@ -349,7 +308,7 @@
     connect(qobject_cast<HbAction *>(document()->findObject("cnt:sendMyCard")), SIGNAL(triggered()),
                 this, SLOT (sendBusinessCard()));
  
-    emit viewActivated(*mContact, aArgs.value(ESelectedDetail).value<QContactDetail>());
+    emit viewActivated( mViewManager, aArgs );
 }
 
 void CntContactCardViewPrivate::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error)
@@ -388,12 +347,13 @@
 */
 void CntContactCardViewPrivate::editContact()
 {
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, editView);
     QVariant var;
     var.setValue(*mContact);
-    viewParameters.insert(ESelectedContact, var);
-    mViewManager->changeView(viewParameters);
+    
+    mArgs.insert(ESelectedContact, var);
+    mArgs.insert(EViewId, editView);
+    
+    mViewManager->changeView( mArgs );
 }
 
 void CntContactCardViewPrivate::addToGroup()
@@ -402,43 +362,18 @@
 
 void CntContactCardViewPrivate::setAsFavorite()
 {
-    QContact favoriteGroup;
-    if (!isFavoriteGroupCreated() )
-    {
-        //Create Fav grp
-        favoriteGroup.setType(QContactType::TypeGroup);
-        QContactName favoriteGroupName;
-        favoriteGroupName.setCustomLabel("Favorites");
-        favoriteGroup.saveDetail(&favoriteGroupName);
-        contactManager()->saveContact(&favoriteGroup);
-        mFavoriteGroupId = favoriteGroup.localId();
-    }
-    else
-    {
-        favoriteGroup = contactManager()->contact(mFavoriteGroupId);
-    }
+    QContactId id = mContact->id();
+    CntFavourite::addContactToFavouriteGroup( contactManager(), id );
     
-    // new contact added to the favorite group
-    QContactRelationship relationship;
-    relationship.setRelationshipType(QContactRelationship::HasMember);
-    relationship.setFirst(favoriteGroup.id());
-    relationship.setSecond(mContact->id());
-    // save relationship
-    contactManager()->saveRelationship(&relationship);
-    
+    qobject_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible(true);
     qobject_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible(false);
-    qobject_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible(true);
     mHeadingItem->setSecondaryIcon(true);  
 }
 
 void CntContactCardViewPrivate::removeFromFavorite()
 {
-    QContact favoriteGroup = contactManager()->contact(mFavoriteGroupId);
-    QContactRelationship relationship;
-    relationship.setRelationshipType(QContactRelationship::HasMember);
-    relationship.setFirst(favoriteGroup.id());
-    relationship.setSecond(mContact->id());
-    contactManager()->removeRelationship(relationship);
+    QContactId id = mContact->id();   
+    CntFavourite::removeContactFromFavouriteGroup( contactManager(), id );
 
     qobject_cast<HbAction *>(document()->findObject("cnt:removefromfavorite"))->setVisible(false);
     qobject_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible(true);
@@ -466,9 +401,8 @@
     if (note && action == note->actions().first())
     {
         contactManager()->removeContact(mContact->localId());
-        CntViewParameters viewParameters;
-        viewParameters.insert(EViewId, namesView);
-        mViewManager->changeView(viewParameters);
+        mArgs.insert(EViewId, namesView);
+        mViewManager->changeView( mArgs );
     }
 }
 
@@ -477,12 +411,12 @@
 */
 void CntContactCardViewPrivate::viewHistory()
 {
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, historyView);
     QVariant var;
     var.setValue(*mContact);
-    viewParameters.insert(ESelectedContact, var);
-    mViewManager->changeView(viewParameters);
+    mArgs.insert(ESelectedContact, var);
+    mArgs.insert(EViewId, historyView);
+        
+    mViewManager->changeView( mArgs );
 }
 
 /*!
@@ -498,6 +432,7 @@
 */
 void CntContactCardViewPrivate::sendBusinessCard()
 {
+    qDebug() << "CntContactCardViewPrivate::sendBusinessCard - IN";
     // Check if the contact has an image.
     QList<QContactAvatar> avatars = mContact->details<QContactAvatar>();
     bool imageExists( false );
@@ -529,8 +464,10 @@
     
     if ( !imageExists )
     {
+        qDebug() << "CntContactCardViewPrivate::sendBusinessCard without image";
         handleSendBusinessCard( NULL ); // no image
     }
+    qDebug() << "CntContactCardViewPrivate::sendBusinessCard - OUT";
 }
 
 /*!
@@ -557,7 +494,19 @@
 {
     CntContactCardDetailItem *item = qobject_cast<CntContactCardDetailItem*>(sender());
     int index = item->index();
-    launchAction(*mContact, mDataContainer->dataItem(index)->detail(), mDataContainer->dataItem(index)->action());
+    QString action = mDataContainer->dataItem(index)->action();
+    // Check if action is internal
+    QList<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(action, "symbian", 1);
+    if(0 < actionDescriptors.count())
+    {
+        // These actions are considered internal(vendor=symbian and version=1)
+        launchAction(*mContact, mDataContainer->dataItem(index)->detail(), action);
+    }
+    else
+    {
+        //Handle dynamic actions differently
+        launchDynamicAction(*mContact, mDataContainer->dataItem(index)->detail(), mDataContainer->dataItem(index)->actionDescriptor());
+    }
 }
 
 /*!
@@ -577,6 +526,18 @@
     mContactAction->invokeAction(contact, detail);
 }
 
+/*!
+Launch dynamic action
+*/
+void CntContactCardViewPrivate::launchDynamicAction(QContact contact, QContactDetail detail, QContactActionDescriptor actionDescriptor)
+{
+    // detail might be empty -> in that case engine uses the preferred detail for the selected action
+    mContactAction = QContactAction::action(actionDescriptor);
+    connect(mContactAction, SIGNAL(stateChanged(QContactAction::State)),
+                this, SLOT(progress(QContactAction::State)));
+    mContactAction->invokeAction(contact, detail);
+}
+
 void CntContactCardViewPrivate::progress(QContactAction::State status)
 {
     switch(status)
@@ -584,7 +545,6 @@
     case QContactAction::FinishedState:
     case QContactAction::FinishedWithErrorState:
         mContactAction->deleteLater();
-        mContactAction = 0;
         break;
     default:
         break;
@@ -610,6 +570,7 @@
     
     CntContactCardContextMenu *menu = new CntContactCardContextMenu( item );
     HbAction *communicationAction = 0;
+    HbAction *dynamicAction = 0;
     HbAction *videoCommunicationAction = 0;
     HbAction *preferredAction = 0;
     CntStringMapper stringMapper;
@@ -629,7 +590,8 @@
             communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(subtype, context));
    
             // TODO : uncomment next line when videotelephony is released
-            //videoCommunicationAction = menu->addAction(QString("VideoCall"));
+            Q_UNUSED(videoCommunicationAction)
+            //videoCommunicationAction = menu->addAction(QString("txt_phob_menu_call_video_number"));
         }        
     }
     else if (action.compare("message", Qt::CaseInsensitive) == 0)
@@ -645,7 +607,25 @@
         else
         {
             communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), QString()));
-        }        
+        }
+    }
+    else if (action.compare("url", Qt::CaseInsensitive) == 0)
+    {
+        if (!detail.contexts().isEmpty())
+        {
+            communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), detail.contexts().first()));
+        }
+        else
+        {
+            communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), QString()));
+        }
+    }
+    else if (1 > QContactAction::actionDescriptors(action, "symbian", 1).count())
+    {
+        // Do verification that action is not internal type(vendor=symbian and version=1)
+        // If hard coded action is not found, fetch localization from dynamic action
+        // and create dynamic action item.
+        dynamicAction = menu->addAction(mDataContainer->dataItem(index)->longPressText());
     }
     
     if (action.compare("call", Qt::CaseInsensitive) == 0)
@@ -670,6 +650,11 @@
     {
         communicationAction->setObjectName( "communicationAction" );
     }
+   
+    if ( dynamicAction )
+    {
+        dynamicAction->setObjectName( "dynamicAction" );
+    }
     
     if ( preferredAction )
     {
@@ -697,6 +682,11 @@
     {
         launchAction( *mContact, detail, action );
     }
+
+    if ( name == "dynamicAction" )
+    {             
+        launchDynamicAction(*mContact, detail, mDataContainer->dataItem(index)->actionDescriptor());
+    }
     
     if ( name == "preferredAction" )
     {
@@ -718,6 +708,7 @@
 
 void CntContactCardViewPrivate::handleSendBusinessCard( HbAction* aAction )
 {
+    qDebug() << "CntContactCardViewPrivate::handleSendBusinessCard - IN";
     QList<QContact> list;
     if ( aAction && aAction->objectName() == "cancel" )
     {
@@ -762,13 +753,14 @@
         
     QVersitContactExporter exporter;
     // The vCard version needs to be 2.1 due to backward compatiblity when sending 
-    if (!exporter.exportContacts(list, QVersitDocument::VCard21Type))
+    if (exporter.exportContacts(list, QVersitDocument::VCard21Type))
     {
-            
+        qDebug() << "CntContactCardViewPrivate::handleSendBusinessCard, VCard21Type";
         QList<QVersitDocument> docs = exporter.documents();
         QFile f(vCardPath);
         if ( f.open(QIODevice::WriteOnly) ) 
         {
+            qDebug() << "CntContactCardViewPrivate::handleSendBusinessCard write VCard";
             // Start creating the vCard
             QVersitWriter writer;
             writer.setDevice(&f);
@@ -783,6 +775,7 @@
             s.send(l,false);
         }
     }
+    qDebug() << "CntContactCardViewPrivate::handleSendBusinessCard - OUT";
 }
 
 /*!
@@ -804,11 +797,6 @@
         }
         return true;
     }
-    else if (event->type() == QEvent::LayoutRequest && mScrollArea)
-    {
-        mContainerWidget->resize(mScrollArea->size().width(), mScrollArea->size().height());
-        return true;
-    }
     else
     {
         return QObject::eventFilter(obj,event);
@@ -821,12 +809,13 @@
 */
 void CntContactCardViewPrivate::doChangeImage()
 {
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, imageEditorView);
     QVariant var;
     var.setValue(*mContact);
-    viewParameters.insert(ESelectedContact, var);
-    mViewManager->changeView(viewParameters);
+    
+    mArgs.insert(ESelectedContact, var);
+    mArgs.insert(EViewId, imageEditorView);
+        
+    mViewManager->changeView( mArgs );
 }
 
 /*!
@@ -871,75 +860,16 @@
     
     HbMenu *menu = new HbMenu();
     menu->addAction(hbTrId("txt_phob_menu_change_picture"), this, SLOT(doChangeImage()) );
-    menu->addAction(hbTrId("txt_phob_menu_remove_image"), this, SLOT(doRemoveImage()) );
- 
+    if (mAvatar)
+    {
+        menu->addAction(hbTrId("txt_phob_menu_remove_image"), this, SLOT(doRemoveImage()) );
+    }
     menu->setAttribute( Qt::WA_DeleteOnClose );
     menu->setPreferredPos( aCoords );
     menu->open();
     }
 
 /*!
-Check if the favourite group created
-*/
-bool CntContactCardViewPrivate::isFavoriteGroupCreated()
-{
-    bool favoriteGroupCreated = false;
-    QContactDetailFilter groupFilter;
-    groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
-    groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup)));
-
-    QList<QContactLocalId> groupContactIds = contactManager()->contactIds(groupFilter);
-    
-    if (!groupContactIds.isEmpty())
-    {
-        for(int i = 0;i < groupContactIds.count();i++)
-        {
-            QContact contact = contactManager()->contact(groupContactIds.at(i));
-            QContactName contactName = contact.detail<QContactName>();
-            QString groupName = contactName.customLabel();
-            if(groupName.compare("Favorites") == 0)
-            {
-                favoriteGroupCreated = true;
-                mFavoriteGroupId = groupContactIds.at(i);
-                break;
-            }
-        }
-    }
-    return favoriteGroupCreated;
-}
-
-/*!
-Check if the contact is the favourite group
-*/
-bool CntContactCardViewPrivate::isFavoriteGroupContact()
-{
-    bool favoriteGroupContact = false;
-    
-    if (isFavoriteGroupCreated())
-    {
-        QContact favoriteGroup = contactManager()->contact(mFavoriteGroupId);
-        QContactRelationshipFilter rFilter;
-        rFilter.setRelationshipType(QContactRelationship::HasMember);
-        rFilter.setRelatedContactRole(QContactRelationship::First);
-        rFilter.setRelatedContactId(favoriteGroup.id());
-    
-        QList<QContactLocalId> contactsLocalIdList = contactManager()->contactIds(rFilter);
-        if (!contactsLocalIdList.isEmpty())
-        {
-            for(int i = 0;i < contactsLocalIdList.count();i++)
-            {
-                QContact favContact = contactManager()->contact(contactsLocalIdList.at(i));
-                if (favContact.localId() == mContact->localId())
-                {
-                    favoriteGroupContact = true;
-                }  
-             }
-        }
-    }
-    return favoriteGroupContact;
-}
-
-/*!
 Return the pointer to the document loader
 */
 CntDocumentLoader* CntContactCardViewPrivate::document()