phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 14:53:18 +0300
changeset 25 76a2435edfd4
parent 24 0ba2181d7c28
child 27 de1630741fbe
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* 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 "cntcontactcarddatacontainer.h"
#include <cntmaptileservice.h> //For fetching maptile

#include <qtcontacts.h>
#include <hbicon.h>

#include "cntstringmapper.h"

/*!
Constructor
*/
CntContactCardDataContainer::CntContactCardDataContainer(QContact* contact, QObject *parent) : mContact(contact), mSeparatorIndex(-1)
{
    Q_UNUSED(parent);
    mDataPointer = new CntContactCardContainerData;
    //Non standard types needs to be registered before they can be used by QVariant
    qRegisterMetaType<QContactDetail>();
    
    if (contact->type() == QContactType::TypeGroup)
    {
        initializeGroupData();
    }
    else
    {
        initializeData();
        initializeDetailsData();
    }
}

/*!
Destructor
*/
CntContactCardDataContainer::~CntContactCardDataContainer()
{

}

/*!
Initialize contact details which include actions.
*/
void CntContactCardDataContainer::initializeData()
{
    QList<QContactActionDescriptor> actionDescriptors = mContact->availableActions();
    QStringList availableActions;
    for (int i = 0;i < actionDescriptors.count();i++)
    {
        availableActions << actionDescriptors.at(i).actionName();
    }

    QList<QContactDetail> details = mContact->details();
    for (int i = 0; i < details.count(); i++)
    {
        QString context;
        if (details[i].contexts().count())
        {
            context = mStringMapper.getMappedDetail(details[i].contexts().at(0));
        }
        
        if (availableActions.contains("call", Qt::CaseInsensitive) && supportsDetail("call", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName)
        {
            QContactPhoneNumber number(details.at(i));
            QVariantList dataList;
            //type
            dataList.append("call");
            //name
            QStringList list;
            list << mStringMapper.getMappedDetail(number.subTypes().at(0)) << context;
            QString name = list.join(" ");
            dataList.append(qtTrId("Call %1").arg(name.trimmed()));
            //data
            dataList.append(number.number());
            //icon
            dataList.append(mStringMapper.getMappedLauncherIcon(number.subTypes().at(0)));
            //detail
            QContactDetail detail(number);
            QVariant var;
            var.setValue(detail);
            dataList.append(var);
            mDataPointer->mDataList.insert(rowCount(), dataList);
        }
       
       if (availableActions.contains("message", Qt::CaseInsensitive) && supportsDetail("message", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName)
       {
           QContactPhoneNumber number(details.at(i));
           QVariantList dataList;
           //type
           dataList.append("message");
           //name
           dataList.append(hbTrId("txt_phob_menu_send_message"));
           //data
           dataList.append(number.number());
           //icon
           dataList.append("qtg_large_message");
           //detail
           QContactDetail detail(number);
           QVariant var;
           var.setValue(detail);
           dataList.append(var);
           mDataPointer->mDataList.insert(rowCount(), dataList);
       }    
    }
    
    //email
    if (availableActions.contains("email", Qt::CaseInsensitive))
    {
        QList<QContactDetail> details = actionDetails("email", *mContact);
        for (int i = 0; i < details.count(); i++)
        {
            QString context;
            if (details[i].contexts().count())
            {
                context = mStringMapper.getMappedDetail(details[i].contexts().at(0));
            }
            
            if (details[i].definitionName() == QContactEmailAddress::DefinitionName)
            {
                QContactEmailAddress email(details.at(i));
                QVariantList dataList;
                //action
                dataList.append("email");
                //name
                QStringList list;
                list << mStringMapper.getMappedDetail(email.definitionName()) << context;
                dataList.append(qtTrId("Mail %1").arg(list.join(" ").trimmed()));
                //data
                dataList.append(email.emailAddress());
                //icon
                dataList.append("qtg_large_email");
                //detail
                QContactDetail detail(email);
                QVariant var;
                var.setValue(detail);
                dataList.append(var);
                mDataPointer->mDataList.insert(rowCount(), dataList);
            }
        }
    }
}

/*!
Initialize group details which includes actions.
*/
void CntContactCardDataContainer::initializeGroupData()
{
    // get the conference number
    
    QContactPhoneNumber confCallNumber = mContact->detail<QContactPhoneNumber>();
        
    QVariantList callDataList;
    //type
    callDataList.append("call");
    //name
    callDataList.append(hbTrId("txt_phob_dblist_conference_call"));
    //data
    callDataList.append(confCallNumber.number());
    //icon
    callDataList.append("qtg_large_call_group");
    //detail
    QContactDetail detail(confCallNumber);
    QVariant var;
    var.setValue(detail);
    callDataList.append(var);
    if(confCallNumber.number() != NULL)
        {
        mDataPointer->mDataList.insert(rowCount(), callDataList);
        }
    
    QVariantList messageDataList;
    //type
    messageDataList.append("message");
    //name
    messageDataList.append(hbTrId("txt_phob_list_send_group_message"));
    //data
    messageDataList.append(confCallNumber.number());
    //icon
    messageDataList.append("qtg_large_message");
    //detail
    QContactDetail messageDetail(confCallNumber);
    QVariant messageVar;
    messageVar.setValue(messageDetail);
    messageDataList.append(messageVar);
    mDataPointer->mDataList.insert(rowCount(), messageDataList);
    
    QVariantList emailDataList;
    //type
    emailDataList.append("email");
    //name
    emailDataList.append(hbTrId("txt_phob_list_send_group_mail"));
    //data
    emailDataList.append(confCallNumber.number());
    //icon
    emailDataList.append("qtg_large_email");
    //detail
    QContactDetail emailDetail(confCallNumber);
    QVariant emailVar;
    emailVar.setValue(emailDetail);
    emailDataList.append(emailVar);
    mDataPointer->mDataList.insert(rowCount(), emailDataList);
  
}

/*!
Initialize contact details which not include actions.
*/
void CntContactCardDataContainer::initializeDetailsData()
{
    QString contextHome(QContactAddress::ContextHome.operator QString());
    QString contextWork(QContactAddress::ContextWork.operator QString());
    CntMapTileService::ContactAddressType sourceAddressType;  
    mLocationFeatureEnabled = CntMapTileService::isLocationFeatureEnabled() ;
    //address
    QList<QContactAddress> addressDetails = mContact->details<QContactAddress>();
    for (int i = 0; i < addressDetails.count(); i++)
    {
        sourceAddressType = CntMapTileService::AddressPreference;
        QVariantList addressList;
        //no action
        addressList.append(QString());
        if (addressDetails[i].contexts().isEmpty())
        {
            addressList.append(hbTrId("txt_phob_formlabel_address"));
        }
        else
        {
            if ( addressDetails[i].contexts().at(0) == contextHome )
            {
                sourceAddressType = CntMapTileService::AddressHome;
                addressList.append(hbTrId("txt_phob_formlabel_address_home"));
            }
            else if (addressDetails[i].contexts().at(0) == contextWork)
            {
                sourceAddressType = CntMapTileService::AddressWork;
                addressList.append(hbTrId("txt_phob_formlabel_address_work"));
            }
        }
        QStringList address;
        
        if (!addressDetails[i].postOfficeBox().isEmpty())
            address.append(addressDetails[i].postOfficeBox());
        if (!addressDetails[i].street().isEmpty())
            address.append(addressDetails[i].street());
        if (!addressDetails[i].postcode().isEmpty())
            address.append(addressDetails[i].postcode());
        if (!addressDetails[i].locality().isEmpty())
            address.append(addressDetails[i].locality());
        if (!addressDetails[i].region().isEmpty())
            address.append(addressDetails[i].region());
        if (!addressDetails[i].country().isEmpty())
            address.append(addressDetails[i].country());
        
        addressList.append(address.join(" "));
        //no icon
        addressList.append(QString());
        //detail
        QContactDetail detail(addressDetails[i]);
        QVariant var;
        var.setValue(detail);
        addressList.append(var);
        addSeparator(rowCount());
        mDataPointer->mDataList.insert(rowCount(), addressList);
        //Check whether location feature enabled
        if (mLocationFeatureEnabled)
        {
            TUint32 contactId = mContact->id().localId();
         
            //Get the maptile image path
            QString imageFile = CntMapTileService::getMapTileImage(contactId, sourceAddressType);
        
		    if ( !imageFile.isNull() )
		    {   
		        //Insert the imagepath in data container
		        QVariantList maptileImage;
                maptileImage.append(QString());
                maptileImage.append(QString(" "));
                maptileImage.append(QString(" "));
    
                maptileImage.append( imageFile );
                addSeparator(rowCount());
                mDataPointer->mDataList.insert(rowCount(), maptileImage);
		    }
        }
    } 
    
    //birthday
    QList<QContactBirthday> birthdayDetails = mContact->details<QContactBirthday>();
    for (int i = 0; i < birthdayDetails.count(); i++)
    {
        QVariantList dateList;
        //no action
        dateList.append(QString());
        dateList.append(hbTrId("txt_phob_formlabel_birthday"));
        dateList.append(birthdayDetails[i].date().toString("dd MMMM yyyy"));
        //no icon
        dateList.append(QString());
        //detail
        QContactDetail detail(birthdayDetails[i]);
        QVariant var;
        var.setValue(detail);
        dateList.append(var);
        addSeparator(rowCount());
        mDataPointer->mDataList.insert(rowCount(), dateList);
    }

    //anniversary
    QList<QContactAnniversary> anniversaryDetails = mContact->details<QContactAnniversary>();
    for (int i = 0; i < anniversaryDetails.count(); i++)
    {
        QVariantList dateList;
        //no action
        dateList.append(QString());
        dateList.append(hbTrId("txt_phob_formlabel_anniversary"));
        dateList.append(anniversaryDetails[i].originalDate().toString("dd MMMM yyyy"));
        //no icon
        dateList.append(QString());
        //detail
        QContactDetail detail(anniversaryDetails[i]);
        QVariant var;
        var.setValue(detail);
        dateList.append(var);
        addSeparator(rowCount());
        mDataPointer->mDataList.insert(rowCount(), dateList);
    }
    
    //ringing tone
    QList<QContactAvatar> ringtoneDetails = mContact->details<QContactAvatar>();
    for (int i = 0; i < ringtoneDetails.count(); i++)
    {
        if (ringtoneDetails.at(i).subType() == QContactAvatar::SubTypeAudioRingtone)
        {
            QVariantList dataList;
            //no action
            dataList.append(QString());
            dataList.append(hbTrId("txt_phob_formlabel_ringing_tone"));
            dataList.append(ringtoneDetails[i].avatar());
            //no icon
            dataList.append(QString());
            //detail
            QContactDetail detail(ringtoneDetails[i]);
            QVariant var;
            var.setValue(detail);
            dataList.append(var);
            addSeparator(rowCount());
            mDataPointer->mDataList.insert(rowCount(), dataList);
            break;
        }
    }

    //note
    QList<QContactNote> noteDetails = mContact->details<QContactNote>();
    for (int i = 0; i < noteDetails.count(); i++)
    {
        QVariantList noteList;
        //no action
        noteList.append(QString());
        noteList.append(hbTrId("txt_phob_formlabel_note2"));
        noteList.append(noteDetails[i].note());
        //no icon
        noteList.append(QString());
        //detail
        QContactDetail detail(noteDetails[i]);
        QVariant var;
        var.setValue(detail);
        noteList.append(var);
        addSeparator(rowCount());
        mDataPointer->mDataList.insert(rowCount(), noteList);
    }

    //family details
    QList<QContactFamily> familyDetails = mContact->details<QContactFamily>();
    for (int i = 0; i < familyDetails.count(); i++)
    {
        // Spouse
        QVariantList spouseList;
        //no action
        spouseList.append(QString());
        spouseList.append(hbTrId("txt_phob_formlabel_spouse"));
        spouseList.append(familyDetails[i].spouse());
        //no icon
        spouseList.append(QString());
        //detail
        QContactDetail spouseDetail(familyDetails[i]);
        QVariant varSpouse;
        varSpouse.setValue(spouseDetail);
        spouseList.append(varSpouse);
        addSeparator(rowCount());
        mDataPointer->mDataList.insert(rowCount(), spouseList);

        // Children
        QVariantList childrenList;
        //no action
        childrenList.append(QString());
        childrenList.append(hbTrId("txt_phob_formlabel_children"));
        childrenList.append(familyDetails[i].children().join(", "));
        //no icon
        childrenList.append(QString());
        //detail
        QContactDetail childrenDetail(familyDetails[i]);
        QVariant varChild;
        varChild.setValue(childrenDetail);
        childrenList.append(varChild);
        addSeparator(rowCount());
        mDataPointer->mDataList.insert(rowCount(), childrenList);
    }
}

/*!
Returns true if contactDetails contains spesific action.
*/
bool CntContactCardDataContainer::supportsDetail(const QString &actionName, const QContactDetail &contactDetail)
{    
    QList<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian");
    QContactAction* contactAction = QContactAction::action(actionDescriptors.at(0));
    
    bool isSupportDetail = contactAction->supportsDetail(contactDetail);
    
    delete contactAction;
    
    return isSupportDetail;
}

/*!
Returns the list of details which current action support.
*/
QList<QContactDetail> CntContactCardDataContainer::actionDetails(const QString &actionName, const QContact &contact)
{
    QList<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian");
    QContactAction* contactAction = QContactAction::action(actionDescriptors.at(0));

    QList<QContactDetail> details = contactAction->supportedDetails(contact);

    delete contactAction;

    return details;
}

/*!
Returns the data for the given index with a role
*/
QVariant CntContactCardDataContainer::data(int index, int role) const
{
    if (index < 0)
        return QVariant();
    
    QVariantList values = mDataPointer->mDataList.at(index);
    
    if (index == mSeparatorIndex)
    {
         if (role == Qt::DisplayRole)
         {
             return QVariant(values[action].toString());
         }
         return QVariant();
    }
    
    if (role == Qt::DisplayRole)
    {
        QStringList list;
        QString field = values[text].toString();
        if(mContact->isPreferredDetail(values[action].toString(), values[detail].value<QContactDetail>()))
        {
            field.prepend("<u>");
            field.append("</u>");
        }
        QString value = values[valueText].toString();
        list << field << value;
        
        return QVariant(list);
    }
     
    else if (role == Qt::DecorationRole)
    {
        if (!values[icon].toString().isEmpty())
        {
            QList<QVariant> icons;
            HbIcon itemIcon(values[icon].toString());
            icons.append(itemIcon);
            return QVariant(icons);
        }
    }
    
    else if (role == Qt::UserRole+1)
    {
        //TODO: Find out better solution!!!
        QMap<QString, QVariant> map;
      
        map.insert("action", values[action]);
        map.insert("name", values[text]);
        map.insert("data", values[valueText]);
        map.insert("icon", values[icon]);
        map.insert("detail", values[detail]);
        return map;
    }

    return QVariant();
}

/*!
Set separator index and add separator item for the given index
*/
void CntContactCardDataContainer::addSeparator(int index)
{
    if (mSeparatorIndex == -1)
    {
        mSeparatorIndex = index;
        QVariantList separatorList;
        separatorList.append(hbTrId("txt_phob_subtitle_details"));
        mDataPointer->mDataList.insert(rowCount(), separatorList);
    }
}

/*!
Returns the amount of rows in the container
*/
int CntContactCardDataContainer::rowCount() const
{
    return mDataPointer->mDataList.count();
}

/*!
Called when a detail is set as preferred, model needs to be refreshed
*/
void CntContactCardDataContainer::preferredUpdated()
{
    //emit layoutChanged();
}