messagingapp/msgui/conversationview/src/msgcontactcardwidget.cpp
changeset 27 e4592d119491
parent 25 84d9eb65b26f
child 47 5b14749788d7
--- a/messagingapp/msgui/conversationview/src/msgcontactcardwidget.cpp	Mon May 03 12:29:07 2010 +0300
+++ b/messagingapp/msgui/conversationview/src/msgcontactcardwidget.cpp	Fri May 14 15:49:35 2010 +0300
@@ -22,15 +22,12 @@
 #include <HbIconItem>
 #include <HbTextItem>
 #include <HbFrameDrawer>
-#include <HbGesture>
-#include <HbGestureSceneFilter>
+//#include <HbGesture>
+//#include <HbGestureSceneFilter>
 #include <HbWidgetFeedback>
 #include <HbFrameItem>
-#include <qmobilityglobal.h>
 #include <qcontactphonenumber.h>
-#include <qcontactfilter.h>
-#include <qcontactmanager.h>
-#include <qcontactdetailfilter.h>
+#include <qcontactavatar.h>
 #include <xqaiwrequest.h>
 #include <xqappmgr.h>
 #include <XQServiceRequest.h>
@@ -38,6 +35,7 @@
 #include <QGraphicsSceneMouseEvent>
 #include <HbMenu>
 #include <HbMainWindow>
+#include <thumbnailmanager_qt.h>
 
 #include <ccsdefs.h>
 
@@ -46,8 +44,7 @@
 #include "debugtraces.h"
 #include "conversationsengine.h"
 #include "convergedmessage.h"
-
-QTM_USE_NAMESPACE
+#include "msgcontacthandler.h"
 
 // LOCAL CONSTANTS
 const QString DEFAULT_AVATAR_ICON("qtg_large_avatar");
@@ -55,7 +52,6 @@
 const QString BACKGROUND_FRAME_NORMAL("qtg_fr_groupbox");
 const QString GROUPBOX_BG_FRAME_PRESSED("qtg_fr_groupbox_pressed");
 
-const QString PLUGINPATH("conversationviewplugin.dll");
 
 // LOCALIZATION CONSTANTS
 #define LOC_RECEIVED_FILES hbTrId("txt_messaging_title_received_files")
@@ -63,28 +59,21 @@
 #define LOC_COMMON_MENU_CALL hbTrId("txt_common_menu_call_verb")
 #define LOC_SAVETO_CONTACTS hbTrId("txt_messaging_menu_save_to_contacts")
 
+// LOCAL FUNCTIONS
+
 //---------------------------------------------------------------
 // MsgContactCardWidget::MsgContactCardWidget
 // @see header
 //---------------------------------------------------------------
 MsgContactCardWidget::MsgContactCardWidget(QGraphicsItem *parent) :
-HbWidget(parent), 
-mMenuShown(false),
-mAvatarIconItem(NULL),
-mPresenceIconItem(NULL),
-mAddressTextItem(NULL),
-mGestureFilter(NULL)
-
+    HbWidget(parent), mMenuShown(false), mAvatarIconItem(NULL), mPresenceIconItem(NULL),
+        mAddressTextItem(NULL),mThumbnailManager(NULL)
 {
-    int baseId = style()->registerPlugin(PLUGINPATH);
-    QDEBUG_WRITE_FORMAT("MsgContactCardWidget BASE ID --->", baseId);
-    setPluginBaseId(baseId);
-
-    init();  
+    init();
     setBackGround(BACKGROUND_FRAME_NORMAL);
     connectSignals(true);
-    
-    connect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(initGesture()));   
+
+    connect(this->mainWindow(), SIGNAL(viewReady()), this, SLOT(initGesture()));
 }
 
 //---------------------------------------------------------------
@@ -93,12 +82,9 @@
 //---------------------------------------------------------------
 MsgContactCardWidget::~MsgContactCardWidget()
 {
-    style()->unregisterPlugin(PLUGINPATH);
-    
-    if(mGestureFilter)
-        {
+  /*  if (mGestureFilter) {
         removeSceneEventFilter(mGestureFilter);
-        }
+    }*/
 }
 
 //---------------------------------------------------------------
@@ -116,6 +102,13 @@
     mAddressTextItem = new HbTextItem(this);
     HbStyle::setItemName(mAddressTextItem, "addressText");
 
+    mThumbnailManager = new ThumbnailManager(this);
+    mThumbnailManager->setMode(ThumbnailManager::Default);
+    mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality);
+    mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailLarge);
+
+    connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), this,
+        SLOT(thumbnailReady(QPixmap, void*, int, int)));
 }
 
 //---------------------------------------------------------------
@@ -187,9 +180,8 @@
         QString displayName;
         QString contactAddress;
         convId = ConversationsEngine::instance()->getCurrentConversationId();
-        ConversationsEngine::instance()->getContactDetails(convId, displayName,
-            contactAddress);
-        
+        ConversationsEngine::instance()->getContactDetails(convId, displayName, contactAddress);
+
         mContactNumber = contactAddress;
         QString contactName;
         if (displayName.isEmpty()) {
@@ -198,21 +190,25 @@
         else {
             contactName.append(displayName);
         }
-        
+
         setAddress(contactName);
 
         // Set Avatar
-        HbIcon avatar;
-        QByteArray avatarByteArray = index.data(Avatar).toByteArray();
-        if (avatarByteArray.isEmpty()) {
-            avatar = HbIcon(DEFAULT_AVATAR_ICON);
+        QList<QContact> contactList = 
+                MsgContactHandler::findContactList(mContactNumber);
+        
+        if (!contactList.isEmpty()) {
+            QList<QContactAvatar> avatarDetails = 
+                    contactList.at(0).details<QContactAvatar> ();
+            
+            if (!avatarDetails.isEmpty()) {
+                mThumbnailManager->getThumbnail(
+                        avatarDetails.at(0).imageUrl().toString());
+            }
         }
-        else {
-            QPixmap pixmap;
-            pixmap.loadFromData(avatarByteArray);
-            avatar = HbIcon(QIcon(pixmap));
-        }
-        setAvatar(avatar);
+
+        // Set default avatar till actual is set.
+        setAvatar(HbIcon(DEFAULT_AVATAR_ICON));
     }
 }
 
@@ -233,21 +229,20 @@
 void MsgContactCardWidget::initGesture()
 {
     // Create gesture filter
-    QGraphicsScene* sc = this->scene();
-    mGestureFilter = new HbGestureSceneFilter( Qt::LeftButton, this );
-    
+  /*  QGraphicsScene* sc = this->scene();
+    mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this);
+
     // Add gestures for longpress
-    HbGesture* gestureLongpressed = new HbGesture( HbGesture::longpress,5 );
-    
-    mGestureFilter->addGesture( gestureLongpressed );
-    
-    connect( gestureLongpressed, SIGNAL(longPress(QPointF)),
-             this, SLOT(handleLongPress(QPointF)));
+    HbGesture* gestureLongpressed = new HbGesture(HbGesture::longpress, 5);
+
+    mGestureFilter->addGesture(gestureLongpressed);
+
+    connect(gestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(handleLongPress(QPointF)));
 
     //install gesture filter.
     this->installSceneEventFilter(mGestureFilter);
-    
-    disconnect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(initGesture()));   
+
+    disconnect(this->mainWindow(), SIGNAL(viewReady()), this, SLOT(initGesture()));*/
 }
 
 //---------------------------------------------------------------
@@ -255,17 +250,16 @@
 // @see header file
 //---------------------------------------------------------------
 void MsgContactCardWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{    
+{
     mMenuShown = false;
-    
+
     HbWidgetFeedback::triggered(this, Hb::InstantPressed);
-    
+
     setBackGround(GROUPBOX_BG_FRAME_PRESSED);
-    
+
     event->accept();
 }
 
-
 //---------------------------------------------------------------
 // MsgContactCardWidget::mouseReleaseEvent
 // @see header file
@@ -273,14 +267,13 @@
 void MsgContactCardWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
     setBackGround(BACKGROUND_FRAME_NORMAL);
-    
-    if(this->rect().contains(event->pos())&& !mMenuShown)
-        {
+
+    if (this->rect().contains(event->pos()) && !mMenuShown) {
         HbWidgetFeedback::triggered(this, Hb::InstantClicked);
-		emit clicked();
-        }
-    
-    event->accept();    
+        emit clicked();
+    }
+
+    event->accept();
 }
 
 //---------------------------------------------------------------
@@ -288,13 +281,13 @@
 // @see header file
 //---------------------------------------------------------------
 void MsgContactCardWidget::setBackGround(const QString& bg)
-    {
+{
     HbFrameItem* backGround = new HbFrameItem(this);
     backGround->frameDrawer().setFrameGraphicsName(bg);
     backGround->frameDrawer().setFrameType(HbFrameDrawer::NinePieces);
-    this->setBackgroundItem(backGround); 
+    this->setBackgroundItem(backGround);
     this->repolish();
-    }
+}
 
 //---------------------------------------------------------------
 // MsgContactCardWidget::handleLongPress
@@ -302,46 +295,42 @@
 //---------------------------------------------------------------
 void MsgContactCardWidget::handleLongPress(QPointF position)
 {
-    if(KBluetoothMsgsConversationId 
-        != ConversationsEngine::instance()->getCurrentConversationId())    
-        {
+    if (KBluetoothMsgsConversationId != ConversationsEngine::instance()->getCurrentConversationId()) {
         HbMenu* contextMenu = new HbMenu();
         contextMenu->setDismissPolicy(HbPopup::TapAnywhere);
         contextMenu->setAttribute(Qt::WA_DeleteOnClose, true);
         contextMenu->setPreferredPos(position);
-        
-        contextMenu->addAction(LOC_MENU_CONTACT_INFO,this, SLOT(openContactInfo()));    
+
+        contextMenu->addAction(LOC_MENU_CONTACT_INFO, this, SLOT(openContactInfo()));
         contextMenu->addAction(LOC_COMMON_MENU_CALL, this, SLOT(call()));
-        
+
         //If contact doesn't exist in phonebook then add another menu item "Save to Contacts"
         int contactId = resolveContactId(mContactNumber);
-        if(contactId < 0)
-        {
+        if (contactId < 0) {
             contextMenu->addAction(LOC_SAVETO_CONTACTS, this, SLOT(addToContacts()));
         }
-        
+
         contextMenu->show();
-        
+
         mMenuShown = true;
-        }
+    }
 }
 
 //---------------------------------------------------------------
 // MsgContactCardWidget::overrideFeedback
 // @see header file
 //---------------------------------------------------------------
-HbFeedback::InstantEffect MsgContactCardWidget::overrideFeedback(Hb::InstantInteraction interaction) const
-        {
-        switch(interaction)
-            {
-            case Hb::InstantPressed:
-            case Hb::InstantClicked:
-                return HbFeedback::Basic;
-            default:
-                return HbFeedback::NoOverride;
-            }
-        }
-		
+/*HbFeedback::InstantEffect MsgContactCardWidget::overrideFeedback(Hb::InstantInteraction interaction) const
+{
+    switch (interaction) {
+    case Hb::InstantPressed:
+    case Hb::InstantClicked:
+        return HbFeedback::Basic;   
+    default:
+        return HbFeedback::None;
+    }
+}*/
+
 //---------------------------------------------------------------
 // MsgContactCardWidget::openContactInfo
 // @see header
@@ -350,40 +339,36 @@
 {
     QString operation;
     QList<QVariant> args;
-    if(KBluetoothMsgsConversationId 
-            != ConversationsEngine::instance()->getCurrentConversationId())
-    {
-        int contactId = resolveContactId(mContactNumber);                
-        if(contactId > 0)
-        {
+    if (KBluetoothMsgsConversationId != ConversationsEngine::instance()->getCurrentConversationId()) {
+        int contactId = resolveContactId(mContactNumber);
+        if (contactId > 0) {
             //open existing contact card
             operation = QString("open(int)");
             args << contactId;
         }
-        else
-        {
+        else {
             //populate data and open unknown contact template
             operation = QString("editCreateNew(QString,QString)");
             QString type = QContactPhoneNumber::DefinitionName;
-    
+
             args << type;
             args << mAddress;
         }
         //service stuff.
         QString serviceName("com.nokia.services.phonebookservices");
-     
+
         XQAiwRequest* request;
         XQApplicationManager appManager;
         request = appManager.create(serviceName, "Fetch", operation, true); // embedded
-        if ( request == NULL )
-        {
-        	return;       
+        if (request == NULL) {
+            return;
         }
-        
+
         // Result handlers
-        connect (request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&)));
-        connect (request, SIGNAL(requestError(const QVariant&)), this, SLOT(handleError(const QVariant&)));
-        
+        connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&)));
+        connect(request, SIGNAL(requestError(const QVariant&)), this,
+            SLOT(handleError(const QVariant&)));
+
         request->setArguments(args);
         request->send();
         delete request;
@@ -396,28 +381,12 @@
 //---------------------------------------------------------------
 int MsgContactCardWidget::resolveContactId(const QString& value)
 {
-    int contactId = -1;
-    
-    QContactManager phonebookManager("symbian");
+    QString displayLabel;
     
-    QContactDetailFilter phoneFilter;
-    phoneFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName,
-                                        QContactPhoneNumber::FieldNumber);
-    phoneFilter.setValue(value);
-    phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith);
-
-    QList<QContactSortOrder> sortOrder;
-    QList<QContact> matchingContacts = phonebookManager.contacts(
-            phoneFilter,
-            sortOrder,
-            QStringList());
-
-    if ( matchingContacts.count() > 0 ) 
-        {       
-        contactId = matchingContacts.at(0).localId();   
-        }
-    
-    return contactId;
+    return MsgContactHandler::resolveContactDisplayName(
+            value, 
+            displayLabel,
+            0);    
 }
 
 //---------------------------------------------------------------
@@ -429,15 +398,14 @@
     //Launch dialer service     
     QString serviceName("com.nokia.services.telephony");
     QString operation("dial(QString)");
-    
-    XQServiceRequest* serviceRequest = new XQServiceRequest(serviceName,operation,false);
-    
-    connect(serviceRequest, SIGNAL(requestCompleted(QVariant)),
-            this, SLOT(onServiceRequestCompleted()));
-    
-    connect(serviceRequest, SIGNAL(requestError(int)),
-            this, SLOT(onServiceRequestCompleted()));
-    
+
+    XQServiceRequest* serviceRequest = new XQServiceRequest(serviceName, operation, false);
+
+    connect(serviceRequest, SIGNAL(requestCompleted(QVariant)), this,
+        SLOT(onServiceRequestCompleted()));
+
+    connect(serviceRequest, SIGNAL(requestError(int)), this, SLOT(onServiceRequestCompleted()));
+
     *serviceRequest << mContactNumber;
     serviceRequest->send();
 }
@@ -457,22 +425,20 @@
 void MsgContactCardWidget::handleOk(const QVariant& result)
 {
     Q_UNUSED(result)
-    
-    QContactManager phonebookManager("symbian");
+
+    QList<QContact> matchingContacts = 
+            MsgContactHandler::findContactList(mContactNumber);
+
+    if (!matchingContacts.isEmpty()) {
+        setAddress(matchingContacts.at(0).displayLabel());
         
-    QContactDetailFilter phoneFilter;
-    phoneFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, 
-                                            QContactPhoneNumber::FieldNumber);
-    phoneFilter.setValue(mContactNumber);
-    phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith);
-
-    QList<QContactSortOrder> sortOrder;
-    QList<QContact> matchingContacts = phonebookManager.contacts(phoneFilter,
-                                       sortOrder, QStringList());
-    
-    if(matchingContacts.count())
-    {
-        setAddress(matchingContacts.at(0).displayLabel());
+        QList<QContactAvatar> avatarDetails = 
+                matchingContacts.at(0).details<QContactAvatar> ();
+        
+        if (!avatarDetails.isEmpty()) {
+            mThumbnailManager->getThumbnail(
+                    avatarDetails.at(0).imageUrl().toString());
+        }
     }
 }
 
@@ -481,11 +447,11 @@
 // @see header
 //---------------------------------------------------------------
 void MsgContactCardWidget::handleError(int errorCode, const QString& errorMessage)
-    {
+{
     Q_UNUSED(errorMessage)
     Q_UNUSED(errorCode)
-    }
-	
+}
+
 //---------------------------------------------------------------
 // MsgContactCardWidget::onServiceRequestCompleted
 // @see header
@@ -493,26 +459,40 @@
 void MsgContactCardWidget::onServiceRequestCompleted()
 {
     //service request is now complete. delete it.
-    XQServiceRequest* request = qobject_cast<XQServiceRequest*>(sender());
-    if(request)
-    {
+    XQServiceRequest* request = qobject_cast<XQServiceRequest*> (sender());
+    if (request) {
         delete request;
     }
 }
 
 //---------------------------------------------------------------
+// MsgContactCardWidget::thumbnailReady
+// @see header
+//---------------------------------------------------------------
+void MsgContactCardWidget::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error)
+{
+    Q_UNUSED(data)
+    Q_UNUSED(id)
+
+    if (!error) {
+        QIcon icon(pixmap);
+        setAvatar(HbIcon(icon));
+    }
+    else {
+        setAvatar(HbIcon(DEFAULT_AVATAR_ICON));
+    }
+}
+//---------------------------------------------------------------
 // MsgContactCardWidget::connectSignals
 // @see header
 //---------------------------------------------------------------
 void MsgContactCardWidget::connectSignals(bool yes)
 {
-    if(yes)
-    {
-        connect(this,SIGNAL(clicked()),this,SLOT(openContactInfo()));
+    if (yes) {
+        connect(this, SIGNAL(clicked()), this, SLOT(openContactInfo()));
     }
-    else
-    {
-        disconnect(this,SIGNAL(clicked()),this,SLOT(openContactInfo()));
+    else {
+        disconnect(this, SIGNAL(clicked()), this, SLOT(openContactInfo()));
     }
 }
 // EOF