# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1273840943 -10800 # Node ID 2a11b5b004703f017b3288e6675d8b6094670f5d # Parent de1630741fbe405335b3c2bf4a810597194ba8f7 Revision: 201017 Kit: 201019 diff -r de1630741fbe -r 2a11b5b00470 contacts_plat/contacts_ui_api/inc/cntviewparams.h --- a/contacts_plat/contacts_ui_api/inc/cntviewparams.h Mon May 03 12:24:20 2010 +0300 +++ b/contacts_plat/contacts_ui_api/inc/cntviewparams.h Fri May 14 15:42:23 2010 +0300 @@ -37,6 +37,7 @@ ESelectedGroupContact, ESelectedDetail, ESelectionMode, + EMyCard, ECustomParam = 100 }; @@ -72,6 +73,7 @@ groupMemberView, groupActionsView, historyView, + importsView, customPhonebookView = 100, // reserved for internal view plugins, DO NOT USE THESE customView = 200 // for all other view plugins }; diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/bwins/cntimageutilityu.def --- a/phonebookengines/bwins/cntimageutilityu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/bwins/cntimageutilityu.def Fri May 14 15:42:23 2010 +0300 @@ -1,19 +1,22 @@ EXPORTS - ?trUtf8@CntImageUtility@@SA?AVQString@@PBD0H@Z @ 1 NONAME ; class QString CntImageUtility::trUtf8(char const *, char const *, int) - ??_ECntImageUtility@@UAE@I@Z @ 2 NONAME ; CntImageUtility::~CntImageUtility(unsigned int) - ?qt_metacall@CntImageUtility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 3 NONAME ; int CntImageUtility::qt_metacall(enum QMetaObject::Call, int, void * *) - ?staticMetaObject@CntImageUtility@@2UQMetaObject@@B @ 4 NONAME ; struct QMetaObject const CntImageUtility::staticMetaObject - ?metaObject@CntImageUtility@@UBEPBUQMetaObject@@XZ @ 5 NONAME ; struct QMetaObject const * CntImageUtility::metaObject(void) const - ??1CntImageUtility@@UAE@XZ @ 6 NONAME ; CntImageUtility::~CntImageUtility(void) - ?initPath@CntImageUtility@@AAEXAAVQString@@H@Z @ 7 NONAME ; void CntImageUtility::initPath(class QString &, int) - ?trUtf8@CntImageUtility@@SA?AVQString@@PBD0@Z @ 8 NONAME ; class QString CntImageUtility::trUtf8(char const *, char const *) - ?tr@CntImageUtility@@SA?AVQString@@PBD0@Z @ 9 NONAME ; class QString CntImageUtility::tr(char const *, char const *) - ?getStaticMetaObject@CntImageUtility@@SAABUQMetaObject@@XZ @ 10 NONAME ; struct QMetaObject const & CntImageUtility::getStaticMetaObject(void) - ?removeImage@CntImageUtility@@QAE_NABVQString@@AAH@Z @ 11 NONAME ; bool CntImageUtility::removeImage(class QString const &, int &) - ?qt_metacast@CntImageUtility@@UAEPAXPBD@Z @ 12 NONAME ; void * CntImageUtility::qt_metacast(char const *) - ?selectDrive@CntImageUtility@@AAEHAAH@Z @ 13 NONAME ; int CntImageUtility::selectDrive(int &) - ?tr@CntImageUtility@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString CntImageUtility::tr(char const *, char const *, int) - ?createImage@CntImageUtility@@QAE_NABVQPixmap@@AAVQString@@AAH@Z @ 15 NONAME ; bool CntImageUtility::createImage(class QPixmap const &, class QString &, int &) - ?createImage@CntImageUtility@@QAE_NABVQString@@AAV2@AAH@Z @ 16 NONAME ; bool CntImageUtility::createImage(class QString const &, class QString &, int &) - ??0CntImageUtility@@QAE@PAVQObject@@@Z @ 17 NONAME ; CntImageUtility::CntImageUtility(class QObject *) + ??_ECntImageUtility@@UAE@I@Z @ 1 NONAME ; CntImageUtility::~CntImageUtility(unsigned int) + ?qt_metacall@CntImageUtility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 2 NONAME ; int CntImageUtility::qt_metacall(enum QMetaObject::Call, int, void * *) + ?staticMetaObject@CntImageUtility@@2UQMetaObject@@B @ 3 NONAME ; struct QMetaObject const CntImageUtility::staticMetaObject + ?metaObject@CntImageUtility@@UBEPBUQMetaObject@@XZ @ 4 NONAME ; struct QMetaObject const * CntImageUtility::metaObject(void) const + ?createImage@CntImageUtility@@QAE_NABVQPixmap@@AAVQString@@@Z @ 5 NONAME ; bool CntImageUtility::createImage(class QPixmap const &, class QString &) + ?selectDrive@CntImageUtility@@AAEHAAH@Z @ 6 NONAME ; int CntImageUtility::selectDrive(int &) + ?tr@CntImageUtility@@SA?AVQString@@PBD0H@Z @ 7 NONAME ; class QString CntImageUtility::tr(char const *, char const *, int) + ?trUtf8@CntImageUtility@@SA?AVQString@@PBD0H@Z @ 8 NONAME ; class QString CntImageUtility::trUtf8(char const *, char const *, int) + ??1CntImageUtility@@UAE@XZ @ 9 NONAME ; CntImageUtility::~CntImageUtility(void) + ?createImage@CntImageUtility@@QAE_NABVQString@@AAV2@@Z @ 10 NONAME ; bool CntImageUtility::createImage(class QString const &, class QString &) + ?trUtf8@CntImageUtility@@SA?AVQString@@PBD0@Z @ 11 NONAME ; class QString CntImageUtility::trUtf8(char const *, char const *) + ?initPath@CntImageUtility@@AAE_NAAVQString@@H@Z @ 12 NONAME ; bool CntImageUtility::initPath(class QString &, int) + ?tr@CntImageUtility@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString CntImageUtility::tr(char const *, char const *) + ?getStaticMetaObject@CntImageUtility@@SAABUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const & CntImageUtility::getStaticMetaObject(void) + ?error@CntImageUtility@@QAE?AW4Error@1@XZ @ 15 NONAME ; enum CntImageUtility::Error CntImageUtility::error(void) + ?qt_metacast@CntImageUtility@@UAEPAXPBD@Z @ 16 NONAME ; void * CntImageUtility::qt_metacast(char const *) + ?isMassStorageAvailable@CntImageUtility@@QAE_NXZ @ 17 NONAME ; bool CntImageUtility::isMassStorageAvailable(void) + ?isImageRemovable@CntImageUtility@@QAE_NABVQString@@@Z @ 18 NONAME ; bool CntImageUtility::isImageRemovable(class QString const &) + ??0CntImageUtility@@QAE@PAVQObject@@@Z @ 19 NONAME ; CntImageUtility::CntImageUtility(class QObject *) + ?removeImage@CntImageUtility@@QAE_NABVQString@@@Z @ 20 NONAME ; bool CntImageUtility::removeImage(class QString const &) diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/bwins/simutilityu.def --- a/phonebookengines/bwins/simutilityu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/bwins/simutilityu.def Fri May 14 15:42:23 2010 +0300 @@ -23,4 +23,6 @@ ?getStaticMetaObject@SimUtility@@SAABUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const & SimUtility::getStaticMetaObject(void) ?simInfoReady@SimUtility@@IAEXAAUSimInfo@1@H@Z @ 23 NONAME ; void SimUtility::simInfoReady(struct SimUtility::SimInfo &, int) ?isSimInserted@SimUtility@@ABE_NXZ @ 24 NONAME ; bool SimUtility::isSimInserted(void) const + ?adnCacheStatusReady@SimUtility@@IAEXAAW4CacheStatus@1@H@Z @ 25 NONAME ; void SimUtility::adnCacheStatusReady(enum SimUtility::CacheStatus &, int) + ?notifyAdnCacheStatus@SimUtility@@QAE_NXZ @ 26 NONAME ; bool SimUtility::notifyAdnCacheStatus(void) diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/cntimageutility/inc/cntimageutility.h --- a/phonebookengines/cntimageutility/inc/cntimageutility.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/cntimageutility/inc/cntimageutility.h Fri May 14 15:42:23 2010 +0300 @@ -19,6 +19,9 @@ #include #include + +#include + #include "cntimageutilityglobal.h" class QPixmap; @@ -28,16 +31,29 @@ Q_OBJECT public: + enum Error { + NoError = 0, + NotSupportedError, + UnspecifiedError, + }; + CntImageUtility(QObject *parent = 0); ~CntImageUtility(); - bool createImage(const QString& filePath, QString& imagePath, int& error); - bool createImage(const QPixmap& pixmap, QString& imagePath, int& error); - bool removeImage(const QString& imagePath, int& error); + bool createImage(const QString& filePath, QString& imagePath); + bool createImage(const QPixmap& pixmap, QString& imagePath); + bool removeImage(const QString& imagePath); + bool isImageRemovable(const QString& filePath); + bool isMassStorageAvailable(); + CntImageUtility::Error error(); private: int selectDrive(int &driveIndex); - void initPath(QString &path, int drive); + bool initPath(QString &path, int drive); + +private: + RFs m_Fs; + CntImageUtility::Error m_error; }; #endif diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/cntimageutility/src/cntimageutility.cpp --- a/phonebookengines/cntimageutility/src/cntimageutility.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/cntimageutility/src/cntimageutility.cpp Fri May 14 15:42:23 2010 +0300 @@ -25,87 +25,117 @@ #include #include -const char* PBK_FOLDER = "Private\\20022EF9"; +const char* CNT_IMAGES_FOLDER = "Data\\20022EF9\\"; const char* IMAGEFILE_EXT = ".jpg"; const char* IMAGE_TYPE = "JPEG"; -const char* FOLDER_SEPARATOR = "\\"; const TInt64 KMinRequiredSpaceImage = 2000000; +_LIT( KImagesFolder, "Data\\20022EF9\\"); + +// Local function +inline TPtrC16 convertToTPtrC16(const QString& string) +{ + return TPtrC16(reinterpret_cast(string.utf16())); +} + + CntImageUtility::CntImageUtility(QObject *parent) : QObject(parent) { + m_Fs.Connect(); } CntImageUtility::~CntImageUtility() { + m_Fs.Close(); } -bool CntImageUtility::createImage(const QString& filePath, QString& imagePath, int& error) +/* + * Create thumbnail image. + * + * \param filePath The file path of source image. + * \param imagePath The file path of new/created image. + * \return Success status. + */ +bool CntImageUtility::createImage(const QString& filePath, QString& imagePath) { - Q_UNUSED(error); - int drive; bool success(false); + m_error = CntImageUtility::NoError; + int err= selectDrive(drive); + if (KErrNone==err + && initPath(imagePath, drive)) { + // Filename format + // image_.jpg + QDateTime dateTime = QDateTime::currentDateTime(); + QString dateTimeString = dateTime.toString("yyhh_mm_ss_zzz"); + QFileInfo fi(filePath); + QString filename = "image_" + dateTimeString + "." + fi.suffix(); + imagePath += filename; + + // Copy image + QFile destFile; + success= destFile.copy(filePath,imagePath); + } + else { + m_error = CntImageUtility::UnspecifiedError; + } + return success; +} + +/* + * Create thumbnail image. + * + * \param pixmap The pixmap of source image. + * \param imagePath The file path of new/created image. + * \return Success status. + */ +bool CntImageUtility::createImage(const QPixmap& pixmap, QString& imagePath) +{ + int drive; + bool success(false); + m_error = CntImageUtility::NoError; QString fileExt(IMAGEFILE_EXT); int err= selectDrive(drive); - if (KErrNone==err) - { - initPath(imagePath, drive); + if (KErrNone==err + && initPath(imagePath, drive)) { // Filename format // image_.jpg QDateTime dateTime = QDateTime::currentDateTime(); QString dateTimeString = dateTime.toString("yyhh_mm_ss_zzz"); QString filename = "image_" + dateTimeString + fileExt; - imagePath += FOLDER_SEPARATOR + filename; + imagePath += filename; - // Copy source image to contacts images - QFile destFile; - success= destFile.copy(filePath,imagePath); + if(!pixmap.isNull()) { + QPixmap pix(pixmap); + QImage image(pix.toImage()); + success= image.save(imagePath, IMAGE_TYPE); } + } + else { + m_error = CntImageUtility::UnspecifiedError; + } return success; } -bool CntImageUtility::createImage(const QPixmap& pixmap, QString& imagePath, int& error) +/* + * Remove thumbnail image. + * + * \param imagePath The file path of thumbnail image. + * \return Success status. + */ +bool CntImageUtility::removeImage(const QString& imagePath) { - Q_UNUSED(error); - - int drive; - bool success(false); - QString fileExt(IMAGEFILE_EXT); - int err= selectDrive(drive); - if (KErrNone==err) - { - initPath(imagePath, drive); - // Filename format - // image_.jpg - QDateTime dateTime = QDateTime::currentDateTime(); - QString dateTimeString = dateTime.toString("yyhh_mm_ss_zzz"); - QString filename = "image_" + dateTimeString + fileExt; - imagePath += FOLDER_SEPARATOR + filename; - - if(!pixmap.isNull()) - { - QPixmap pix(pixmap); - QImage image(pix.toImage()); - success= image.save(imagePath, IMAGE_TYPE); - } - } - return success; -} - -bool CntImageUtility::removeImage(const QString& imagePath, int& error) -{ - Q_UNUSED(error); - QDir dir; bool success(false); + m_error = CntImageUtility::NoError; QFile file( imagePath ); if( !file.exists() - || dir.remove(imagePath)) + || dir.remove(imagePath)) { success= true; - + } return success; } @@ -113,43 +143,94 @@ { int err = KErrNone; TInt64 minSpaceInBytes = KMinRequiredSpaceImage; - RFs fsSession; - - // Connect to file session - err= fsSession.Connect(); - if(err!=KErrNone) - return err; // Get the drive/volume details TVolumeInfo vInfo; err = DriveInfo::GetDefaultDrive(DriveInfo::EDefaultMassStorage, driveIndex); - if (KErrNone==err) - { - err = fsSession.Volume(vInfo, driveIndex); - } + if (KErrNone==err) { + err = m_Fs.Volume(vInfo, driveIndex); + } // Check the availability and disk space - if ( !err && vInfo.iFree < minSpaceInBytes) - { + if ( !err && vInfo.iFree < minSpaceInBytes) { // All drives are full or inaccessible err = KErrDiskFull; - } + } return err; } -void CntImageUtility::initPath(QString &path, int drive) +bool CntImageUtility::initPath(QString &path, int drive) +{ + int err = KErrNone; + bool success(false); + + // Get contacts images path + TFileName tPath; + PathInfo::GetRootPath(tPath, drive); + tPath.Append(KImagesFolder()); + path = QString::fromUtf16(tPath.Ptr(), tPath.Length()); + + /* Contact images should go to the + * hidden folder \data\20022EF9 + */ + QDir dir(path); + if (!dir.cd(CNT_IMAGES_FOLDER)) { + TPtrC16 pathDesc(convertToTPtrC16(path)); + err=m_Fs.MkDirAll(tPath); + err=m_Fs.SetAtt(tPath, KEntryAttHidden, 0); + } + + success = (err == KErrNone); + return success; +} + +/* + * \return whether mass storage is supported in phone. + */ +bool CntImageUtility::isMassStorageAvailable() { - // Get the root path for the given drive. - TFileName tPath; - PathInfo::GetRootPath(tPath, drive); - path = QString::fromUtf16(tPath.Ptr(), tPath.Length()); - - // Image files saved in Phonebook folder - // Create folder if not exists - QDir dir(path); - if (!dir.cd(PBK_FOLDER)) - { - dir.mkpath(PBK_FOLDER); - } - path = dir.path(); + int err = KErrNone; + bool success(false); + m_error = CntImageUtility::NoError; + + int drive; + err = DriveInfo::GetDefaultDrive(DriveInfo::EDefaultMassStorage, drive); + success = (err == KErrNone); + return success; } + +/* + * \return whether thumbnail image is removable. + */ +bool CntImageUtility::isImageRemovable(const QString& filePath) +{ + int drive; + bool success(false); + m_error = CntImageUtility::NoError; + + // Image removable if saved in contacts images folder + // Folder :/Data/20022EF9 + int err= selectDrive(drive); + if(KErrNone==err) { + // Get the root path + TFileName tPath; + PathInfo::GetRootPath(tPath, drive); + QString basePath = QString::fromUtf16(tPath.Ptr(), tPath.Length()); + + QDir dir(basePath); + if (dir.cd(CNT_IMAGES_FOLDER)) { + basePath=QDir::toNativeSeparators(dir.path()); + if(filePath.startsWith(basePath)) + success=true; + } + } + return success; +} + +/* + * \return Error status. + */ +CntImageUtility::Error CntImageUtility::error() +{ + return m_error; +} diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntdbdumper/src/dbsqldumper.cpp --- a/phonebookengines/contactsmodel/cntdbdumper/src/dbsqldumper.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntdbdumper/src/dbsqldumper.cpp Fri May 14 15:42:23 2010 +0300 @@ -148,6 +148,10 @@ return KSqlContactPredSearchTable8; case KContactPredSearchTable9Name: return KSqlContactPredSearchTable9; + case KContactPredSearchTable10Name: + return KSqlContactPredSearchTable10; + case KContactPredSearchTable11Name: + return KSqlContactPredSearchTable11; default: { @@ -340,6 +344,8 @@ case KContactPredSearchTable7Name: case KContactPredSearchTable8Name: case KContactPredSearchTable9Name: + case KContactPredSearchTable10Name: + case KContactPredSearchTable11Name: switch(aColumnIndex) { case 0: diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/inc/clplcontactproperties.h --- a/phonebookengines/contactsmodel/cntplsql/inc/clplcontactproperties.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/inc/clplcontactproperties.h Fri May 14 15:42:23 2010 +0300 @@ -123,7 +123,7 @@ CContactIdArray& CardTemplateIdsL(); CContactIdArray& GroupIdListL(); - CContactIdArray* SearchIdListL(const TDesC& aSearchQuery) const; + CBufSeg* DetailsListL(const TDesC& aSearchQuery) const; TInt64 MachineIdL() const; void SetMachineIdL(TInt64 aMachineId); TPtrC UniqueIdL(); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h --- a/phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h Fri May 14 15:42:23 2010 +0300 @@ -90,7 +90,7 @@ /** * Construct mappings between keys and characters. */ - TBool ContructKeyboardMappings(); + void ContructKeyboardMappings(); /** * Returns a list of languages installed on the phone. @@ -108,8 +108,10 @@ */ TChar KeyForCharacter(const TChar& aChar) const; +#if defined(_DEBUG) TInt KeyIdToNumber(TInt aKeyId) const; - +#endif // #if defined(_DEBUG) + TChar ArrayIndexToNumberChar(TInt aArrayIndex) const; #else // #if defined(USE_ORBIT_KEYMAP) TChar GetNumericValueForChar(TChar input) const; @@ -118,10 +120,18 @@ private: // Data #if defined(USE_ORBIT_KEYMAP) - // One QString for each key of the keyboard (1-9,0). + // One QString for each key of the keyboard (1-9,0,*,#). // Each contains all the characters that can originate from that key, // considering the languages available on the device. + // + // iKeyMapping[0] has mappings for 1-key, iKeyMapping[1] for 2-key, ... + // iKeyMapping[8] for 9-key, iKeyMapping[9] for 0-key, + // iKeyMapping[10] for *-key, iKeyMapping[11] for #-key. QList iKeyMapping; + + // Characters that have been hardcoded to certain keys, regardless of + // actual keymap. + QString iHardcodedChars; #endif // #if defined(USE_ORBIT_KEYMAP) // For unit testing diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/inc/dbsqlconstants.h --- a/phonebookengines/contactsmodel/cntplsql/inc/dbsqlconstants.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/inc/dbsqlconstants.h Fri May 14 15:42:23 2010 +0300 @@ -21,9 +21,7 @@ #include const TInt KInitialValue = -1; - -// TODO: update this to handle all 10 predictive search tables -const TInt KNumOfTables = 14; +const TInt KNumOfTables = 16; const TInt KNumColInPrefTable = 6; const TInt KNumColInContactTable = 16; const TInt KNumColInGroupTable = 3; @@ -46,6 +44,8 @@ _LIT(KSqlContactPredSearchTable7,"predictivesearch7"); _LIT(KSqlContactPredSearchTable8,"predictivesearch8"); _LIT(KSqlContactPredSearchTable9,"predictivesearch9"); +_LIT(KSqlContactPredSearchTable10,"predictivesearch10"); +_LIT(KSqlContactPredSearchTable11,"predictivesearch11"); _LIT(KSqlContactPresenceTableName, "presence"); enum TDatabaseTables @@ -63,7 +63,9 @@ KContactPredSearchTable6Name, KContactPredSearchTable7Name, KContactPredSearchTable8Name, - KContactPredSearchTable9Name + KContactPredSearchTable9Name, + KContactPredSearchTable10Name, + KContactPredSearchTable11Name }; // columns for contact table @@ -225,6 +227,14 @@ "CREATE TABLE predictivesearch9 (contact_id INTEGER PRIMARY KEY,\ nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable10Stmnt, +"CREATE TABLE predictivesearch10 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); +_LIT(KPredSearchCreateTable11Stmnt, +"CREATE TABLE predictivesearch11 (contact_id INTEGER PRIMARY KEY,\ + nbr BIGINT NULL, nbr2 BIGINT NULL, nbr3 BIGINT NULL, nbr4 BIGINT NULL,\ + first_name CHAR(16) NULL, last_name CHAR(16) NULL);"); // create table indexes @@ -278,6 +288,16 @@ _LIT(KPredSearchCreateNbr3IndexTable9, "CREATE INDEX index9_nbr3 on predictivesearch9 (nbr3);"); _LIT(KPredSearchCreateNbr4IndexTable9, "CREATE INDEX index9_nbr4 on predictivesearch9 (nbr4);"); +_LIT(KPredSearchCreateNbrIndexTable10, "CREATE INDEX index10_nbr on predictivesearch10 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable10, "CREATE INDEX index10_nbr2 on predictivesearch10 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable10, "CREATE INDEX index10_nbr3 on predictivesearch10 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable10, "CREATE INDEX index10_nbr4 on predictivesearch10 (nbr4);"); + +_LIT(KPredSearchCreateNbrIndexTable11, "CREATE INDEX index11_nbr on predictivesearch11 (nbr);"); +_LIT(KPredSearchCreateNbr2IndexTable11, "CREATE INDEX index11_nbr2 on predictivesearch11 (nbr2);"); +_LIT(KPredSearchCreateNbr3IndexTable11, "CREATE INDEX index11_nbr3 on predictivesearch11 (nbr3);"); +_LIT(KPredSearchCreateNbr4IndexTable11, "CREATE INDEX index11_nbr4 on predictivesearch11 (nbr4);"); + // create table indexes for readable names for ordering results alphabetically _LIT(KPredSearchCreateFNIndexInTable0, "CREATE INDEX index_last_name0 on predictivesearch0 (last_name);"); @@ -329,6 +349,16 @@ _LIT(KPredSearchCreateLNIndexInTable9, "CREATE INDEX index_first_name9 on predictivesearch9 (first_name);"); +_LIT(KPredSearchCreateFNIndexInTable10, +"CREATE INDEX index_last_name10 on predictivesearch10 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable10, +"CREATE INDEX index_first_name10 on predictivesearch10 (first_name);"); + +_LIT(KPredSearchCreateFNIndexInTable11, +"CREATE INDEX index_last_name11 on predictivesearch11 (last_name);"); +_LIT(KPredSearchCreateLNIndexInTable11, +"CREATE INDEX index_first_name11 on predictivesearch11 (first_name);"); + _LIT(KPresenceContactId, "contact_id"); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/inc/pltables.h --- a/phonebookengines/contactsmodel/cntplsql/inc/pltables.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/inc/pltables.h Fri May 14 15:42:23 2010 +0300 @@ -344,7 +344,6 @@ // aString ownership is not transferred void AddTokens(HBufC* aString, QStringList& aTokens) const; - TBool IsValidChar(TInt aChar) const; TBool IsValidChar(QChar aChar) const; // aFirstName ownership is not transferred @@ -354,10 +353,11 @@ void DeleteFromAllTablesL(TContactItemId aContactId, TBool& aLowDiskErrorOccurred) const; - QList FillTableList() const; + QList FillAllTables() const; // Return next table's name, ownership is transferred - HBufC* GetTableNameL(QList& aTables) const; + HBufC* GetNextTableNameL(QList& aTables) const; + const TDesC& TableNameL(TChar aCh) const; quint64 ConvertToHex(QString aToken) const; diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/inc/pplcontactitemmanager.h --- a/phonebookengines/contactsmodel/cntplsql/inc/pplcontactitemmanager.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/inc/pplcontactitemmanager.h Fri May 14 15:42:23 2010 +0300 @@ -71,7 +71,7 @@ TBool IsDatabaseEmptyL(); CPplPreferencesPersistor& PreferencesPersitor(); CContactIdArray* GroupIdListL(); - CContactIdArray* SearchIdListL (const TDesC& aSearchQuery) const; + CBufSeg* DetailsListL (const TDesC& aSearchQuery) const; CContactIdArray& CardTemplateIdsL(); TContactItemId OwnCardIdL(); void SetOwnCardIdL(TContactItemId aId); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/src/clplcontactproperties.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/clplcontactproperties.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/src/clplcontactproperties.cpp Fri May 14 15:42:23 2010 +0300 @@ -177,11 +177,11 @@ } -CContactIdArray* CLplContactProperties::SearchIdListL(const TDesC& aSearchQuery) const +CBufSeg* CLplContactProperties::DetailsListL(const TDesC& aSearchQuery) const { - return iContactItemManager->SearchIdListL(aSearchQuery); + return iContactItemManager->DetailsListL(aSearchQuery); + } - } TInt64 CLplContactProperties::MachineIdL() const { diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp Fri May 14 15:42:23 2010 +0300 @@ -20,7 +20,7 @@ #if defined(USE_ORBIT_KEYMAP) // If defined, only the currently used language's keymap is used -#define USE_ONLY_DEFAULT_LANG_KEYMAP +//#define USE_ONLY_DEFAULT_LANG_KEYMAP #include @@ -55,8 +55,8 @@ _LIT(KSeparator, " "); #if defined(USE_ORBIT_KEYMAP) -// How many keys have mappings (keys 0..9 have mapping) -const TInt KAmountOfKeys = 10; +// How many keys have mappings in ITU-T keypad (keys 0..9, * and # have mappings) +const TInt KAmountOfKeys = 12; // The first key of the keyboard has value zero ('1' in the 12-key virtual keypad) enum TKeyId @@ -70,10 +70,25 @@ EKey7, EKey8, EKey9, - EKey0 + EKey0, + EKeyStar, + EKeyHash, + ELastKey = EKeyHash }; + +const QChar KStar = '*'; +const QChar KPlus = '+'; +const QChar KHash = '#'; #endif // #if defined(USE_ORBIT_KEYMAP) +// * key is mapped to this +const TChar KMappedCharForStar = 'a'; +// # key is mapped to this +const TChar KMappedCharForHash = 'b'; +// Unmapped (unknown) characters are replaced with this +const TChar KPadChar = 'f'; + + // ============================== MEMBER FUNCTIONS ============================ // ---------------------------------------------------------------------------- @@ -81,14 +96,14 @@ // ---------------------------------------------------------------------------- CPcsKeyMap* CPcsKeyMap::NewL() { - PRINT( _L("Enter CPcsKeyMap::NewL") ); + PRINT(_L("Enter CPcsKeyMap::NewL")); - CPcsKeyMap* self = new ( ELeave ) CPcsKeyMap(); - CleanupStack::PushL( self ); + CPcsKeyMap* self = new (ELeave) CPcsKeyMap(); + CleanupStack::PushL(self); self->ConstructL(); - CleanupStack::Pop( self ); + CleanupStack::Pop(self); - PRINT( _L("End CPcsKeyMap::NewL") ); + PRINT(_L("End CPcsKeyMap::NewL")); return self; } @@ -97,8 +112,8 @@ // ---------------------------------------------------------------------------- CPcsKeyMap::~CPcsKeyMap() { - PRINT( _L("Enter CPcsKeyMap::~CPcsKeyMap") ); - PRINT( _L("End CPcsKeyMap::~CPcsKeyMap") ); + PRINT(_L("Enter CPcsKeyMap::~CPcsKeyMap")); + PRINT(_L("End CPcsKeyMap::~CPcsKeyMap")); } // ---------------------------------------------------------------------------- @@ -109,7 +124,7 @@ HBufC* CPcsKeyMap::GetNumericKeyStringL(const TDesC& aSource, TBool aPlainConversion) const { - PRINT1( _L("Enter CPcsKeyMap::GetNumericKeyStringL input '%S'"), &aSource ); + PRINT1(_L("Enter CPcsKeyMap::GetNumericKeyStringL input '%S'"), &aSource); TInt length = aSource.Length(); HBufC* destination = HBufC::NewL(length); @@ -133,7 +148,7 @@ } } - PRINT1( _L("End CPcsKeyMap::GetNumericKeyStringL result '%S'"), destination ); + PRINT1(_L("End CPcsKeyMap::GetNumericKeyStringL result '%S'"), destination); return destination; } @@ -153,10 +168,6 @@ CPcsKeyMap::CPcsKeyMap() : iKeyMapping() { - for (TInt i = 0; i < KAmountOfKeys; ++i) - { - iKeyMapping << QString(""); - } } // ---------------------------------------------------------------------------- @@ -164,35 +175,40 @@ // ---------------------------------------------------------------------------- void CPcsKeyMap::ConstructL() { - TBool ok(EFalse); TInt err(KErrNone); - QT_TRYCATCH_ERROR(err, ok = ContructKeyboardMappings()); + QT_TRYCATCH_ERROR(err, ContructKeyboardMappings()); if (err != KErrNone) { PRINT1(_L("ContructKeyboardMappings threw exception, err=%d"), err); User::Leave(err); } - if (!ok) - { - PRINT(_L("ContructKeyboardMappings returns error")); - User::Leave(KErrGeneral); - } } // ---------------------------------------------------------------------------- // CPcsKeyMap::ContructKeyboardMappings // Fetch keymap for every language/country pair present. -// 10.1 only has virtual 12 key ITU-T keyboard +// Even though most languages map *, + and # to 1-key, they are here mapped to +// the distinct *-key or #-key of the 12-key ITU-T keypad. // ---------------------------------------------------------------------------- -TBool CPcsKeyMap::ContructKeyboardMappings() +void CPcsKeyMap::ContructKeyboardMappings() { - PRINT( _L("Enter CPcsKeyMap::ContructKeyboardMappings") ); + PRINT(_L("Enter CPcsKeyMap::ContructKeyboardMappings")); + + for (TInt i = 0; i < KAmountOfKeys; ++i) + { + iKeyMapping << QString(""); + } + + iKeyMapping[EKeyStar].append(KStar); + iKeyMapping[EKeyStar].append(KPlus); + iKeyMapping[EKeyHash].append(KHash); + iHardcodedChars.append(KStar); + iHardcodedChars.append(KPlus); + iHardcodedChars.append(KHash); #if defined(_DEBUG) TInt count(0); #endif - - TInt err(KErrNone); QList languages; #if defined(USE_ONLY_DEFAULT_LANG_KEYMAP) HbInputLanguage inputLanguage(QLocale::system().language()); @@ -200,66 +216,49 @@ #else languages = AvailableLanguages(); #endif - // Calling HbKeymapFactory::keymap() causes "no memory" exception after - // ~20 different language/variant combinations in emulator. - // In text shell all languages can be handled successfully. - // In device, already the first call to HbKeymapFactory::keymap() - // crashes. - const TInt KMaxLanguages = 30; - TInt handleMaxLanguages = languages.size(); - if (handleMaxLanguages > KMaxLanguages) - { - handleMaxLanguages = KMaxLanguages; - } - PRINT1( _L("handle %d languages"), handleMaxLanguages ); // test - - for (TInt lang = 0; lang < handleMaxLanguages; ++lang) + TInt languageCount = languages.size(); + for (TInt lang = 0; lang < languageCount; ++lang) { -// PRINT1( _L("handle language %d"), languages[lang].language() ); // test + PRINT2(_L("(%d) handle language %d"), lang, languages[lang].language()); if (IsLanguageSupported(languages[lang].language())) { - PRINT2(_L("Constructing keymap for lang=%d,var=%d"), +/* PRINT2(_L("Constructing keymap for lang=%d,var=%d"), languages[lang].language(), - languages[lang].variant()); + languages[lang].variant()); */ const HbKeymap* keymap = HbKeymapFactory::instance()->keymap(languages[lang].language(), languages[lang].variant()); if (keymap) { - for (TInt key = EKey1; key <= EKey0; ++key) + for (TInt key = EKey1; key <= ELastKey; ++key) { - PRINT1( _L("handle key(enum value %d)"), key ); // test +// PRINT1(_L("handle key(enum value %d)"), key); // test const HbMappedKey* mappedKey = keymap->keyForIndex(HbKeyboardVirtual12Key, key); - if (!mappedKey) - { - PRINT1(_L("Mapped key not found, key(%d)"), KeyIdToNumber(key)); - return EFalse; - } - // Get both upper and lowercase letters - const QString lowerCase = mappedKey->characters(HbModifierNone); // e.g. "abc2.." - const QString upperCase = mappedKey->characters(HbModifierShiftPressed); // e.g. "ABC2.." - const QString charsForKey = lowerCase + upperCase; - - // Filter out duplicate characters - for (TInt i = charsForKey.length() - 1; i >= 0 ; --i) + // mappedKey can be NULL, as most languages don't have mapping for EKeyStar, EKeyHash + if (mappedKey) { - QChar ch = charsForKey[i]; - // Key '1' is at index 0 in iKeyMapping, key '2' at index 1 etc. - // and key '0' at the last index. - TInt index = key - EKey1; - if (!iKeyMapping[index].contains(ch)) - { -/* - PRINT3(_L("CPcsKeyMap: map key(%d) <-> char='%c'(0x%x)"), - KeyIdToNumber(key), - ch.toAscii(), - ch.toAscii()); */ + const QString lowerCase = mappedKey->characters(HbModifierNone); // "abc2.." + const QString upperCase = mappedKey->characters(HbModifierShiftPressed); // "ABC2.." + const QString charsForKey = lowerCase + upperCase; + + // Filter out duplicate characters + for (TInt i = charsForKey.length() - 1; i >= 0 ; --i) + { + QChar ch = charsForKey[i]; + if (!iKeyMapping[key].contains(ch) && + !iHardcodedChars.contains(ch)) + { +/* PRINT3(_L("CPcsKeyMap: map key(%d) <-> char='%c'(0x%x)"), + KeyIdToNumber(key), + ch.toAscii(), + ch.toAscii()); */ #if defined(_DEBUG) - ++count; + ++count; #endif - iKeyMapping[index] += ch; - } - } + iKeyMapping[key] += ch; + } + } + } } } else @@ -270,9 +269,8 @@ } #if defined(_DEBUG) - PRINT1( _L("End CPcsKeyMap::ContructKeyboardMappings keymap has %d chars"), count ); + PRINT1(_L("End CPcsKeyMap::ContructKeyboardMappings keymap has %d chars"), count); #endif - return ETrue; } // ---------------------------------------------------------------------------- @@ -282,31 +280,31 @@ // ---------------------------------------------------------------------------- QList CPcsKeyMap::AvailableLanguages() const { - PRINT( _L("Enter CPcsKeyMap::AvailableLanguages") ); + PRINT(_L("Enter CPcsKeyMap::AvailableLanguages")); QList languages = HbKeymapFactory::availableLanguages(); -#if 0 // This code would make sure the default language is at the beginning of +#if 1 // This code would make sure the default language is at the beginning of // list of available languages. But since there is resource leak, the code // is currently commented out until the leak is fixed. QLocale::Language currentLanguage = QLocale::system().language(); if (!IsLanguageSupported(currentLanguage)) { - PRINT( _L("current lang not supported, use english") ); //test + PRINT(_L("current lang not supported, use english")); //test currentLanguage = QLocale::English; } HbInputLanguage defaultLanguage(currentLanguage); if (languages.contains(defaultLanguage)) { - PRINT( _L("remove default lang") ); //test + PRINT(_L("remove default lang")); //test languages.removeOne(defaultLanguage); } - PRINT( _L("insert default lang as first lang") ); //test + PRINT(_L("insert default lang as first lang")); //test languages.prepend(defaultLanguage); // THIS LEAKS RESOURCES! #endif - PRINT1( _L("End CPcsKeyMap::AvailableLanguages found %d languages"), - languages.count() ); + PRINT1(_L("End CPcsKeyMap::AvailableLanguages found %d languages"), + languages.count()); return languages; } @@ -324,11 +322,10 @@ // If the character is not mapped, use the character itself. // ---------------------------------------------------------------------------- TChar CPcsKeyMap::KeyForCharacter(const TChar& aChar) const - { + { TUint charValue(aChar); QChar ch(charValue); - - for (TInt index = 0; index < KAmountOfKeys; ++index) + for (TInt index = 0; index < KAmountOfKeys; ++index) { if (iKeyMapping[index].contains(ch)) { @@ -336,11 +333,12 @@ } } - PRINT2( _L("CPcsKeyMap::KeyForCharacter no mapping for char '%c' (0x%x)"), - (TUint)aChar, (TUint)aChar ); // test - return aChar; + PRINT2(_L("CPcsKeyMap::KeyForCharacter no mapping for char '%c' (0x%x)"), + (TUint)aChar, (TUint)aChar); + return KPadChar; } +#if defined(_DEBUG) // ---------------------------------------------------------------------------- // CPcsKeyMap::KeyIdToNumber // Map Orbit API's key id to the number that the key results when pressed. @@ -358,15 +356,18 @@ case EKey7: case EKey8: case EKey9: + case EKeyStar: + case EKeyHash: return aKeyId + 1; case EKey0: return 0; default: - PRINT1( _L("CPcsKeyMap::KeyIdToNumber invalid index %d"), aKeyId ); + PRINT1(_L("CPcsKeyMap::KeyIdToNumber invalid index %d"), aKeyId); User::Panic(_L("CPcsKeyMap::KeyIdToNumber"), KErrArgument); return 0; } } +#endif // ---------------------------------------------------------------------------- // CPcsKeyMap::ArrayIndexToNumberChar @@ -377,11 +378,17 @@ __ASSERT_DEBUG(aArrayIndex < KAmountOfKeys, User::Panic(_L("CPcsKeyMap::ArrayIndexToNumberChar"), KErrOverflow)); - if (aArrayIndex == KAmountOfKeys - 1) + switch (aArrayIndex) { - return '0'; + case EKey0: + return '0'; + case EKeyStar: + return KMappedCharForStar; + case EKeyHash: + return KMappedCharForHash; + default: + return aArrayIndex + '1'; } - return aArrayIndex + '1'; } #else // #if defined(USE_ORBIT_KEYMAP) CPcsKeyMap::CPcsKeyMap() @@ -389,10 +396,10 @@ } void CPcsKeyMap::ConstructL() - { + { } -TChar CPcsKeyMap::GetNumericValueForChar(TChar input ) const +TChar CPcsKeyMap::GetNumericValueForChar(TChar input) const { TChar ret = '0'; switch (input) @@ -400,8 +407,9 @@ case 'A': case 'B': case 'C': - ret = '2'; - break; + ret = '2'; + break; + case 'D': case 'E': case 'F': @@ -445,13 +453,32 @@ case 'Z': ret = '9'; break; - - case ' ': - ret = '0'; - break; + + case '*': + case '+': + ret = KMappedCharForStar; + break; + + case '#': + ret = KMappedCharForHash; + break; - default: // Other chars, e.g. numbers - ret = input; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ' ': + ret = input; // Numbers and space + break; + + default: // Other (unknown) chars + ret = KPadChar; } return ret; } diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp Fri May 14 15:42:23 2010 +0300 @@ -34,10 +34,18 @@ // to prevent overflow when comparing upper and lower limits. const TInt KMaxDigits = 15; -const QChar KPadChar = 'a'; // Pad with hex-digit 0xA - const quint64 KConversionError = 0xeeeeeeeeeeeeeee; +#define MAPPED_CHAR_FOR_STAR 'a' +#define MAPPED_CHAR_FOR_HASH 'b' + +const QChar KMappedQCharForStar = MAPPED_CHAR_FOR_STAR; +const QChar KMappedQCharForHash = MAPPED_CHAR_FOR_HASH; + +// These must be same as in cpcskeymap.cpp +const TChar KMappedCharForStar = MAPPED_CHAR_FOR_STAR; +const TChar KMappedCharForHash = MAPPED_CHAR_FOR_HASH; +const QChar KPadChar = 'f'; // Pad with hex-digit 0xF /** @@ -92,7 +100,7 @@ /** @param aItem A contact item whose data are added to the table. */ -void CPplPredictiveSearchTable::CreateInDbL( CContactItem& aItem ) +void CPplPredictiveSearchTable::CreateInDbL(CContactItem& aItem) { RDebug::Print(_L("CPplPredictiveSearchTable::CreateInDbL")); WriteToDbL(aItem); @@ -106,7 +114,7 @@ @param aItem A contact item whose data is updated in the database. */ -void CPplPredictiveSearchTable::UpdateL( const CContactItem& aItem ) +void CPplPredictiveSearchTable::UpdateL(const CContactItem& aItem) { RDebug::Print(_L("CPplPredictiveSearchTable::UpdateL")); @@ -146,7 +154,7 @@ { RDebug::Print(_L("CPplPredictiveSearchTable::CreateTableL")); - RDebug::Print(_L("Create 10 tables")); + RDebug::Print(_L("Create 12 tables")); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable0Stmnt)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable1Stmnt)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable2Stmnt)); @@ -157,6 +165,8 @@ User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable7Stmnt)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable8Stmnt)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable9Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable10Stmnt)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateTable11Stmnt)); RDebug::Print(_L("Create indexes")); @@ -210,6 +220,16 @@ User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable9)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable9)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable10)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable10)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable10)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable10)); + + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbrIndexTable11)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr2IndexTable11)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr3IndexTable11)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateNbr4IndexTable11)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable0)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable0)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable1)); @@ -230,6 +250,10 @@ User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable8)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable9)); User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable9)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable10)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable10)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateFNIndexInTable11)); + User::LeaveIfError(iDatabase.Exec(KPredSearchCreateLNIndexInTable11)); RDebug::Print(_L("CPplPredictiveSearchTable::CreateTableL ends")); } @@ -247,7 +271,7 @@ TCntSqlStatementType deleteType(EDelete, KSqlContactPredSearchTable0); // Insert new record - // INSERT INTO predictivesearchX (X=0..9) + // INSERT INTO predictivesearchX (X=0..11) // (contact_id, nbr, nbr2, nbr3, nbr4, first_name, last_name) // VALUES (contact_id value, nbr value, nbr2 value, nbr3 value, nbr4 value, // first_name value, last_name value); @@ -277,7 +301,7 @@ &KPredSearchContactId, &KPredSearchContactIdParam); // Delete information of a particular contact item - // DELETE FROM predictivesearchX (X=0..9) + // DELETE FROM predictivesearchX (X=0..11) // WHERE contact_id = [contact id value]; iDeleteStmnt = TSqlProvider::GetSqlStatementL(deleteType); iDeleteStmnt->SetConditionL(*whereContactIdClause); @@ -321,7 +345,7 @@ }); HBufC* tableName(NULL); - while ((tableName = GetTableNameL(tables)) != NULL) + while ((tableName = GetNextTableNameL(tables)) != NULL) { // Takes ownership. Clears also earlier SQL statement. iInsertStmnt->SetTableName(tableName); @@ -447,9 +471,9 @@ QList tables; for (TInt i = aTokens.count() - 1; i >= 0; --i) { + __ASSERT_ALWAYS(IsValidChar(aTokens[i][0]), + User::Panic(_L("DetermineTables"), KErrArgument)); TChar ch(aTokens[i][0].unicode()); - __ASSERT_ALWAYS(IsValidChar(ch), - User::Panic(_L("DetermineTables"), KErrArgument)); if (!tables.contains(ch)) { tables.append(ch); @@ -459,44 +483,6 @@ } -// Ignore tokens beginning with something else than '0'..'9'. -// Keep duplicate tokens to support e.g. search "202" when both FN and LN are "23". -void -CPplPredictiveSearchTable::AddTokens(HBufC* aString, QStringList& aTokens) const - { - if (aString) - { - QString s((QChar*)aString->Ptr(), aString->Length()); -#if defined(USE_ORBIT_KEYMAP) - QStringList tokens = s.split(iKeyMap->Separator(), QString::SkipEmptyParts); -#else - QStringList tokens = s.split(' ', QString::SkipEmptyParts); -#endif - - // Select tokens in the same order they are in original aString - for (TInt i = 0; i < tokens.count(); ++i) - { - if (IsValidChar(tokens[i][0])) - { - aTokens.append(tokens[i]); - } - } - } - } - - -TBool CPplPredictiveSearchTable::IsValidChar(TInt aChar) const - { - return (aChar >= '0' && aChar <= '9'); - } - - -TBool CPplPredictiveSearchTable::IsValidChar(QChar aChar) const - { - return (aChar >= '0' && aChar <= '9'); - } - - // 1. get first token of LN // 2. get first token of FN // 3. get second token of LN @@ -530,6 +516,40 @@ } +// Ignore tokens beginning with invalid (unknown) character. +// Keep duplicate tokens to support e.g. search "202" when both FN and LN are "23". +void +CPplPredictiveSearchTable::AddTokens(HBufC* aString, QStringList& aTokens) const + { + if (aString) + { + QString s((QChar*)aString->Ptr(), aString->Length()); +#if defined(USE_ORBIT_KEYMAP) + QStringList tokens = s.split(iKeyMap->Separator(), QString::SkipEmptyParts); +#else + QStringList tokens = s.split(' ', QString::SkipEmptyParts); +#endif + + // Select tokens in the same order they are in original aString + for (TInt i = 0; i < tokens.count(); ++i) + { + if (IsValidChar(tokens[i][0])) + { + aTokens.append(tokens[i]); + } + } + } + } + + +TBool CPplPredictiveSearchTable::IsValidChar(QChar aChar) const + { + return (aChar >= '0' && aChar <= '9') || + aChar == MAPPED_CHAR_FOR_STAR || + aChar == MAPPED_CHAR_FOR_HASH; + } + + void CPplPredictiveSearchTable::GetNextToken(QStringList& aSource, QStringList& aDestination) const { @@ -547,10 +567,10 @@ TBool& aLowDiskErrorOccurred) const { QList tables; - QT_TRYCATCH_LEAVING(tables = FillTableList()); + QT_TRYCATCH_LEAVING(tables = FillAllTables()); HBufC* tableName(NULL); - while ((tableName = GetTableNameL(tables)) != NULL) + while ((tableName = GetNextTableNameL(tables)) != NULL) { iDeleteStmnt->SetTableName(tableName); // Clears also earlier SQL statement @@ -567,9 +587,8 @@ const TInt KContactIdParamIndex(KFirstIndex); User::LeaveIfError(stmnt.BindInt(KContactIdParamIndex, aContactId)); RDebug::Print(_L("CPplPredictiveSearchTable::DeleteFromAllTablesL execute statement")); - // Returns the amount of rows that were changed/inserted/deleted. - // Since contact is not present in all tables, some operations return 0, - // it is not an error. + // Returns the amount of affected rows. As contact is not present each + // table, some operations return 0, it is not an error. TInt status = stmnt.Exec(); RDebug::Print(_L("CPplPredictiveSearchTable::DeleteFromAllTablesL rows deleted=%d"), status); CleanupStack::PopAndDestroy(&stmnt); @@ -588,43 +607,69 @@ } -QList CPplPredictiveSearchTable::FillTableList() const +QList CPplPredictiveSearchTable::FillAllTables() const { QList tables; - const TInt KLargestKey = '9'; - for (TInt i = '0'; i <= KLargestKey; ++i) + + const TInt KLargestDigitKey = '9'; + for (TInt i = '0'; i <= KLargestDigitKey; ++i) { TChar ch = i; tables << ch; } + tables << KMappedCharForStar; + tables << KMappedCharForHash; + return tables; } -HBufC* CPplPredictiveSearchTable::GetTableNameL(QList& aTables) const +HBufC* CPplPredictiveSearchTable::GetNextTableNameL(QList& aTables) const { HBufC* tableName(NULL); if (aTables.count() > 0) { - TChar ch = aTables[0]; - __ASSERT_ALWAYS(IsValidChar(ch), User::Leave(KErrArgument)); + // Enough space for the longest table name + tableName = HBufC::NewL(KSqlContactPredSearchTable11().Length()); + TPtr ptr = tableName->Des(); + ptr.Append(TableNameL(aTables[0])); - // Each table's name has same length, replace last char with the correct one - tableName = HBufC::NewL(KSqlContactPredSearchTable0().Length()); - TPtr ptr = tableName->Des(); - ptr.Append(KSqlContactPredSearchTable0); - ptr[ptr.Length() - 1] = ch; aTables.removeFirst(); - RDebug::Print(_L("CPplPredictiveSearchTable::GetTableNameL '%S'"), tableName); + RDebug::Print(_L("CPplPredictiveSearchTable::GetNextTableNameL '%S'"), tableName); } return tableName; } +// when qwerty will be supported, keymap prob maps original chars to +// 0..9, a..z + few capital letters +const TDesC& CPplPredictiveSearchTable::TableNameL(TChar aCh) const + { + switch (aCh) + { + case '0': return KSqlContactPredSearchTable0; + case '1': return KSqlContactPredSearchTable1; + case '2': return KSqlContactPredSearchTable2; + case '3': return KSqlContactPredSearchTable3; + case '4': return KSqlContactPredSearchTable4; + case '5': return KSqlContactPredSearchTable5; + case '6': return KSqlContactPredSearchTable6; + case '7': return KSqlContactPredSearchTable7; + case '8': return KSqlContactPredSearchTable8; + case '9': return KSqlContactPredSearchTable9; + case MAPPED_CHAR_FOR_STAR: return KSqlContactPredSearchTable10; + case MAPPED_CHAR_FOR_HASH: return KSqlContactPredSearchTable11; + default: + TUint ch = aCh; + RDebug::Print(_L("CPplPredictiveSearchTable::TableName unknown char '%c'"), ch); + User::Leave(KErrArgument); + return KNullDesC; + } + } -// E.g. aToken = "01230" -> append 'a' until has KMaxDigits characters -// -> "01230aaaaaaaaaa" -> convert to hexadecimal number -> 0x01230aaaaaaaaaa. -// Leaving from this function causes panic, perhaps because of QString -// parameter? So rather return an error code if conversion fails. + +// E.g. aToken = "01230" -> append KPadChar until has KMaxDigits characters +// -> "01230ffffffffff" -> convert to hexadecimal number -> 0x01230ffffffffff. +// If this function would leave, causes panic, perhaps because of QString parameter? quint64 CPplPredictiveSearchTable::ConvertToHex(QString aToken) const { if (aToken.length() > KMaxDigits) diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntplsql/src/pplcontactitemmanager.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/pplcontactitemmanager.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/src/pplcontactitemmanager.cpp Fri May 14 15:42:23 2010 +0300 @@ -722,22 +722,39 @@ return idArray; } -CContactIdArray* CPplContactItemManager::SearchIdListL(const TDesC& aSearchQuery) const +/** +Fast access method for retrieving a list of contact details as raw data. +This method can be used for example to fetch the names of all contacts +in a very efficient manner. It is assumed that the first column in +aSearchQuery is 'id' and that the other columns are text. + +The returned buffer can be read with RBufReadStream - the first column +of each row is a 32-bit integer (the id), the rest of the columns are +16-bit descriptors. An id of 0 signifies the end of the list. +*/ +CBufSeg* CPplContactItemManager::DetailsListL(const TDesC& aSearchQuery) const { - CContactIdArray* idArray = CContactIdArray::NewLC(); - + CBufSeg* array = CBufSeg::NewL(4096); + CleanupStack::PushL(array); + //Prepare and execute the sql query RSqlStatement selectStatement; CleanupClosePushL(selectStatement); User::LeaveIfError(selectStatement.Prepare(iDatabase, aSearchQuery)); - const TInt KIdx = iSelectStatement->ParameterIndex(KContactId); - + // Iterate through the results and append the contactIds to idArray TInt err; - while((err = selectStatement.Next()) == KSqlAtRow) + RBufWriteStream stream; + stream.Open(*array); + TInt columnCount = selectStatement.ColumnCount(); + while ((err = selectStatement.Next()) == KSqlAtRow) { - idArray->AddL(selectStatement.ColumnInt(KIdx)); + stream.WriteInt32L(selectStatement.ColumnInt(0)); + for (TInt i = 1; i < columnCount; ++i) + stream << selectStatement.ColumnTextL(i); } + stream.WriteInt32L(0); + stream.Close(); if(err != KSqlAtEnd) { @@ -746,11 +763,12 @@ //Cleanup CleanupStack::PopAndDestroy(&selectStatement); - CleanupStack::Pop(idArray); + CleanupStack::Pop(array); - return idArray; + return array; } + /** Utility method used to rthe prefered card template id */ diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntsrv/inc/CCntIpcCodes.h --- a/phonebookengines/contactsmodel/cntsrv/inc/CCntIpcCodes.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntsrv/inc/CCntIpcCodes.h Fri May 14 15:42:23 2010 +0300 @@ -37,7 +37,7 @@ #define KCapabilityWriteUserData 400 // To be removed. Should be defined in a header file -#define KCntSearchResultIdLists 99 +#define KCntSearchResultList 99 /** Contacts database filename maximum length. Used to police descriptors on Client @@ -108,9 +108,9 @@ ECntOpenViewSession, ECntCloseViewSession, ECntViewChangeSortOrderL, - ECntSearchResultIdLists = KCntSearchResultIdLists, // Do not change this enum value - // and do not add anything immediately - // after this. + ECntSearchResultList = KCntSearchResultList, // Do not change this enum value + // and do not add anything immediately + // after this. // ---- Read User Data capability ---- ECntOpenDataBase= KCapabilityReadUserData, ECntReOpenDbTables, diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntsrv/inc/persistencelayer.h --- a/phonebookengines/contactsmodel/cntsrv/inc/persistencelayer.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntsrv/inc/persistencelayer.h Fri May 14 15:42:23 2010 +0300 @@ -174,7 +174,7 @@ virtual TInt64 MachineIdL() const = 0; virtual CContactIdArray& CardTemplateIdsL() = 0; virtual CContactIdArray& GroupIdListL() = 0; - virtual CContactIdArray* SearchIdListL(const TDesC& aSearchQuery) const = 0; + virtual CBufSeg* DetailsListL(const TDesC& aSearchQuery) const = 0; virtual void SetMachineIdL(TInt64 aMachineId) = 0; virtual TPtrC UniqueIdL() = 0; diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntsrv/src/CCntFileManagerMsgHandler.cpp --- a/phonebookengines/contactsmodel/cntsrv/src/CCntFileManagerMsgHandler.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntsrv/src/CCntFileManagerMsgHandler.cpp Fri May 14 15:42:23 2010 +0300 @@ -56,7 +56,7 @@ ECntGetDatabaseReady, ECntFetchTemplateIds, ECntFetchGroupIdLists, - ECntSearchResultIdLists, + ECntSearchResultList, ECntFilesSize, ECntGetDefinitionsForExistingView }; @@ -397,26 +397,26 @@ aMessage.ReadL(1, searchQueryPtr); CheckForManagerL(); - CContactIdArray* arrayPtr = iManager->GetPersistenceLayer().ContactProperties().SearchIdListL(searchQuery->Des()); - CleanupStack::PushL(arrayPtr); - TPtr8 cntIDBuff = iPackager.PackL(*arrayPtr); - TInt length = cntIDBuff.Length(); - CleanupStack::PopAndDestroy(); //arrayPtr - CleanupStack::PopAndDestroy(); //searchQuery - - // Write data if client buffer is large enough otherwise return the - // required buffer size. - if(aMessage.GetDesMaxLength(0) >= length) - { - aMessage.WriteL(0, cntIDBuff); + + CBufSeg* buffer = iManager->GetPersistenceLayer().ContactProperties().DetailsListL(searchQuery->Des()); + if (aMessage.GetDesMaxLength(0) >= buffer->Size()) + { + TInt offset = 0; + while (offset < buffer->Size()) + { + TPtr8 ptr = buffer->Ptr(offset); + aMessage.WriteL(0, ptr, offset); + offset += ptr.Size(); + } aMessage.Complete(KErrNone); } else - { - aMessage.Complete(length); + { + aMessage.Complete(buffer->Size()); } - - + + delete buffer; + CleanupStack::PopAndDestroy(); //searchQuery } @@ -425,6 +425,7 @@ DefinitionsOfExistingViewsL(aMessage); } + void CCntFileManagerMsgHandler::FilesSizeL(const RMessage2& aMessage) { CheckForManagerL(); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/cntsrv/src/CCntServer.cpp --- a/phonebookengines/contactsmodel/cntsrv/src/CCntServer.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/cntsrv/src/CCntServer.cpp Fri May 14 15:42:23 2010 +0300 @@ -364,7 +364,7 @@ iMsgLut.InsertL(ECntGetDatabaseReady, static_cast(&CCntFileManagerMsgHandler::GetDatabaseReadyL)); iMsgLut.InsertL(ECntFetchTemplateIds, static_cast(&CCntFileManagerMsgHandler::FetchTemplateIdsL)); iMsgLut.InsertL(ECntFetchGroupIdLists, static_cast(&CCntFileManagerMsgHandler::FetchGroupIdListsL)); - iMsgLut.InsertL(ECntSearchResultIdLists, static_cast(&CCntFileManagerMsgHandler::FetchSearchResultsL)); + iMsgLut.InsertL(ECntSearchResultList, static_cast(&CCntFileManagerMsgHandler::FetchSearchResultsL)); iMsgLut.InsertL(ECntFilesSize, static_cast(&CCntFileManagerMsgHandler::FilesSizeL)); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpcskeymap.cpp --- a/phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpcskeymap.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpcskeymap.cpp Fri May 14 15:42:23 2010 +0300 @@ -112,11 +112,14 @@ void UT_CPcsKeyMap::UT_NewLL() { #if defined(USE_ORBIT_KEYMAP) - const TInt KAmountOfKeys = 10; // Must have same value as in cpcskeymap.cpp + // Must be same as in cpcskeymap.cpp + const TInt KAmountOfKeys = 12; + // Note that * and # keys do not have mappings in most languages + const TInt KAmountOfNumberKeys = 10; // Each numeric key has been mapped EUNIT_ASSERT_EQUALS( KAmountOfKeys, iKeyMap->iKeyMapping.count() ); - for (TInt i = 0; i < KAmountOfKeys; ++i) + for (TInt i = 0; i < KAmountOfNumberKeys; ++i) { EUNIT_ASSERT( iKeyMap->iKeyMapping.at(i).length() > 0 ); } @@ -225,13 +228,11 @@ // void UT_CPcsKeyMap::UT_GetNumericKeyStringWithSpecialCharactersL() { - _LIT( KAlpha, " +g-[5]t" ); + _LIT( KAlpha, " +g-*[#5]?t" ); #if defined(USE_ORBIT_KEYMAP) - // Orbit keymap code is used - _LIT( KNumeric, " 141[5]8" ); + _LIT( KNumeric, " a41afb5f18" ); #else - // Hardcoded keymap is used - _LIT( KNumeric, " +4-[5]8" ); + _LIT( KNumeric, " a4-a[b5]?8" ); #endif HBufC* numericBuf = iKeyMap->GetNumericKeyStringL( KAlpha, EFalse ); CleanupStack::PushL( numericBuf ); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpplpredictivesearchtable.cpp --- a/phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpplpredictivesearchtable.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpplpredictivesearchtable.cpp Fri May 14 15:42:23 2010 +0300 @@ -19,6 +19,7 @@ #include "t_cpplpredictivesearchtable.h" #include "pltables.h" #include "dbsqlconstants.h" +#include "cpcskeymap.h" // USE_ORBIT_KEYMAP macro // SYSTEM INCLUDES #include @@ -45,6 +46,9 @@ // Must have same value as KMaxDigits in cpplpredictivesearchtable.cpp const TInt KMaxDigits = 15; + +const TInt KTableCount = 12; + // Must have same value as KConversionError in cpplpredictivesearchtable.cpp const quint64 KConversionError = 0xeeeeeeeeeeeeeee; @@ -787,31 +791,34 @@ void UT_CPplPredictiveSearchTable::UT_ConvertToHexL() { // Basic case - EUNIT_ASSERT_EQUALS(0x4458aaaaaaaaaaa, iTable->ConvertToHex("4458")); + EUNIT_ASSERT_EQUALS(0x4458fffffffffff, iTable->ConvertToHex("4458")); + + // Long digit + EUNIT_ASSERT_EQUALS(0x123456789012345, iTable->ConvertToHex("123456789012345")); // Trailing zeros - EUNIT_ASSERT_EQUALS(0x12345678900aaaa, iTable->ConvertToHex("12345678900")); + EUNIT_ASSERT_EQUALS(0x12345678900ffff, iTable->ConvertToHex("12345678900")); // Leading zeros - EUNIT_ASSERT_EQUALS(0x00123456789aaaa, iTable->ConvertToHex("00123456789")); + EUNIT_ASSERT_EQUALS(0x00123456789ffff, iTable->ConvertToHex("00123456789")); // Just zeros - EUNIT_ASSERT_EQUALS(0x00000aaaaaaaaaa, iTable->ConvertToHex("00000")); - EUNIT_ASSERT_EQUALS(0x00000000000000a, iTable->ConvertToHex("00000000000000")); + EUNIT_ASSERT_EQUALS(0x00000ffffffffff, iTable->ConvertToHex("00000")); + EUNIT_ASSERT_EQUALS(0x00000000000000f, iTable->ConvertToHex("00000000000000")); EUNIT_ASSERT_EQUALS(0x000000000000000, iTable->ConvertToHex("000000000000000")); - EUNIT_ASSERT_EQUALS(0x0aaaaaaaaaaaaaa, iTable->ConvertToHex("0")); + EUNIT_ASSERT_EQUALS(0x0ffffffffffffff, iTable->ConvertToHex("0")); // Zeros in the middle - EUNIT_ASSERT_EQUALS(0x12300450008000a, iTable->ConvertToHex("12300450008000")); + EUNIT_ASSERT_EQUALS(0x12300450008000f, iTable->ConvertToHex("12300450008000")); // Empty string - EUNIT_ASSERT_EQUALS(0xaaaaaaaaaaaaaaa, iTable->ConvertToHex("")); + EUNIT_ASSERT_EQUALS(0xfffffffffffffff, iTable->ConvertToHex("")); // Unmapped characters - EUNIT_ASSERT_EQUALS(0x123aaaaaaaaaaaa, iTable->ConvertToHex("123??45??67")); - EUNIT_ASSERT_EQUALS(0x00aaaaaaaaaaaaa, iTable->ConvertToHex("00?1234567")); - EUNIT_ASSERT_EQUALS(0xaaaaaaaaaaaaaaa, iTable->ConvertToHex("?1234567")); - EUNIT_ASSERT_EQUALS(0xaaaaaaaaaaaaaaa, iTable->ConvertToHex("???")); + EUNIT_ASSERT_EQUALS(0x123ffffffffffff, iTable->ConvertToHex("123??45??67")); + EUNIT_ASSERT_EQUALS(0x00fffffffffffff, iTable->ConvertToHex("00?1234567")); + EUNIT_ASSERT_EQUALS(0xfffffffffffffff, iTable->ConvertToHex("?1234567")); + EUNIT_ASSERT_EQUALS(0xfffffffffffffff, iTable->ConvertToHex("???")); // Too many digits EUNIT_ASSERT_EQUALS(KConversionError, iTable->ConvertToHex("12345678901234567890")); @@ -864,9 +871,10 @@ TInt aCountInTable6, TInt aCountInTable7, TInt aCountInTable8, - TInt aCountInTable9) + TInt aCountInTable9, + TInt aCountInTable10, + TInt aCountInTable11) { - const TInt KTableCount = 10; TPtrC tableNames[KTableCount] = { KSqlContactPredSearchTable0, @@ -878,15 +886,17 @@ KSqlContactPredSearchTable6, KSqlContactPredSearchTable7, KSqlContactPredSearchTable8, - KSqlContactPredSearchTable9 + KSqlContactPredSearchTable9, + KSqlContactPredSearchTable10, + KSqlContactPredSearchTable11 }; TInt rowCounts[KTableCount] = {0}; for (TInt i = 0; i < KTableCount; ++i) { HBufC* s = HBufC::NewLC(KCountSelect().Length() + - // All table names are same length - KSqlContactPredSearchTable0().Length()); + // Enough space for longest table name + KSqlContactPredSearchTable11().Length()); TPtr ptr = s->Des(); ptr.Format(KCountSelect, &tableNames[i]); @@ -906,6 +916,8 @@ EUNIT_ASSERT_EQUALS(aCountInTable7, rowCounts[7]); EUNIT_ASSERT_EQUALS(aCountInTable8, rowCounts[8]); EUNIT_ASSERT_EQUALS(aCountInTable9, rowCounts[9]); + EUNIT_ASSERT_EQUALS(aCountInTable10, rowCounts[10]); + EUNIT_ASSERT_EQUALS(aCountInTable11, rowCounts[11]); } // There is only need to search from one table (unless search string begins @@ -930,7 +942,7 @@ // No need to use "WHERE.." or "ORDER BY first_name ASC" _LIT(KSearchOneDigitFormat, "SELECT contact_id FROM %S"); select = HBufC::NewLC(KSearchOneDigitFormat().Length() + - KSqlContactPredSearchTable0().Length()); + KSqlContactPredSearchTable11().Length()); select->Des().AppendFormat(KSearchOneDigitFormat, &tableName); } else @@ -944,7 +956,7 @@ TInt KNbrColumns = 4; TInt KSpaceForLimits = KNbrColumns * 2 * (KMaxDigits + 2); // Two extra for decimal representation of max 15 hex digits select = HBufC::NewLC(KSearchFormat().Length() + - KSqlContactPredSearchTable0().Length() + + KSqlContactPredSearchTable11().Length() + KSpaceForLimits); select->Des().AppendFormat(KSearchFormat, &tableName, lowerLimit, upperLimit, @@ -998,6 +1010,10 @@ return KSqlContactPredSearchTable8; case '9': return KSqlContactPredSearchTable9; + case 'a': + return KSqlContactPredSearchTable10; + case 'b': + return KSqlContactPredSearchTable11; default: return KNullDesC; } @@ -1010,7 +1026,7 @@ TInt64 UT_CPplPredictiveSearchTable::UpperLimitL(const TDesC& aString) const { - return ConvertToNbrL(aString, 'a'); + return ConvertToNbrL(aString, 'f'); } TInt64 UT_CPplPredictiveSearchTable::ConvertToNbrL(const TDesC& aString, @@ -1044,7 +1060,7 @@ _LIT(KCheckIfTableExistsFormat, "SELECT %S FROM %S;"); TInt bufSize = KCheckIfTableExistsFormat().Length() + KPredSearchContactId().Length() + - KSqlContactPredSearchTable0().Length(); + KSqlContactPredSearchTable11().Length(); HBufC* sqlStatement = HBufC::NewLC(bufSize); sqlStatement->Des().AppendFormat(KCheckIfTableExistsFormat, &KPredSearchContactId, @@ -1063,7 +1079,6 @@ // This function has code copied from CPplContactItemManager::DeletePredSearchTablesL void UT_CPplPredictiveSearchTable::CPplContactItemManager_DeletePredSearchTablesL() { - const TInt KTableCount = 10; const TDesC* KTableNames[KTableCount] = { &KSqlContactPredSearchTable0, @@ -1075,7 +1090,9 @@ &KSqlContactPredSearchTable6, &KSqlContactPredSearchTable7, &KSqlContactPredSearchTable8, - &KSqlContactPredSearchTable9 + &KSqlContactPredSearchTable9, + &KSqlContactPredSearchTable10, + &KSqlContactPredSearchTable11 }; // IF EXISTS suppresses error that would occur if table does not exist diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpplpredictivesearchtable.h --- a/phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpplpredictivesearchtable.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/contactsmodel/tsrc/cntplsql/src/t_cpplpredictivesearchtable.h Fri May 14 15:42:23 2010 +0300 @@ -91,7 +91,9 @@ TInt aCountInTable6 = 0, TInt aCountInTable7 = 0, TInt aCountInTable8 = 0, - TInt aCountInTable9 = 0); + TInt aCountInTable9 = 0, + TInt aCountInTable10 = 0, + TInt aCountInTable11 = 0); /** * Adds a new contact to table. diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/eabi/cntimageutilityu.def --- a/phonebookengines/eabi/cntimageutilityu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/eabi/cntimageutilityu.def Fri May 14 15:42:23 2010 +0300 @@ -1,19 +1,22 @@ EXPORTS - _ZN15CntImageUtility11createImageERK7QPixmapR7QStringRi @ 1 NONAME - _ZN15CntImageUtility11createImageERK7QStringRS0_Ri @ 2 NONAME + _ZN15CntImageUtility11createImageERK7QPixmapR7QString @ 1 NONAME + _ZN15CntImageUtility11createImageERK7QStringRS0_ @ 2 NONAME _ZN15CntImageUtility11qt_metacallEN11QMetaObject4CallEiPPv @ 3 NONAME _ZN15CntImageUtility11qt_metacastEPKc @ 4 NONAME - _ZN15CntImageUtility11removeImageERK7QStringRi @ 5 NONAME + _ZN15CntImageUtility11removeImageERK7QString @ 5 NONAME _ZN15CntImageUtility11selectDriveERi @ 6 NONAME - _ZN15CntImageUtility16staticMetaObjectE @ 7 NONAME DATA 16 - _ZN15CntImageUtility19getStaticMetaObjectEv @ 8 NONAME - _ZN15CntImageUtility8initPathER7QStringi @ 9 NONAME - _ZN15CntImageUtilityC1EP7QObject @ 10 NONAME - _ZN15CntImageUtilityC2EP7QObject @ 11 NONAME - _ZN15CntImageUtilityD0Ev @ 12 NONAME - _ZN15CntImageUtilityD1Ev @ 13 NONAME - _ZN15CntImageUtilityD2Ev @ 14 NONAME - _ZNK15CntImageUtility10metaObjectEv @ 15 NONAME - _ZTI15CntImageUtility @ 16 NONAME - _ZTV15CntImageUtility @ 17 NONAME + _ZN15CntImageUtility16isImageRemovableERK7QString @ 7 NONAME + _ZN15CntImageUtility16staticMetaObjectE @ 8 NONAME DATA 16 + _ZN15CntImageUtility19getStaticMetaObjectEv @ 9 NONAME + _ZN15CntImageUtility22isMassStorageAvailableEv @ 10 NONAME + _ZN15CntImageUtility5errorEv @ 11 NONAME + _ZN15CntImageUtility8initPathER7QStringi @ 12 NONAME + _ZN15CntImageUtilityC1EP7QObject @ 13 NONAME + _ZN15CntImageUtilityC2EP7QObject @ 14 NONAME + _ZN15CntImageUtilityD0Ev @ 15 NONAME + _ZN15CntImageUtilityD1Ev @ 16 NONAME + _ZN15CntImageUtilityD2Ev @ 17 NONAME + _ZNK15CntImageUtility10metaObjectEv @ 18 NONAME + _ZTI15CntImageUtility @ 19 NONAME + _ZTV15CntImageUtility @ 20 NONAME diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/eabi/simutilityu.def --- a/phonebookengines/eabi/simutilityu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/eabi/simutilityu.def Fri May 14 15:42:23 2010 +0300 @@ -23,4 +23,6 @@ _ZTI10SimUtility @ 22 NONAME _ZTV10SimUtility @ 23 NONAME _ZNK10SimUtility13isSimInsertedEv @ 24 NONAME + _ZN10SimUtility19adnCacheStatusReadyERNS_11CacheStatusEi @ 25 NONAME + _ZN10SimUtility20notifyAdnCacheStatusEv @ 26 NONAME diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntactions/inc/mobcntemailaction.h --- a/phonebookengines/mobcntactions/inc/mobcntemailaction.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntactions/inc/mobcntemailaction.h Fri May 14 15:42:23 2010 +0300 @@ -28,8 +28,9 @@ MobCntEmailAction(); ~MobCntEmailAction(); - bool supportsDetail(const QContactDetail& detail) const; QContactFilter contactFilter(const QVariant& value) const; + bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const; + QList supportedDetails(const QContact& contact) const; MobCntEmailAction* clone() const; void performAction(); }; diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntactions/inc/mobcntmessageaction.h --- a/phonebookengines/mobcntactions/inc/mobcntmessageaction.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntactions/inc/mobcntmessageaction.h Fri May 14 15:42:23 2010 +0300 @@ -28,6 +28,9 @@ MobCntMessageAction(); ~MobCntMessageAction(); + bool isDetailSupported(const QContactDetail &detail, const QContact &contact) const; + QList supportedDetails(const QContact& contact) const; + MobCntMessageAction* clone() const; void performAction(); }; diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntactions/src/mobcntaction.cpp --- a/phonebookengines/mobcntactions/src/mobcntaction.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntactions/src/mobcntaction.cpp Fri May 14 15:42:23 2010 +0300 @@ -96,9 +96,10 @@ return (detail.definitionName() == QContactPhoneNumber::DefinitionName); } -QList MobCntAction::supportedDetails(const QContact& /*contact*/) const +//virtual function, common code for call, videocall and message actions +QList MobCntAction::supportedDetails(const QContact& contact) const { - return QList(); + return contact.details(QContactPhoneNumber::DefinitionName); } QContactActionDescriptor MobCntAction::actionDescriptor() const diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntactions/src/mobcntemailaction.cpp --- a/phonebookengines/mobcntactions/src/mobcntemailaction.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntactions/src/mobcntemailaction.cpp Fri May 14 15:42:23 2010 +0300 @@ -32,11 +32,6 @@ { } -bool MobCntEmailAction::supportsDetail(const QContactDetail& detail) const -{ - return (detail.definitionName() == QContactEmailAddress::DefinitionName); -} - QContactFilter MobCntEmailAction::contactFilter(const QVariant& value) const { Q_UNUSED(value); @@ -47,6 +42,16 @@ return emailFilter; } +bool MobCntEmailAction::isDetailSupported(const QContactDetail &detail, const QContact &/*contact*/) const +{ + return (detail.definitionName() == QContactEmailAddress::DefinitionName); +} + +QList MobCntEmailAction::supportedDetails(const QContact& contact) const +{ + return contact.details(QContactEmailAddress::DefinitionName); +} + MobCntEmailAction* MobCntEmailAction::clone() const { return new MobCntEmailAction(); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntactions/src/mobcntmessageaction.cpp --- a/phonebookengines/mobcntactions/src/mobcntmessageaction.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntactions/src/mobcntmessageaction.cpp Fri May 14 15:42:23 2010 +0300 @@ -36,6 +36,34 @@ return new MobCntMessageAction(); } +bool MobCntMessageAction::isDetailSupported(const QContactDetail &detail, const QContact &/*contact*/) const +{ + if (detail.definitionName() == QContactPhoneNumber::DefinitionName + && !static_cast(detail).subTypes().isEmpty()) + { + return (static_cast(detail).subTypes().first() == QContactPhoneNumber::SubTypeMobile); + } + else + { + return false; + } +} + +QList MobCntMessageAction::supportedDetails(const QContact& contact) const +{ + QList details = contact.details(QContactPhoneNumber::DefinitionName); + QList supportedDetails; + for (int i = 0; i < details.count(); i++) + { + if (!static_cast(details[i]).subTypes().isEmpty() + && static_cast(details[i]).subTypes().first() == QContactPhoneNumber::SubTypeMobile) + { + supportedDetails.append(details[i]); + } + } + return supportedDetails; +} + void MobCntMessageAction::performAction() { QString service("com.nokia.services.hbserviceprovider.conversationview"); diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntmodel/inc/mobcntmodel.h --- a/phonebookengines/mobcntmodel/inc/mobcntmodel.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntmodel/inc/mobcntmodel.h Fri May 14 15:42:23 2010 +0300 @@ -19,7 +19,7 @@ #include #include -#include +#include #include "mobcntmodelglobal.h" #include @@ -99,7 +99,8 @@ private: QSharedDataPointer d; MobCntIconManager *mIconManager; - QIcon mDefaultIcon; + HbIcon mDefaultIcon; + HbIcon mDefaultMyCardIcon; }; #endif diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntmodel/src/mobcntmodel.cpp --- a/phonebookengines/mobcntmodel/src/mobcntmodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntmodel/src/mobcntmodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -42,7 +42,8 @@ mIconManager = new MobCntIconManager(); connect(mIconManager, SIGNAL(contactIconReady(int)), this, SLOT(updateContactIcon(int))); - mDefaultIcon = QIcon(":/icons/qtg_large_avatar.svg"); + mDefaultIcon = HbIcon("qtg_large_avatar"); + mDefaultMyCardIcon = HbIcon("qtg_large_mycard"); d = new MobCntModelData(contactFilter, contactSortOrders, showMyCard); d->m_contactManager = new QContactManager; @@ -71,7 +72,8 @@ mIconManager = new MobCntIconManager(); connect(mIconManager, SIGNAL(contactIconReady(int)), this, SLOT(updateContactIcon(int))); - mDefaultIcon = QIcon(":/icons/qtg_large_avatar.svg"); + mDefaultIcon = HbIcon("qtg_large_avatar"); + mDefaultMyCardIcon = HbIcon("qtg_large_mycard"); d = new MobCntModelData(contactFilter, contactSortOrders, showMyCard); d->m_contactManager = manager; @@ -117,8 +119,11 @@ definitionRestrictions.append(QContactAvatar::DefinitionName); definitionRestrictions.append(QContactPhoneNumber::DefinitionName); definitionRestrictions.append(QContactOrganization::DefinitionName); + QContactFetchHint restrictions; + restrictions.setDetailDefinitionsHint(definitionRestrictions); + restrictions.setOptimizationHints(QContactFetchHint::NoRelationships); - d->currentContact = d->m_contactManager->contact(d->contactIds[row], definitionRestrictions); + d->currentContact = d->m_contactManager->contact(d->contactIds[row], restrictions); } d->currentRow = row; } @@ -132,7 +137,7 @@ else if (role == Qt::BackgroundRole) { if (d->mMyCardId == d->contactIds[row] || dummyMyCardId == d->contactIds[row]) { - return HbFrameBackground("qtg_fr_groupbox", HbFrameDrawer::NinePieces); + return HbFrameBackground("qtg_fr_list_parent_normal", HbFrameDrawer::NinePieces); } } else if (role == Qt::DecorationRole) { @@ -142,14 +147,27 @@ if(!contactAvatar.imageUrl().isEmpty()) { QIcon icon = mIconManager->contactIcon(contactAvatar.imageUrl().toString(), row); if (icon.isNull()) { - icons.append(mDefaultIcon); + if (d->mMyCardId == d->contactIds[row] || + dummyMyCardId == d->contactIds[row]) { + icons.append(mDefaultMyCardIcon); + } + else { + icons.append(mDefaultIcon); + } } else { icons.append(icon); } } else { - icons.append(mDefaultIcon); + if (d->mMyCardId == d->contactIds[row] || + dummyMyCardId == d->contactIds[row]) { + icons.append(mDefaultMyCardIcon); + } + else { + icons.append(mDefaultIcon); + } + } return QVariant(icons); @@ -419,8 +437,8 @@ isSelfContact = true; if (d->currentContact.details().count() <= 4) { //empty card - name = tr("My card"); - number = tr("Create my identity"); + name = hbTrId("txt_phob_dblist_mycard"); + number = hbTrId("txt_phob_dblist_mycard_val_create_my_identity"); } else { isNonEmptySelfContact = true; @@ -500,8 +518,6 @@ if (contactIds.contains(d->mMyCardId)) d->mMyCardId = 0; - updateContactIdsArray(); - for (int i = (indexSequences.count() - 1);i >= 0; i--) { if (indexSequences.at(i).first() == 0 && d->showMyCard) { @@ -522,6 +538,7 @@ endRemoveRows(); } } + updateContactIdsArray(); } /*! diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/mobcntmodel/tsrc/ut_mobcntmodel/src/ut_mobcntmodel.cpp --- a/phonebookengines/mobcntmodel/tsrc/ut_mobcntmodel/src/ut_mobcntmodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/mobcntmodel/tsrc/ut_mobcntmodel/src/ut_mobcntmodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -28,7 +28,7 @@ mManager = new QContactManager("symbian"); QList ids = mManager->contactIds(); QMap errorMapInit; - mManager->removeContacts(&ids, &errorMapInit); + mManager->removeContacts(ids, &errorMapInit); } void TestMobCntModel::create() @@ -57,8 +57,8 @@ //create and save contact QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QContactPhoneNumber number; number.setNumber("1234567"); @@ -140,9 +140,7 @@ ret = mCntModel->data(modelIndex, Qt::DisplayRole); QVERIFY(ret.type() == QVariant::StringList); displayContent = ret.toStringList(); - QVERIFY(displayContent.count() == 2); - QVERIFY(displayContent.at(0) == "My card"); - QVERIFY(displayContent.at(1) == "Create my identity"); + QVERIFY(displayContent.count() == 2);// "My card" ; "Create my identity" // add some content to MyCard myCard.saveDetail(&number); @@ -157,26 +155,26 @@ void TestMobCntModel::rowCount() { // we should have 2 contacts in the model saved from the last test case - QCOMPARE(mCntModel->rowCount(),2); - QVERIFY(mCntModel->rowCount() == 2); + QCOMPARE(mCntModel->rowCount(),3); + QVERIFY(mCntModel->rowCount() == 3); } void TestMobCntModel::contact() { QList ids = mManager->contactIds(); QMap errorMapContact; - mManager->removeContacts(&ids,&errorMapContact); + mManager->removeContacts(ids,&errorMapContact); QTest::qWait(1000); QModelIndex modelIndex = mCntModel->index(0, 0); QContact empty = mCntModel->contact(modelIndex); - QVERIFY(empty.isEmpty()); + //QVERIFY(empty.isEmpty()); //create and save contact QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QContactPhoneNumber number; number.setNumber("1234567"); @@ -213,14 +211,14 @@ void TestMobCntModel::setFilterAndSortOrder() { - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); QTest::qWait(1000); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -261,14 +259,14 @@ mCntModel = new MobCntModel(mManager); - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); QTest::qWait(1000); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -302,14 +300,14 @@ void TestMobCntModel::rowId() { - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); QTest::qWait(1000); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -322,14 +320,14 @@ void TestMobCntModel::dataForDisplayRole() { - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); QTest::qWait(1000); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -343,14 +341,14 @@ void TestMobCntModel::updateContactIcon() { - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); QTest::qWait(1000); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -366,15 +364,15 @@ { QList ids = mManager->contactIds(); QMap errorMapHandleAdded; - mManager->removeContacts(&ids,&errorMapHandleAdded); + mManager->removeContacts(ids,&errorMapHandleAdded); QTest::qWait(1000); QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int))); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -385,19 +383,19 @@ { QList ids = mManager->contactIds(); QMap errorMapHandleChanged; - mManager->removeContacts(&ids,&errorMapHandleChanged); + mManager->removeContacts(ids,&errorMapHandleChanged); QTest::qWait(1000); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); QSignalSpy spy(mCntModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex&))); - name.setMiddle("mid"); + name.setMiddleName("mid"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -410,7 +408,7 @@ QList ids = mManager->contactIds(); QMap errorMapHandle; - mManager->removeContacts(&ids,&errorMapHandle); + mManager->removeContacts(ids,&errorMapHandle); QTest::qWait(1000); QCOMPARE(spy.count(), 1); @@ -418,14 +416,14 @@ void TestMobCntModel::handleMyCardChanged() { - QList ids = mManager->contacts(); + QList ids = mManager->contactIds(); mManager->removeContacts(&ids); QTest::qWait(1000); QContact c; QContactName name; - name.setFirst("firstname"); - name.setLast("lastname"); + name.setFirstName("firstname"); + name.setLastName("lastname"); c.saveDetail(&name); QVERIFY(mManager->saveContact(&c)); @@ -444,7 +442,8 @@ //let's have clean database after running tests QList ids = mManager->contactIds(); QMap errorMap; - mManager->removeContacts(&ids, &errorMap); + mManager->removeContacts(ids, &errorMap); delete mManager; + mManager = 0; } diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/simutility/inc/simutility.h --- a/phonebookengines/simutility/inc/simutility.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/simutility/inc/simutility.h Fri May 14 15:42:23 2010 +0300 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -38,7 +39,8 @@ enum ActiveRequest { ENoActiveRequest = 0, EGetInfo, - EGetAvailableStores + EGetAvailableStores, + EGetCacheStatus }; public: @@ -81,17 +83,24 @@ }; struct AvailableStores { + bool SimPresent; bool AdnStorePresent; bool SdnStorePresent; bool FdnStorePresent; AvailableStores() { + SimPresent = false; AdnStorePresent = false; SdnStorePresent = false; FdnStorePresent = false; }; }; + enum CacheStatus { + ECacheReady, + ECacheFailed + }; + public: SimUtility(StoreType type, int& error, QObject *parent = 0); ~SimUtility(); @@ -106,6 +115,7 @@ //async request bool startGetSimInfo(); bool startGetAvailableStores(); + bool notifyAdnCacheStatus(); public: void RequestCompleted(int error); @@ -113,6 +123,7 @@ signals: void simInfoReady(SimUtility::SimInfo& simInfo, int error); void availableStoresReady(SimUtility::AvailableStores& availableStores, int error); + void adnCacheStatusReady(SimUtility::CacheStatus& cacheStatus, int error); private: void ParseServiceTable(AvailableStores* availableStores) const; @@ -127,6 +138,8 @@ RMobilePhone::TMobilePhoneServiceTableV1 m_serviceTable; RMobilePhone::TMobilePhoneServiceTableV1Pckg m_serviceTablePckg; RMobilePhone::TMobilePhoneServiceTable m_serviceTableType; + RMmCustomAPI m_customPhone; + TName m_etelStoreNameCached; AsyncWorker* m_asyncWorker; int m_activeRequest; diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/simutility/simutility.pro --- a/phonebookengines/simutility/simutility.pro Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/simutility/simutility.pro Fri May 14 15:42:23 2010 +0300 @@ -41,4 +41,5 @@ LIBS += -letel \ -letelmm \ - -lsecui + -lsecui \ + -lcustomapi diff -r de1630741fbe -r 2a11b5b00470 phonebookengines/simutility/src/simutility.cpp --- a/phonebookengines/simutility/src/simutility.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookengines/simutility/src/simutility.cpp Fri May 14 15:42:23 2010 +0300 @@ -23,8 +23,15 @@ : QObject(parent), m_etelStoreInfoPckg(m_etelStoreInfo), m_serviceTablePckg(m_serviceTable), - m_activeRequest(ENoActiveRequest) + m_asyncWorker(NULL), + m_activeRequest(ENoActiveRequest), + m_securitySettings(NULL) { +#ifdef __WINS__ + error = KErrNotSupported; + return; +#endif + error = m_etelServer.Connect(); if (error == KErrNone) { error = m_etelServer.LoadPhoneModule(KMmTsyModuleName); @@ -53,6 +60,10 @@ } if (error == KErrNone) { + error = m_customPhone.Open(m_etelPhone); + } + + if (error == KErrNone) { TRAP(error, m_asyncWorker = new (ELeave)AsyncWorker(this); TSecUi::InitializeLibL(); @@ -194,6 +205,47 @@ return true; } +bool SimUtility::notifyAdnCacheStatus() +{ + if(m_asyncWorker->IsActive()) { + return false; + } + CacheStatus cacheStatus; + + //check current cache status + TRequestStatus requestStatus; + RMmCustomAPI::TPndCacheStatus pndStatus; + TName storeName; + storeName.Copy(KETelIccAdnPhoneBook); + m_customPhone.GetPndCacheStatus(requestStatus, pndStatus, storeName); + User::WaitForRequest(requestStatus); + if (requestStatus.Int() != KErrNone) { + return false; + } + + if (pndStatus == RMmCustomAPI::ECacheReady || + pndStatus == RMmCustomAPI::ECacheNotUsed) { + cacheStatus = ECacheReady; + emit adnCacheStatusReady(cacheStatus, KErrNone); + return true; + } + else if (pndStatus == RMmCustomAPI::ECacheFailed) { + cacheStatus = ECacheFailed; + emit adnCacheStatusReady(cacheStatus, KErrNone); + return true; + } + else if (pndStatus == RMmCustomAPI::ECacheNotReady) { + //wait for cache notification + m_customPhone.NotifyPndCacheReady(m_asyncWorker->iStatus, m_etelStoreNameCached); + m_asyncWorker->SetActive(); + m_activeRequest = EGetCacheStatus; + return true; + } + else { + return false; + } +} + void SimUtility::RequestCompleted(int error) { if (m_activeRequest == EGetInfo) { @@ -219,23 +271,40 @@ AvailableStores availableStores; if (error == KErrNone) { //parse service table to find what stores are supported - ParseServiceTable(&availableStores); + ParseServiceTable(&availableStores); } emit availableStoresReady(availableStores, error); }//EGetAvailableStores + else if (m_activeRequest == EGetCacheStatus) { + if ( m_etelStoreNameCached.Compare(KETelIccAdnPhoneBook) == 0) { + //ADN cache is ready + CacheStatus cacheStatus; + if (error != KErrNone) { + cacheStatus = ECacheFailed; + emit adnCacheStatusReady(cacheStatus, error); + } + else { + cacheStatus = ECacheReady; + emit adnCacheStatusReady(cacheStatus, error); + } + } + else { + //another store is cached, continue listening for ADN cache + notifyAdnCacheStatus(); + } + }//EGetCacheStatus - m_activeRequest = ENoActiveRequest; + if (!m_asyncWorker->IsActive()) { + m_activeRequest = ENoActiveRequest; + } } void SimUtility::ParseServiceTable(AvailableStores* availableStores) const { + availableStores->SimPresent = true; if (m_serviceTableType == RMobilePhone::EUSIMServiceTable) { - if (m_serviceTable.iServices1To8 & RMobilePhone::KUstLocalPhBk ) { - availableStores->AdnStorePresent = true; - } - else { - availableStores->AdnStorePresent = false; - } + //ADN store is always present if SIM card is inserted + availableStores->AdnStorePresent = true; if (m_serviceTable.iServices1To8 & RMobilePhone::KUstSDN ) { availableStores->SdnStorePresent = true; @@ -252,12 +321,8 @@ } } else if (m_serviceTableType == RMobilePhone::ESIMServiceTable) { - if (m_serviceTable.iServices1To8 & RMobilePhone::KSstADN ) { - availableStores->AdnStorePresent = true; - } - else { - availableStores->AdnStorePresent = false; - } + //ADN store is always present if SIM card is inserted + availableStores->AdnStorePresent = true; if (m_serviceTable.iServices17To24 & RMobilePhone::KSstSDN) { availableStores->SdnStorePresent = true; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/bwins/cnthistorymodelu.def --- a/phonebookui/bwins/cnthistorymodelu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/bwins/cnthistorymodelu.def Fri May 14 15:42:23 2010 +0300 @@ -1,37 +1,37 @@ EXPORTS - ?clearHistory@CntHistoryModel@@QAEXXZ @ 1 NONAME ; void CntHistoryModel::clearHistory(void) - ??1CntHistoryModel@@UAE@XZ @ 2 NONAME ; CntHistoryModel::~CntHistoryModel(void) - ?messageAdded@CntHistoryModel@@AAEXAAVMsgItem@@@Z @ 3 NONAME ; void CntHistoryModel::messageAdded(class MsgItem &) - ?qt_metacast@CntHistoryModel@@UAEPAXPBD@Z @ 4 NONAME ; void * CntHistoryModel::qt_metacast(char const *) - ?validateRowIndex@CntHistoryModel@@ABE_NH@Z @ 5 NONAME ; bool CntHistoryModel::validateRowIndex(int) const - ?metaObject@CntHistoryModel@@UBEPBUQMetaObject@@XZ @ 6 NONAME ; struct QMetaObject const * CntHistoryModel::metaObject(void) const - ?messageChanged@CntHistoryModel@@AAEXAAVMsgItem@@@Z @ 7 NONAME ; void CntHistoryModel::messageChanged(class MsgItem &) - ?readLogEvent@CntHistoryModel@@AAEXPAVLogsEvent@@AAVHistoryItem@@@Z @ 8 NONAME ; void CntHistoryModel::readLogEvent(class LogsEvent *, class HistoryItem &) - ?qt_metacall@CntHistoryModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 9 NONAME ; int CntHistoryModel::qt_metacall(enum QMetaObject::Call, int, void * *) - ?messagesReady@CntHistoryModel@@AAEXAAV?$QList@VMsgItem@@@@@Z @ 10 NONAME ; void CntHistoryModel::messagesReady(class QList &) - ?staticMetaObject@CntHistoryModel@@2UQMetaObject@@B @ 11 NONAME ; struct QMetaObject const CntHistoryModel::staticMetaObject - ?sort@CntHistoryModel@@UAEXHW4SortOrder@Qt@@@Z @ 12 NONAME ; void CntHistoryModel::sort(int, enum Qt::SortOrder) - ?trUtf8@CntHistoryModel@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString CntHistoryModel::trUtf8(char const *, char const *) - ?tr@CntHistoryModel@@SA?AVQString@@PBD0@Z @ 14 NONAME ; class QString CntHistoryModel::tr(char const *, char const *) - ?initializeLogsModel@CntHistoryModel@@AAEXXZ @ 15 NONAME ; void CntHistoryModel::initializeLogsModel(void) - ?trUtf8@CntHistoryModel@@SA?AVQString@@PBD0H@Z @ 16 NONAME ; class QString CntHistoryModel::trUtf8(char const *, char const *, int) - ?sortAndRefresh@CntHistoryModel@@QAEXW4SortOrder@Qt@@@Z @ 17 NONAME ; void CntHistoryModel::sortAndRefresh(enum Qt::SortOrder) - ?markAllAsSeen@CntHistoryModel@@QAEXXZ @ 18 NONAME ; void CntHistoryModel::markAllAsSeen(void) - ??0CntHistoryModel@@QAE@IPAVQContactManager@QtMobility@@PAVQObject@@@Z @ 19 NONAME ; CntHistoryModel::CntHistoryModel(unsigned int, class QtMobility::QContactManager *, class QObject *) - ?data@CntHistoryModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 20 NONAME ; class QVariant CntHistoryModel::data(class QModelIndex const &, int) const - ?markingCompleted@CntHistoryModel@@AAEXH@Z @ 21 NONAME ; void CntHistoryModel::markingCompleted(int) - ?initializeMsgModel@CntHistoryModel@@AAEXXZ @ 22 NONAME ; void CntHistoryModel::initializeMsgModel(void) - ?findIndices@CntHistoryModel@@AAE?AV?$QList@V?$QList@H@@@@ABV?$QList@H@@@Z @ 23 NONAME ; class QList > CntHistoryModel::findIndices(class QList const &) - ??_ECntHistoryModel@@UAE@I@Z @ 24 NONAME ; CntHistoryModel::~CntHistoryModel(unsigned int) - ?displayRoleData@CntHistoryModel@@ABE?AVQVariant@@ABVHistoryItem@@@Z @ 25 NONAME ; class QVariant CntHistoryModel::displayRoleData(class HistoryItem const &) const - ?initializeModel@CntHistoryModel@@AAEXXZ @ 26 NONAME ; void CntHistoryModel::initializeModel(void) - ?rowCount@CntHistoryModel@@UBEHABVQModelIndex@@@Z @ 27 NONAME ; int CntHistoryModel::rowCount(class QModelIndex const &) const - ?logsRowsRemoved@CntHistoryModel@@AAEXABVQModelIndex@@HH@Z @ 28 NONAME ; void CntHistoryModel::logsRowsRemoved(class QModelIndex const &, int, int) - ?readMsgEvent@CntHistoryModel@@AAEXAAVMsgItem@@AAVHistoryItem@@@Z @ 29 NONAME ; void CntHistoryModel::readMsgEvent(class MsgItem &, class HistoryItem &) - ?messageDeleted@CntHistoryModel@@AAEXAAVMsgItem@@@Z @ 30 NONAME ; void CntHistoryModel::messageDeleted(class MsgItem &) - ?tr@CntHistoryModel@@SA?AVQString@@PBD0H@Z @ 31 NONAME ; class QString CntHistoryModel::tr(char const *, char const *, int) - ?getStaticMetaObject@CntHistoryModel@@SAABUQMetaObject@@XZ @ 32 NONAME ; struct QMetaObject const & CntHistoryModel::getStaticMetaObject(void) - ?logsDataChanged@CntHistoryModel@@AAEXABVQModelIndex@@0@Z @ 33 NONAME ; void CntHistoryModel::logsDataChanged(class QModelIndex const &, class QModelIndex const &) - ?clearedCallLogs@CntHistoryModel@@AAEXH@Z @ 34 NONAME ; void CntHistoryModel::clearedCallLogs(int) - ?logsRowsInserted@CntHistoryModel@@AAEXABVQModelIndex@@HH@Z @ 35 NONAME ; void CntHistoryModel::logsRowsInserted(class QModelIndex const &, int, int) + ?initializeModel@CntHistoryModel@@AAEXXZ @ 1 NONAME ; void CntHistoryModel::initializeModel(void) + ?rowCount@CntHistoryModel@@UBEHABVQModelIndex@@@Z @ 2 NONAME ; int CntHistoryModel::rowCount(class QModelIndex const &) const + ?clearHistory@CntHistoryModel@@QAEXXZ @ 3 NONAME ; void CntHistoryModel::clearHistory(void) + ?logsRowsRemoved@CntHistoryModel@@AAEXABVQModelIndex@@HH@Z @ 4 NONAME ; void CntHistoryModel::logsRowsRemoved(class QModelIndex const &, int, int) + ??1CntHistoryModel@@UAE@XZ @ 5 NONAME ; CntHistoryModel::~CntHistoryModel(void) + ?messageAdded@CntHistoryModel@@AAEXAAVMsgItem@@@Z @ 6 NONAME ; void CntHistoryModel::messageAdded(class MsgItem &) + ?qt_metacast@CntHistoryModel@@UAEPAXPBD@Z @ 7 NONAME ; void * CntHistoryModel::qt_metacast(char const *) + ?validateRowIndex@CntHistoryModel@@ABE_NH@Z @ 8 NONAME ; bool CntHistoryModel::validateRowIndex(int) const + ?metaObject@CntHistoryModel@@UBEPBUQMetaObject@@XZ @ 9 NONAME ; struct QMetaObject const * CntHistoryModel::metaObject(void) const + ?messageChanged@CntHistoryModel@@AAEXAAVMsgItem@@@Z @ 10 NONAME ; void CntHistoryModel::messageChanged(class MsgItem &) + ?readLogEvent@CntHistoryModel@@AAEXPAVLogsEvent@@AAVHistoryItem@@@Z @ 11 NONAME ; void CntHistoryModel::readLogEvent(class LogsEvent *, class HistoryItem &) + ?qt_metacall@CntHistoryModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 12 NONAME ; int CntHistoryModel::qt_metacall(enum QMetaObject::Call, int, void * *) + ?messagesReady@CntHistoryModel@@AAEXAAV?$QList@VMsgItem@@@@@Z @ 13 NONAME ; void CntHistoryModel::messagesReady(class QList &) + ?staticMetaObject@CntHistoryModel@@2UQMetaObject@@B @ 14 NONAME ; struct QMetaObject const CntHistoryModel::staticMetaObject + ?readMsgEvent@CntHistoryModel@@AAEXAAVMsgItem@@AAVHistoryItem@@@Z @ 15 NONAME ; void CntHistoryModel::readMsgEvent(class MsgItem &, class HistoryItem &) + ?decorationRoleData@CntHistoryModel@@ABE?AVQVariant@@ABVHistoryItem@@@Z @ 16 NONAME ; class QVariant CntHistoryModel::decorationRoleData(class HistoryItem const &) const + ?sort@CntHistoryModel@@UAEXHW4SortOrder@Qt@@@Z @ 17 NONAME ; void CntHistoryModel::sort(int, enum Qt::SortOrder) + ?messageDeleted@CntHistoryModel@@AAEXAAVMsgItem@@@Z @ 18 NONAME ; void CntHistoryModel::messageDeleted(class MsgItem &) + ?trUtf8@CntHistoryModel@@SA?AVQString@@PBD0@Z @ 19 NONAME ; class QString CntHistoryModel::trUtf8(char const *, char const *) + ?backgroundRoleData@CntHistoryModel@@ABE?AVQVariant@@ABVHistoryItem@@@Z @ 20 NONAME ; class QVariant CntHistoryModel::backgroundRoleData(class HistoryItem const &) const + ?tr@CntHistoryModel@@SA?AVQString@@PBD0H@Z @ 21 NONAME ; class QString CntHistoryModel::tr(char const *, char const *, int) + ?tr@CntHistoryModel@@SA?AVQString@@PBD0@Z @ 22 NONAME ; class QString CntHistoryModel::tr(char const *, char const *) + ?getStaticMetaObject@CntHistoryModel@@SAABUQMetaObject@@XZ @ 23 NONAME ; struct QMetaObject const & CntHistoryModel::getStaticMetaObject(void) + ?initializeLogsModel@CntHistoryModel@@AAEXXZ @ 24 NONAME ; void CntHistoryModel::initializeLogsModel(void) + ?trUtf8@CntHistoryModel@@SA?AVQString@@PBD0H@Z @ 25 NONAME ; class QString CntHistoryModel::trUtf8(char const *, char const *, int) + ?sortAndRefresh@CntHistoryModel@@QAEXW4SortOrder@Qt@@@Z @ 26 NONAME ; void CntHistoryModel::sortAndRefresh(enum Qt::SortOrder) + ?logsDataChanged@CntHistoryModel@@AAEXABVQModelIndex@@0@Z @ 27 NONAME ; void CntHistoryModel::logsDataChanged(class QModelIndex const &, class QModelIndex const &) + ?markAllAsSeen@CntHistoryModel@@QAEXXZ @ 28 NONAME ; void CntHistoryModel::markAllAsSeen(void) + ??0CntHistoryModel@@QAE@IPAVQContactManager@QtMobility@@PAVQObject@@@Z @ 29 NONAME ; CntHistoryModel::CntHistoryModel(unsigned int, class QtMobility::QContactManager *, class QObject *) + ?data@CntHistoryModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 30 NONAME ; class QVariant CntHistoryModel::data(class QModelIndex const &, int) const + ?logsRowsInserted@CntHistoryModel@@AAEXABVQModelIndex@@HH@Z @ 31 NONAME ; void CntHistoryModel::logsRowsInserted(class QModelIndex const &, int, int) + ?initializeMsgModel@CntHistoryModel@@AAEXXZ @ 32 NONAME ; void CntHistoryModel::initializeMsgModel(void) + ?findIndices@CntHistoryModel@@AAE?AV?$QList@V?$QList@H@@@@ABV?$QList@H@@@Z @ 33 NONAME ; class QList > CntHistoryModel::findIndices(class QList const &) + ??_ECntHistoryModel@@UAE@I@Z @ 34 NONAME ; CntHistoryModel::~CntHistoryModel(unsigned int) + ?displayRoleData@CntHistoryModel@@ABE?AVQVariant@@ABVHistoryItem@@@Z @ 35 NONAME ; class QVariant CntHistoryModel::displayRoleData(class HistoryItem const &) const diff -r de1630741fbe -r 2a11b5b00470 phonebookui/bwins/pbkcommonuiu.def --- a/phonebookui/bwins/pbkcommonuiu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/bwins/pbkcommonuiu.def Fri May 14 15:42:23 2010 +0300 @@ -30,92 +30,92 @@ ?trUtf8@CntMainWindow@@SA?AVQString@@PBD0H@Z @ 29 NONAME ; class QString CntMainWindow::trUtf8(char const *, char const *, int) ?trUtf8@CntEditView@@SA?AVQString@@PBD0H@Z @ 30 NONAME ; class QString CntEditView::trUtf8(char const *, char const *, int) ??1CntEditView@@UAE@XZ @ 31 NONAME ; CntEditView::~CntEditView(void) - ?qt_metacast@CntBaseSelectionView@@UAEPAXPBD@Z @ 32 NONAME ; void * CntBaseSelectionView::qt_metacast(char const *) - ?deactivate@CntBaseSelectionView@@UAEXXZ @ 33 NONAME ; void CntBaseSelectionView::deactivate(void) - ?metaObject@CntBaseSelectionView@@UBEPBUQMetaObject@@XZ @ 34 NONAME ; struct QMetaObject const * CntBaseSelectionView::metaObject(void) const - ?setViewFactory@CntDefaultViewManager@@QAEXPAVCntAbstractViewFactory@@@Z @ 35 NONAME ; void CntDefaultViewManager::setViewFactory(class CntAbstractViewFactory *) - ?d_func@CntEditView@@ABEPBVCntEditViewPrivate@@XZ @ 36 NONAME ; class CntEditViewPrivate const * CntEditView::d_func(void) const - ?backPressed@CntContactCardView@@IAEXXZ @ 37 NONAME ; void CntContactCardView::backPressed(void) - ?qt_metacall@CntViewNavigator@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 38 NONAME ; int CntViewNavigator::qt_metacall(enum QMetaObject::Call, int, void * *) - ?activate@CntBaseSelectionView@@UAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 39 NONAME ; void CntBaseSelectionView::activate(class CntAbstractViewManager *, class QMap) - ?tr@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 40 NONAME ; class QString CntViewNavigator::tr(char const *, char const *) - ?tr@CntDefaultViewManager@@SA?AVQString@@PBD0H@Z @ 41 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *, int) - ?getStaticMetaObject@CntViewNavigator@@SAABUQMetaObject@@XZ @ 42 NONAME ; struct QMetaObject const & CntViewNavigator::getStaticMetaObject(void) - ?viewId@CntEditView@@UBEHXZ @ 43 NONAME ; int CntEditView::viewId(void) const - ?tr@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 44 NONAME ; class QString CntViewNavigator::tr(char const *, char const *, int) - ?qt_metacast@CntDefaultViewManager@@UAEPAXPBD@Z @ 45 NONAME ; void * CntDefaultViewManager::qt_metacast(char const *) - ?qt_metacast@CntContactCardView@@UAEPAXPBD@Z @ 46 NONAME ; void * CntContactCardView::qt_metacast(char const *) - ?activate@CntEditView@@UAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 47 NONAME ; void CntEditView::activate(class CntAbstractViewManager *, class QMap) - ?qt_metacall@CntDefaultViewManager@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 48 NONAME ; int CntDefaultViewManager::qt_metacall(enum QMetaObject::Call, int, void * *) - ?viewClosed@CntBaseSelectionView@@IAEXXZ @ 49 NONAME ; void CntBaseSelectionView::viewClosed(void) - ?qt_metacast@CntViewNavigator@@UAEPAXPBD@Z @ 50 NONAME ; void * CntViewNavigator::qt_metacast(char const *) - ??0CntEditView@@QAE@XZ @ 51 NONAME ; CntEditView::CntEditView(void) - ?view@CntContactCardView@@UBEPAVHbView@@XZ @ 52 NONAME ; class HbView * CntContactCardView::view(void) const - ?keyPressed@CntMainWindow@@IAEXPAVQKeyEvent@@@Z @ 53 NONAME ; void CntMainWindow::keyPressed(class QKeyEvent *) - ?tr@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 54 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *, int) - ?metaObject@CntContactCardView@@UBEPBUQMetaObject@@XZ @ 55 NONAME ; struct QMetaObject const * CntContactCardView::metaObject(void) const - ?tr@CntContactCardView@@SA?AVQString@@PBD0H@Z @ 56 NONAME ; class QString CntContactCardView::tr(char const *, char const *, int) - ?tr@CntContactCardView@@SA?AVQString@@PBD0@Z @ 57 NONAME ; class QString CntContactCardView::tr(char const *, char const *) - ?tr@CntEditView@@SA?AVQString@@PBD0@Z @ 58 NONAME ; class QString CntEditView::tr(char const *, char const *) - ??0CntViewNavigator@@QAE@PAVQObject@@@Z @ 59 NONAME ; CntViewNavigator::CntViewNavigator(class QObject *) - ?d_func@CntContactCardView@@AAEPAVCntContactCardViewPrivate@@XZ @ 60 NONAME ; class CntContactCardViewPrivate * CntContactCardView::d_func(void) - ?metaObject@CntViewNavigator@@UBEPBUQMetaObject@@XZ @ 61 NONAME ; struct QMetaObject const * CntViewNavigator::metaObject(void) const - ?staticMetaObject@CntContactCardView@@2UQMetaObject@@B @ 62 NONAME ; struct QMetaObject const CntContactCardView::staticMetaObject - ?d_func@CntContactCardView@@ABEPBVCntContactCardViewPrivate@@XZ @ 63 NONAME ; class CntContactCardViewPrivate const * CntContactCardView::d_func(void) const - ?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 64 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *, int) - ?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 65 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *) - ?tr@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 66 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *) - ?getStaticMetaObject@CntBaseSelectionView@@SAABUQMetaObject@@XZ @ 67 NONAME ; struct QMetaObject const & CntBaseSelectionView::getStaticMetaObject(void) - ??0CntDefaultViewManager@@QAE@PAVHbMainWindow@@@Z @ 68 NONAME ; CntDefaultViewManager::CntDefaultViewManager(class HbMainWindow *) - ?createView@CntDefaultViewFactory@@UAEPAVCntAbstractView@@H@Z @ 69 NONAME ; class CntAbstractView * CntDefaultViewFactory::createView(int) - ?next@CntViewNavigator@@QAEXABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 70 NONAME ; void CntViewNavigator::next(int const &, class QFlags &) - ?qt_metacast@CntEditView@@UAEPAXPBD@Z @ 71 NONAME ; void * CntEditView::qt_metacast(char const *) - ?switchView@CntDefaultViewManager@@AAEXV?$QMap@HVQVariant@@@@V?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 72 NONAME ; void CntDefaultViewManager::switchView(class QMap, class QFlags) - ?contactManager@CntDefaultViewManager@@UAEPAVQContactManager@QtMobility@@ABVQString@@@Z @ 73 NONAME ; class QtMobility::QContactManager * CntDefaultViewManager::contactManager(class QString const &) - ?contactUpdated@CntEditView@@IAEXXZ @ 74 NONAME ; void CntEditView::contactUpdated(void) - ?deactivate@CntEditView@@UAEXXZ @ 75 NONAME ; void CntEditView::deactivate(void) - ?addEffect@CntViewNavigator@@QAEXABH0@Z @ 76 NONAME ; void CntViewNavigator::addEffect(int const &, int const &) - ?trUtf8@CntContactCardView@@SA?AVQString@@PBD0@Z @ 77 NONAME ; class QString CntContactCardView::trUtf8(char const *, char const *) - ?staticMetaObject@CntDefaultViewManager@@2UQMetaObject@@B @ 78 NONAME ; struct QMetaObject const CntDefaultViewManager::staticMetaObject - ?removeException@CntViewNavigator@@QAEXABH@Z @ 79 NONAME ; void CntViewNavigator::removeException(int const &) - ?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 80 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *) - ?metaObject@CntEditView@@UBEPBUQMetaObject@@XZ @ 81 NONAME ; struct QMetaObject const * CntEditView::metaObject(void) const - ?viewOpened@CntBaseSelectionView@@IAEXV?$QMap@HVQVariant@@@@@Z @ 82 NONAME ; void CntBaseSelectionView::viewOpened(class QMap) - ??_ECntMainWindow@@UAE@I@Z @ 83 NONAME ; CntMainWindow::~CntMainWindow(unsigned int) - ??1CntDefaultViewManager@@UAE@XZ @ 84 NONAME ; CntDefaultViewManager::~CntDefaultViewManager(void) - ?metaObject@CntMainWindow@@UBEPBUQMetaObject@@XZ @ 85 NONAME ; struct QMetaObject const * CntMainWindow::metaObject(void) const - ?back@CntViewNavigator@@QAEABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 86 NONAME ; int const & CntViewNavigator::back(class QFlags &) - ??0CntContactCardView@@QAE@XZ @ 87 NONAME ; CntContactCardView::CntContactCardView(void) - ?metaObject@CntDefaultViewManager@@UBEPBUQMetaObject@@XZ @ 88 NONAME ; struct QMetaObject const * CntDefaultViewManager::metaObject(void) const - ?deactivate@CntContactCardView@@UAEXXZ @ 89 NONAME ; void CntContactCardView::deactivate(void) - ?changeView@CntDefaultViewManager@@UAEXV?$QMap@HVQVariant@@@@@Z @ 90 NONAME ; void CntDefaultViewManager::changeView(class QMap) - ?getStaticMetaObject@CntDefaultViewManager@@SAABUQMetaObject@@XZ @ 91 NONAME ; struct QMetaObject const & CntDefaultViewManager::getStaticMetaObject(void) - ?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 92 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *, int) - ??_ECntContactCardView@@UAE@I@Z @ 93 NONAME ; CntContactCardView::~CntContactCardView(unsigned int) - ?tr@CntEditView@@SA?AVQString@@PBD0H@Z @ 94 NONAME ; class QString CntEditView::tr(char const *, char const *, int) - ?staticMetaObject@CntViewNavigator@@2UQMetaObject@@B @ 95 NONAME ; struct QMetaObject const CntViewNavigator::staticMetaObject - ?qt_metacall@CntEditView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 96 NONAME ; int CntEditView::qt_metacall(enum QMetaObject::Call, int, void * *) - ?getStaticMetaObject@CntEditView@@SAABUQMetaObject@@XZ @ 97 NONAME ; struct QMetaObject const & CntEditView::getStaticMetaObject(void) - ?trUtf8@CntEditView@@SA?AVQString@@PBD0@Z @ 98 NONAME ; class QString CntEditView::trUtf8(char const *, char const *) - ?qt_metacast@CntMainWindow@@UAEPAXPBD@Z @ 99 NONAME ; void * CntMainWindow::qt_metacast(char const *) - ??1CntViewNavigator@@UAE@XZ @ 100 NONAME ; CntViewNavigator::~CntViewNavigator(void) - ?qt_metacall@CntContactCardView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 101 NONAME ; int CntContactCardView::qt_metacall(enum QMetaObject::Call, int, void * *) - ?qt_metacall@CntMainWindow@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 102 NONAME ; int CntMainWindow::qt_metacall(enum QMetaObject::Call, int, void * *) - ?trUtf8@CntMainWindow@@SA?AVQString@@PBD0@Z @ 103 NONAME ; class QString CntMainWindow::trUtf8(char const *, char const *) - ?isDefault@CntBaseSelectionView@@UBE_NXZ @ 104 NONAME ; bool CntBaseSelectionView::isDefault(void) const - ?staticMetaObject@CntMainWindow@@2UQMetaObject@@B @ 105 NONAME ; struct QMetaObject const CntMainWindow::staticMetaObject - ??1CntBaseSelectionView@@UAE@XZ @ 106 NONAME ; CntBaseSelectionView::~CntBaseSelectionView(void) - ??1CntContactCardView@@UAE@XZ @ 107 NONAME ; CntContactCardView::~CntContactCardView(void) - ?isDefault@CntContactCardView@@UBE_NXZ @ 108 NONAME ; bool CntContactCardView::isDefault(void) const - ?tr@CntMainWindow@@SA?AVQString@@PBD0H@Z @ 109 NONAME ; class QString CntMainWindow::tr(char const *, char const *, int) - ?createPluginView@CntDefaultViewFactory@@AAEPAVCntAbstractView@@H@Z @ 110 NONAME ; class CntAbstractView * CntDefaultViewFactory::createPluginView(int) - ??_ECntEditView@@UAE@I@Z @ 111 NONAME ; CntEditView::~CntEditView(unsigned int) - ??0CntBaseSelectionView@@QAE@XZ @ 112 NONAME ; CntBaseSelectionView::CntBaseSelectionView(void) - ??0CntMainWindow@@QAE@PAVQWidget@@H@Z @ 113 NONAME ; CntMainWindow::CntMainWindow(class QWidget *, int) - ?getStaticMetaObject@CntMainWindow@@SAABUQMetaObject@@XZ @ 114 NONAME ; struct QMetaObject const & CntMainWindow::getStaticMetaObject(void) - ?tr@CntDefaultViewManager@@SA?AVQString@@PBD0@Z @ 115 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *) - ?removeCurrentView@CntDefaultViewManager@@AAEXXZ @ 116 NONAME ; void CntDefaultViewManager::removeCurrentView(void) - ?contactRemoved@CntEditView@@IAEXXZ @ 117 NONAME ; void CntEditView::contactRemoved(void) + ?contactUpdated@CntEditView@@IAEX_N@Z @ 32 NONAME ; void CntEditView::contactUpdated(bool) + ?qt_metacast@CntBaseSelectionView@@UAEPAXPBD@Z @ 33 NONAME ; void * CntBaseSelectionView::qt_metacast(char const *) + ?deactivate@CntBaseSelectionView@@UAEXXZ @ 34 NONAME ; void CntBaseSelectionView::deactivate(void) + ?metaObject@CntBaseSelectionView@@UBEPBUQMetaObject@@XZ @ 35 NONAME ; struct QMetaObject const * CntBaseSelectionView::metaObject(void) const + ?setViewFactory@CntDefaultViewManager@@QAEXPAVCntAbstractViewFactory@@@Z @ 36 NONAME ; void CntDefaultViewManager::setViewFactory(class CntAbstractViewFactory *) + ?d_func@CntEditView@@ABEPBVCntEditViewPrivate@@XZ @ 37 NONAME ; class CntEditViewPrivate const * CntEditView::d_func(void) const + ?backPressed@CntContactCardView@@IAEXXZ @ 38 NONAME ; void CntContactCardView::backPressed(void) + ?qt_metacall@CntViewNavigator@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 39 NONAME ; int CntViewNavigator::qt_metacall(enum QMetaObject::Call, int, void * *) + ?activate@CntBaseSelectionView@@UAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 40 NONAME ; void CntBaseSelectionView::activate(class CntAbstractViewManager *, class QMap) + ?tr@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 41 NONAME ; class QString CntViewNavigator::tr(char const *, char const *) + ?tr@CntDefaultViewManager@@SA?AVQString@@PBD0H@Z @ 42 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *, int) + ?getStaticMetaObject@CntViewNavigator@@SAABUQMetaObject@@XZ @ 43 NONAME ; struct QMetaObject const & CntViewNavigator::getStaticMetaObject(void) + ?viewId@CntEditView@@UBEHXZ @ 44 NONAME ; int CntEditView::viewId(void) const + ?tr@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 45 NONAME ; class QString CntViewNavigator::tr(char const *, char const *, int) + ?qt_metacast@CntDefaultViewManager@@UAEPAXPBD@Z @ 46 NONAME ; void * CntDefaultViewManager::qt_metacast(char const *) + ?qt_metacast@CntContactCardView@@UAEPAXPBD@Z @ 47 NONAME ; void * CntContactCardView::qt_metacast(char const *) + ?activate@CntEditView@@UAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 48 NONAME ; void CntEditView::activate(class CntAbstractViewManager *, class QMap) + ?qt_metacall@CntDefaultViewManager@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 49 NONAME ; int CntDefaultViewManager::qt_metacall(enum QMetaObject::Call, int, void * *) + ?viewClosed@CntBaseSelectionView@@IAEXXZ @ 50 NONAME ; void CntBaseSelectionView::viewClosed(void) + ?qt_metacast@CntViewNavigator@@UAEPAXPBD@Z @ 51 NONAME ; void * CntViewNavigator::qt_metacast(char const *) + ??0CntEditView@@QAE@XZ @ 52 NONAME ; CntEditView::CntEditView(void) + ?view@CntContactCardView@@UBEPAVHbView@@XZ @ 53 NONAME ; class HbView * CntContactCardView::view(void) const + ?keyPressed@CntMainWindow@@IAEXPAVQKeyEvent@@@Z @ 54 NONAME ; void CntMainWindow::keyPressed(class QKeyEvent *) + ?tr@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 55 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *, int) + ?metaObject@CntContactCardView@@UBEPBUQMetaObject@@XZ @ 56 NONAME ; struct QMetaObject const * CntContactCardView::metaObject(void) const + ?tr@CntContactCardView@@SA?AVQString@@PBD0H@Z @ 57 NONAME ; class QString CntContactCardView::tr(char const *, char const *, int) + ?tr@CntContactCardView@@SA?AVQString@@PBD0@Z @ 58 NONAME ; class QString CntContactCardView::tr(char const *, char const *) + ?tr@CntEditView@@SA?AVQString@@PBD0@Z @ 59 NONAME ; class QString CntEditView::tr(char const *, char const *) + ??0CntViewNavigator@@QAE@PAVQObject@@@Z @ 60 NONAME ; CntViewNavigator::CntViewNavigator(class QObject *) + ?d_func@CntContactCardView@@AAEPAVCntContactCardViewPrivate@@XZ @ 61 NONAME ; class CntContactCardViewPrivate * CntContactCardView::d_func(void) + ?metaObject@CntViewNavigator@@UBEPBUQMetaObject@@XZ @ 62 NONAME ; struct QMetaObject const * CntViewNavigator::metaObject(void) const + ?staticMetaObject@CntContactCardView@@2UQMetaObject@@B @ 63 NONAME ; struct QMetaObject const CntContactCardView::staticMetaObject + ?d_func@CntContactCardView@@ABEPBVCntContactCardViewPrivate@@XZ @ 64 NONAME ; class CntContactCardViewPrivate const * CntContactCardView::d_func(void) const + ?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 65 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *, int) + ?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 66 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *) + ?tr@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 67 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *) + ?getStaticMetaObject@CntBaseSelectionView@@SAABUQMetaObject@@XZ @ 68 NONAME ; struct QMetaObject const & CntBaseSelectionView::getStaticMetaObject(void) + ??0CntDefaultViewManager@@QAE@PAVHbMainWindow@@@Z @ 69 NONAME ; CntDefaultViewManager::CntDefaultViewManager(class HbMainWindow *) + ?createView@CntDefaultViewFactory@@UAEPAVCntAbstractView@@H@Z @ 70 NONAME ; class CntAbstractView * CntDefaultViewFactory::createView(int) + ?next@CntViewNavigator@@QAEXABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 71 NONAME ; void CntViewNavigator::next(int const &, class QFlags &) + ?qt_metacast@CntEditView@@UAEPAXPBD@Z @ 72 NONAME ; void * CntEditView::qt_metacast(char const *) + ?switchView@CntDefaultViewManager@@AAEXV?$QMap@HVQVariant@@@@V?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 73 NONAME ; void CntDefaultViewManager::switchView(class QMap, class QFlags) + ?contactRemoved@CntEditView@@IAEX_N@Z @ 74 NONAME ; void CntEditView::contactRemoved(bool) + ?contactManager@CntDefaultViewManager@@UAEPAVQContactManager@QtMobility@@ABVQString@@@Z @ 75 NONAME ; class QtMobility::QContactManager * CntDefaultViewManager::contactManager(class QString const &) + ?deactivate@CntEditView@@UAEXXZ @ 76 NONAME ; void CntEditView::deactivate(void) + ?addEffect@CntViewNavigator@@QAEXABH0@Z @ 77 NONAME ; void CntViewNavigator::addEffect(int const &, int const &) + ?trUtf8@CntContactCardView@@SA?AVQString@@PBD0@Z @ 78 NONAME ; class QString CntContactCardView::trUtf8(char const *, char const *) + ?staticMetaObject@CntDefaultViewManager@@2UQMetaObject@@B @ 79 NONAME ; struct QMetaObject const CntDefaultViewManager::staticMetaObject + ?removeException@CntViewNavigator@@QAEXABH@Z @ 80 NONAME ; void CntViewNavigator::removeException(int const &) + ?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 81 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *) + ?metaObject@CntEditView@@UBEPBUQMetaObject@@XZ @ 82 NONAME ; struct QMetaObject const * CntEditView::metaObject(void) const + ?viewOpened@CntBaseSelectionView@@IAEXV?$QMap@HVQVariant@@@@@Z @ 83 NONAME ; void CntBaseSelectionView::viewOpened(class QMap) + ??_ECntMainWindow@@UAE@I@Z @ 84 NONAME ; CntMainWindow::~CntMainWindow(unsigned int) + ??1CntDefaultViewManager@@UAE@XZ @ 85 NONAME ; CntDefaultViewManager::~CntDefaultViewManager(void) + ?metaObject@CntMainWindow@@UBEPBUQMetaObject@@XZ @ 86 NONAME ; struct QMetaObject const * CntMainWindow::metaObject(void) const + ?back@CntViewNavigator@@QAEABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 87 NONAME ; int const & CntViewNavigator::back(class QFlags &) + ??0CntContactCardView@@QAE@XZ @ 88 NONAME ; CntContactCardView::CntContactCardView(void) + ?metaObject@CntDefaultViewManager@@UBEPBUQMetaObject@@XZ @ 89 NONAME ; struct QMetaObject const * CntDefaultViewManager::metaObject(void) const + ?deactivate@CntContactCardView@@UAEXXZ @ 90 NONAME ; void CntContactCardView::deactivate(void) + ?changeView@CntDefaultViewManager@@UAEXV?$QMap@HVQVariant@@@@@Z @ 91 NONAME ; void CntDefaultViewManager::changeView(class QMap) + ?getStaticMetaObject@CntDefaultViewManager@@SAABUQMetaObject@@XZ @ 92 NONAME ; struct QMetaObject const & CntDefaultViewManager::getStaticMetaObject(void) + ?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 93 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *, int) + ??_ECntContactCardView@@UAE@I@Z @ 94 NONAME ; CntContactCardView::~CntContactCardView(unsigned int) + ?tr@CntEditView@@SA?AVQString@@PBD0H@Z @ 95 NONAME ; class QString CntEditView::tr(char const *, char const *, int) + ?staticMetaObject@CntViewNavigator@@2UQMetaObject@@B @ 96 NONAME ; struct QMetaObject const CntViewNavigator::staticMetaObject + ?qt_metacall@CntEditView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 97 NONAME ; int CntEditView::qt_metacall(enum QMetaObject::Call, int, void * *) + ?getStaticMetaObject@CntEditView@@SAABUQMetaObject@@XZ @ 98 NONAME ; struct QMetaObject const & CntEditView::getStaticMetaObject(void) + ?trUtf8@CntEditView@@SA?AVQString@@PBD0@Z @ 99 NONAME ; class QString CntEditView::trUtf8(char const *, char const *) + ?qt_metacast@CntMainWindow@@UAEPAXPBD@Z @ 100 NONAME ; void * CntMainWindow::qt_metacast(char const *) + ??1CntViewNavigator@@UAE@XZ @ 101 NONAME ; CntViewNavigator::~CntViewNavigator(void) + ?qt_metacall@CntContactCardView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 102 NONAME ; int CntContactCardView::qt_metacall(enum QMetaObject::Call, int, void * *) + ?qt_metacall@CntMainWindow@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 103 NONAME ; int CntMainWindow::qt_metacall(enum QMetaObject::Call, int, void * *) + ?trUtf8@CntMainWindow@@SA?AVQString@@PBD0@Z @ 104 NONAME ; class QString CntMainWindow::trUtf8(char const *, char const *) + ?isDefault@CntBaseSelectionView@@UBE_NXZ @ 105 NONAME ; bool CntBaseSelectionView::isDefault(void) const + ?staticMetaObject@CntMainWindow@@2UQMetaObject@@B @ 106 NONAME ; struct QMetaObject const CntMainWindow::staticMetaObject + ??1CntBaseSelectionView@@UAE@XZ @ 107 NONAME ; CntBaseSelectionView::~CntBaseSelectionView(void) + ??1CntContactCardView@@UAE@XZ @ 108 NONAME ; CntContactCardView::~CntContactCardView(void) + ?isDefault@CntContactCardView@@UBE_NXZ @ 109 NONAME ; bool CntContactCardView::isDefault(void) const + ?tr@CntMainWindow@@SA?AVQString@@PBD0H@Z @ 110 NONAME ; class QString CntMainWindow::tr(char const *, char const *, int) + ?createPluginView@CntDefaultViewFactory@@AAEPAVCntAbstractView@@H@Z @ 111 NONAME ; class CntAbstractView * CntDefaultViewFactory::createPluginView(int) + ??_ECntEditView@@UAE@I@Z @ 112 NONAME ; CntEditView::~CntEditView(unsigned int) + ??0CntBaseSelectionView@@QAE@XZ @ 113 NONAME ; CntBaseSelectionView::CntBaseSelectionView(void) + ??0CntMainWindow@@QAE@PAVQWidget@@H@Z @ 114 NONAME ; CntMainWindow::CntMainWindow(class QWidget *, int) + ?getStaticMetaObject@CntMainWindow@@SAABUQMetaObject@@XZ @ 115 NONAME ; struct QMetaObject const & CntMainWindow::getStaticMetaObject(void) + ?tr@CntDefaultViewManager@@SA?AVQString@@PBD0@Z @ 116 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *) + ?removeCurrentView@CntDefaultViewManager@@AAEXXZ @ 117 NONAME ; void CntDefaultViewManager::removeCurrentView(void) ?viewId@CntContactCardView@@UBEHXZ @ 118 NONAME ; int CntContactCardView::viewId(void) const ?removeEffect@CntViewNavigator@@QAEXABH@Z @ 119 NONAME ; void CntViewNavigator::removeEffect(int const &) diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/inc/cnthistorymodel.h --- a/phonebookui/cnthistorymodel/inc/cnthistorymodel.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/inc/cnthistorymodel.h Fri May 14 15:42:23 2010 +0300 @@ -44,30 +44,30 @@ Q_OBJECT public: - enum ConversationDirection + enum Attributes { - Incoming = 0, - Outgoing, - Missed - }; - - enum ReadStatus - { - Unseen = 3, - Seen + Incoming = 1, + Outgoing = 2, + Unseen = 4, + Seen = 8, + Attachment = 16 }; enum ItemType { - CallLog = 5, - Message + CallLog = 32, + Message = 64 + }; + enum Icon + { + MissedCall = 128, + ReceivedCall = 256, + DialledCall = 512 }; enum CustomRoles { - SeenStatusRole = Qt::UserRole + 1, - DirectionRole, - ItemTypeRole, + FlagsRole = Qt::UserRole + 1, PhoneNumberRole }; @@ -88,6 +88,8 @@ private: void initializeModel(); QVariant displayRoleData(const HistoryItem& item) const; + QVariant decorationRoleData(const HistoryItem& item) const; + QVariant backgroundRoleData(const HistoryItem& item) const; // Utility finctions void readLogEvent(LogsEvent* event, HistoryItem& item); @@ -102,8 +104,7 @@ void logsRowsInserted(const QModelIndex& parent, int first, int last); void logsRowsRemoved(const QModelIndex& parent, int first, int last); void logsDataChanged(const QModelIndex& first, const QModelIndex& last); - void clearedCallLogs(int err); - void markingCompleted(int err); + // Messaging model slots void messagesReady(QList& msgs); void messageAdded(MsgItem& msg); @@ -112,5 +113,8 @@ private: QSharedDataPointer d; + + // Testing related friend definitions + friend class TestCntHistoryModel; }; #endif diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/inc/cnthistorymodel_p.h --- a/phonebookui/cnthistorymodel/inc/cnthistorymodel_p.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/inc/cnthistorymodel_p.h Fri May 14 15:42:23 2010 +0300 @@ -24,27 +24,36 @@ #include #include -QTM_USE_NAMESPACE - +#ifdef PBK_UNIT_TEST +#include "stub_classes.h" +#else #include #include #include +#endif #include +#include + +QTM_USE_NAMESPACE -class HistoryItem +// Constants +#define MISSED_CALL_ICON "qtg_small_missed_call" +#define DAILED_CALL_ICON "qtg_small_sent" +#define RECEIVED_CALL_ICON "qtg_small_received" +#define MESSAGE_ICON "qtg_small_message" +const QString DATE_FORMAT("dd/MM"); // Date format. +const QString TIME_FORMAT("hh:mm"); // Time format. + +class HistoryItem { public: - HistoryItem() : - seenStatus(4) + HistoryItem() : flags(0) {}; inline const HistoryItem& operator=(const HistoryItem& other) { - direction = other.direction; - seenStatus = other.seenStatus; - msgType = other.msgType; + flags = other.flags; number = other.number; - iconPath = other.iconPath; title = other.title; message = other.message; timeStamp = other.timeStamp; @@ -57,11 +66,8 @@ } public: - int direction; // 0 - incoming, 1 - outgoing, 2 - missed - int seenStatus; // 3 = unseen, 4 = seen - int msgType; // 5 = call log, 6 = message - QString number; - QString iconPath; + int flags; + QString number; QString title; QString message; QDateTime timeStamp; @@ -80,7 +86,9 @@ m_msgHistory(NULL), m_contactId(contactId), m_contactManager(manager), - m_isMarkedAsSeen(false) + m_isMyCard(false), + m_isMarkedAsSeen(false), + m_initLogs(false) {} ~CntHistoryModelData() { @@ -107,6 +115,7 @@ QContactManager* m_contactManager; bool m_isMyCard; bool m_isMarkedAsSeen; + bool m_initLogs; //this contains merged calls and messages history QList m_List; QMap m_logsMap; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/inc/cnthistorymodelglobal.h --- a/phonebookui/cnthistorymodel/inc/cnthistorymodelglobal.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/inc/cnthistorymodelglobal.h Fri May 14 15:42:23 2010 +0300 @@ -21,6 +21,7 @@ #include #include #include +#include #ifdef CNTHISTORYMODEL_NO_EXPORT #define CNTHISTORYMODEL_EXPORT diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/src/cnthistorymodel.cpp --- a/phonebookui/cnthistorymodel/src/cnthistorymodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/src/cnthistorymodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -17,8 +17,9 @@ #include #include -#include -#include +#include +#include +#include #include "cnthistorymodel_p.h" #include "cnthistorymodel.h" @@ -28,12 +29,12 @@ { bool greaterThan(const HItemPointer& t1, const HItemPointer& t2) { - return t1.data()->timeStamp > t2.data()->timeStamp; + return ((*t1).timeStamp > (*t2).timeStamp); } bool lessThan(const HItemPointer& t1, const HItemPointer& t2) { - return t1.data()->timeStamp < t2.data()->timeStamp; + return ((*t1).timeStamp < (*t2).timeStamp); } } @@ -54,16 +55,8 @@ { d = new CntHistoryModelData(contactId, manager); - // Check if the contact is my card - if (d->m_contactId == d->m_contactManager->selfContactId()) { - d->m_isMyCard = true; - } - else { - d->m_isMyCard = false; - } // Create the model structure and cache history data from the databases initializeModel(); - } CntHistoryModel::~CntHistoryModel() @@ -95,13 +88,11 @@ case Qt::DisplayRole: return displayRoleData(*p); case Qt::DecorationRole: - return QVariant((*p).iconPath); - case SeenStatusRole: - return QVariant((*p).seenStatus); - case DirectionRole: - return QVariant((*p).direction); - case ItemTypeRole: - return QVariant((*p).msgType); + return decorationRoleData(*p); + case Qt::BackgroundRole: + return backgroundRoleData(*p); + case FlagsRole: + return QVariant((*p).flags); case PhoneNumberRole: return QVariant((*p).number); default: @@ -112,7 +103,7 @@ /*! * Return the data to be used by the view for a display role. * - * \param column The column of the item to return data about. + * \param item The History item to return data about. * return QVariant List of strings to be displayed on the view. * The stings can also be NULL * index 0 Title of the conversation item. @@ -123,12 +114,58 @@ { QStringList list; - list << item.title << item.message << item.timeStamp.toString(); + if (item.timeStamp.date() == QDateTime::currentDateTime().date()) + { + list << item.title << item.message << item.timeStamp.toString(TIME_FORMAT); + } + else + { + list << item.title << item.message << item.timeStamp.toString(DATE_FORMAT); + } return QVariant(list); } /*! + * Return the data to be used by the view for a decoration role. + * + * \param item The History item to return data about. + * return QVariant String of the icon path. + */ +QVariant CntHistoryModel::decorationRoleData(const HistoryItem& item) const +{ + // Messages + if (item.flags & Message) + return QVariant(HbIcon(MESSAGE_ICON)); + + // Call logs + if (item.flags & CallLog) { + if (item.flags & MissedCall) + return QVariant(HbIcon(MISSED_CALL_ICON)); + if (item.flags & DialledCall) + return QVariant(HbIcon(DAILED_CALL_ICON)); + if (item.flags & ReceivedCall) + return QVariant(HbIcon(RECEIVED_CALL_ICON)); + } + + return QVariant(); +} + +/*! + * Return the data to be used to draw the background of list items + * + * \param item The History item to return data about. + * return QVariant HbFrameBackground of the list item. + */ +QVariant CntHistoryModel::backgroundRoleData(const HistoryItem& item) const +{ + if (item.flags & Incoming) + return QVariant(HbFrameBackground("qtg_fr_convlist_received_normal", HbFrameDrawer::NinePieces)); + else + return QVariant(HbFrameBackground("qtg_fr_convlist_sent_normal", HbFrameDrawer::NinePieces)); +} + +/*! * Get the number of rows (conversations) in this model. * * \param parent Optional parent index value. @@ -159,25 +196,27 @@ * */ void CntHistoryModel::clearHistory() -{ +{ if ( d->m_List.isEmpty() ) return; // Call logs - if ( !d->m_isMyCard && d->m_logsFilter ) { - if ( !d->m_logsFilter->clearEvents() ) { - // Operation not async - clearedCallLogs( 0 ); - } - } else if ( d->m_logsModel ) { - if ( !d->m_logsModel->clearList(LogsModel::TypeLogsClearAll) ) { - // Operation not async - clearedCallLogs( 0 ); - } - } + if ( !d->m_isMyCard && d->m_logsFilter ) + d->m_logsFilter->clearEvents(); + else if ( d->m_logsModel ) + d->m_logsModel->clearList(LogsModel::TypeLogsClearAll); // Messages - d->m_msgHistory->clearMessages( (int)d->m_contactId ); + if (d->m_msgHistory) + d->m_msgHistory->clearMessages( (int)d->m_contactId ); + + // Clear all data from the history model. + int count = rowCount(); + d->m_List.clear(); + d->m_msgMap.clear(); + d->m_logsMap.clear(); + beginRemoveRows( QModelIndex(), 0, count ); + endRemoveRows(); } /*! @@ -189,17 +228,9 @@ if ( d->m_isMarkedAsSeen ) return; - // Call logs - if ( !d->m_isMyCard && d->m_logsFilter ) { - d->m_logsFilter->markEventsSeen(); - } else if ( d->m_logsModel ) { - d->m_logsModel->markEventsSeen(LogsModel::TypeLogsClearMissed); - } - // Messages - d->m_msgHistory->markRead( (int)d->m_contactId ); - - d->m_isMarkedAsSeen = true; + if (d->m_msgHistory->markRead( d->m_contactId )) + d->m_isMarkedAsSeen = true; } /*! @@ -209,7 +240,8 @@ void CntHistoryModel::sortAndRefresh(Qt::SortOrder order) { sort(0, order); - emit layoutChanged(); + beginInsertRows(QModelIndex(), 0, rowCount()); + endInsertRows(); } /*! @@ -225,25 +257,26 @@ void CntHistoryModel::initializeMsgModel() { + if( d->m_isMyCard ) + return; + + // Contact centric MsgHistory* m = new MsgHistory(); + d->m_msgHistory = m; + // Connect to signals emitted by msg model connect(m, SIGNAL(messagesReady(QList& )), this, SLOT(messagesReady(QList& ))); connect(m, SIGNAL(messageAdded(MsgItem& )), this, SLOT(messageAdded(MsgItem& ))); connect(m, SIGNAL(messageChanged(MsgItem& )), this, SLOT(messageChanged(MsgItem& ))); connect(m, SIGNAL(messageDeleted(MsgItem& )), this, SLOT(messageDeleted(MsgItem& ))); - // Contact centric - if( !d->m_isMyCard ) { - // Subscribe to get new messages - // received from this contact - m->subscribe(d->m_contactId); - - // Initial fetch of all messages - m->getMessages(d->m_contactId); - } + // Subscribe to get new messages + // received from this contact + m->subscribe(d->m_contactId); - d->m_msgHistory = m; + // Initial fetch of all messages + m->getMessages(d->m_contactId); } void CntHistoryModel::initializeLogsModel() @@ -259,19 +292,15 @@ connect(d->m_logsFilter, SIGNAL(clearingCompleted(int)), this, SLOT(clearedCallLogs(int))); - connect(d->m_logsFilter, SIGNAL(markingCompleted(int)), - this, SLOT(markingCompleted(int))); } else { //get all call events d->m_AbstractLogsModel = d->m_logsModel; connect(d->m_logsModel, SIGNAL(clearingCompleted(int)), this, SLOT(clearedCallLogs(int))); - connect(d->m_logsModel, SIGNAL(markingCompleted(int)), - this, SLOT(markingCompleted(int))); } - //read first call events and start listening for more + //read first call events if any and start listening for more for ( int i = 0; i < d->m_AbstractLogsModel->rowCount(); ++i ) { LogsEvent* event = qVariantValue( d->m_AbstractLogsModel->data(d->m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) ); @@ -300,44 +329,40 @@ * \param item Conversation history item */ void CntHistoryModel::readLogEvent(LogsEvent* event, HistoryItem& item) -{ +{ QString bodyText; - QString icon; QString title; if ( d->m_isMyCard ) { if ( event->remoteParty().length() > 0 ) { - title = event->remoteParty(); + title = QString(event->remoteParty()); } else { - title = event->number(); + title = QString(event->number()); } } else { if ( event->direction() == LogsEvent::DirIn ) { bodyText = hbTrId("txt_phob_list_received"); - icon = QString("qtg_small_received"); + item.flags |= ReceivedCall; } else if ( event->direction() == LogsEvent::DirOut ) { bodyText = hbTrId("txt_phob_list_dialled_call"); - icon = QString("qtg_small_sent"); + item.flags |= DialledCall; } else if ( event->direction() == LogsEvent::DirMissed ) { bodyText = hbTrId("txt_phob_list_missed_call"); - icon = QString("qtg_small_missed_call"); - if ( !event->isRead() ) - item.seenStatus = Unseen; + item.flags |= MissedCall; } } if ( event->direction() == LogsEvent::DirOut ) - item.direction = Outgoing; + item.flags |= Outgoing; else - item.direction = Incoming; + item.flags |= Incoming; item.message = bodyText; - item.iconPath = icon; item.title = title; - item.timeStamp = event->time(); - item.msgType = CallLog; - item.number = event->number(); + item.timeStamp = event->time().toLocalTime(); + item.flags |= CallLog; + item.number = QString(event->number()); } /*! @@ -350,6 +375,7 @@ void CntHistoryModel::logsRowsInserted(const QModelIndex& /*parent*/, int first, int last) { int oldRowCount = rowCount(); + QList l; for ( int i = first; i < d->m_AbstractLogsModel->rowCount() && i <= last; ++i ) { LogsEvent* event = qVariantValue( @@ -363,6 +389,14 @@ } } + // Check if this is the first time to receive events + // and sort the entire list. + if ( !d->m_initLogs ) { + sort(); + oldRowCount = 0; + d->m_initLogs = true; + } + beginInsertRows(QModelIndex(), oldRowCount, rowCount()); endInsertRows(); } @@ -381,9 +415,11 @@ for ( int i = first; i <= last; ++i ) { HItemPointer item = d->m_logsMap.value( i ); int index = d->m_List.indexOf( item ); - d->m_List.removeOne( item ); - d->m_logsMap.remove( i ); - indices.append( index ); + if ( index > -1 ) { + d->m_List.removeAt( index ); + d->m_logsMap.remove( i ); + indices.append( index ); + } } // Remove list items in batches @@ -434,45 +470,6 @@ } /*! - * Clear logs event slot received from logs model - * - * \param err Error of the clear logs request - */ -void CntHistoryModel::clearedCallLogs(int err) -{ - if ( err != 0 ) { - return; - } - - QList< int > indices; - foreach( HItemPointer p, d->m_logsMap.values() ) { - d->m_List.removeOne( p ); - } - d->m_logsMap.clear(); - - // Remove list items in batches - if ( !indices.isEmpty() ) { - QList< QList > batches = findIndices(indices); - foreach( QList l, batches ) { - beginRemoveRows( QModelIndex(), l.first(), l.last() ); - endRemoveRows(); - } - } -} - -/*! - * Mark events as seen slot received from logs model - * - * \param err Error of the marking logs request - */ -void CntHistoryModel::markingCompleted(int err) -{ - if ( err == 0 ) { - d->m_isMarkedAsSeen = true; - } -} - -/*! * Check whether an idex is out of bound of our list * * \param index Index to be validated @@ -495,11 +492,9 @@ QList currSequence; int prevIndex = indices.at(0) - 1; - for (int i = 0; i < indices.count(); i++) + foreach( int currIndex, indices ) { - int currIndex = indices.at(i); - - if (currIndex >= 0) + if ( currIndex >= 0 ) { if ( prevIndex+1 != currIndex && !currSequence.isEmpty() ) { @@ -511,7 +506,7 @@ } } - if (!currSequence.isEmpty()) + if ( !currSequence.isEmpty() ) { // Add last sequence if such exist sequences.append( currSequence ); @@ -529,23 +524,24 @@ void CntHistoryModel::readMsgEvent(MsgItem& event, HistoryItem& item) { // Msg direction - if ( event.direction() == MsgItem::MsgDirectionIncoming ) - item.direction = CntHistoryModel::Incoming; - if ( event.direction() == MsgItem::MsgDirectionOutgoing ) - item.direction = CntHistoryModel::Outgoing; + if ( event.direction() == MsgItem::MsgDirectionIncoming ) { + item.flags |= Incoming; + // Read status + if ( event.isAttributeSet(MsgItem::MsgAttributeUnread) ) + item.flags |= Unseen; + else + item.flags &= ~Unseen; + } else if ( event.direction() == MsgItem::MsgDirectionOutgoing ) + item.flags |= Outgoing; - // Read status - /* TODO: This API available in the next release - *if ( event.isAttributeSet(MsgItem::MsgAttributeUnread) ) - item.seenStatus = CntHistoryModel::Unseen; - else - item.seenStatus = CntHistoryModel::Seen;*/ + // Attachment + if (event.isAttributeSet(MsgItem::MsgAttributeAttachment)) + item.flags |= Attachment; - item.msgType = CntHistoryModel::Message; - item.number = event.phoneNumber(); - item.iconPath = QString("qtg_small_message"); + item.flags |= Message; + item.number = event.phoneNumber(); item.message = event.body(); - item.timeStamp = event.timeStamp(); + item.timeStamp = event.timeStamp().toLocalTime(); } /*! @@ -557,8 +553,6 @@ */ void CntHistoryModel::messagesReady(QList& msgs) { - int oldRowCount = rowCount(); - foreach( MsgItem m, msgs ) { // Create a new hst item HItemPointer item(new HistoryItem()); @@ -566,19 +560,17 @@ // Parse the MsgItem and add data into hst item readMsgEvent( m, *item ); - // Map the hst item to a MsgItem in the msgModel + // Map the hist item to a MsgItem in the msgModel d->m_msgMap.insert( m.id(), item ); // Append the hst item to our list d->m_List.append( item ); } - beginInsertRows(QModelIndex(), oldRowCount, rowCount()); - endInsertRows(); + sort(); - // After all messagas are fetched sort them and - // refresh the UI. - sortAndRefresh(); + beginInsertRows(QModelIndex(), 0, rowCount()); + endInsertRows(); } /*! @@ -597,7 +589,7 @@ // Parse the MsgItem and add data into hst item readMsgEvent( msg, *item ); - // Map the hst item to a MsgItem in the msgModel + // Map the hist item to a MsgItem in the msgModel d->m_msgMap.insert( msg.id(), item ); // Append the hst item to our list @@ -647,11 +639,10 @@ return; // Remove the item in stored containers - int count = d->m_msgMap.remove( msg.id() ); + d->m_msgMap.remove( msg.id() ); int index = d->m_List.indexOf( p ); - bool removed = d->m_List.removeOne( p ); - - if ( removed && count > 0 ) { + if ( index > -1 ) { + d->m_List.removeAt( index ); beginRemoveRows(QModelIndex(), index, index); endRemoveRows(); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.cpp --- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -18,238 +18,312 @@ #include #include "mt_cnthistorymodel.h" +#include "cnthistorymodel_p.h" #include "cnthistorymodel.h" -#include "stub_classes.h" + +void TestCntHistoryModel::init() +{ + cm = new QContactManager("symbian"); + model = new CntHistoryModel(1, cm); + model->d->m_List.clear(); + model->d->m_logsMap.clear(); + model->d->m_msgMap.clear(); +} + +void TestCntHistoryModel::cleanup() +{ + delete cm; + delete model; +} + +void TestCntHistoryModel::testLogsInsertions() +{ + QSignalSpy spy( model, SIGNAL(rowsInserted(const QModelIndex &, int, int))); + model->logsRowsInserted(QModelIndex(), 0, 0); + + QVERIFY(model->rowCount() == 1); + QVERIFY(model->d->m_logsMap.count() == 1); + QVERIFY(spy.count() == 1); +} -void TestCntHistoryModel::initTestCase() +void TestCntHistoryModel::testLogsRemovals() +{ + model->logsRowsInserted(QModelIndex(), 0, 0); + + QSignalSpy spy( model, SIGNAL(rowsRemoved(const QModelIndex &, int, int))); + model->logsRowsRemoved(QModelIndex(), 0, 0); + QVERIFY(model->rowCount() == 0); + QVERIFY(model->d->m_logsMap.count() == 0); + QVERIFY(spy.count() == 1); + + // Remove the same item + QSignalSpy spy1( model, SIGNAL(rowsRemoved(const QModelIndex &, int, int))); + model->logsRowsRemoved(QModelIndex(), 0, 0); + QVERIFY(spy1.count() == 0); +} + +void TestCntHistoryModel::testLogsUpdates() +{ + model->logsRowsInserted(QModelIndex(), 0, 0); + + QSignalSpy spy( model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &))); + QModelIndex in = model->d->m_AbstractLogsModel->index(0,0); + model->logsDataChanged(in, in); + QVERIFY(spy.count() == 1); +} + +void TestCntHistoryModel::testMsgInsertions() { + QList msgs; + MsgItem msg1; + msg1.setId(111); + MsgItem msg2; + msg2.setId(222); + MsgItem msg3; + msg3.setId(333); + msgs.append(msg1); + msgs.append(msg2); + msgs.append(msg3); + + QSignalSpy spy( model, SIGNAL(rowsInserted(const QModelIndex &, int, int))); + model->messagesReady(msgs); + + QVERIFY(model->rowCount() == 3); + QVERIFY(model->d->m_msgMap.count() == 3); + QVERIFY(model->d->m_msgMap.contains(111)); + QVERIFY(model->d->m_msgMap.contains(222)); + QVERIFY(model->d->m_msgMap.contains(333)); + QVERIFY(spy.count() == 1); + + MsgItem msg; + QSignalSpy spy2( model, SIGNAL(rowsInserted(const QModelIndex &, int, int))); + model->messageAdded(msg); + QVERIFY(model->rowCount() == 4); + QVERIFY(model->d->m_msgMap.count() == 4); + QVERIFY(spy2.count() == 1); + } -void TestCntHistoryModel::cleanupTestCase() +void TestCntHistoryModel::testMsgRemovals() +{ + QList msgs; + MsgItem msg1; + msg1.setId(111); + MsgItem msg2; + msg2.setId(222); + MsgItem msg3; + msg3.setId(333); + msgs.append(msg1); + msgs.append(msg2); + msgs.append(msg3); + model->messagesReady(msgs); + + QSignalSpy spy( model, SIGNAL(rowsRemoved(const QModelIndex &, int, int))); + model->messageDeleted(msg2); + QVERIFY(!model->d->m_msgMap.contains(222)); + QVERIFY(model->rowCount() == 2); + QVERIFY(spy.count() == 1); + + // Increase code coverage + HItemPointer p; + model->d->m_msgMap.insert(333, p); + model->messageDeleted(msg3); +} + +void TestCntHistoryModel::testMsgUpdates() { + QList msgs; + MsgItem msg1; + msg1.setId(111); + MsgItem msg2; + msg2.setId(222); + MsgItem msg3; + msg3.setId(333); + msgs.append(msg1); + msgs.append(msg2); + msgs.append(msg3); + model->messagesReady(msgs); + + QSignalSpy spy( model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &))); + QString s("test message"); + msg2.setBody(s); + model->messageChanged(msg2); + QVERIFY(model->d->m_msgMap.value(222)->message == s); + QVERIFY(spy.count() == 1); + + // Increase code coverage + HItemPointer p; + model->d->m_msgMap.insert(333, p); + model->messageChanged(msg3); +} + +void TestCntHistoryModel::testReadLogEvent() +{ + LogsEvent event; + HItemPointer item(new HistoryItem); + model->readLogEvent(&event, *item); + + QVERIFY(event.time() == item->timeStamp); + QVERIFY(item->flags & CntHistoryModel::Incoming); + QVERIFY(event.number() == item->number); + QVERIFY(item->flags & CntHistoryModel::CallLog); + QVERIFY(!item->message.isEmpty()); + + // Increase code coverage + model->d->m_isMyCard = true; + model->readLogEvent(&event, *item); +} + +void TestCntHistoryModel::testReadMsgEvent() +{ + MsgItem msg; + QString body("Some message"); + msg.setBody(body); + msg.setDirection(MsgItem::MsgDirectionIncoming); + msg.setPhoneNumber("123456"); + QDateTime d = QDateTime(QDate(2012, 12, 12), QTime(12, 23, 10)); + msg.setTimeStamp(d.toTime_t()); + + HItemPointer item(new HistoryItem); + model->readMsgEvent(msg, *item); + + QVERIFY(item->timeStamp == d); + QVERIFY(item->message == body); + QVERIFY(item->flags & CntHistoryModel::Message); + QVERIFY(item->number == QString("123456")); + QVERIFY(item->flags & CntHistoryModel::Incoming); } void TestCntHistoryModel::testRoles() { - // Contact centric history data - QContactManager* cm = new QContactManager("symbian"); - QContact c; - QVERIFY(cm->saveContact(&c)); - CntHistoryModel* model = new CntHistoryModel(c.localId(), cm); - QVERIFY(model != 0); - QVERIFY(model->rowCount() == FILTERED_EVENTS); + MsgItem msg; + model->messageAdded(msg); + + QModelIndex modelIndex = model->index(0, 0); + QVERIFY(modelIndex.isValid()); // Branded icon path - int index = 1; - QModelIndex modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - QVariant var = modelIndex.data(Qt::DecorationRole); - QVERIFY(var.type() == QVariant::String); + //QVariant var = modelIndex.data(Qt::DecorationRole); + //QVERIFY(var.type() == QVariant::String); - // Direction - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(DirectionRole); + // FlagsRole + var = modelIndex.data(CntHistoryModel::FlagsRole); QVERIFY(var.type() == QVariant::Int); - QVERIFY(var.toInt() == Incoming || - var.toInt() == Outgoing || - var.toInt() == Missed); // Display role - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); var = modelIndex.data(Qt::DisplayRole); - QString str = QString(cc_msg).arg(index); - QVERIFY(var.toStringList().at(0) == ""); - QDateTime t = constDateTime.addSecs(5*index); - str = t.toString(); - QVERIFY(var.toStringList().at(2) == str); - - index = 3; - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(Qt::DisplayRole); - str = QString(cc_msg).arg(index); QVERIFY(var.type() == QVariant::StringList); - QVERIFY(var.toStringList().at(0) == ""); - t = constDateTime.addSecs(5*index); - str = t.toString(); - QVERIFY(var.toStringList().at(2) == str); - - // decoration role - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(Qt::DecorationRole); - QVERIFY(var.type() == QVariant::String); - QVERIFY(var.toString() == QString("qtg_small_missed_call") || - var.toString() == QString("qtg_small_sent") || - var.toString() == QString("qtg_small_received")); - - // SeenStatusRole - index = 1; - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(SeenStatusRole); - QVERIFY(var.type() == QVariant::Int); - QVERIFY(var.toInt() == Unseen || - var.toInt() == Seen); - - // ItemTypeRole - index = 1; - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(ItemTypeRole); - QVERIFY(var.type() == QVariant::Int); - QVERIFY(var.toInt() == CallLog || - var.toInt() == Message); // PhoneNumberRole - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(PhoneNumberRole); + var = modelIndex.data(CntHistoryModel::PhoneNumberRole); QVERIFY(var.type() == QVariant::String); - QVERIFY(var.toString() == "1234567"); + + // BackgroundRole + var = modelIndex.data(Qt::BackgroundRole); + QVERIFY(var.type() > (QVariant::UserType - 1)); // Invalid role - index = 1; - modelIndex = model->index(index, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(1000); + var = modelIndex.data(-10); QVERIFY(var.type() == QVariant::Invalid); // Invalid indices - modelIndex = model->index(-1, 0); + modelIndex = model->index(-10, 0); QVERIFY(!modelIndex.isValid()); - var = modelIndex.data(Qt::DisplayRole); - QVERIFY(var.type() == QVariant::Invalid); - var = model->data(modelIndex, Qt::DisplayRole); QVERIFY(var.type() == QVariant::Invalid); modelIndex = model->index(100, 0); QVERIFY(!modelIndex.isValid()); - var = modelIndex.data(Qt::DisplayRole); - QVERIFY(var.type() == QVariant::Invalid); + // Stored history item is null + model->d->m_List.first().clear(); + modelIndex = model->index(0, 0); var = model->data(modelIndex, Qt::DisplayRole); QVERIFY(var.type() == QVariant::Invalid); - - // Test all conversations - QVERIFY(cm->setSelfContactId(c.localId())); - delete model; - model = new CntHistoryModel(c.localId(), cm); - QVERIFY(model != 0); - QVERIFY(model->rowCount() == ALL_EVENTS); - - cm->removeContact(c.localId()); - - delete cm; - delete model; } void TestCntHistoryModel::testSorting() { - QContactManager* cm = new QContactManager("symbian"); - QContact c; - QVERIFY(cm->saveContact(&c)); - CntHistoryModel* model = new CntHistoryModel(c.localId(), cm); - QVERIFY(model != 0); - QVERIFY(model->rowCount() == FILTERED_EVENTS); + // Create random data + QList delta; + delta.append(23); + delta.append(12); + delta.append(45); + delta.append(32); + delta.append(67); + delta.append(45); + delta.append(92); + delta.append(12); + + QDateTime dt = QDateTime::currentDateTime(); + + for(int i=0; itimeStamp = dt.toLocalTime(); + if ( i % 2 ) + p.data()->flags |= CntHistoryModel::CallLog; + else + p.data()->flags |= CntHistoryModel::Message; + + qDebug() << "Flag: " << p.data()->flags; + qDebug() << "Delta: " << delta.at(i); + model->d->m_List.append(p); + } // Sort ascending - QSignalSpy spy( model, SIGNAL( layoutChanged())); + QSignalSpy spy( model, SIGNAL( rowsInserted(const QModelIndex &, int, int))); model->sortAndRefresh(Qt::AscendingOrder); - QModelIndex modelIndex = model->index(1, 0); - QVERIFY(modelIndex.isValid()); - QVariant var = modelIndex.data(Qt::DisplayRole); - QDateTime dt1 = QDateTime::fromString(var.toStringList().at(2)); - - modelIndex = model->index(2, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(Qt::DisplayRole); - QDateTime dt2 = QDateTime::fromString(var.toStringList().at(2)); - QVERIFY(dt1 < dt2); - QVERIFY(spy.count() == 1); + QVERIFY(spy.count() == 1); + HItemPointer current = model->d->m_List.first(); + for(int i=1; id->m_List.count(); i++) { + QVERIFY(current.data()->timeStamp <= model->d->m_List.at(i).data()->timeStamp); + current = model->d->m_List.at(i); + } // Sort descending - QSignalSpy spy1( model, SIGNAL( layoutChanged())); + QSignalSpy spy1( model, SIGNAL( rowsInserted(const QModelIndex &, int, int))); model->sortAndRefresh(Qt::DescendingOrder); - modelIndex = model->index(1, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(Qt::DisplayRole); - dt1 = QDateTime::fromString(var.toStringList().at(2)); - - modelIndex = model->index(2, 0); - QVERIFY(modelIndex.isValid()); - var = modelIndex.data(Qt::DisplayRole); - dt2 = QDateTime::fromString(var.toStringList().at(2)); - QVERIFY(dt1 > dt2); - QVERIFY(spy1.count() == 1); - - cm->removeContact(c.localId()); - delete model; - delete cm; + QVERIFY(spy1.count() == 1); + current = model->d->m_List.last(); + for(int i=model->d->m_List.count(); i<1; i--) { + QVERIFY(current.data()->timeStamp >= model->d->m_List.at(i).data()->timeStamp); + current = model->d->m_List.at(i); + } } void TestCntHistoryModel::testClear() { - QContactManager* cm = new QContactManager("symbian"); - QContact c; - QVERIFY(cm->saveContact(&c)); - CntHistoryModel* model = new CntHistoryModel(c.localId(), cm); - QVERIFY(model != 0); - QVERIFY(model->rowCount() == FILTERED_EVENTS); + model->logsRowsInserted(QModelIndex(), 0, 0); - // Clear history + // Clear history with log QSignalSpy spy( model, SIGNAL( rowsRemoved(const QModelIndex &, int, int))); - int beforeClear = model->rowCount(); model->clearHistory(); - QTest::qWait(1000); // wait clearing completion QVERIFY( model->rowCount() == 0 ); QVERIFY(spy.count() == 1); - QList arguments = spy.takeFirst(); - QVERIFY(arguments.at(1).type() == QVariant::Int); - QVERIFY(arguments.at(2).type() == QVariant::Int); - QVERIFY(arguments.at(2).toInt() == beforeClear); - // Clear already empty history view QSignalSpy spy1( model, SIGNAL( rowsRemoved(const QModelIndex &, int, int))); model->clearHistory(); - QTest::qWait(1000); // wait clearing completion QVERIFY(spy1.count() == 0); - - cm->removeContact(c.localId()); - delete model; - delete cm; } void TestCntHistoryModel::testMarkSeen() { - QContactManager* cm = new QContactManager("symbian"); - QContact c; - QVERIFY(cm->saveContact(&c)); - CntHistoryModel* model = new CntHistoryModel(c.localId(), cm); - QVERIFY(model != 0); - QVERIFY(model->rowCount() == FILTERED_EVENTS); - // Mark history as seen - QSignalSpy spy( model, SIGNAL( layoutChanged())); + QVERIFY(!model->d->m_isMarkedAsSeen); model->markAllAsSeen(); - QTest::qWait(1000); // wait marking completion - QVERIFY(spy.count() == 1); + QVERIFY(model->d->m_isMarkedAsSeen); - // Mark already marked history as seen - QSignalSpy spy1( model, SIGNAL( layoutChanged())); + // NOT TESTING! Increasing code coverage model->markAllAsSeen(); - QTest::qWait(1000); // wait marking completion - QVERIFY(spy1.count() == 0); - - cm->removeContact(c.localId()); - delete model; - delete cm; + model->d->m_isMarkedAsSeen = false; + model->d->m_isMyCard = true; + model->initializeMsgModel(); + model->markAllAsSeen(); + model->clearHistory(); } QTEST_MAIN(TestCntHistoryModel); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.h --- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.h Fri May 14 15:42:23 2010 +0300 @@ -16,17 +16,34 @@ */ #include +#include + +QTM_USE_NAMESPACE + +class CntHistoryModel; class TestCntHistoryModel : public QObject { Q_OBJECT private slots: - void initTestCase(); - void cleanupTestCase(); + void init(); + void cleanup(); + void testLogsInsertions(); + void testLogsRemovals(); + void testLogsUpdates(); + void testMsgInsertions(); + void testMsgRemovals(); + void testMsgUpdates(); + void testReadLogEvent(); + void testReadMsgEvent(); void testRoles(); void testSorting(); void testClear(); void testMarkSeen(); + +private: + QContactManager* cm; + CntHistoryModel* model; }; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.pro --- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.pro Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.pro Fri May 14 15:42:23 2010 +0300 @@ -36,10 +36,11 @@ ../../inc/cnthistorymodel_p.h \ ../../inc/cnthistorymodel.h -SOURCES += mt_cnthistorymodel.cpp \ - stub_classes.cpp \ - ../../src/cnthistorymodel.cpp +SOURCES += stub_classes.cpp \ + ../../src/cnthistorymodel.cpp \ + mt_cnthistorymodel.cpp -LIBS += -lQtContacts +LIBS += -lQtContacts \ + -lmsghistory TARGET.CAPABILITY = ALL -TCB diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/stub_classes.cpp --- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/stub_classes.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/stub_classes.cpp Fri May 14 15:42:23 2010 +0300 @@ -15,22 +15,11 @@ * */ +#include "cnthistorymodel_p.h" #include "stub_classes.h" Q_DECLARE_METATYPE(LogsEvent *) -namespace { - void addModelData(HistoryItem &t, int i) - { - t.timeStamp = constDateTime.addSecs(5*i); - t.message = QString(cc_msg).arg(i); - t.direction = i%2 == 0 ? Incoming : Outgoing; - t.seenStatus = i%2 == 0 ? Unseen : Seen; - t.iconPath = QString(icon_path).arg(i); - t.title = QString(cc_msg).arg(i); - }; -} - QVariant LogsModel::data(const QModelIndex& index, int role) const { if (index.row() < 0 && index.row() >= rowCount()) @@ -104,3 +93,12 @@ beginInsertRows(QModelIndex(), 0, m_events.count()); endInsertRows(); } + +bool MsgHistory::getMessages(int cntId){} + +bool MsgHistory::subscribe(int cntId){} + +bool MsgHistory::markRead(int cntId){ + return true; +} + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/stub_classes.h --- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/stub_classes.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/stub_classes.h Fri May 14 15:42:23 2010 +0300 @@ -17,11 +17,9 @@ #ifndef STUB_CLASSES_H #define STUB_CLASSES_H -#include -#include #include #include -#include +#include "cnthistorymodel.h" #define ALL_EVENTS 7 #define FILTERED_EVENTS 5 @@ -31,81 +29,6 @@ const QString icon_path = QString("Icon %1 path"); const QDateTime constDateTime = QDateTime(QDate(2010, 2, 15), QTime(12, 10, 10)); -struct HistoryItem { - int direction; // 0 - incoming, 1 - outgoing, 2 - missed - int seenStatus; // 3 = unseen, 4 = seen - int msgType; // 5 = call log, 6 = message - QString number; - QString iconPath; - QString title; - QString message; - QDateTime timeStamp; - QString mmsMessage; - - HistoryItem() : - direction(0), - seenStatus(4), - iconPath(QString()), - title(QString()), - message(QString()), - timeStamp(QDateTime()), - mmsMessage(QString()) - {}; - - inline const HistoryItem& operator=(const HistoryItem& other) - { - direction = other.direction; - seenStatus = other.seenStatus; - msgType = other.msgType; - number = other.number; - iconPath = other.iconPath; - title = other.title; - message = other.message; - timeStamp = other.timeStamp; - return *this; - } - - inline bool operator==(const HistoryItem& other) const - { return timeStamp == other.timeStamp; } -}; - -enum -{ - TimeStamp, - Direction, - BodyText, - UnReadStatus, - FirstName, - LastName -}; - -enum -{ - Incoming, - Outgoing, - Missed -}; - -enum -{ - Unseen = 3, - Seen -}; - -enum ItemType -{ - CallLog = 5, - Message -}; - -enum CustomRoles -{ - SeenStatusRole = Qt::UserRole + 1, - DirectionRole, - ItemTypeRole, - PhoneNumberRole -}; - class LogsEvent { public: diff -r de1630741fbe -r 2a11b5b00470 phonebookui/eabi/cnthistorymodelu.def --- a/phonebookui/eabi/cnthistorymodelu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/eabi/cnthistorymodelu.def Fri May 14 15:42:23 2010 +0300 @@ -11,25 +11,25 @@ _ZN15CntHistoryModel14messageChangedER7MsgItem @ 10 NONAME _ZN15CntHistoryModel14messageDeletedER7MsgItem @ 11 NONAME _ZN15CntHistoryModel14sortAndRefreshEN2Qt9SortOrderE @ 12 NONAME - _ZN15CntHistoryModel15clearedCallLogsEi @ 13 NONAME - _ZN15CntHistoryModel15initializeModelEv @ 14 NONAME - _ZN15CntHistoryModel15logsDataChangedERK11QModelIndexS2_ @ 15 NONAME - _ZN15CntHistoryModel15logsRowsRemovedERK11QModelIndexii @ 16 NONAME - _ZN15CntHistoryModel16logsRowsInsertedERK11QModelIndexii @ 17 NONAME - _ZN15CntHistoryModel16markingCompletedEi @ 18 NONAME - _ZN15CntHistoryModel16staticMetaObjectE @ 19 NONAME DATA 16 - _ZN15CntHistoryModel18initializeMsgModelEv @ 20 NONAME - _ZN15CntHistoryModel19getStaticMetaObjectEv @ 21 NONAME - _ZN15CntHistoryModel19initializeLogsModelEv @ 22 NONAME - _ZN15CntHistoryModel4sortEiN2Qt9SortOrderE @ 23 NONAME - _ZN15CntHistoryModelC1EjPN10QtMobility15QContactManagerEP7QObject @ 24 NONAME - _ZN15CntHistoryModelC2EjPN10QtMobility15QContactManagerEP7QObject @ 25 NONAME - _ZN15CntHistoryModelD0Ev @ 26 NONAME - _ZN15CntHistoryModelD1Ev @ 27 NONAME - _ZN15CntHistoryModelD2Ev @ 28 NONAME - _ZNK15CntHistoryModel10metaObjectEv @ 29 NONAME - _ZNK15CntHistoryModel15displayRoleDataERK11HistoryItem @ 30 NONAME - _ZNK15CntHistoryModel16validateRowIndexEi @ 31 NONAME + _ZN15CntHistoryModel15initializeModelEv @ 13 NONAME + _ZN15CntHistoryModel15logsDataChangedERK11QModelIndexS2_ @ 14 NONAME + _ZN15CntHistoryModel15logsRowsRemovedERK11QModelIndexii @ 15 NONAME + _ZN15CntHistoryModel16logsRowsInsertedERK11QModelIndexii @ 16 NONAME + _ZN15CntHistoryModel16staticMetaObjectE @ 17 NONAME DATA 16 + _ZN15CntHistoryModel18initializeMsgModelEv @ 18 NONAME + _ZN15CntHistoryModel19getStaticMetaObjectEv @ 19 NONAME + _ZN15CntHistoryModel19initializeLogsModelEv @ 20 NONAME + _ZN15CntHistoryModel4sortEiN2Qt9SortOrderE @ 21 NONAME + _ZN15CntHistoryModelC1EjPN10QtMobility15QContactManagerEP7QObject @ 22 NONAME + _ZN15CntHistoryModelC2EjPN10QtMobility15QContactManagerEP7QObject @ 23 NONAME + _ZN15CntHistoryModelD0Ev @ 24 NONAME + _ZN15CntHistoryModelD1Ev @ 25 NONAME + _ZN15CntHistoryModelD2Ev @ 26 NONAME + _ZNK15CntHistoryModel10metaObjectEv @ 27 NONAME + _ZNK15CntHistoryModel15displayRoleDataERK11HistoryItem @ 28 NONAME + _ZNK15CntHistoryModel16validateRowIndexEi @ 29 NONAME + _ZNK15CntHistoryModel18backgroundRoleDataERK11HistoryItem @ 30 NONAME + _ZNK15CntHistoryModel18decorationRoleDataERK11HistoryItem @ 31 NONAME _ZNK15CntHistoryModel4dataERK11QModelIndexi @ 32 NONAME _ZNK15CntHistoryModel8rowCountERK11QModelIndex @ 33 NONAME _ZTI15CntHistoryModel @ 34 NONAME diff -r de1630741fbe -r 2a11b5b00470 phonebookui/eabi/pbkcommonuiu.def --- a/phonebookui/eabi/pbkcommonuiu.def Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/eabi/pbkcommonuiu.def Fri May 14 15:42:23 2010 +0300 @@ -2,8 +2,8 @@ _ZN11CntEditView10deactivateEv @ 1 NONAME _ZN11CntEditView11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME _ZN11CntEditView11qt_metacastEPKc @ 3 NONAME - _ZN11CntEditView14contactRemovedEv @ 4 NONAME - _ZN11CntEditView14contactUpdatedEv @ 5 NONAME + _ZN11CntEditView14contactRemovedEb @ 4 NONAME + _ZN11CntEditView14contactUpdatedEb @ 5 NONAME _ZN11CntEditView16changesDiscardedEv @ 6 NONAME _ZN11CntEditView16staticMetaObjectE @ 7 NONAME DATA 16 _ZN11CntEditView19getStaticMetaObjectEv @ 8 NONAME diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntactionmenubuilder.h --- a/phonebookui/pbkcommonui/inc/cntactionmenubuilder.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntactionmenubuilder.h Fri May 14 15:42:23 2010 +0300 @@ -37,7 +37,7 @@ ~CntActionMenuBuilder(); public: - void execActionMenu( QContact& aContact, QPointF aPoint ); + HbMenu* actionMenu( QContact& aContact ); public: HbMenu* buildActionMenu( QContact& aContact ); @@ -63,7 +63,7 @@ #endif void createCallAction( HbMenu& aMenu, QContact& aContact ); - void createSmsAction( HbMenu& aMenu, QContact& aContact ); + void createMessageAction( HbMenu& aMenu, QContact& aContact ); void createEmailAction( HbMenu& aMenu, QContact& aContact ); private: QContactLocalId iMyCardId; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntaddressmodel.h --- a/phonebookui/pbkcommonui/inc/cntaddressmodel.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntaddressmodel.h Fri May 14 15:42:23 2010 +0300 @@ -47,5 +47,12 @@ QContactAddress *mAddress; QContactAddress *mAddressHome; QContactAddress *mAddressWork; + +#ifdef PBK_UNIT_TEST +public: +#else +protected: +#endif + bool mIsLocationPickerEnabled; }; #endif /* CNTDETAILADDRESSEDITORMODEL_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntaddressviewitem.h --- a/phonebookui/pbkcommonui/inc/cntaddressviewitem.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntaddressviewitem.h Fri May 14 15:42:23 2010 +0300 @@ -19,11 +19,8 @@ #define CNTADDRESSVIEWITEM_H_ #include -//#include "cntdetailviewitem.h" #include -#include -class XQAiwRequest; class HbWidget; class HbAbstractViewItem; @@ -34,18 +31,27 @@ public: CntAddressViewItem( QGraphicsItem* aParent = 0 ); ~CntAddressViewItem(); - + +#ifdef PBK_UNIT_TEST +public slots: +#else private slots: +#endif void launchLocationPicker(); - void handleLocationChange(const QVariant& aValue ); public: HbAbstractViewItem* createItem(); HbWidget* createCustomWidget(); - - XQAiwRequest* mRequest; - XQApplicationManager* mAppManager; - QObject* mSenderButton; - }; + + bool canSetModelIndex( const QModelIndex &index ) const; + +#ifdef PBK_UNIT_TEST +public: +#else +private: +#endif + void handleLocationChange(const QVariant& aValue ); + +}; #endif /* CNTADDRESSVIEWITEM_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntcollectionview.h --- a/phonebookui/pbkcommonui/inc/cntcollectionview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntcollectionview.h Fri May 14 15:42:23 2010 +0300 @@ -19,6 +19,7 @@ #define CNTCOLLECTIONVIEW_H #include +#include #include #include @@ -27,10 +28,13 @@ class HbView; class HbListView; class CntCollectionListModel; +class CntFetchContacts; class QModelIndex; class HbAbstractViewItem; class CntExtensionManager; +QTM_USE_NAMESPACE + class CntCollectionView : public QObject, public CntAbstractView { Q_OBJECT @@ -50,13 +54,27 @@ private slots: void showPreviousView(); void openGroup(const QModelIndex &index); + void showContextMenu(HbAbstractViewItem *item, const QPointF &coords); + void handleMenu(HbAction* action); + void newGroup(); + void handleNewGroup(HbAction* action); + void handleNewGroupMembers(); + void refreshDataModel(); + void deleteGroup(QContact group); + void handleDeleteGroup(HbAction* action); + void deleteGroups(); + void handleDeleteGroups(HbAction* action); - +private: + QContactManager* getContactManager(); + void saveNewGroup(QContact* aContact); + + private: CntExtensionManager& mExtensionManager; HbView* mView; // own @@ -70,6 +88,10 @@ HbAction* mExtensionAction; // owned by view HbAction* mNewGroupAction; // owned by view HbAction* mDeleteGroupsAction; // owned by view + + QContact* mHandledContact; // own, needed for asynchronous popups + CntFetchContacts* mFetchView; + QSet mSelectedContactsSet; }; #endif // CNTCOLLECTIONVIEW_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntcontactcardcontextmenu.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/inc/cntcontactcardcontextmenu.h Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,34 @@ +/* +* 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 CNTCONTACTCARDCONTEXTMENU_H_ +#define CNTCONTACTCARDCONTEXTMENU_H_ + +#include + +class CntContactCardDetailItem; +class CntContactCardContextMenu : public HbMenu +{ +public: + CntContactCardContextMenu( CntContactCardDetailItem* aItem ); + ~CntContactCardContextMenu(); + + CntContactCardDetailItem* item(); +private: + CntContactCardDetailItem* mItem; +}; +#endif /* CNTCONTACTCARDCONTEXTMENU_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntcontactcarddatacontainer.h --- a/phonebookui/pbkcommonui/inc/cntcontactcarddatacontainer.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntcontactcarddatacontainer.h Fri May 14 15:42:23 2010 +0300 @@ -49,7 +49,8 @@ QList actionDetails(const QString &actionName, const QContact &contact); bool supportsDetail(const QString &actionName, const QContactDetail &contactDetail); void addSeparator(int index); - + void sortDataItems(); + #ifdef PBK_UNIT_TEST public: #else diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntcontactcarddataitem.h --- a/phonebookui/pbkcommonui/inc/cntcontactcarddataitem.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntcontactcarddataitem.h Fri May 14 15:42:23 2010 +0300 @@ -30,7 +30,7 @@ Q_OBJECT public: - CntContactCardDataItem(const QString& aTitle, bool aIsFocusable); + CntContactCardDataItem(const QString& aTitle, int aPosition, bool aIsFocusable); virtual ~CntContactCardDataItem(); public: @@ -50,7 +50,8 @@ QContactDetail detail() { return mDetail; } Qt::TextElideMode elideMode() { return mValueTextElideMode; } bool isFocusable() { return mIsFocusable; } - + int position() { return mPosition; } + private: HbIcon mIcon; HbIcon mSecondaryIcon; @@ -60,6 +61,9 @@ QContactDetail mDetail; Qt::TextElideMode mValueTextElideMode; bool mIsFocusable; + +public: + int mPosition; }; #endif /* CNTCONTACTCARDDATAITEM_H */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntcontactcarddetailitem.h --- a/phonebookui/pbkcommonui/inc/cntcontactcarddetailitem.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntcontactcarddetailitem.h Fri May 14 15:42:23 2010 +0300 @@ -23,12 +23,12 @@ class HbIconItem; class HbTextItem; -class HbRichTextItem; class QGraphicsGridLayout; class HbFrameItem; -class HbGestureSceneFilter; -class HbGesture; +class HbTouchArea; class CntContactCardDataItem; +class QTapGesture; +class QTapAndHoldGesture; class CntContactCardDetailItem : public HbWidget { @@ -36,16 +36,22 @@ Q_PROPERTY( QString text READ getText ) Q_PROPERTY( QString valueText READ getValueText ) Q_PROPERTY( HbIcon icon READ getIcon ) + Q_PROPERTY( HbIcon secondaryIcon READ getSecondaryIcon ) public: CntContactCardDetailItem(int index, QGraphicsItem *parent = 0, bool isFocusable = true); ~CntContactCardDetailItem(); protected: - void mousePressEvent(QGraphicsSceneMouseEvent *event); - void mouseMoveEvent(QGraphicsSceneMouseEvent *event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - + //void mousePressEvent(QGraphicsSceneMouseEvent *event); + //void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + //void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void gestureEvent(QGestureEvent* event); + +private: + void tapTriggered(QTapGesture *gesture); + void tapAndHoldTriggered(QTapAndHoldGesture *gesture); + public: void initGesture(); void createPrimitives(); @@ -65,6 +71,7 @@ QString getText() const { return text; } QString getValueText() const { return valueText; } HbIcon getIcon() const { return icon; } + HbIcon getSecondaryIcon() const { return secondaryIcon; } #ifdef PBK_UNIT_TEST public: @@ -72,13 +79,13 @@ private: #endif HbIconItem *mIcon; + HbIconItem *mSecondaryIcon; HbTextItem *mFirstLineText; HbTextItem *mSecondLineText; HbFrameItem *mFrameItem; HbFrameItem *mFocusItem; + HbTouchArea *mTouchArea; bool mHasFocus; - HbGestureSceneFilter *mGestureFilter; - HbGesture *mGestureLongpressed; int mIndex; bool mIsFocusable; Qt::TextElideMode mValueTextElideMode; @@ -87,6 +94,7 @@ QString text; QString valueText; HbIcon icon; + HbIcon secondaryIcon; }; #endif // CNTCOMMLAUNCHERDETAILITEM_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntcontactcardheadingitem.h --- a/phonebookui/pbkcommonui/inc/cntcontactcardheadingitem.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntcontactcardheadingitem.h Fri May 14 15:42:23 2010 +0300 @@ -21,15 +21,13 @@ #include #include #include -#include -#include - class HbTouchArea; class HbIconItem; class HbTextItem; class HbFrameItem; class HbMarqueeItem; +class QGestureEvent; QTM_BEGIN_NAMESPACE class QContact; @@ -56,7 +54,7 @@ void createPrimitives(); void recreatePrimitives(); void updatePrimitives(); - void setDetails(const QContact* contact, bool isMyCard); + void setDetails(const QContact* contact); void setIcon(const HbIcon newIcon); void setGroupDetails(const QContact* contact); void setSecondaryIcon(bool favoriteContact); @@ -69,9 +67,7 @@ void processLongPress(const QPointF &point); protected: - void mousePressEvent(QGraphicsSceneMouseEvent *event); - void mouseMoveEvent(QGraphicsSceneMouseEvent *event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void gestureEvent(QGestureEvent* event); QVariant itemChange(GraphicsItemChange change, const QVariant &value); private slots: @@ -110,8 +106,6 @@ HbTextItem *mSecondaryText; HbMarqueeItem *mMarqueeItem; HbFrameItem *mFrameItem; - HbGestureSceneFilter *mGestureFilter; - HbGesture *mGestureLongpressed; HbTouchArea *mPictureArea; QString firstLineText; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntcontactcardview_p.h --- a/phonebookui/pbkcommonui/inc/cntcontactcardview_p.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntcontactcardview_p.h Fri May 14 15:42:23 2010 +0300 @@ -71,11 +71,17 @@ void sendBusinessCard(); void addToGroup(); void deleteContact(); + void handleDeleteContact(HbAction *action); void setAsFavorite(); void removeFromFavorite(); void progress(QContactAction::State status); void setOrientation(Qt::Orientation orientation); void showPreviousView(); + void doChangeImage(); + void doRemoveImage(); + + void handleMenuAction(HbAction* aAction); + void handleSendBusinessCard( HbAction* aAction ); public: CntContactCardView* q_ptr; @@ -97,11 +103,8 @@ #else private: #endif - void doChangeImage(); - void doRemoveImage(); - void launchAction(QContact contact, QContactDetail detail, QString action); - bool createVCard(QString& vCardPath); + //bool createVCard(QString& vCardPath); bool isFavoriteGroupContact(); bool isFavoriteGroupCreated(); @@ -124,6 +127,7 @@ QContactAvatar *mAvatar; bool mIsGroupMember; bool mIsHandlingMenu; + bool mIsPreviousImageEditorView; QMap mPreferredItems; int mFavoriteGroupId; CntDocumentLoader *mLoader; @@ -132,6 +136,7 @@ CntImageLabel *mImageLabel; XQServiceRequest *mHighwayService; HbIcon *mVCardIcon; + }; #endif // CNTCOMMLAUNCHERVIEW_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntdateeditorviewitem.h --- a/phonebookui/pbkcommonui/inc/cntdateeditorviewitem.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntdateeditorviewitem.h Fri May 14 15:42:23 2010 +0300 @@ -23,6 +23,8 @@ #include #include +class HbAction; + class CntDateEditorViewItem : public CntDetailViewItem { Q_OBJECT @@ -39,7 +41,12 @@ HbWidget* createCustomWidget(); private: - QDate editDate( QDate aCurrent, QString aTitle ); + void editDate( QDate aCurrent, QString aTitle ); + void changeDate( QDate aNewDate ); + +private slots: + void handleEditDate( HbAction *aAction ); + #ifdef PBK_UNIT_TEST public: diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntdefaultviewmanager.h --- a/phonebookui/pbkcommonui/inc/cntdefaultviewmanager.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntdefaultviewmanager.h Fri May 14 15:42:23 2010 +0300 @@ -25,6 +25,7 @@ class CntAbstractViewFactory; class CntAbstractView; class CntViewNavigator; +class SimUtility; QTM_BEGIN_NAMESPACE class QContactManager; @@ -65,6 +66,8 @@ QList mBackends; HbMainWindow* mMainWindow; - friend class TestCntDefaultViewManager; + SimUtility* mSimUtility; + + friend class T_CntDefaultViewManager; }; #endif /* CNTDEFAULTVIEWMANAGER_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntdetaileditor.h --- a/phonebookui/pbkcommonui/inc/cntdetaileditor.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntdetaileditor.h Fri May 14 15:42:23 2010 +0300 @@ -45,7 +45,7 @@ void saveChanges(); void discardChanges(); void insertField(); - void handleOrientation(Qt::Orientation aOrientation); + void handleItemShown(const QModelIndex& aIndex ); public: void setViewId( int aId ); @@ -74,7 +74,7 @@ #endif QPointer mDataForm; - QPointer mDataFormModel; + CntDetailEditorModel *mDataFormModel; QPointer mHeader; int mId; HbView *mView; @@ -83,5 +83,6 @@ CntEditorFactory *mEditorFactory; HbAction *mSoftkey; HbAction *mCancel; + CntViewParameters mArgs; }; #endif /* CNTDETAILEDITOR_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntdetailpopup.h --- a/phonebookui/pbkcommonui/inc/cntdetailpopup.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntdetailpopup.h Fri May 14 15:42:23 2010 +0300 @@ -25,11 +25,14 @@ class QStandardItemModel; class HbListView; +typedef QList CntViewIdList; + class CntDetailPopup : public HbDialog { Q_OBJECT public: - static int selectDetail(); + static void selectDetail( CntViewIdList aList, QObject *receiver = 0, const char *member = 0 ); + int selectedDetail(); #ifdef PBK_UNIT_TEST public slots: @@ -43,10 +46,9 @@ #else private: #endif - CntDetailPopup(QGraphicsItem *parent = 0); + CntDetailPopup(QGraphicsItem *parent, CntViewIdList aList ); ~CntDetailPopup(); - QString selectedDetail(); void addListItem(QString aIcon, QString label, int aId); #ifdef PBK_UNIT_TEST @@ -56,7 +58,8 @@ #endif QStandardItemModel *mListModel; HbListView *mListView; - QString mSelectedDetail; + int mSelectedDetail; + CntViewIdList mViewIdList; }; #endif // CNTDETAILPOPUP_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cnteditview.h --- a/phonebookui/pbkcommonui/inc/cnteditview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cnteditview.h Fri May 14 15:42:23 2010 +0300 @@ -35,8 +35,8 @@ ~CntEditView(); signals: - void contactUpdated(); - void contactRemoved(); + void contactUpdated(bool aSuccess); + void contactRemoved(bool aSuccess); void changesDiscarded(); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cnteditview_p.h --- a/phonebookui/pbkcommonui/inc/cnteditview_p.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cnteditview_p.h Fri May 14 15:42:23 2010 +0300 @@ -38,6 +38,7 @@ class HbView; class HbAction; class QAction; +class HbMenu; QTM_BEGIN_NAMESPACE class QContactDetail; @@ -57,8 +58,8 @@ void deactivate(); signals: - void contactUpdated(); - void contactRemoved(); + void contactUpdated(bool aSuccess); + void contactRemoved(bool aSuccess); void changesDiscarded(); public: @@ -69,7 +70,9 @@ void longPressed( HbAbstractViewItem *item, const QPointF &coords ); void addDetailItem(); + void handleAddDetailItem(HbAction *aAction); void deleteContact(); + void handleDeleteContact(HbAction *action); void discardChanges(); void saveChanges(); @@ -77,10 +80,11 @@ void openImageEditor(); void thumbnailReady( const QPixmap& pixmap, void *data, int id, int error ); void setOrientation(Qt::Orientation aOrientation); + void handleMenuAction( HbAction* aAction ); private: void loadAvatar(); - QList createPopup( CntEditViewItem* aDetail ); + HbMenu* createPopup( const QModelIndex aIndex, CntEditViewItem* aDetail ); void addDetail( CntEditViewItem* aDetail ); void editDetail( CntEditViewItem* aDetail ); void removeDetail( CntEditViewItem* aDetail, const QModelIndex& aIndex ); @@ -91,10 +95,12 @@ CntEditViewListModel* mModel; CntEditViewHeadingItem* mHeading; CntImageLabel *mImageLabel; + CntViewParameters mArgs; HbDocumentLoader* mDocument; ThumbnailManager* mThumbnailManager; QContact* mContact; // own CntAbstractViewManager* mMgr; // not owned + bool mIsMyCard; HbAction* mSoftkey; HbAction* mDiscard; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cnteditviewlistmodel.h --- a/phonebookui/pbkcommonui/inc/cnteditviewlistmodel.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cnteditviewlistmodel.h Fri May 14 15:42:23 2010 +0300 @@ -24,6 +24,7 @@ #include #include "cntstringmapper.h" +#include "cntdetailpopup.h" class CntExtensionManager; class CntEditViewItemSupplier; @@ -82,8 +83,9 @@ CntEditViewItem* itemAt( const QModelIndex& aIndex ) const; void removeItem( CntEditViewItem* aItem, const QModelIndex& aIndex ); bool isEmptyItem( CntEditViewItem* aItem ); + void refreshExtensionItems( const QModelIndex& aIndex ); + void allInUseFields( CntViewIdList& aList ); - void refreshExtensionItems( const QModelIndex& aIndex ); private: void refresh(); void loadPluginItems( CntEditViewItemSupplier* aSupplier ); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntfavoritesmemberview.h --- a/phonebookui/pbkcommonui/inc/cntfavoritesmemberview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntfavoritesmemberview.h Fri May 14 15:42:23 2010 +0300 @@ -56,7 +56,11 @@ #endif void manageFavorites(); + void handleManageFavorites(HbAction *action); + void onLongPressed (HbAbstractViewItem *item, const QPointF &coords); + void handleMenu(HbAction* action); + void openContact(const QModelIndex &index); void editContact(const QModelIndex &index); void removeFromFavorites(const QModelIndex &index); @@ -77,7 +81,6 @@ HbView* mView; // own HbAction* mSoftkey; // owned by view - }; #endif /* CNTFAVORITESMEMBERVIEW_H */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntfavoritesview.h --- a/phonebookui/pbkcommonui/inc/cntfavoritesview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntfavoritesview.h Fri May 14 15:42:23 2010 +0300 @@ -34,6 +34,7 @@ class CntFavoritesView : public QObject, public CntAbstractView { + friend class TestCntFavoritesView; Q_OBJECT public: @@ -50,6 +51,7 @@ private slots: void showPreviousView(); void openSelectionPopup(); + void handleMemberSelection(HbAction *action); void setOrientation(Qt::Orientation orientation); #ifdef PBK_UNIT_TEST diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntfetchcontactsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/inc/cntfetchcontactsview.h Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,105 @@ +/* +* 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 CntFetchContacts_H_ +#define CntFetchContacts_H_ + +#include +#include +#include +#include +#include + +class HbDialog; +class HbSearchPanel; +class HbAction; +class HbListView; +class HbLabel; +class HbStaticVkbHost; +class HbIndexFeedback; + +class MobCntModel; +class QGraphicsLinearLayout; + +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +class CntFetchContacts : public QObject + { + Q_OBJECT + +public: + CntFetchContacts(QContactManager *aManager); + ~CntFetchContacts(); + + enum DisplayType { + view, + popup + }; + +private slots: + void memberSelectionChanged(const QModelIndex &index); + + void closeFind(); + void setFilter(const QString &filterString); + + void handleKeypadOpen(); + void handleKeypadClose(); + + void handleUserResponse(HbAction* action); + +public: + void displayContacts(DisplayType aType, HbAbstractItemView::SelectionMode aMode, QSet aContacts); + + QSet getSelectedContacts() const; + bool wasCanceled() const; + void setDetails(QString aTitle, QString aButtonText); + +private: + void doInitialize(HbAbstractItemView::SelectionMode aMode, + QSet aContacts); + void connectSignal(); + void showPopup(); + void markMembersInView(); + +signals: + void clicked(); + +private: + HbDialog* mPopup; + HbSearchPanel* mSearchPanel; + MobCntModel* mCntModel; + HbListView* mListView; + QGraphicsLinearLayout* mLayout; + HbTextItem* mEmptyListLabel; + HbWidget* mContainerWidget; + HbAbstractItemView::SelectionMode mSelectionMode; + QSet mCurrentlySelected; + QContactManager* mManager; + bool mWasCanceled; + HbLabel* mLabel; + HbStaticVkbHost* mVirtualKeyboard; + QString mButtonText; + HbAction* mPrimaryAction; + HbAction* mSecondaryAction; + HbIndexFeedback* mIndexFeedback; + }; + +#endif /* CntFetchContacts_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntgroupdeletepopup.h --- a/phonebookui/pbkcommonui/inc/cntgroupdeletepopup.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntgroupdeletepopup.h Fri May 14 15:42:23 2010 +0300 @@ -20,8 +20,8 @@ #include #include -#include -#include "qmobilityglobal.h" +#include +#include #include "cntgroupdeletepopupmodel.h" class HbListView; @@ -41,16 +41,16 @@ ~CntGroupDeletePopup(); void populateListOfGroup(); - void deleteGroup(); + QList deleteGroup() const; #ifdef PBK_UNIT_TEST public: #else private: #endif - HbListView *mListView; - QContactManager *mContactManager; - CntGroupDeletePopupModel * mModel; + HbListView *mListView; + QContactManager *mContactManager; + CntGroupDeletePopupModel *mModel; }; #endif // CNTGROUPDELETEPOPUP_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntgroupeditormodel.h --- a/phonebookui/pbkcommonui/inc/cntgroupeditormodel.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntgroupeditormodel.h Fri May 14 15:42:23 2010 +0300 @@ -21,6 +21,7 @@ #include #include "qtpbkglobal.h" +class HbDataFormModelItem; QTM_BEGIN_NAMESPACE class QContact; QTM_END_NAMESPACE @@ -37,9 +38,13 @@ void saveContactDetails(); + bool isConferenceNumber( const QModelIndex& aIndex ); private: QContactName iGroupName; QContactPhoneNumber iGroupConfCallNumber; + + HbDataFormModelItem* iNameItem; + HbDataFormModelItem* iNumberItem; }; #endif /* CNTGROUPEDITORMODEL_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntgroupmemberview.h --- a/phonebookui/pbkcommonui/inc/cntgroupmemberview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntgroupmemberview.h Fri May 14 15:42:23 2010 +0300 @@ -19,6 +19,7 @@ #define CNTGROUPMEMBERVIEW_H #include +#include #include #include @@ -26,6 +27,7 @@ class MobCntModel; class CntAbstractViewManager; class CntContactCardHeadingItem; +class CntFetchContacts; class HbView; class HbAction; class HbListView; @@ -65,15 +67,31 @@ void showPreviousView(); void openGroupActions(); void manageMembers(); + void handleManageMembers(); void editGroup(); void deleteGroup(); + void handleDeleteGroup(HbAction *action); + void showContextMenu(HbAbstractViewItem *item, const QPointF &coords); + void handleMenu(HbAction* action); + + void showContactView(const QModelIndex &index); void removeFromGroup(const QModelIndex &index); void editContact(const QModelIndex &index); void thumbnailReady(const QPixmap& pixmap, void *data, int id, int error); void openImageEditor(); + void drawImageMenu(const QPointF &aCoords); + void handleImageMenu(HbAction* action); + +private: + void changeImage(); + void removeImage(); + +private: + QContactManager* getContactManager(); + private: QContact* mGroupContact; // own CntAbstractViewManager* mViewManager; @@ -90,6 +108,10 @@ CntImageLabel* mImageLabel; HbListView* mListView; // owned by layout HbDocumentLoader* mDocument; + CntFetchContacts* mFetchView; + QList mOriginalGroupMembers; + bool mIsPreviousImageEditorView; + QContactAvatar* mAvatar; }; #endif // CNTGROUPMEMBERVIEW_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntgroupselectionpopup.h --- a/phonebookui/pbkcommonui/inc/cntgroupselectionpopup.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntgroupselectionpopup.h Fri May 14 15:42:23 2010 +0300 @@ -45,8 +45,8 @@ CntGroupSelectionPopup(QContactManager *manager, QContact *contact, QGraphicsItem *parent = 0); ~CntGroupSelectionPopup(); - void saveNewGroup(); - void saveOldGroup(); + bool saveNewGroup(); + bool saveOldGroup(); void populateListOfContact(); #ifdef PBK_UNIT_TEST @@ -54,9 +54,8 @@ #else private slots: #endif - -void closeFind(); -void setFilter(const QString &filterString); + void closeFind(); + void setFilter(const QString &filterString); #ifdef PBK_UNIT_TEST public: diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cnthistoryview.h --- a/phonebookui/pbkcommonui/inc/cnthistoryview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cnthistoryview.h Fri May 14 15:42:23 2010 +0300 @@ -50,8 +50,11 @@ public slots: void updateScrollingPosition(); void clearHistory(); + void handleClearHistory(HbAction *action); void itemActivated(const QModelIndex &index); void showPreviousView(); + void showClearHistoryMenu(); + private: @@ -67,8 +70,9 @@ HbView* mView; // not own HbDocumentLoader* mDocumentLoader; // own CntAbstractViewManager* mViewMgr; // not own - HbAction* mBackKey; // own + HbAction* mBackKey; // not own QContact* mContact; // own + HbAction* mClearHistory; // not own }; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cnthistoryviewitem.h --- a/phonebookui/pbkcommonui/inc/cnthistoryviewitem.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cnthistoryviewitem.h Fri May 14 15:42:23 2010 +0300 @@ -19,18 +19,20 @@ #define CNTHISTORYVIEWITEM_H // INCLUDES -#include "cnthistoryviewitemwidget.h" -#include -#include -#include -#include +#include + +class HbFrameItem; /** * This class represents the item decorator of * the comm history view. */ -class CntHistoryViewItem : public HbAbstractViewItem - { +class CntHistoryViewItem : public HbListViewItem +{ + Q_OBJECT + Q_PROPERTY( bool incoming READ getIncoming ) + Q_PROPERTY( bool newmessage READ isNewMessage ) + public: /* * Constructor @@ -38,29 +40,25 @@ * default set to 0 */ CntHistoryViewItem(QGraphicsItem* parent=0); - + /* * Factory method to the items */ HbAbstractViewItem* createItem(); - - /* - * Overriden method to postprocess custom item - */ - void polish(HbStyleParameters& params); - + /* * Overriden method to draw the custom item in the list view */ void updateChildItems(); -private: + bool getIncoming() const { return mIncoming; } + bool isNewMessage() const { return mNewMessage; } - /* - * Custom widget containing text fields and icon - * Not owned - */ - CntHistoryViewItemWidget* itemWidget; - }; +private: + bool mIncoming; + bool mNewMessage; + + HbFrameItem* mNewItem; +}; #endif // CNTHISTORYVIEWITEM_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cnthistoryviewitemwidget.h --- a/phonebookui/pbkcommonui/inc/cnthistoryviewitemwidget.h Mon May 03 12:24:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +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 CNTHISTORYVIEWITEMWIDGET_H -#define CNTHISTORYVIEWITEMWIDGET_H - -#include -#include - -class HbIconItem; -class HbTextItem; -class HbFrameItem; - -class CntHistoryViewItemWidget : public HbWidget -{ - Q_OBJECT - Q_PROPERTY( bool titleExist READ isTitleExist ) - Q_PROPERTY( bool bodyTextExist READ isBodyTextExist ) - Q_PROPERTY( bool incoming READ getIncoming ) - -public: - CntHistoryViewItemWidget(QGraphicsItem *parent = 0); - ~CntHistoryViewItemWidget(); - -public: - void createPrimitives(); - void recreatePrimitives(); - void updatePrimitives(); - void setDetails(QString title, QString bodyText, QString timeStamp, QString iconName, bool incoming, bool newMessage); - - bool isTitleExist() const { return !mTitle.isNull(); } - bool isBodyTextExist() const { return !mBodyText.isNull(); } - bool getIncoming() const { return mIncoming; } - -private: - - HbIconItem *mIconLabel; - HbTextItem *mTitleLabel; - HbTextItem *mBodyTextLabel; - HbTextItem *mTimeStampLabel; - HbFrameItem *mFrameLabel; - HbFrameItem *mNewItemLabel; - - QString mTitle; - QString mBodyText; - QString mTimeStamp; - HbIcon mIcon; - bool mIncoming; - bool mNewMessage; -}; - -#endif // CNTHISTORYVIEWITEMWIDGET_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntimageeditorview.h --- a/phonebookui/pbkcommonui/inc/cntimageeditorview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntimageeditorview.h Fri May 14 15:42:23 2010 +0300 @@ -93,6 +93,8 @@ HbDocumentLoader mDocumentLoader; HbListView *mListView; // owned by layout QStandardItemModel *mModel; // own + + CntViewParameters mArgs; }; #endif // CNTIMAGEEDITORVIEW_H diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntimportsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/inc/cntimportsview.h Fri May 14 15:42:23 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 CNTIMPORTSVIEW_H_ +#define CNTIMPORTSVIEW_H_ + +#include +#include +#include + +//#include "cntabstractview.h" +#include "cntactionmenubuilder.h" +#include +#include "simutility.h" + +#include + +class CntAbstractViewManager; +class HbView; +class HbAction; +class QStandardItemModel; +class SimUtility; +class HbDialog; + +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +class CntImportsView : public QObject, public CntAbstractView +{ + +Q_OBJECT + +public slots: + + void onListViewActivated(const QModelIndex &index); + void stopSimImport(); + void importFetchResultReceivedADN(); + void importFetchResultReceivedSDN(); + void adnCacheStatusReady(SimUtility::CacheStatus& cacheStatus, int error); + +public: +CntImportsView(); + ~CntImportsView(); + +public: // From CntAbstractView + void activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ); + void deactivate(); + bool isDefault() const { return false; } + HbView* view() const { return mView; } + int viewId() const { return importsView; } + void simInfoErrorMessage(int infoError); + bool startSimImport(); + void fetchSDNContacts(); + +protected: + void timerEvent(QTimerEvent *event); + +private: + void showWaitNote(); + void showSimImportResults() const; + +#ifdef PBK_UNIT_TEST +public slots: +#else +private slots: +#endif + void showPreviousView(); + +#ifdef PBK_UNIT_TEST +public : +#else +private : +#endif + // QContact* mContact; + CntAbstractViewManager* mViewManager; + QContactManager *mContactSimManagerADN; + QContactManager *mContactSimManagerSDN; + QContactManager *mContactSymbianManager; + QContactFetchRequest *mFetchRequestADN; + QContactFetchRequest *mFetchRequestSDN; + HbListView *mListView; + HbDocumentLoader mDocumentLoader; + HbView* mView; // own + HbAction* mSoftkey; + QStandardItemModel* mModel; + SimUtility *mSimUtility; + bool mAdnEntriesPresent; + HbDialog *mImportSimPopup; + int mSaveCount; + QList mSaveSimContactsList; + QList mSaveSimContactsListSDN; + QTimer *mTimer; + bool mFetchIsDone; + int mTimerId; + bool mAdnStorePresent; + bool mSdnStorePresent; + bool mSimPresent; + int mAdnStoreEntries; + bool mSimError; + bool mWaitingForAdnCache; +}; + +#endif /* CNTIMPORTSVIEW_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntmycardview.h --- a/phonebookui/pbkcommonui/inc/cntmycardview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntmycardview.h Fri May 14 15:42:23 2010 +0300 @@ -24,6 +24,7 @@ #include class CntAbstractViewManager; +class CntFetchContacts; class HbView; class HbAction; @@ -57,14 +58,16 @@ void showPreviousView(); void openNameEditor(); void openMyCardSelectionView(); + void handleMultiCardSelection(); void setOrientation(Qt::Orientation orientation); private: - QContact* mContact; // own - CntAbstractViewManager* mViewManager; - HbDocumentLoader mDocumentLoader; - HbView* mView; // own - HbAction* mSoftkey; + QContact* mContact; // own + CntAbstractViewManager* mViewManager; + HbDocumentLoader mDocumentLoader; + HbView* mView; // own + HbAction* mSoftkey; + CntFetchContacts* mFetchView; }; #endif /* CNTMYCARDVIEW_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntnamesview_p.h --- a/phonebookui/pbkcommonui/inc/cntnamesview_p.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntnamesview_p.h Fri May 14 15:42:23 2010 +0300 @@ -38,6 +38,7 @@ class HbStaticVkbHost; class QGraphicsLinearLayout; class CntExtensionManager; +class CntFetchContacts; class CntNamesViewPrivate : public QObject { @@ -62,6 +63,11 @@ void handleExtensionAction(); void createNewContact(); + void deleteContact( QContact& aContact ); + void deleteMultipleContacts(); + + void handleDeleteMultipleContacts(); + void showPreviousView(); void showCollectionView(); void showContactView( QContact& aContact ); @@ -71,26 +77,25 @@ void executeAction( QContact& aContact, QString aAction ); void actionExecuted( CntAction* aAction ); - void deleteContact( QContact& aContact ); + void handleDeleteContact( HbAction* aAction ); void importSim(); - + public: bool isFinderVisible(); void activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ); void deactivate(); - void scrollTo(const QContact &aContact); public: - CntNamesView* q_ptr; + CntNamesView *q_ptr; -public: // lazy initializations - HbListView* list(); - HbTextItem* emptyLabel(); - HbGroupBox* groupBox(); - HbSearchPanel* search(); - QGraphicsLinearLayout* layout(); - HbDocumentLoader* document(); - +public: // lazy initializations + HbListView *list(); + HbTextItem *emptyLabel(); + HbGroupBox *groupBox(); + HbSearchPanel *search(); + QGraphicsLinearLayout *layout(); + HbDocumentLoader *document(); + private: CntExtensionManager& mExtensionManager; CntAbstractViewManager* mViewManager; @@ -103,10 +108,15 @@ HbDocumentLoader* mLoader; QGraphicsLinearLayout* mLayout; HbStaticVkbHost* mVirtualKeyboard; - HbAction* mSoftkey; // own - CntActionMenuBuilder* mMenuBuilder; // own - - bool mIsDefault; - int mId; + HbAction* mSoftkey; + CntActionMenuBuilder* mMenuBuilder; + HbAction* mImportSim; + HbAction* mNewContact; + QContactLocalId mHandledContactId; + HbAction* mMultipleDeleter; + CntFetchContacts* mFetchView; + bool mIsDefault; + int mId; + bool mMenuVisible; }; #endif /* CNTABSTRACTLISTVIEW_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntphonenumbermodel.h --- a/phonebookui/pbkcommonui/inc/cntphonenumbermodel.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntphonenumbermodel.h Fri May 14 15:42:23 2010 +0300 @@ -36,7 +36,7 @@ public: // takes ownership of aContact - CntPhoneNumberModel( QContact* aContact, QObject* aParent=0 ); + CntPhoneNumberModel( QContact* aContact, QObject* aParent = 0 ); ~CntPhoneNumberModel(); void saveContactDetails(); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntphonenumberviewitem.h --- a/phonebookui/pbkcommonui/inc/cntphonenumberviewitem.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntphonenumberviewitem.h Fri May 14 15:42:23 2010 +0300 @@ -57,7 +57,6 @@ #endif HbComboBox* mBox; HbLineEdit* mEdit; - HbEditorInterface* mFilter; QGraphicsLinearLayout* mLayout; }; #endif /* CNTPHONENUMBERVIEWITEM_H_ */ diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/inc/cntstringmapper.h --- a/phonebookui/pbkcommonui/inc/cntstringmapper.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/inc/cntstringmapper.h Fri May 14 15:42:23 2010 +0300 @@ -45,107 +45,160 @@ public: void initMappings() { - // init stringmap for string localization - mStringMap.insert(QContactPhoneNumber::DefinitionName, hbTrId("Phone number")); - mStringMap.insert(QContactPhoneNumber::SubTypeAssistant, hbTrId("Assistant number")); - mStringMap.insert(QContactPhoneNumber::SubTypeCar, hbTrId("Car phone")); - mStringMap.insert(QContactPhoneNumber::SubTypeMobile, hbTrId("Mobile")); - mStringMap.insert(QContactPhoneNumber::SubTypeLandline, hbTrId("Phone")); - mStringMap.insert(QContactPhoneNumber::SubTypeDtmfMenu, hbTrId("DTMF")); - mStringMap.insert(QContactPhoneNumber::SubTypeFacsimile, hbTrId("Fax")); - mStringMap.insert(QContactPhoneNumber::SubTypePager, hbTrId("Pager number")); - - mStringMap.insert(QContactEmailAddress::DefinitionName, hbTrId("Email")); - - mStringMap.insert(QContactAddress::DefinitionName, hbTrId("Address")); - - mStringMap.insert(QContactOnlineAccount::DefinitionName, hbTrId("Chat")); - mStringMap.insert(QContactOnlineAccount::SubTypeSipVoip, hbTrId("Internet call")); - mStringMap.insert(QContactOnlineAccount::SubTypeSip, hbTrId("SIP")); - mStringMap.insert(QContactOnlineAccount::SubTypeVideoShare, hbTrId("Share Video")); - - mStringMap.insert(QContactUrl::DefinitionName, hbTrId("URL")); - - mStringMap.insert(QContactOrganization::DefinitionName, hbTrId("Company details")); - mStringMap.insert(QContactOrganization::FieldAssistantName, hbTrId("Assistant name")); - - mStringMap.insert(QContactBirthday::DefinitionName, hbTrId("Birthday")); - mStringMap.insert(QContactAnniversary::DefinitionName, hbTrId("Anniversary")); - - mStringMap.insert(QContactAvatar::SubTypeAudioRingtone, hbTrId("Ringtone")); - - mStringMap.insert(QContactNote::DefinitionName, hbTrId("Note")); - - mStringMap.insert(QContactFamily::FieldSpouse, hbTrId("Spouse")); - mStringMap.insert(QContactFamily::FieldChildren, hbTrId("Children")); - - mStringMap.insert(QContactDetail::ContextHome, hbTrId("(home)")); - mStringMap.insert(QContactDetail::ContextWork, hbTrId("(work)")); - - // init mapping of editor icons - mEditorIconMap.insert(QContactPhoneNumber::DefinitionName, "qtg_small_mobile"); - mEditorIconMap.insert(QContactPhoneNumber::SubTypeAssistant, "qtg_small_assistant"); - mEditorIconMap.insert(QContactPhoneNumber::SubTypeCar, "qtg_small_car"); - mEditorIconMap.insert(QContactPhoneNumber::SubTypeMobile, "qtg_small_mobile"); - mEditorIconMap.insert(QContactPhoneNumber::SubTypeLandline, "qtg_small_landline"); - mEditorIconMap.insert(QContactPhoneNumber::SubTypeDtmfMenu, "qgn_prop_empty"); - mEditorIconMap.insert(QContactPhoneNumber::SubTypeFacsimile, "qtg_small_fax"); - mEditorIconMap.insert(QContactPhoneNumber::SubTypePager, "qtg_small_pagerg"); - - mEditorIconMap.insert(QContactEmailAddress::DefinitionName, "qtg_small_email"); - - mEditorIconMap.insert(QContactAddress::DefinitionName, "qtg_small_location"); + //editor icons + mContactEditorIconList.append(Loc(QContactPhoneNumber::DefinitionName, "", "qtg_small_mobile")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextHome, "qtg_small_mobile_home")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextWork, "qtg_small_mobile_work")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeMobile, "", "qtg_small_mobile")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextHome, "qtg_small_mobile_home")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextWork, "qtg_small_mobile_work")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeLandline, "", "qtg_small_landline")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextHome, "qtg_small_landline_home")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextWork, "qtg_small_landline_work")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, "", "qtg_small_fax")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, "qtg_small_fax_home")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, "qtg_small_fax_work")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypePager, "", "qtg_small_pager")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeCar, "", "qtg_small_car")); + mContactEditorIconList.append(Loc(QContactPhoneNumber::SubTypeAssistant, "", "qtg_small_assistant")); + mContactEditorIconList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", "qtg_small_voip")); + mContactEditorIconList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, "qtg_small_voip_home")); + mContactEditorIconList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, "qtg_small_voip_work")); + mContactEditorIconList.append(Loc(QContactOnlineAccount::SubTypeSip, "", "qtg_small_internet")); + mContactEditorIconList.append(Loc(QContactEmailAddress::DefinitionName, "", "qtg_small_email")); + mContactEditorIconList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextHome, "qtg_small_email_home")); + mContactEditorIconList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextWork, "qtg_small_email_work")); + mContactEditorIconList.append(Loc(QContactUrl::DefinitionName, "", "qtg_small_url_address")); + mContactEditorIconList.append(Loc(QContactUrl::DefinitionName, QContactDetail::ContextHome, "qtg_small_url_address_home")); + mContactEditorIconList.append(Loc(QContactUrl::DefinitionName, QContactDetail::ContextWork, "qtg_small_url_address_work")); + mContactEditorIconList.append(Loc(QContactAddress::DefinitionName, "", "qtg_small_location")); + + //editor list items + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, "", hbTrId("txt_phob_dblist_mobile"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_mobile_home"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_mobile_work"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, "", hbTrId("txt_phob_dblist_phone"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_phone_home"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_phone_work"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypePager, "", hbTrId("txt_phob_dblist_pager"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, "", hbTrId("txt_phob_dblist_assistant"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeCar, "", hbTrId("txt_phob_dblist_car"))); + mContactEditorLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_dblist_internet_telephone"))); + mContactEditorLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_internet_telephone_home"))); + mContactEditorLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_internet_telephone_work"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, "", hbTrId("txt_phob_dblist_fax"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_fax_home"))); + mContactEditorLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_fax_work"))); + mContactEditorLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_dblist_ptt"))); - mEditorIconMap.insert(QContactOnlineAccount::DefinitionName, "qtg_small_internet"); - mEditorIconMap.insert(QContactOnlineAccount::SubTypeSipVoip, "qtg_small_internet"); - mEditorIconMap.insert(QContactOnlineAccount::SubTypeSip, "qtg_small_internet"); - mEditorIconMap.insert(QContactOnlineAccount::SubTypeVideoShare, "qtg_small_internet"); - mEditorIconMap.insert(QContactUrl::DefinitionName, "qtg_small_url_address.svg"); + //editor list item specific menu items + mContactEditorAddLocList.append(Loc(QContactAddress::DefinitionName, "", hbTrId("txt_phob_menu_add_address"))); + mContactEditorAddLocList.append(Loc(QContactOrganization::DefinitionName, "", hbTrId("txt_phob_menu_add_company_details"))); + mContactEditorAddLocList.append(Loc(QContactEmailAddress::DefinitionName, "", hbTrId("txt_phob_menu_add_email"))); + mContactEditorAddLocList.append(Loc(QContactFamily::DefinitionName, "", hbTrId("txt_phob_menu_add_family_details"))); + mContactEditorAddLocList.append(Loc(QContactPhoneNumber::DefinitionName, "", hbTrId("txt_phob_menu_add_number"))); + mContactEditorAddLocList.append(Loc(QContactUrl::DefinitionName, "", hbTrId("txt_phob_menu_add_url"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, "", hbTrId("txt_phob_dblist_mobile"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextHome,hbTrId("txt_phob_dblist_mobile_home"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextWork,hbTrId("txt_phob_dblist_mobile_work"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, "",hbTrId("txt_phob_dblist_phone"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_phone_home"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_phone_work"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypePager, "", hbTrId("txt_phob_dblist_pager"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, "", hbTrId("txt_phob_dblist_assistant"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeCar, "", hbTrId("txt_phob_dblist_car"))); - mLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_dblist_internet_telephone"))); - mLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_internet_telephone_home"))); - mLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_internet_telephone_work"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, "", hbTrId("txt_phob_dblist_fax"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_fax_home"))); - mLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_fax_work"))); - mLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_dblist_ptt"))); - - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::DefinitionName, "", hbTrId("txt_phob_menu_call_mobile"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_mobile_home"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_mobile_work"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, "", hbTrId("txt_phob_menu_call_assistant"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_assistant"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_assistant"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeCar, "", hbTrId("txt_phob_menu_call_car_phone"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_car_phone"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_car_phone"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextHome,hbTrId("txt_phob_menu_call_mobile_home"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextWork,hbTrId("txt_phob_menu_call_mobile_work"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, "", hbTrId("txt_phob_menu_call_mobile"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, "",hbTrId("txt_phob_menu_call_phone"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_phone_home"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_phone_work"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, "", hbTrId("txt_phob_menu_fax"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, hbTrId("txt_phob_menu_fax_home"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, hbTrId("txt_phob_menu_fax_work"))); - mContactCardMenuLocList.append(Loc(QContactPhoneNumber::SubTypePager, "", hbTrId("txt_phob_menu_call_pager"))); - mContactCardMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_menu_call_internet_call"))); - mContactCardMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_internet_call_home"))); - mContactCardMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_internet_call_work"))); - mContactCardMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_menu_sip"))); - mContactCardMenuLocList.append(Loc(QContactEmailAddress::DefinitionName, "", hbTrId("txt_phob_menu_email"))); - mContactCardMenuLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_email_home"))); - mContactCardMenuLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_email_work"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::DefinitionName, "", hbTrId("txt_phob_menu_edit_mobile"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_mobile_home"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_mobile_work"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, "", hbTrId("txt_phob_menu_call_assistant"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_assistant"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_assistant"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeCar, "", hbTrId("txt_phob_menu_edit_car"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_car"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_car"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextHome,hbTrId("txt_phob_menu_edit_mobile"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextWork,hbTrId("txt_phob_menu_edit_mobile_home"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, "", hbTrId("txt_phob_menu_edit_mobile_work"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, "",hbTrId("txt_phob_menu_edit_phone"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_phone_home"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_phone_work"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, "", hbTrId("txt_phob_menu_edit_fax"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_fax_home"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_fax_work"))); + mContactEditorEditLocList.append(Loc(QContactPhoneNumber::SubTypePager, "", hbTrId("txt_phob_menu_edit_pager"))); + mContactEditorEditLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_menu_edit_internet_telephone"))); + mContactEditorEditLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_internet_telephone_home"))); + mContactEditorEditLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_internet_telephone_work"))); + mContactEditorEditLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_menu_edit_sip"))); + mContactEditorEditLocList.append(Loc(QContactEmailAddress::DefinitionName, "", hbTrId("txt_phob_menu_edit_email"))); + mContactEditorEditLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_email_home"))); + mContactEditorEditLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_email_work"))); + mContactEditorEditLocList.append(Loc(QContactAddress::DefinitionName, "", hbTrId("txt_phob_menu_edit_address"))); + mContactEditorEditLocList.append(Loc(QContactAddress::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_edit_address_home"))); + mContactEditorEditLocList.append(Loc(QContactAddress::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_edit_address_work"))); + mContactEditorEditLocList.append(Loc(QContactAnniversary::DefinitionName, "", hbTrId("txt_phob_menu_edit_anniversary"))); + mContactEditorEditLocList.append(Loc(QContactBirthday::DefinitionName, "", hbTrId("txt_phob_menu_edit_birthday"))); + mContactEditorEditLocList.append(Loc(QContactNote::DefinitionName, "", hbTrId("txt_phob_menu_edit_note"))); + mContactEditorEditLocList.append(Loc(QContactFamily::FieldSpouse, "", hbTrId("txt_phob_menu_edit_children"))); + mContactEditorEditLocList.append(Loc(QContactFamily::FieldChildren, "", hbTrId("txt_phob_menu_edit_spouse"))); + + + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::DefinitionName, "", hbTrId("txt_phob_menu_delete_mobile"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_mobile_home"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_mobile_work"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, "", hbTrId("txt_phob_menu_call_assistant"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_assistant"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_assistant"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeCar, "", hbTrId("txt_phob_menu_delete_car"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_car"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_car"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextHome,hbTrId("txt_phob_menu_delete_mobile"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextWork,hbTrId("txt_phob_menu_delete_mobile_home"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, "", hbTrId("txt_phob_menu_delete_mobile_work"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, "",hbTrId("txt_phob_menu_delete_phone"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_phone_home"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_phone_work"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, "", hbTrId("txt_phob_menu_delete_fax"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_fax_home"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_fax_work"))); + mContactEditorDelLocList.append(Loc(QContactPhoneNumber::SubTypePager, "", hbTrId("txt_phob_menu_delete_pager"))); + mContactEditorDelLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_menu_delete_internet_telephone"))); + mContactEditorDelLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_internet_telephone_home"))); + mContactEditorDelLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_internet_telephone_work"))); + mContactEditorDelLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_menu_delete_sip"))); + mContactEditorDelLocList.append(Loc(QContactEmailAddress::DefinitionName, "", hbTrId("txt_phob_menu_delete_email"))); + mContactEditorDelLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_email_home"))); + mContactEditorDelLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_email_work"))); + mContactEditorDelLocList.append(Loc(QContactAddress::DefinitionName, "", hbTrId("txt_phob_menu_delete_address"))); + mContactEditorDelLocList.append(Loc(QContactAddress::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_delete_address_home"))); + mContactEditorDelLocList.append(Loc(QContactAddress::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_delete_address_work"))); + mContactEditorDelLocList.append(Loc(QContactAnniversary::DefinitionName, "", hbTrId("txt_phob_menu_delete_anniversary"))); + mContactEditorDelLocList.append(Loc(QContactBirthday::DefinitionName, "", hbTrId("txt_phob_menu_delete_birthday"))); + mContactEditorDelLocList.append(Loc(QContactNote::DefinitionName, "", hbTrId("txt_phob_menu_delete_note"))); + mContactEditorDelLocList.append(Loc(QContactFamily::FieldSpouse, "", hbTrId("txt_phob_menu_delete_children"))); + mContactEditorDelLocList.append(Loc(QContactFamily::FieldChildren, "", hbTrId("txt_phob_menu_delete_spouse"))); + + //contact card item specific menu + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::DefinitionName, "", hbTrId("txt_phob_menu_call_mobile"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_mobile_home"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_mobile_work"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, "", hbTrId("txt_phob_menu_call_assistant"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_assistant"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeAssistant, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_assistant"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeCar, "", hbTrId("txt_phob_menu_call_car_phone"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_car_phone"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeCar, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_car_phone"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextHome,hbTrId("txt_phob_menu_call_mobile_home"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, QContactDetail::ContextWork,hbTrId("txt_phob_menu_call_mobile_work"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeMobile, "", hbTrId("txt_phob_menu_call_mobile"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, "",hbTrId("txt_phob_menu_call_phone"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_phone_home"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeLandline, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_phone_work"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, "", hbTrId("txt_phob_menu_fax"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, hbTrId("txt_phob_menu_fax_home"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, hbTrId("txt_phob_menu_fax_work"))); + mItemSpecificMenuLocList.append(Loc(QContactPhoneNumber::SubTypePager, "", hbTrId("txt_phob_menu_call_pager"))); + mItemSpecificMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_menu_call_internet_call"))); + mItemSpecificMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_menu_call_internet_call_home"))); + mItemSpecificMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_menu_call_internet_call_work"))); + mItemSpecificMenuLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_menu_sip"))); + mItemSpecificMenuLocList.append(Loc(QContactEmailAddress::DefinitionName, "", hbTrId("txt_phob_menu_email"))); + mItemSpecificMenuLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_menu_email_home"))); + mItemSpecificMenuLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_menu_email_work"))); + //contact card list items mContactCardLocList.append(Loc(QContactPhoneNumber::DefinitionName, "", hbTrId("txt_phob_dblist_call_mobile"))); mContactCardLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_call_mobile_home"))); mContactCardLocList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_call_mobile_work"))); @@ -165,15 +218,18 @@ mContactCardLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_fax_home"))); mContactCardLocList.append(Loc(QContactPhoneNumber::SubTypeFacsimile, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_fax_work"))); mContactCardLocList.append(Loc(QContactPhoneNumber::SubTypePager, "", hbTrId("txt_phob_dblist_call_pager"))); - mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_dblist_call_internet_call"))); - mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_call_internet_call_home"))); - mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_call_internet_call_work"))); - mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_dblist_sip"))); + mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, "", hbTrId("txt_phob_formlabel_internet_telephone"))); + mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextHome, hbTrId("txt_phob_formlabel_internet_telephone_home"))); + mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSipVoip, QContactDetail::ContextWork, hbTrId("txt_phob_formlabel_internet_telephone_work"))); + mContactCardLocList.append(Loc(QContactOnlineAccount::SubTypeSip, "", hbTrId("txt_phob_formlabel_sip"))); mContactCardLocList.append(Loc(QContactEmailAddress::DefinitionName, "", hbTrId("txt_phob_dblist_email"))); mContactCardLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_email_home"))); mContactCardLocList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_email_work"))); + mContactCardLocList.append(Loc(QContactUrl::DefinitionName, "", hbTrId("txt_phob_dblist_url"))); + mContactCardLocList.append(Loc(QContactUrl::DefinitionName, QContactDetail::ContextHome, hbTrId("txt_phob_dblist_url_home"))); + mContactCardLocList.append(Loc(QContactUrl::DefinitionName, QContactDetail::ContextWork, hbTrId("txt_phob_dblist_url_work"))); - // init mapping of contact card icons + //contact card icons mContactCardIconList.append(Loc(QContactPhoneNumber::DefinitionName, "", "qtg_large_call_mobile")); mContactCardIconList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextHome, "qtg_large_call_mobile_home")); mContactCardIconList.append(Loc(QContactPhoneNumber::DefinitionName, QContactDetail::ContextWork, "qtg_large_call_mobile_work")); @@ -197,29 +253,16 @@ mContactCardIconList.append(Loc(QContactEmailAddress::DefinitionName, "", "qtg_large_email")); mContactCardIconList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextHome, "qtg_large_email_home")); mContactCardIconList.append(Loc(QContactEmailAddress::DefinitionName, QContactDetail::ContextWork, "qtg_large_email_work")); + mContactCardIconList.append(Loc(QContactUrl::DefinitionName, "", "qtg_large_url_address")); + mContactCardIconList.append(Loc(QContactUrl::DefinitionName, QContactDetail::ContextHome, "qtg_large_url_address_home")); + mContactCardIconList.append(Loc(QContactUrl::DefinitionName, QContactDetail::ContextWork, "qtg_large_url_address_work")); } - QString getMappedDetail(const QString &string) { return mStringMap.value(string); } - QString getMappedIcon(const QString &string) { return mEditorIconMap.value(string); } - - QString getLocString( QString aDefId, QString aContext ) - { - QString str = aDefId; - foreach ( Loc loc, mLocList ) - { - if ( loc.mId == aDefId && loc.mContext == aContext ) - { - str = loc.mLoc; - break; - } - } - return str; - } - - QString getContactCardMenuLocString( QString aDefId, QString aContext ) + //helper function to get string from list + QString getLocString( QString aDefId, QString aContext, QList list) { QString str; - foreach ( Loc loc, mContactCardMenuLocList ) + foreach ( Loc loc, list ) { if ( loc.mId == aDefId && loc.mContext == aContext ) { @@ -229,40 +272,63 @@ } return str; } + + //get string of editor view item + QString getContactEditorLocString( QString aDefId, QString aContext ) + { + return getLocString( aDefId, aContext, mContactEditorLocList ); + } + + //get add string of contect editor + QString getContactEditorAddLocString( QString aDefId, QString aContext ) + { + return getLocString( aDefId, aContext, mContactEditorAddLocList ); + } + + //get edit string of contect editor + QString getContactEditorEditLocString( QString aDefId, QString aContext ) + { + return getLocString( aDefId, aContext, mContactEditorEditLocList ); + } + + + //get delete string of contect editor + QString getContactEditorDelLocString( QString aDefId, QString aContext ) + { + return getLocString( aDefId, aContext, mContactEditorDelLocList ); + } + + //get string of item specific menu of contact card and editor view + QString getItemSpecificMenuLocString( QString aDefId, QString aContext ) + { + return getLocString( aDefId, aContext, mItemSpecificMenuLocList ); + } + + //get string of contact card list item QString getContactCardListLocString( QString aDefId, QString aContext ) { - QString str; - foreach ( Loc loc, mContactCardLocList ) - { - if ( loc.mId == aDefId && loc.mContext == aContext ) - { - str = loc.mLoc; - break; - } - } - return str; + return getLocString( aDefId, aContext, mContactCardLocList ); } + + //get string of editor view icon + QString getContactEditorIconString( QString aDefId, QString aContext ) + { + return getLocString( aDefId, aContext, mContactEditorIconList ); + } + + //get string of contact card icon QString getContactCardIconString( QString aDefId, QString aContext ) { - QString str; - foreach ( Loc loc, mContactCardIconList ) - { - if ( loc.mId == aDefId && loc.mContext == aContext ) - { - str = loc.mLoc; - break; - } - } - return str; + return getLocString( aDefId, aContext, mContactCardIconList ); } - + private: - QMap mStringMap; - QMap mEditorIconMap; - QMap mLauncherIconMap; - - QList mLocList; - QList mContactCardMenuLocList; + QList mContactEditorIconList; + QList mContactEditorLocList; + QList mContactEditorAddLocList; + QList mContactEditorEditLocList; + QList mContactEditorDelLocList; + QList mItemSpecificMenuLocList; QList mContactCardLocList; QList mContactCardIconList; }; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/pbkcommonui.pro --- a/phonebookui/pbkcommonui/pbkcommonui.pro Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/pbkcommonui.pro Fri May 14 15:42:23 2010 +0300 @@ -77,6 +77,7 @@ inc/cntcontactcardheadingitem.h \ inc/cntcontactcarddatacontainer.h \ inc/cntcontactcarddataitem.h \ + inc/cntcontactcardcontextmenu.h \ inc/cntcontactcardview.h \ inc/cntcontactcardview_p.h \ inc/cntcontactcarddetailitem.h \ @@ -94,7 +95,6 @@ inc/cntgroupeditormodel.h \ inc/cnthistoryview.h \ inc/cnthistoryviewitem.h \ - inc/cnthistoryviewitemwidget.h \ inc/cntgroupselectionpopup.h \ inc/cntgroupdeletepopupmodel.h \ inc/cntdetailconst.h \ @@ -120,7 +120,9 @@ inc/cntdetailviewitem.h \ inc/cntgroupdeletepopup.h \ inc/cntextensionmanager.h \ - inc/cntimagelabel.h + inc/cntimagelabel.h \ + inc/cntfetchcontactsview.h \ + inc/cntimportsview.h SOURCES += \ src/cntviewnavigator.cpp \ @@ -144,6 +146,7 @@ src/cntcontactcardview.cpp \ src/cntcontactcardview_p.cpp \ src/cntcontactcardheadingitem.cpp \ + src/cntcontactcardcontextmenu.cpp \ src/cntdocumentloader.cpp \ src/cnteditview.cpp \ src/cnteditview_p.cpp \ @@ -159,7 +162,6 @@ src/cntgroupeditormodel.cpp \ src/cnthistoryview.cpp \ src/cnthistoryviewitem.cpp \ - src/cnthistoryviewitemwidget.cpp \ src/cntgroupselectionpopup.cpp \ src/cntgroupdeletepopupmodel.cpp \ src/cntaddressmodel.cpp \ @@ -182,7 +184,9 @@ src/cnturleditorviewitem.cpp \ src/cntgroupdeletepopup.cpp \ src/cntextensionmanager.cpp \ - src/cntimagelabel.cpp + src/cntimagelabel.cpp \ + src/cntimportsview.cpp \ + src/cntfetchcontactsview.cpp RESOURCES += resources\pbkcommonui.qrc diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_actions.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_actions.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_collections.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_collections.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_contactcard.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_contactcard.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + +
diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_detail_editor.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_detail_editor.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_editor.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_editor.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_ev.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_ev.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + +
diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_favmember.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_favmember.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_favorite.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_favorite.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+
+ + + + + + + + + + + + +
+ + + + + +
diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_groupactions.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_groupactions.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_groupmembers.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_groupmembers.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + +
diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_history.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_history.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_if.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_if.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+ + + + + + + + + + + + + +
+ + + + + +
diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_list.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_list.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_mc.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_mc.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + +
diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_namelist.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_namelist.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/contacts_sim.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/contacts_sim.docml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/pbkcommonui.qrc --- a/phonebookui/pbkcommonui/resources/pbkcommonui.qrc Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/pbkcommonui.qrc Fri May 14 15:42:23 2010 +0300 @@ -13,6 +13,7 @@ contacts_groupactions.docml contacts_history.docml contacts_editor.docml + contacts_sim.docml contacts_favorite.docml contacts_favmember.docml contacts_collections.docml @@ -33,8 +34,8 @@ style/cntcontactcarddetailitem.css style/cntcontactcardheadingitem.widgetml style/cntcontactcardheadingitem.css - style/cnthistoryviewitemwidget.widgetml - style/cnthistoryviewitemwidget.css + style/cnthistoryviewitem.widgetml + style/cnthistoryviewitem.css style/cntlocationbutton.hbpushbutton.widgetml style/cntlocationbutton.css diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.css --- a/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.css Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.css Fri May 14 15:42:23 2010 +0300 @@ -7,6 +7,12 @@ fixed-height:var(hb-param-graphic-size-primary-large); } +CntContactCardDetailItem::secondaryIcon{ + fixed-width:var(hb-param-graphic-size-secondary); + fixed-height:var(hb-param-graphic-size-secondary); +} + + CntContactCardDetailItem::text{ text-height:var(hb-param-text-height-primary); font-variant:primary; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.widgetml --- a/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.widgetml Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.widgetml Fri May 14 15:42:23 2010 +0300 @@ -3,9 +3,12 @@ + + + - + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/style/cnthistoryviewitem.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/style/cnthistoryviewitem.css Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,22 @@ +CntHistoryViewItem[layoutName="history"][modelItemType="StandardItem"][incoming]{ + layout:custom-history-incoming; +} + +CntHistoryViewItem[layoutName="history"][modelItemType="StandardItem"][!incoming]{ + layout:custom-history-outgoing; +} + +CntHistoryViewItem::text-3[layoutName="history"]{ + text-height:var(hb-param-text-height-tiny); + font-variant:secondary; + text-align: left; +} + +CntHistoryViewItem::frame[layoutName="history"]{ + border-width: 0.0un; +} + +CntHistoryViewItem::newitem[layoutName="history"]{ + top:-1.0un; + bottom:1.0un; +} diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/style/cnthistoryviewitem.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/style/cnthistoryviewitem.widgetml Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.css --- a/phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.css Mon May 03 12:24:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -CntHistoryViewItemWidget[incoming][titleExist][bodyTextExist]{ - layout:layout_incoming_title_bodytext_timestamp; -} - -CntHistoryViewItemWidget[!incoming][titleExist][bodyTextExist]{ - layout:layout_outgoing_title_bodytext_timestamp; -} - -CntHistoryViewItemWidget[incoming][!titleExist][bodyTextExist]{ - layout:layout_incoming_bodytext_timestamp; -} - -CntHistoryViewItemWidget[!incoming][!titleExist][bodyTextExist]{ - layout:layout_outgoing_bodytext_timestamp; -} - -CntHistoryViewItemWidget[incoming][titleExist][!bodyTextExist]{ - layout:layout_incoming_title_timestamp; -} - -CntHistoryViewItemWidget[!incoming][titleExist][!bodyTextExist]{ - layout:layout_outgoing_title_timestamp; -} - -CntHistoryViewItemWidget::title{ - text-height:var(hb-param-text-height-primary); - font-variant:primary; -} - -CntHistoryViewItemWidget::bodyText{ - text-height:var(hb-param-text-height-secondary); - text-line-count-max:3; - font-variant:secondary; -} - -CntHistoryViewItemWidget::timeStamp{ - text-height:var(hb-param-text-height-secondary); - font-variant:secondary; - text-height:var(hb-param-text-height-tiny); -} - -CntHistoryViewItemWidget::icon{ - fixed-width:var(hb-param-graphic-size-primary-small); - fixed-height:var(hb-param-graphic-size-primary-small); -} - -CntHistoryViewItemWidget::frame{ - border-width: var(hb-param-background-list-main); -} - -CntHistoryViewItemWidget::newItem{ - left:-0.25un; - top:-1.0un; - bottom:0.5un; - size-policy:fixed preferred; -} diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.widgetml --- a/phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.widgetml Mon May 03 12:24:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntactionmenubuilder.cpp --- a/phonebookui/pbkcommonui/src/cntactionmenubuilder.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntactionmenubuilder.cpp Fri May 14 15:42:23 2010 +0300 @@ -58,7 +58,7 @@ if ( actions.contains("message", Qt::CaseInsensitive) ) { - createSmsAction( *menu, aContact ); + createMessageAction( *menu, aContact ); } if ( actions.contains("email", Qt::CaseInsensitive) ) @@ -80,12 +80,10 @@ return menu; } -void CntActionMenuBuilder::execActionMenu( QContact& aContact, QPointF aPoint ) +HbMenu* CntActionMenuBuilder::actionMenu( QContact& aContact ) { mContact = new QContact( aContact ); - HbMenu* menu = buildActionMenu( aContact ); - menu->exec( aPoint ); - delete menu; + return buildActionMenu( aContact ); } void CntActionMenuBuilder::emitOpenContact() @@ -123,31 +121,26 @@ // Create call action QContactDetail detail = aContact.preferredDetail("call"); QContactPhoneNumber number = detail.isEmpty() ? aContact.detail() : detail; - - QString detailName = mMap->getMappedDetail( number.subTypes().first() ); - if (!number.contexts().isEmpty()) - { - detailName += hbTrId(" %1").arg(mMap->getMappedDetail( number.contexts().first()) ); - } - aMenu.addAction( hbTrId("Call %1").arg(detailName), this, SLOT(emitCallContact()) ); + QString context = number.contexts().isEmpty() ? QString() : number.contexts().first(); + QString subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first(); + + aMenu.addAction( mMap->getItemSpecificMenuLocString( subtype, context ), this, SLOT(emitCallContact()) ); } void CntActionMenuBuilder::createEmailAction( HbMenu& aMenu, QContact& aContact ) { + // Create email action QContactDetail detail = aContact.preferredDetail("email"); QContactEmailAddress email = detail.isEmpty() ? aContact.detail() : detail; - - QString detailName = hbTrId("txt_phob_menu_email"); - if (!email.contexts().isEmpty()) - { - detailName += hbTrId(" %1").arg(mMap->getMappedDetail(email.contexts().first())); - } - aMenu.addAction(hbTrId("Mail %1").arg(detailName), this, SLOT(emitMailContact())); + QString context = email.contexts().isEmpty() ? QString() : email.contexts().first(); + + aMenu.addAction( mMap->getItemSpecificMenuLocString( email.definitionName(), context), this, SLOT(emitMailContact()) ); } -void CntActionMenuBuilder::createSmsAction( HbMenu& aMenu, QContact& aContact ) +void CntActionMenuBuilder::createMessageAction( HbMenu& aMenu, QContact& aContact ) { - Q_UNUSED( aContact ) + Q_UNUSED( aContact ); + aMenu.addAction(hbTrId("txt_phob_menu_send_message"), this, SLOT(emitSmsContact())); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntaddressmodel.cpp --- a/phonebookui/pbkcommonui/src/cntaddressmodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntaddressmodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -18,12 +18,14 @@ #include "cntaddressmodel.h" #include "cntdetailmodelitem.h" #include "cntdetailconst.h" +#include CntAddressModel::CntAddressModel( QContact* aContact ): CntDetailEditorModel( aContact ), mAddress(NULL), mAddressHome(NULL), -mAddressWork(NULL) +mAddressWork(NULL), +mIsLocationPickerEnabled( false ) { HbDataFormModelItem* address = appendDataFormGroup(qtTrId("Address"), invisibleRootItem()); HbDataFormModelItem* addressHome = appendDataFormGroup(qtTrId("Address (home)"), invisibleRootItem()); @@ -86,8 +88,14 @@ void CntAddressModel::createAddressItems( HbDataFormModelItem* aGroup, QContactAddress* aAddress ) { - // custom item for map button - // HbDataFormModelItem* mapButton = new HbDataFormModelItem( HbDataFormModelItem::CustomItemBase ); + //Show the location picker button only if location feature enabled + if( CntMapTileService::isLocationFeatureEnabled() ) + { + // custom item for map button + HbDataFormModelItem* mapButton = new HbDataFormModelItem( HbDataFormModelItem::CustomItemBase ); + appendDataFormItem( mapButton, aGroup ); + mIsLocationPickerEnabled = true; + } // default items for rest of fields HbDataFormModelItem* street = new HbDataFormModelItem( HbDataFormModelItem::TextItem, qtTrId("Street")); @@ -110,7 +118,6 @@ country->setContentWidgetData( "text", aAddress->country() ); country->setContentWidgetData( "maxLength", CNT_COUNTRY_MAXLENGTH ); - //appendDataFormItem( mapButton, aGroup ); appendDataFormItem( street, aGroup ); appendDataFormItem( postal, aGroup ); appendDataFormItem( city, aGroup ); @@ -155,12 +162,18 @@ void CntAddressModel::saveAddressItems( HbDataFormModelItem* aGroup, QContactAddress* aAddress ) { + int offset = 0; + if( CntMapTileService::isLocationFeatureEnabled() ) + { + offset = 1; + } + // first item (0) is the map button - aAddress->setStreet( aGroup->childAt( 0 )->contentWidgetData("text").toString().trimmed() ); - aAddress->setPostcode( aGroup->childAt( 1 )->contentWidgetData("text").toString().trimmed() ); - aAddress->setLocality( aGroup->childAt( 2 )->contentWidgetData("text").toString().trimmed() ); - aAddress->setRegion( aGroup->childAt( 3 )->contentWidgetData("text").toString().trimmed() ); - aAddress->setCountry( aGroup->childAt( 4 )->contentWidgetData("text").toString().trimmed() ); + aAddress->setStreet( aGroup->childAt( 0 + offset )->contentWidgetData("text").toString().trimmed() ); + aAddress->setPostcode( aGroup->childAt( 1 + offset )->contentWidgetData("text").toString().trimmed() ); + aAddress->setLocality( aGroup->childAt( 2 + offset )->contentWidgetData("text").toString().trimmed() ); + aAddress->setRegion( aGroup->childAt( 3 + offset )->contentWidgetData("text").toString().trimmed() ); + aAddress->setCountry( aGroup->childAt( 4 + offset )->contentWidgetData("text").toString().trimmed() ); } bool CntAddressModel::isAddressEmpty( QContactAddress* aAddress ) diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntaddressviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntaddressviewitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntaddressviewitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -29,23 +29,18 @@ #include #include -//#include "qlocationpickeritem_temp.h" +#include "qlocationpickeritem.h" #include #include #include CntAddressViewItem::CntAddressViewItem(QGraphicsItem* aParent) : /*CntDetailViewItem(aParent),*/ - HbDataFormViewItem(aParent), - mRequest(NULL), - mAppManager(NULL), - mSenderButton(NULL) + HbDataFormViewItem(aParent) { } CntAddressViewItem::~CntAddressViewItem() { - delete mRequest; - delete mAppManager; } HbAbstractViewItem* CntAddressViewItem::createItem() @@ -53,52 +48,109 @@ return new CntAddressViewItem(*this); } +bool CntAddressViewItem::canSetModelIndex( const QModelIndex &index ) const +{ + HbDataFormModelItem::DataItemType itemType = + static_cast( + index.data(HbDataFormModelItem::ItemTypeRole).toInt() ); + + if( itemType == HbDataFormModelItem::CustomItemBase ) + { + return true; + } + else + { + return false; + } + +} + HbWidget* CntAddressViewItem::createCustomWidget() { - QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Horizontal); - + HbDataFormModelItem::DataItemType itemType = static_cast( + modelIndex().data(HbDataFormModelItem::ItemTypeRole).toInt()); + HbWidget* widget = new HbWidget(); - widget->setLayout(layout); - - HbStyleLoader::registerFilePath(":/style/cntlocationbutton.css"); - HbStyleLoader::registerFilePath(":/style/cntlocationbutton.hbpushbutton.widgetml"); - HbDataForm* form = static_cast (itemView()); - HbDataFormModel* model = static_cast (form->model()); - - HbPushButton* mLocationButton = new HbPushButton(this); - mLocationButton->setObjectName("cntlocationbutton"); - mLocationButton->setIcon(HbIcon(":/icons/pickerIcon.jpg")); - mLocationButton->setText(qtTrId("Select location from map")); - mLocationButton->setOrientation(Qt::Horizontal); - - connect(mLocationButton, SIGNAL(clicked()), this, SLOT(launchLocationPicker())); - - layout->addItem(mLocationButton); + if( itemType == HbDataFormModelItem::CustomItemBase ) + { + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Horizontal); + widget->setLayout(layout); + + HbStyleLoader::registerFilePath(":/style/cntlocationbutton.css"); + HbStyleLoader::registerFilePath(":/style/cntlocationbutton.hbpushbutton.widgetml"); + HbDataForm* form = static_cast (itemView()); + HbDataFormModel* model = static_cast (form->model()); + + HbPushButton* mLocationButton = new HbPushButton(this); + mLocationButton->setObjectName("cntlocationbutton"); + mLocationButton->setIcon(HbIcon("qtg_mono_location")); + mLocationButton->setText( hbTrId("txt_phob_button_select_location") ); + + connect(mLocationButton, SIGNAL(clicked()), this, SLOT(launchLocationPicker())); + + layout->addItem(mLocationButton); + + } return widget; } void CntAddressViewItem::launchLocationPicker() { - mAppManager = new XQApplicationManager(); - if (mRequest) { - delete mRequest; - mRequest = 0; + XQApplicationManager *appManager = new XQApplicationManager(); + XQAiwRequest* request = appManager->create("com.nokia.symbian", "ILocationPick", "pick()", true); + if( request ) + { + QVariant retValue; + if( request->send( retValue ) ) + { + handleLocationChange( retValue ); + } + + delete request; } - - mSenderButton = sender(); - mRequest = mAppManager->create("com.nokia.symbian", "ILocationPick", "pick()", false); - if (mRequest) { - connect(mRequest, SIGNAL(requestOk(const QVariant&)), this, - SLOT(handleLocationChange(const QVariant&))); - mRequest->send(); - } + delete appManager; } void CntAddressViewItem::handleLocationChange(const QVariant& aValue) { - Q_UNUSED( aValue ); + QLocationPickerItem selectedLocation = aValue.value(); + if( selectedLocation.mIsValid ) + { + HbDataForm* form = static_cast(itemView()); + HbDataFormModel* model = static_cast(form->model()); + HbDataFormModelItem* item = model->itemFromIndex( modelIndex() ); + + QModelIndex nextIndex = modelIndex().sibling( modelIndex().row() + 1 , modelIndex().column() ); + HbDataFormModelItem* street = model->itemFromIndex( nextIndex ); + street->setContentWidgetData( "text", selectedLocation.mStreet ); + street->setContentWidgetData( "maxLength", CNT_STREET_MAXLENGTH ); + + nextIndex = modelIndex().sibling( modelIndex().row() + 2 , modelIndex().column() ); + + HbDataFormModelItem* postal = model->itemFromIndex( nextIndex ); + postal->setContentWidgetData( "text", selectedLocation.mPostalCode ); + postal->setContentWidgetData( "maxLength", CNT_POSTCODE_MAXLENGTH ); + + nextIndex = modelIndex().sibling( modelIndex().row() + 3 , modelIndex().column() ); + HbDataFormModelItem* locality = model->itemFromIndex( nextIndex ); + locality->setContentWidgetData( "text", selectedLocation.mCity ); + locality->setContentWidgetData( "maxLength", CNT_LOCALITY_MAXLENGTH ); + + nextIndex = modelIndex().sibling( modelIndex().row() + 4 , modelIndex().column() ); + HbDataFormModelItem* province = model->itemFromIndex( nextIndex ); + province->setContentWidgetData( "text", selectedLocation.mState ); + province->setContentWidgetData( "maxLength", CNT_REGION_MAXLENGTH ); + + nextIndex = modelIndex().sibling( modelIndex().row() + 5 , modelIndex().column() ); + HbDataFormModelItem* country = model->itemFromIndex( nextIndex ); + country->setContentWidgetData( "text", selectedLocation.mCountry ); + country->setContentWidgetData( "maxLength", CNT_COUNTRY_MAXLENGTH ); + + + } + } -//Q_IMPLEMENT_USER_METATYPE(QLocationPickerItem) + Q_IMPLEMENT_USER_METATYPE(QLocationPickerItem) // End of File diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntbaseselectionview.cpp --- a/phonebookui/pbkcommonui/src/cntbaseselectionview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntbaseselectionview.cpp Fri May 14 15:42:23 2010 +0300 @@ -19,6 +19,8 @@ #include #include +#include +#include #include #include #include @@ -37,6 +39,15 @@ } mView = static_cast( mDocument->findWidget("view") ); mListView = static_cast( mDocument->findWidget("listView") ); + + mListView->setFrictionEnabled(true); + mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); + mListView->verticalScrollBar()->setInteractive(true); + mListView->setUniformItemSizes(true); + + HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView); + indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); + indexFeedback->setItemView(mListView); mSoftkey = new HbAction(Hb::BackNaviAction, mView); connect( mSoftkey, SIGNAL(triggered()), this, SLOT(closeView()) ); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp --- a/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -109,22 +109,6 @@ beginRemoveRows(parent, row, row); mDataPointer->mDataList.removeAt(row); - if (mDataPointer->mExtensions.remove(row) > 0) - { - // if extension group was deleted, refresh the indices of extension group map - QList keyList = mDataPointer->mExtensions.keys(); - qSort(keyList); - - for (int i = 0;i < keyList.count();i++) - { - if (keyList.at(i) > row) - { - CntUiGroupSupplier* groupSupplier = mDataPointer->mExtensions.take(keyList.at(i)); - mDataPointer->mExtensions.insert(keyList.at(i) - 1, groupSupplier); - } - } - } - endRemoveRows(); return true; @@ -137,7 +121,8 @@ { for (int i = 0;i < rowCount();i++) { - if (mDataPointer->mDataList.at(i)[2] == localId) + // extension items have 4 items in the list, we don't allow those to be deleted from here + if (mDataPointer->mDataList.at(i)[2] == localId && mDataPointer->mDataList.at(i).count() < 4) { removeRow(i); break; @@ -221,13 +206,13 @@ } else { - displayList.append(hbTrId("txt_phob_dblist_favorites_val_no_favorites_selecte")); // as this isn't supported yet + displayList.append(hbTrId("txt_phob_dblist_favorites_val_no_favorites_selecte")); } } dataList.append(displayList); dataList.append(QStringList("qtg_large_favourites")); - dataList.append(mFavoriteGroupId); // as favorites doesn't really have a contact Id, -1 is used + dataList.append(mFavoriteGroupId); mDataPointer->mDataList.append(dataList); } @@ -358,9 +343,23 @@ } dataList.append(displayList); - // icon, default for now always - dataList.append(QStringList("qtg_large_custom")); - + // Default if no image for group + bool icon = false; + QList details = contact.details(); + for (int i = 0;i < details.count();i++) + { + if (details.at(i).imageUrl().isValid()) + { + dataList.append(QStringList(details.at(i).imageUrl().toString())); + icon = true; + break; + } + } + if(!icon) + { + dataList.append(QStringList("qtg_large_custom")); + } + // contact Id for identification dataList.append(groupContactIds.at(i)); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcollectionview.cpp --- a/phonebookui/pbkcommonui/src/cntcollectionview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcollectionview.cpp Fri May 14 15:42:23 2010 +0300 @@ -16,6 +16,7 @@ */ #include "cntcollectionview.h" +#include "cntfetchcontactsview.h" #include "cntgroupselectionpopup.h" #include "cntgroupdeletepopup.h" #include "cntcollectionlistmodel.h" @@ -36,6 +37,9 @@ #include #include #include +#include + +#include const char *CNT_COLLECTIONVIEW_XML = ":/xml/contacts_collections.docml"; @@ -53,7 +57,9 @@ mFindAction(NULL), mExtensionAction(NULL), mNewGroupAction(NULL), - mDeleteGroupsAction(NULL) + mDeleteGroupsAction(NULL), + mHandledContact(NULL), + mFetchView(NULL) { bool ok = false; mDocumentLoader.load(CNT_COLLECTIONVIEW_XML, &ok); @@ -91,6 +97,12 @@ CntCollectionView::~CntCollectionView() { mView->deleteLater(); + + delete mHandledContact; + mHandledContact = NULL; + + delete mFetchView; + mFetchView = NULL; } /*! @@ -109,7 +121,7 @@ QContactDetailFilter groupFilter; groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); - QList groupContactIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(groupFilter); + QList groupContactIds = getContactManager()->contactIds(groupFilter); if (groupContactIds.count() < 2) { mDeleteGroupsAction->setEnabled(false); @@ -131,8 +143,11 @@ mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); mListView->listItemPrototype()->setStretchingStyle(HbListViewItem::StretchLandscape); - mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), mExtensionManager, this); + mModel = new CntCollectionListModel(getContactManager(), mExtensionManager, this); mListView->setModel(mModel); + + mFetchView = new CntFetchContacts(mViewManager->contactManager( SYMBIAN_BACKEND )); + connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleNewGroupMembers())); } void CntCollectionView::deactivate() @@ -169,13 +184,13 @@ if (id == favoriteGrpId ) { - QContact favoriteGroup = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(favoriteGrpId); + QContact favoriteGroup = getContactManager()->contact(favoriteGrpId); QContactRelationshipFilter rFilter; rFilter.setRelationshipType(QContactRelationship::HasMember); rFilter.setRelatedContactRole(QContactRelationship::First); rFilter.setRelatedContactId(favoriteGroup.id()); // group members and their count - QList groupMemberIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(rFilter); + QList groupMemberIds = getContactManager()->contactIds(rFilter); if (groupMemberIds.isEmpty()) { @@ -198,7 +213,7 @@ } else { - QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); + QContact groupContact = getContactManager()->contact(id); CntViewParameters viewParameters; viewParameters.insert(EViewId, groupMemberView); @@ -223,158 +238,217 @@ else { int id = item->modelIndex().data(Qt::UserRole).toInt(); + QVariant data( item->modelIndex().row() ); + int favoriteGrpId = mModel->favoriteGroupId(); - + HbMenu *menu = new HbMenu(); - HbAction *openAction = 0; - HbAction *deleteAction = 0; - - openAction = menu->addAction(hbTrId("txt_common_menu_open")); + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->setPreferredPos( coords ); + + HbAction* openAction = menu->addAction(hbTrId("txt_common_menu_open")); + openAction->setData( data ); if (id != favoriteGrpId) { - deleteAction = menu->addAction(hbTrId("txt_phob_menu_delete_group")); + HbAction* deleteAction = menu->addAction(hbTrId("txt_phob_menu_delete_group")); + deleteAction->setData( data ); } - - HbAction *selectedAction = menu->exec(coords); + menu->open(this, SLOT(handleMenu(HbAction*))); - if (selectedAction) - { - if (selectedAction == openAction) - { - openGroup(item->modelIndex()); - } - else if (selectedAction == deleteAction) - { - QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); - deleteGroup(groupContact); - } - } - menu->deleteLater(); } } +void CntCollectionView::handleMenu(HbAction* action) +{ + int row = action->data().toInt(); + HbMenu *menuItem = static_cast(sender()); + QModelIndex index = mModel->index(row, 0); + + int id = index.data(Qt::UserRole).toInt(); + + if ( action == menuItem->actions().first() ) + { + openGroup(index); + } + else if (action == menuItem->actions().at(1)) + { + + QContact groupContact = getContactManager()->contact(id); + deleteGroup(groupContact); + } +} + + + void CntCollectionView::newGroup() { - QString mTextOfNewItem(""); - - HbInputDialog popup; + HbInputDialog *popup = new HbInputDialog(); + popup->setAttribute(Qt::WA_DeleteOnClose, true); - HbGroupBox *headingLabel = new HbGroupBox(&popup); - headingLabel->setHeading("txt_phob_title_new_group_name"); - popup.setHeadingWidget(headingLabel); - popup.setPrimaryAction(new HbAction(hbTrId("txt_phob_button_create"),&popup)); - popup.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"),&popup)); - popup.setInputMode(HbInputDialog::TextInput); - popup.setPromptText(""); - popup.setBackgroundFaded(true); - HbAction* action = popup.exec(); - QString text = popup.value().toString(); + popup->setPromptText(hbTrId("txt_phob_title_new_group_name")); + popup->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_create"), popup)); + popup->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), popup)); + popup->setInputMode(HbInputDialog::TextInput); + + popup->open(this, SLOT(handleNewGroup(HbAction*))); +} + +void CntCollectionView::handleNewGroup(HbAction* action) +{ + HbInputDialog *popup = static_cast(sender()); - if (action == popup.primaryAction()) + if (popup && action == popup->actions().first()) { - mTextOfNewItem = text; + QString text = popup->value().toString(); - QContact groupContact; - groupContact.setType(QContactType::TypeGroup); + mHandledContact = new QContact(); + mHandledContact->setType(QContactType::TypeGroup); QContactName groupName; - groupName.setCustomLabel(mTextOfNewItem); + groupName.setCustomLabel(text); - groupContact.saveDetail(&groupName); - mViewManager->contactManager(SYMBIAN_BACKEND)->saveContact(&groupContact); - - // call a dialog to display the contacts + mHandledContact->saveDetail(&groupName); + getContactManager()->saveContact(mHandledContact); - CntGroupSelectionPopup *groupSelectionPopup = - new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), &groupContact); - groupSelectionPopup->populateListOfContact(); - HbAction* action = groupSelectionPopup->exec(); - if (action == groupSelectionPopup->primaryAction()) - { - groupSelectionPopup->saveNewGroup(); - - CntViewParameters viewParameters; - viewParameters.insert(EViewId, groupMemberView); - QVariant var; - var.setValue(groupContact); - viewParameters.insert(ESelectedContact, var); - mViewManager->changeView(viewParameters); - - delete groupSelectionPopup; - } - else if (action == groupSelectionPopup->secondaryAction()) - { - delete groupSelectionPopup; - QString groupNameCreated(groupName.customLabel()); - HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_new_group_1_created").arg(groupNameCreated)); - //refresh the page - refreshDataModel(); - mDeleteGroupsAction->setEnabled(true); - } - + QContactDetailFilter filter; + QList contactsList = getContactManager()->contactIds(filter); + QSet contactsSet = contactsList.toSet(); + + // Select some contact(s) to add to the group + QString groupNameCreated(mHandledContact->displayLabel()); + mFetchView->setDetails(HbParameterLengthLimiter(hbTrId("txt_phob_subtitle_1_group")).arg(groupNameCreated), + hbTrId("Save")); + mFetchView->displayContacts(CntFetchContacts::popup, + HbAbstractItemView::MultiSelection, + contactsSet); } } +void CntCollectionView::handleNewGroupMembers() +{ + mSelectedContactsSet = mFetchView->getSelectedContacts(); + if ( !mFetchView->wasCanceled() && mSelectedContactsSet.size() ) { + saveNewGroup(mHandledContact); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, groupMemberView); + QVariant var; + var.setValue(*mHandledContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); + } + + QString groupNameCreated(mHandledContact->displayLabel()); + HbNotificationDialog::launchDialog(HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_new_group_1_created")).arg(groupNameCreated)); + + // Refresh the page + refreshDataModel(); + mDeleteGroupsAction->setEnabled(true); + + delete mHandledContact; + mHandledContact = NULL; +} + void CntCollectionView::refreshDataModel() { mListView->setModel(0); delete mModel; mModel = 0; - mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), mExtensionManager, this); + mModel = new CntCollectionListModel(getContactManager(), mExtensionManager, this); mListView->setModel(mModel); } void CntCollectionView::deleteGroup(QContact group) { - QString name = group.displayLabel(); + mHandledContact = new QContact(group); + QString name = mHandledContact->displayLabel(); + + HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_dialog_delete_1_group")).arg(name), this, SLOT(handleDeleteGroup(HbAction*)), + hbTrId("txt_phob_button_delete"), hbTrId("txt_common_button_cancel")); +} - HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_delete_1").arg(name), HbMessageBox::MessageTypeQuestion); - note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - HbAction *selected = note->exec(); - if (selected == note->primaryAction()) +void CntCollectionView::handleDeleteGroup(HbAction* action) +{ + HbMessageBox *note = static_cast(sender()); + + if (note && action == note->actions().first()) { - mViewManager->contactManager(SYMBIAN_BACKEND)->removeContact(group.localId()); - mModel->removeGroup(group.localId()); + getContactManager()->removeContact(mHandledContact->localId()); + mModel->removeGroup(mHandledContact->localId()); // disable delete group(s) button if only favorites group is present QContactDetailFilter groupFilter; groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); - QList groupContactIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(groupFilter); + QList groupContactIds = getContactManager()->contactIds(groupFilter); if (groupContactIds.count() < 2) { mDeleteGroupsAction->setEnabled(false); } } - delete note; + + delete mHandledContact; + mHandledContact = NULL; } void CntCollectionView::deleteGroups() { // save the group here - CntGroupDeletePopup *groupDeletePopup = new CntGroupDeletePopup(mViewManager->contactManager(SYMBIAN_BACKEND)); + CntGroupDeletePopup *groupDeletePopup = new CntGroupDeletePopup(getContactManager()); groupDeletePopup->populateListOfGroup(); - HbAction* action = groupDeletePopup->exec(); - if (action == groupDeletePopup->primaryAction()) - { - groupDeletePopup->deleteGroup(); - } + groupDeletePopup->open(this, SLOT(handleDeleteGroups(HbAction*))); + +} + +void CntCollectionView::handleDeleteGroups(HbAction* action) +{ + CntGroupDeletePopup *groupDeletePopup = static_cast(sender()); - delete groupDeletePopup; - //refresh the page - refreshDataModel(); - - // disable delete group(s) button if only favorites group is present - QContactDetailFilter groupFilter; - groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); - QList groupContactIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(groupFilter); - if (groupContactIds.count() < 2) + if (groupDeletePopup && action == groupDeletePopup->actions().first()) { - mDeleteGroupsAction->setEnabled(false); + QList deletedList = groupDeletePopup->deleteGroup(); + foreach (QContactLocalId id, deletedList) + { + mModel->removeGroup(id); + } + + // disable delete group(s) button if only favorites group is present + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); + QList groupContactIds = getContactManager()->contactIds(groupFilter); + if (groupContactIds.count() < 2) + { + mDeleteGroupsAction->setEnabled(false); + } } } + +QContactManager* CntCollectionView::getContactManager() +{ + if (!mViewManager) return NULL; + + return mViewManager->contactManager(SYMBIAN_BACKEND); +} + +void CntCollectionView::saveNewGroup(QContact* aContact) +{ + if (!aContact) return; + + // Save the relationship from the selection model of the member selection list + QList selectedList = mSelectedContactsSet.toList(); + for (int i = 0; i < selectedList.size(); i++ ) { + QContact contact = getContactManager()->contact(selectedList.at(i)); + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(aContact->id()); + relationship.setSecond(contact.id()); + + // Save relationship + getContactManager()->saveRelationship(&relationship); + } +} + // EOF diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcompanyeditormodel.cpp --- a/phonebookui/pbkcommonui/src/cntcompanyeditormodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcompanyeditormodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -80,8 +80,14 @@ else mCompany.setAssistantName(QString()); - if ( !mCompany.isEmpty() ) { - mContact->saveDetail( &mCompany ); + mContact->saveDetail( &mCompany ); + + if ( mCompany.name().isEmpty() && + mCompany.title().isEmpty() && + mCompany.department().isEmpty() && + mCompany.assistantName().isEmpty() ) + { + mContact->removeDetail( &mCompany ); } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcontactcardcontextmenu.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntcontactcardcontextmenu.cpp Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,33 @@ +/* +* 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 "cntcontactcardcontextmenu.h" +#include "cntcontactcarddetailitem.h" + +CntContactCardContextMenu::CntContactCardContextMenu( CntContactCardDetailItem* aItem ) : +HbMenu(), +mItem( aItem ) +{ +} + +CntContactCardContextMenu::~CntContactCardContextMenu() +{ +} + +CntContactCardDetailItem* CntContactCardContextMenu::item() +{ + return mItem; +} diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp Fri May 14 15:42:23 2010 +0300 @@ -20,6 +20,7 @@ #include //For fetching maptile #include +#include #include #include #include @@ -27,6 +28,17 @@ #include "cntstringmapper.h" /*! +Compare function for CntContactCardDataItem +*/ +namespace +{ + bool compareObjects(const CntContactCardDataItem *d1, const CntContactCardDataItem *d2) + { + return d1->mPosition < d2->mPosition; + } +} + +/*! Constructor */ CntContactCardDataContainer::CntContactCardDataContainer(QContact* contact, QObject *parent) : mContact(contact), mSeparatorIndex(-1) @@ -72,31 +84,22 @@ if (availableActions.contains("call", Qt::CaseInsensitive) && supportsDetail("call", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName) { QContactPhoneNumber number(details.at(i)); - QString title; - QString icon; - if (!number.contexts().isEmpty()) - { - title = mStringMapper.getContactCardListLocString(number.subTypes().first(), number.contexts().first()); - icon = mStringMapper.getContactCardIconString(number.subTypes().first(), number.contexts().first()); - } - else - { - title = mStringMapper.getContactCardListLocString(number.subTypes().first(), QString()); - icon = mStringMapper.getContactCardIconString(number.subTypes().first(), QString()); - } + + QString context = number.contexts().isEmpty() ? QString() : number.contexts().first(); + QString subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first(); - CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, true); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(mStringMapper.getContactCardListLocString(subtype, context), itemCount(), true); dataItem->setAction("call"); dataItem->setValueText(number.number()); - dataItem->setIcon(HbIcon(icon)); + dataItem->setIcon(HbIcon(mStringMapper.getContactCardIconString(subtype, context))); dataItem->setContactDetail(number); mDataItemList.insert(itemCount(), dataItem); } - if (availableActions.contains("message", Qt::CaseInsensitive) && supportsDetail("message", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName) - { + if (availableActions.contains("message", Qt::CaseInsensitive) && supportsDetail("message", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName) + { QContactPhoneNumber number(details.at(i)); - CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_message"), true); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_message"), itemCount(), true); dataItem->setAction("message"); dataItem->setValueText(number.number()); QString icon; @@ -119,40 +122,39 @@ dataItem->setIcon(HbIcon(icon)); dataItem->setContactDetail(number); mDataItemList.insert(itemCount(), dataItem); - } + } } - //email if (availableActions.contains("email", Qt::CaseInsensitive)) { QList details = actionDetails("email", *mContact); for (int i = 0; i < details.count(); i++) - { - if (details[i].definitionName() == QContactEmailAddress::DefinitionName) - { - QContactEmailAddress email(details.at(i)); - QString title; - QString icon; - if (!email.contexts().isEmpty()) - { - title = mStringMapper.getContactCardListLocString(email.definitionName(), email.contexts().first()); - icon = mStringMapper.getContactCardIconString(email.definitionName(), email.contexts().first()); - } - else - { - title = mStringMapper.getContactCardListLocString(email.definitionName(), QString()); - icon = mStringMapper.getContactCardIconString(email.definitionName(), QString()); - } - - CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, true); - dataItem->setAction("email"); - dataItem->setValueText(email.emailAddress(), Qt::ElideLeft); - dataItem->setIcon(HbIcon(icon)); - dataItem->setContactDetail(email); - mDataItemList.insert(itemCount(), dataItem); - } + { + QContactEmailAddress email(details.at(i)); + QString context = email.contexts().isEmpty() ? QString() : email.contexts().first(); + + CntContactCardDataItem* dataItem = new CntContactCardDataItem(mStringMapper.getContactCardListLocString(email.definitionName(), context), itemCount(), true); + dataItem->setAction("email"); + dataItem->setValueText(email.emailAddress(), Qt::ElideLeft); + dataItem->setIcon(HbIcon(mStringMapper.getContactCardIconString(email.definitionName(), context))); + dataItem->setContactDetail(email); + mDataItemList.insert(itemCount(), dataItem); } } + //url + QList urlDetails = mContact->details(); + for (int i = 0; i < urlDetails.count(); i++) + { + QContactUrl url(urlDetails.at(i)); + QString context = url.contexts().isEmpty() ? QString() : url.contexts().first(); + + CntContactCardDataItem* dataItem = new CntContactCardDataItem(mStringMapper.getContactCardListLocString(url.definitionName(), context), itemCount(), true); + dataItem->setAction("url"); + dataItem->setValueText(url.url()); + dataItem->setIcon(HbIcon(mStringMapper.getContactCardIconString(url.definitionName(), context))); + dataItem->setContactDetail(url); + mDataItemList.insert(itemCount(), dataItem); + } } /*! @@ -166,7 +168,7 @@ //call if (confCallNumber.number() != NULL) { - CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_conference_call"), true); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_conference_call"), itemCount(), true); dataItem->setAction("call"); dataItem->setValueText(confCallNumber.number()); dataItem->setIcon(HbIcon("qtg_large_call_group")); @@ -175,7 +177,7 @@ } //message - CntContactCardDataItem* dataMessageItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_val_members"), true); + CntContactCardDataItem* dataMessageItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_val_members"), itemCount(), true); dataMessageItem->setAction("message"); dataMessageItem->setValueText(confCallNumber.number()); dataMessageItem->setIcon(HbIcon("qtg_large_message")); @@ -183,7 +185,7 @@ mDataItemList.insert(itemCount(), dataMessageItem); //email - CntContactCardDataItem* dataEmailItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_email"), true); + CntContactCardDataItem* dataEmailItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_email"), itemCount(), true); dataEmailItem->setAction("email"); dataEmailItem->setValueText(confCallNumber.number()); dataEmailItem->setIcon(HbIcon("qtg_large_email")); @@ -196,11 +198,27 @@ */ void CntContactCardDataContainer::initializeDetailsData() { + //sip & internet call + QList onlinedDetails = mContact->details(); + for (int i = 0; i < onlinedDetails.count(); i++) + { + QContactOnlineAccount online(onlinedDetails.at(i)); + QString context = online.contexts().isEmpty() ? QString() : online.contexts().first(); + QString subtype = online.subTypes().isEmpty() ? online.definitionName() : online.subTypes().first(); + + CntContactCardDataItem* dataItem = new CntContactCardDataItem(mStringMapper.getContactCardListLocString(subtype, context), itemCount(), false); + dataItem->setValueText(online.accountUri()); + dataItem->setContactDetail(online); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataItem); + } + + //address QString contextHome(QContactAddress::ContextHome.operator QString()); QString contextWork(QContactAddress::ContextWork.operator QString()); CntMapTileService::ContactAddressType sourceAddressType; mLocationFeatureEnabled = CntMapTileService::isLocationFeatureEnabled() ; - //address + QList addressDetails = mContact->details(); for (int i = 0; i < addressDetails.count(); i++) { @@ -225,7 +243,7 @@ title = hbTrId("txt_phob_formlabel_address_work"); } } - CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, false); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, itemCount(), false); QStringList address; if (!addressDetails[i].street().isEmpty()) @@ -265,30 +283,44 @@ QIcon mapTileIcon; QPainter painter; - QPixmap baloon(":/icons/pin.png"); + QPixmap baloon( HbIcon("qtg_small_location").pixmap() ); QPixmap map(icon.pixmap()); //Display pin image in the center of maptile image painter.begin(&map); - painter.drawPixmap((map.width()/2), - ((map.height()/2)-(baloon.height())), baloon); + painter.drawPixmap( ( map.width()/2 ) - ( baloon.width()/ 2 ), + (( map.height()/2 )-( baloon.height())), baloon ); + painter.end(); mapTileIcon.addPixmap(map); addSeparator(itemCount()); - CntContactCardDataItem* dataItem = new CntContactCardDataItem(QString(), false); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(QString(), itemCount(), false); dataItem->setIcon(HbIcon(mapTileIcon)); mDataItemList.insert(itemCount(), dataItem); } } } + //company + QList organizationDetails = mContact->details(); + for (int i = 0; i < organizationDetails.count(); i++) + { + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_company_details"), itemCount(), false); + QStringList companyList; + companyList << organizationDetails[i].title() << organizationDetails[i].name() << organizationDetails[i].department(); + dataItem->setValueText(companyList.join(" ").trimmed()); + dataItem->setContactDetail(organizationDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataItem); + } + //birthday QList birthdayDetails = mContact->details(); for (int i = 0; i < birthdayDetails.count(); i++) { - CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_birthday"), false); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_birthday"), itemCount(), false); dataItem->setValueText(birthdayDetails[i].date().toString("dd MMMM yyyy")); dataItem->setContactDetail(birthdayDetails[i]); addSeparator(itemCount()); @@ -299,7 +331,7 @@ QList anniversaryDetails = mContact->details(); for (int i = 0; i < anniversaryDetails.count(); i++) { - CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_anniversary"), false); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_anniversary"), itemCount(), false); dataItem->setValueText(anniversaryDetails[i].originalDate().toString("dd MMMM yyyy")); dataItem->setContactDetail(anniversaryDetails[i]); addSeparator(itemCount()); @@ -312,7 +344,7 @@ { if (!ringtoneDetails.at(i).audioRingtoneUrl().isEmpty()) { - CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_ringing_tone"), false); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_ringing_tone"), itemCount(), false); dataItem->setValueText(ringtoneDetails[i].audioRingtoneUrl().toString()); dataItem->setContactDetail(ringtoneDetails[i]); addSeparator(itemCount()); @@ -325,7 +357,7 @@ QList noteDetails = mContact->details(); for (int i = 0; i < noteDetails.count(); i++) { - CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_note"), false); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_note"), itemCount(), false); dataItem->setValueText(noteDetails[i].note()); dataItem->setContactDetail(noteDetails[i]); addSeparator(itemCount()); @@ -336,13 +368,13 @@ QList familyDetails = mContact->details(); for (int i = 0; i < familyDetails.count(); i++) { - CntContactCardDataItem* dataSpouseItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_spouse"), false); + CntContactCardDataItem* dataSpouseItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_spouse"), itemCount(), false); dataSpouseItem->setValueText(familyDetails[i].spouse()); dataSpouseItem->setContactDetail(familyDetails[i]); addSeparator(itemCount()); mDataItemList.insert(itemCount(), dataSpouseItem); - CntContactCardDataItem* dataChildrenItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_children"), false); + CntContactCardDataItem* dataChildrenItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_children"), itemCount(), false); dataChildrenItem->setValueText(familyDetails[i].children().join(", ")); dataChildrenItem->setContactDetail(familyDetails[i]); addSeparator(itemCount()); @@ -356,8 +388,12 @@ bool CntContactCardDataContainer::supportsDetail(const QString &actionName, const QContactDetail &contactDetail) { QList actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian"); + if (actionDescriptors.isEmpty()) + { + return false; + } + QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); - bool isSupportDetail = contactAction->isDetailSupported(contactDetail); delete contactAction; @@ -371,8 +407,12 @@ QList CntContactCardDataContainer::actionDetails(const QString &actionName, const QContact &contact) { QList actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian"); - QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); - + if (actionDescriptors.isEmpty()) + { + return QList(); + } + + QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); QList details = contactAction->supportedDetails(contact); delete contactAction; @@ -403,7 +443,7 @@ if (mSeparatorIndex == -1) { mSeparatorIndex = index; - CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_subtitle_details"), false); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_subtitle_details"), itemCount(), false); mDataItemList.insert(itemCount(), dataItem); } } @@ -416,3 +456,13 @@ return mDataItemList.count(); } +/*! +Sort data item list by position number +*/ +void CntContactCardDataContainer::sortDataItems() +{ + qStableSort(mDataItemList.begin(), mDataItemList.end(), compareObjects); +} + + + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcontactcarddataitem.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcarddataitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcarddataitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -17,14 +17,15 @@ #include "cntcontactcarddataitem.h" -CntContactCardDataItem::CntContactCardDataItem(const QString& aTitle, bool aIsFocusable) : +CntContactCardDataItem::CntContactCardDataItem(const QString& aTitle, int aPosition, bool aIsFocusable) : mIcon(HbIcon()), mSecondaryIcon(HbIcon()), mTitle(aTitle), mValueText(QString("")), mAction(QString("")), mValueTextElideMode(Qt::ElideRight), - mIsFocusable(aIsFocusable) + mIsFocusable(aIsFocusable), + mPosition(aPosition) { } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcontactcarddetailitem.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcarddetailitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcarddetailitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -15,6 +15,9 @@ * */ +#include +#include + #include "cntcontactcarddetailitem.h" #include "cntcontactcarddataitem.h" #include @@ -23,22 +26,24 @@ #include #include #include -#include -#include #include #include #include +#include +#include +#include +#include + CntContactCardDetailItem::CntContactCardDetailItem(int index, QGraphicsItem *parent, bool isFocusable) : HbWidget(parent), mIcon(NULL), + mSecondaryIcon(NULL), mFirstLineText(NULL), mSecondLineText(NULL), mFrameItem(NULL), mFocusItem(NULL), mHasFocus(false), - mGestureFilter(NULL), - mGestureLongpressed(NULL), mIndex(index), mIsFocusable(isFocusable), mValueTextElideMode(Qt::ElideRight), @@ -64,9 +69,9 @@ if (!mIcon) { mIcon = new HbIconItem(this); - mIcon->setIcon(icon); style()->setItemName(mIcon, "icon"); } + mIcon->setIcon(icon); } else { @@ -77,12 +82,24 @@ mIcon = 0; } + if (!mSecondaryIcon) + { + mSecondaryIcon = new HbIconItem(this); + mSecondaryIcon->setFlags(HbIcon::Colorized); + style()->setItemName(mSecondaryIcon, "secondaryIcon"); + } + mSecondaryIcon->setIcon(secondaryIcon); + mSecondaryIcon->setColor(HbColorScheme::color("foreground")); + if (!text.isNull()) { - mFirstLineText = new HbTextItem(this); + if (!mFirstLineText) + { + mFirstLineText = new HbTextItem(this); + mFirstLineText->setTextWrapping(Hb::TextWordWrap); + style()->setItemName(mFirstLineText, "text"); + } mFirstLineText->setText(text); - mFirstLineText->setTextWrapping(Hb::TextWordWrap); - style()->setItemName(mFirstLineText, "text"); } else { @@ -92,16 +109,16 @@ } mFirstLineText = 0; } - + if (!valueText.isNull()) { if (!mSecondLineText) { mSecondLineText = new HbTextItem(this); - mSecondLineText->setText(valueText); mSecondLineText->setElideMode(mValueTextElideMode); style()->setItemName(mSecondLineText, "valueText"); } + mSecondLineText->setText(valueText); } else { @@ -130,41 +147,87 @@ mFocusItem->setVisible(false); style()->setItemName(mFocusItem, "highlight"); } + + updatePrimitives(); + updateGeometry(); + repolish(); } void CntContactCardDetailItem::recreatePrimitives() { HbWidget::recreatePrimitives(); - - delete mIcon; - mIcon = 0; - - delete mFirstLineText; - mFirstLineText = 0; - - delete mSecondLineText; - mSecondLineText = 0; - - delete mFrameItem; - mFrameItem = 0; - - delete mFocusItem; - mFocusItem = 0; - + createPrimitives(); } void CntContactCardDetailItem::initGesture() { - mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); - mGestureLongpressed = new HbGesture(HbGesture::longpress, 5); - mGestureFilter->addGesture(mGestureLongpressed); - mGestureFilter->setLongpressAnimation(true); - installSceneEventFilter(mGestureFilter); + grabGesture(Qt::TapAndHoldGesture, Qt::ReceivePartialGestures); + grabGesture(Qt::TapGesture, Qt::ReceivePartialGestures); +} + +void CntContactCardDetailItem::gestureEvent(QGestureEvent* event) +{ + qDebug() << "CntContactCardDetailItem::gestureEvent - IN"; + event->accept( Qt::TapAndHoldGesture ); + + if (QGesture *tap = event->gesture(Qt::TapGesture)) + { + tapTriggered(static_cast(tap)); + event->accept( tap ); + } + + if (QGesture *tapAndHold = event->gesture(Qt::TapAndHoldGesture)) + { + tapAndHoldTriggered(static_cast(tapAndHold)); + event->accept( tapAndHold ); + } + qDebug() << "CntContactCardDetailItem::gestureEvent - OUT"; +} - connect(mGestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(onLongPress(QPointF))); +void CntContactCardDetailItem::tapTriggered(QTapGesture *gesture) +{ + qDebug() << "CntContactdDetailItem::tagTriggered - IN"; + + Qt::GestureState state = gesture->state(); + qDebug() << "CntContactdDetailItem::tagTriggered, state: " << state; + switch ( state ) + { + case Qt::GestureStarted: + { + if (mIsFocusable) + { + HbInstantFeedback::play(HbFeedback::Basic); + } + mHasFocus = true; + updatePrimitives(); + break; + } + case Qt::GestureFinished: + case Qt::GestureCanceled: + { + mHasFocus = false; + updatePrimitives(); + emit clicked(); // also in GestureCancelled? + break; + } + default: + { + break; + } + } + qDebug() << "CntContactdDetailItem::tagTriggered - OUT"; } +void CntContactCardDetailItem::tapAndHoldTriggered(QTapAndHoldGesture *gesture) +{ + if (gesture->state() == Qt::GestureFinished) + { + onLongPress(gesture->position()); + } +} + + void CntContactCardDetailItem::onLongPress(const QPointF &point) { mHasFocus = false; @@ -186,6 +249,7 @@ } } +/* void CntContactCardDetailItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (mIsFocusable) @@ -196,7 +260,8 @@ mHasFocus = true; updatePrimitives(); } - +*/ +/* void CntContactCardDetailItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (!rect().contains(event->pos()) && mHasFocus) @@ -219,20 +284,32 @@ } event->accept(); } +*/ void CntContactCardDetailItem::setDetails(CntContactCardDataItem* aDataItem) { - text.clear(); - valueText.clear(); - icon.clear(); mValueTextElideMode = aDataItem->elideMode(); - if (!aDataItem->icon().isNull()) + if (aDataItem->icon() != icon) + { + icon.clear(); icon = aDataItem->icon(); - if (!aDataItem->titleText().isEmpty()) + } + if (aDataItem->secondaryIcon() != secondaryIcon) + { + secondaryIcon.clear(); + secondaryIcon = aDataItem->secondaryIcon(); + } + if (aDataItem->titleText() != text) + { + text.clear(); text = aDataItem->titleText(); - if (!aDataItem->valueText().isEmpty()) + } + if (aDataItem->valueText() != valueText) + { + valueText.clear(); valueText = aDataItem->valueText(); + } recreatePrimitives(); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -40,11 +41,8 @@ mSecondaryText(NULL), mMarqueeItem(NULL), mFrameItem(NULL), - mGestureFilter(NULL), - mGestureLongpressed(NULL), mPictureArea(NULL) { - } CntContactCardHeadingItem::~CntContactCardHeadingItem() @@ -192,7 +190,7 @@ if (!mFrameItem) { mFrameItem = new HbFrameItem(this); - mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_parent_normal"); + mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox"); mFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); mFrameItem->setZValue(-2); style()->setItemName(mFrameItem, "background"); @@ -291,7 +289,7 @@ || !(contact->detail().department().isEmpty())); } -void CntContactCardHeadingItem::setDetails(const QContact* contact, bool isMyCard) +void CntContactCardHeadingItem::setDetails(const QContact* contact) { primaryText.clear(); firstLineText.clear(); @@ -300,14 +298,7 @@ tinyMarqueeText.clear(); // icon label - if (isMyCard) - { - icon = HbIcon("qtg_large_mycard"); - } - else - { - icon = HbIcon("qtg_large_avatar"); - } + icon = HbIcon("qtg_large_add_contact_picture"); QContactName name = contact->detail(); @@ -392,37 +383,17 @@ emit passLongPressed(point); } -void CntContactCardHeadingItem::mousePressEvent(QGraphicsSceneMouseEvent *event) +void CntContactCardHeadingItem::gestureEvent(QGestureEvent* event) { - event->accept(); -} - -void CntContactCardHeadingItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - event->accept(); + QGesture *tapAndHold = event->gesture(Qt::TapAndHoldGesture); + if (tapAndHold && tapAndHold->state() == Qt::GestureFinished) { + processLongPress(static_cast(tapAndHold)->position()); + } } -void CntContactCardHeadingItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - if (rect().contains(event->pos())) { - emit clicked(); - } - event->accept(); -} - void CntContactCardHeadingItem::initGesture() { - mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); - - // Orbit documentation states that added gestures will be deleted - // when the filter is deleted (filter takes ownership). So no - // need to worry about deleting the gesture. - mGestureLongpressed = new HbGesture(HbGesture::longpress, 5); - mGestureFilter->addGesture(mGestureLongpressed); - mGestureFilter->setLongpressAnimation(true); - - mIcon->installSceneEventFilter(mGestureFilter); - connect(mGestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(processLongPress(QPointF))); + grabGesture(Qt::TapAndHoldGesture); } QVariant CntContactCardHeadingItem::itemChange(GraphicsItemChange change, const QVariant &value) diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp Fri May 14 15:42:23 2010 +0300 @@ -10,7 +10,6 @@ * Nokia Corporation - initial contribution. * * Contributors: -* * Description: * */ @@ -30,6 +29,9 @@ #include #include #include +#include +#include +#include #include #include #include //For maptile processing @@ -40,10 +42,12 @@ #include "cntcontactcarddetailitem.h" #include "cntcontactcardheadingitem.h" #include "cntcontactcarddataitem.h" +#include "cntcontactcardcontextmenu.h" #include "cntmainwindow.h" #include "cntstringmapper.h" #include "cntdocumentloader.h" #include "cntimagelabel.h" +#include "cntimageutility.h" const char *CNT_CONTACTCARDVIEW_XML = ":/xml/contacts_contactcard.docml"; @@ -65,6 +69,7 @@ mAvatar(NULL), mIsGroupMember(false), mIsHandlingMenu(false), + mIsPreviousImageEditorView(false), mFavoriteGroupId(-1), mLoader(NULL), mContactAction(NULL), @@ -126,6 +131,20 @@ { emit backPressed(); + //save an avatar + if (mIsPreviousImageEditorView) + { + QList details = mContact->details(); + for (int i = 0; i < details.count(); i++) + { + if (!details.at(i).imageUrl().isEmpty()) + { + contactManager()->saveContact(mContact); + break; + } + } + } + CntViewParameters viewParameters; if (mIsGroupMember) { @@ -148,6 +167,11 @@ 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(); mContact = new QContact(contact); @@ -174,7 +198,7 @@ QGraphicsLinearLayout* l = static_cast(c->layout()); mHeadingItem = static_cast(document()->findWidget(QString("cnt_contactcard_heading"))); - mHeadingItem->setDetails(mContact, mContact->localId() == contactManager()->selfContactId()); + mHeadingItem->setDetails(mContact); mHeadingItem->setSecondaryIcon(isFavoriteGroupContact()); connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&))); @@ -187,11 +211,11 @@ for (int i = 0;i < details.count();i++) { if (details.at(i).imageUrl().isValid()) - { + { mAvatar = new QContactAvatar(details.at(i)); mThumbnailManager->getThumbnail(mAvatar->imageUrl().toString()); break; - } + } } // data @@ -235,9 +259,11 @@ // separator else if (index == mDataContainer->separatorIndex()) { - HbGroupBox* details = new HbGroupBox(mView); - details->setHeading(mDataContainer->dataItem(index)->titleText()); - mContainerLayout->addItem(details); + HbFrameItem* frameItem = new HbFrameItem(QString("qtg_fr_list_separator"), HbFrameDrawer::NinePieces); + HbLabel* label = static_cast(document()->findWidget(QString("separator"))); + label->setPlainText(mDataContainer->dataItem(index)->titleText()); + label->setBackgroundItem(frameItem); + mContainerLayout->addItem(label); } // details @@ -248,7 +274,17 @@ { HbLabel* iconLabel = new HbLabel(mView); iconLabel->setIcon(dataItem->icon()); - iconLabel->setPreferredSize(dataItem->icon().width(), dataItem->icon().height()); + + int width = dataItem->icon().width(); + int height = dataItem->icon().height(); + + //HbLabel setPreferredSize is not working properly, + //so added minimum , maximum size to fix the issue + iconLabel->setPreferredSize(QSizeF(width,height)); + iconLabel->setMinimumSize(QSizeF(width, height)); + iconLabel->setMaximumSize(QSizeF(width, height)); + iconLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, + QSizePolicy::Fixed)); mContainerLayout->addItem(iconLabel); } else @@ -276,7 +312,7 @@ { for (int i = 0 ; i < count ; i++) { - if (mContactsList.at(i) == mContact->localId() ) + if (mContactsList.at(i) == mContact->localId()) { setAsFavorite = true; } @@ -286,11 +322,11 @@ if (setAsFavorite) { - mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:setasfavorite"))); + qobject_cast(document()->findObject("cnt:setasfavorite"))->setVisible(false); } else { - mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:removefromfavorite"))); + qobject_cast(document()->findObject("cnt:removefromfavorite"))->setVisible(false); } // Menu items @@ -390,24 +426,24 @@ // save relationship contactManager()->saveRelationship(&relationship); - mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:setasfavorite"))); - mView->menu()->addAction(qobject_cast(document()->findObject("cnt:removefromfavorite"))); + qobject_cast(document()->findObject("cnt:setasfavorite"))->setVisible(false); + qobject_cast(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); - - mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:removefromfavorite"))); - mView->menu()->addAction(qobject_cast(document()->findObject("cnt:setasfavorite"))); + + qobject_cast(document()->findObject("cnt:removefromfavorite"))->setVisible(false); + qobject_cast(document()->findObject("cnt:setasfavorite"))->setVisible(true); mHeadingItem->setSecondaryIcon(false); - } +} /*! Delete contact @@ -415,23 +451,25 @@ void CntContactCardViewPrivate::deleteContact() { QString name = contactManager()->synthesizedDisplayLabel(*mContact); + + HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(HbAction*)), + hbTrId("txt_phob_button_delete"), hbTrId("txt_common_button_cancel")); +} - HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_delete_1").arg(name), HbMessageBox::MessageTypeQuestion); - note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - HbAction *selected = note->exec(); - if (selected == note->primaryAction()) +/*! +Handle action for deleting a contact +*/ +void CntContactCardViewPrivate::handleDeleteContact(HbAction *action) +{ + HbMessageBox *note = static_cast(sender()); + + if (note && action == note->actions().first()) { contactManager()->removeContact(mContact->localId()); CntViewParameters viewParameters; viewParameters.insert(EViewId, namesView); - QVariant var; - var.setValue(*mContact); - viewParameters.insert(ESelectedContact, var); - viewParameters.insert(ESelectedAction, "delete"); mViewManager->changeView(viewParameters); } - delete note; } /*! @@ -460,44 +498,38 @@ */ void CntContactCardViewPrivate::sendBusinessCard() { - QString tempDir = QDir::tempPath().append("/tempcntvcard"); - - QDir dir(tempDir); - - // Temporary directory to store the vCard file - if (!dir.exists()) + // Check if the contact has an image. + QList avatars = mContact->details(); + bool imageExists( false ); + foreach(QContactAvatar a, mContact->details()) { - // Create a temp directory - QDir::temp().mkdir("tempcntvcard"); - } - else - { - // Empty the temp directory since the other vCards are not required - QStringList l = dir.entryList(); - foreach(QString s, l) + if (!a.imageUrl().isEmpty()) { - if (dir.exists(s)) - { - dir.remove(s); - } + imageExists = true; + HbMessageBox *note = new HbMessageBox( + hbTrId("txt_phob_info_add_contact_card_image_to_business_c"), + HbMessageBox::MessageTypeQuestion); + note->setIcon(*mVCardIcon); + + HbAction* ok = new HbAction(hbTrId("txt_common_button_ok"), note); + HbAction* cancel = new HbAction(hbTrId("txt_common_button_cancel"), note); + + ok->setObjectName( "ok" ); + cancel->setObjectName( "cancel" ); + + note->addAction( ok ); + note->addAction( cancel ); + + note->setModal( true ); + note->setAttribute(Qt::WA_DeleteOnClose, true ); + note->open( this, SLOT(handleSendBusinessCard(HbAction*))); + break; } } - QString vCardName = QString(mContact->displayLabel().append(".vcf")); - QString vCardPath = dir.absolutePath().append(QDir::separator()); - vCardPath.append(vCardName); - vCardPath = QDir::toNativeSeparators(vCardPath); - - QString service("com.nokia.services.hbserviceprovider.conversationview"); - QString type("send(QVariant)"); - - // Create the vCard and send it to messaging service - if (createVCard(vCardPath)) + if ( !imageExists ) { - ShareUi s; - QStringList l; - l << vCardPath; - s.send(l,false); + handleSendBusinessCard( NULL ); // no image } } @@ -534,8 +566,12 @@ void CntContactCardViewPrivate::launchAction(QContact contact, QContactDetail detail, QString action) { // detail might be empty -> in that case engine uses the preferred detail for the selected action - QList callActionDescriptors = QContactAction::actionDescriptors(action, "symbian"); - mContactAction = QContactAction::action(callActionDescriptors.at(0)); + QList actionDescriptors = QContactAction::actionDescriptors(action, "symbian"); + if (actionDescriptors.isEmpty()) + { + return; + } + mContactAction = QContactAction::action(actionDescriptors.first()); connect(mContactAction, SIGNAL(stateChanged(QContactAction::State)), this, SLOT(progress(QContactAction::State))); mContactAction->invokeAction(contact, detail); @@ -562,7 +598,6 @@ { mContact->setPreferredDetail(aAction, aDetail); contactManager()->saveContact(mContact); - emit preferredUpdated(); } /*! @@ -573,8 +608,9 @@ CntContactCardDetailItem *item = qobject_cast(sender()); int index = item->index(); - HbMenu *menu = new HbMenu(); + CntContactCardContextMenu *menu = new CntContactCardContextMenu( item ); HbAction *communicationAction = 0; + HbAction *videoCommunicationAction = 0; HbAction *preferredAction = 0; CntStringMapper stringMapper; @@ -584,14 +620,17 @@ if (action.compare("call", Qt::CaseInsensitive) == 0) { QContactDetail detail = mDataContainer->dataItem(index)->detail(); - if (!detail.contexts().isEmpty()) + if (detail.definitionName() == QContactPhoneNumber::DefinitionName) { - communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), detail.contexts().first())); - } - else - { - communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), QString())); - } + QContactPhoneNumber number = static_cast(detail); + QString context = number.contexts().isEmpty() ? QString() : number.contexts().first(); + QString subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first(); + + communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(subtype, context)); + + // TODO : uncomment next line when videotelephony is released + //videoCommunicationAction = menu->addAction(QString("VideoCall")); + } } else if (action.compare("message", Qt::CaseInsensitive) == 0) { @@ -601,11 +640,11 @@ { if (!detail.contexts().isEmpty()) { - communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), detail.contexts().first())); + communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), detail.contexts().first())); } else { - communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), QString())); + communicationAction = menu->addAction(stringMapper.getItemSpecificMenuLocString(detail.definitionName(), QString())); } } @@ -613,6 +652,10 @@ { preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_number")); } + else if (action.compare("message", Qt::CaseInsensitive) == 0) + { + preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_number")); + } else if (action.compare("email", Qt::CaseInsensitive) == 0) { preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_email")); @@ -622,33 +665,124 @@ { preferredAction->setEnabled(false); } + + if ( communicationAction ) + { + communicationAction->setObjectName( "communicationAction" ); + } - if (preferredAction) + if ( preferredAction ) { + preferredAction->setObjectName( "preferredAction" ); menu->insertSeparator(preferredAction); } - - HbAction *selectedAction = menu->exec(aCoords); + + menu->setPreferredPos( aCoords ); + menu->setAttribute( Qt::WA_DeleteOnClose, true ); + menu->open( this, SLOT(handleMenuAction(HbAction*)) ); +} - if (selectedAction) +void CntContactCardViewPrivate::handleMenuAction(HbAction* aAction) +{ + CntContactCardContextMenu* menu = static_cast(sender()); + CntContactCardDetailItem *item = menu->item(); + int index = item->index(); + + QString action = mDataContainer->dataItem(index)->action(); + QContactDetail detail = mDataContainer->dataItem(index)->detail(); + + QString name = aAction->objectName(); + + if ( name == "communicationAction" ) + { + launchAction( *mContact, detail, action ); + } + + if ( name == "preferredAction" ) { - if (selectedAction == communicationAction) + setPreferredAction(action, detail); + + if (mPreferredItems.contains(action)) { - launchAction(*mContact, detail, action); + CntContactCardDetailItem *oldItem = mPreferredItems.value(action); + mDataContainer->dataItem(oldItem->index())->setSecondaryIcon(HbIcon()); + oldItem->setDetails(mDataContainer->dataItem(oldItem->index())); + } + + mDataContainer->dataItem(item->index())->setSecondaryIcon(HbIcon("qtg_mono_favourites")); + item->setDetails(mDataContainer->dataItem(item->index())); + + mPreferredItems.insert(action, item); + } +} + +void CntContactCardViewPrivate::handleSendBusinessCard( HbAction* aAction ) +{ + QList list; + if ( aAction && aAction->objectName() == "cancel" ) + { + QContact tmpContact( *mContact ); + foreach ( QContactAvatar a, tmpContact.details() ) + { + tmpContact.removeDetail( &a ); } - else if (selectedAction == preferredAction) + list.append( tmpContact ); + } + else + { + list.append( *mContact ); + } + + QString tempDir = QDir::tempPath().append("/tempcntvcard"); + QDir dir(tempDir); + + // Temporary directory to store the vCard file + if (!dir.exists()) + { + // Create a temp directory + QDir::temp().mkdir("tempcntvcard"); + } + else + { + // Empty the temp directory since the other vCards are not required + QStringList l = dir.entryList(); + foreach(QString s, l) { - setPreferredAction(action, detail); - //item->setUnderLine(true); - - if (mPreferredItems.contains(action)) + if (dir.exists(s)) { - //mPreferredItems.value(action)->setUnderLine(false); - } - mPreferredItems.insert(action, item); + dir.remove(s); + } + } + } + + QString vCardName = QString(mContact->displayLabel().append(".vcf")); + QString vCardPath = dir.absolutePath().append(QDir::separator()); + vCardPath.append(vCardName); + vCardPath = QDir::toNativeSeparators(vCardPath); + + QVersitContactExporter exporter; + // The vCard version needs to be 2.1 due to backward compatiblity when sending + if (!exporter.exportContacts(list, QVersitDocument::VCard21Type)) + { + + QList docs = exporter.documents(); + QFile f(vCardPath); + if ( f.open(QIODevice::WriteOnly) ) + { + // Start creating the vCard + QVersitWriter writer; + writer.setDevice(&f); + + bool ret = writer.startWriting(docs); + ret = writer.waitForFinished(); + + // Create the vCard and send it to messaging service + ShareUi s; + QStringList l; + l << vCardPath; + s.send(l,false); } } - menu->deleteLater(); } /*! @@ -703,9 +837,21 @@ { if (mAvatar) { + CntImageUtility imageUtility; + QString filePath=mAvatar->imageUrl().toString(); + bool success = mContact->removeDetail(mAvatar); if (success) { + if (!filePath.isEmpty()) + { + // Check if image removable. + CntImageUtility imageUtility; + if(imageUtility.isImageRemovable(filePath)) + { + imageUtility.removeImage(filePath); + } + } mHeadingItem->setIcon(HbIcon("qtg_large_avatar")); contactManager()->saveContact(mContact); } @@ -724,27 +870,14 @@ mIsHandlingMenu = true; HbMenu *menu = new HbMenu(); - HbAction *changeImageAction = menu->addAction(hbTrId("txt_phob_menu_change_picture")); - HbAction *removeAction = menu->addAction(hbTrId("txt_phob_menu_remove_image")); - - HbAction *selectedAction = menu->exec(aCoords); - - if (selectedAction) - { - if (selectedAction == changeImageAction) - { - doChangeImage(); - } - else if (selectedAction == removeAction) - { - doRemoveImage(); - } + menu->addAction(hbTrId("txt_phob_menu_change_picture"), this, SLOT(doChangeImage()) ); + menu->addAction(hbTrId("txt_phob_menu_remove_image"), this, SLOT(doRemoveImage()) ); + + menu->setAttribute( Qt::WA_DeleteOnClose ); + menu->setPreferredPos( aCoords ); + menu->open(); } - mIsHandlingMenu = false; - menu->deleteLater(); -} - /*! Check if the favourite group created */ @@ -807,83 +940,6 @@ } /*! -Creates the v-card -*/ -bool CntContactCardViewPrivate::createVCard(QString& vCardPath) -{ - QList list; - QContact tempContact(*mContact); - bool createVCard( false ); - - // Check if the contact has an image. - QList avatars = tempContact.details(); - - foreach(QContactAvatar a, avatars) - { - if (!a.imageUrl().isEmpty()) - { - // If true and query the user if they want to add it to - // the business card - - // TODO: Missing translation - HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_add_contact_card_image_to_business_c"), - HbMessageBox::MessageTypeQuestion); - note->setIcon(*mVCardIcon); - - note->setPrimaryAction(new HbAction(hbTrId("txt_common_button_ok"), note)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - HbAction *selected = note->exec(); - if (selected == note->secondaryAction()) - { - // Remove the avatar detail from the temp contact - createVCard = tempContact.removeDetail(&a); - } - else if (selected == note->primaryAction()) - { - createVCard = true; - } - delete note; - break; - } - else - { - // Contact does not have an image - createVCard = true; - } - } - - // False = User clicked outside the popup, dismissing it - // = User prompted the removal of the avatar but it failed - if (!createVCard) - { - return false; - } - - list.append(tempContact); - QVersitContactExporter exporter; - // The vCard version needs to be 2.1 due to backward compatiblity when sending - if (!exporter.exportContacts(list, QVersitDocument::VCard21Type)) - return false; - - QList docs = exporter.documents(); - - QFile f(vCardPath); - if (!f.open(QIODevice::WriteOnly)) - { - return false; - } - - // Start creating the vCard - QVersitWriter writer; - writer.setDevice(&f); - - bool ret = writer.startWriting(docs); - ret = writer.waitForFinished(); - - return ret; -} - -/*! Return the pointer to the document loader */ CntDocumentLoader* CntContactCardViewPrivate::document() diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntdateeditormodel.cpp --- a/phonebookui/pbkcommonui/src/cntdateeditormodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdateeditormodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -41,8 +41,8 @@ mAnniversary = anniversaryList.first(); HbDataFormModelItem* root = invisibleRootItem(); - appendDataFormItem( new CntDetailModelItem( mBirthday, qtTrId("Birthday")), root ); - appendDataFormItem( new CntDetailModelItem( mAnniversary, qtTrId("Anniversary")), root ); + appendDataFormItem( new CntDetailModelItem( mBirthday, hbTrId("txt_phob_formlabel_birthday")), root ); + appendDataFormItem( new CntDetailModelItem( mAnniversary, hbTrId("txt_phob_formlabel_anniversary")), root ); } CntDateEditorModel::~CntDateEditorModel() diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -30,118 +30,141 @@ #include #include #include -#include +#include #include -#include - CntDateEditorViewItem::CntDateEditorViewItem( QGraphicsItem* aParent ) : -CntDetailViewItem( aParent ), -mButton(NULL) - { + CntDetailViewItem( aParent ), + mButton(NULL) +{ mLocale = QLocale::system(); - } +} CntDateEditorViewItem::~CntDateEditorViewItem() - { - } +{ +} HbAbstractViewItem* CntDateEditorViewItem::createItem() - { +{ return new CntDateEditorViewItem( *this ); - } +} void CntDateEditorViewItem::clicked() - { +{ HbDataFormModel* model = static_cast(itemView()->model()); CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); QContactDetail detail = item->detail(); - - QString buttonText = qtTrId( "No date set" ); + if ( detail.definitionName() == QContactBirthday::DefinitionName ) - { + { QContactBirthday bd = detail; - QDate date = editDate( bd.date(), qtTrId("Birthday") ); - if ( date != bd.date() ) - { - bd.setDate( date ); - item->setDetail( bd ); - } - buttonText = mLocale.toString( date ); - } - - if ( detail.definitionName() == QContactAnniversary::DefinitionName ) - { - QContactAnniversary anniversary = detail; - QDate date = editDate( anniversary.originalDate(), qtTrId("Anniversary") ); - if ( date != anniversary.originalDate() ) - { - anniversary.setOriginalDate( date ); - item->setDetail( anniversary ); - } - buttonText = mLocale.toString( date ); - } - - mButton->setText( buttonText ); + editDate( bd.date(), hbTrId("txt_phob_formlabel_birthday") ); } + if ( detail.definitionName() == QContactAnniversary::DefinitionName ) + { + QContactAnniversary anniversary = detail; + editDate( anniversary.originalDate(), hbTrId("txt_phob_formlabel_anniversary") ); + } +} + HbWidget* CntDateEditorViewItem::createCustomWidget() - { +{ mButton = new HbPushButton(); connect( mButton, SIGNAL(clicked(bool)), this, SLOT(clicked()) ); - + HbDataFormModel* model = static_cast(itemView()->model()); CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); - + QContactDetail detail = item->detail(); - QString text( qtTrId("No date set") ); - + QString text("No date set"); // loc missing + if ( detail.definitionName() == QContactBirthday::DefinitionName ) - { + { QContactBirthday birthday = detail; if ( !birthday.isEmpty() ) - { + { text = mLocale.toString( birthday.date() ); - } } - + } + if ( detail.definitionName() == QContactAnniversary::DefinitionName ) - { + { QContactAnniversary anniversary = detail; if ( !anniversary.isEmpty() ) - { + { text = mLocale.toString( anniversary.originalDate() ); - } } + } mButton->setText( text ); return mButton; - } +} -QDate CntDateEditorViewItem::editDate( QDate aCurrent, QString aTitle ) - { - QPointer popup = new HbDialog(); +void CntDateEditorViewItem::editDate( QDate aCurrent, QString aTitle ) +{ + HbDialog *popup = new HbDialog(); popup->setDismissPolicy(HbDialog::NoDismiss); popup->setTimeout(HbPopup::NoTimeout); + popup->setAttribute(Qt::WA_DeleteOnClose, true); HbDateTimePicker *picker = new HbDateTimePicker( popup ); picker->setDisplayFormat( mLocale.dateFormat() ); picker->setDateRange(CNT_DATEPICKER_FROM, CNT_DATEPICKER_TO ); picker->setDate( aCurrent ); - - HbTextItem *headingText = new HbTextItem( popup ); - headingText->setFontSpec( HbFontSpec(HbFontSpec::Title) ); - headingText->setText( aTitle ); - + + HbLabel *headingText = new HbLabel( popup ); + headingText->setPlainText( aTitle ); + popup->setHeadingWidget(headingText); popup->setContentWidget(picker); - popup->setPrimaryAction(new HbAction(qtTrId("Ok"), popup)); - popup->setSecondaryAction(new HbAction(qtTrId("Cancel"), popup)); + popup->addAction(new HbAction(hbTrId("txt_common_button_ok"), popup)); + popup->addAction(new HbAction(hbTrId("txt_common_button_cancel"), popup)); + + popup->open(this, SLOT(handleEditDate(HbAction*))); +} - HbAction *selected = popup->exec(); - QDate date = (selected == popup->primaryAction()) ? picker->date() : aCurrent; - delete popup; - - return date; +void CntDateEditorViewItem::changeDate( QDate aNewDate ) +{ + HbDataFormModel* model = static_cast(itemView()->model()); + CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); + QContactDetail detail = item->detail(); + + QString buttonText("No date set"); // loc missing + if ( detail.definitionName() == QContactBirthday::DefinitionName ) + { + QContactBirthday bd = detail; + if ( aNewDate != bd.date() ) + { + bd.setDate( aNewDate ); + item->setDetail( bd ); + } + buttonText = mLocale.toString( aNewDate ); } + if ( detail.definitionName() == QContactAnniversary::DefinitionName ) + { + QContactAnniversary anniversary = detail; + if ( aNewDate != anniversary.originalDate() ) + { + anniversary.setOriginalDate( aNewDate ); + item->setDetail( anniversary ); + } + buttonText = mLocale.toString( aNewDate ); + } + + mButton->setText( buttonText ); +} + +void CntDateEditorViewItem::handleEditDate( HbAction *aAction ) +{ + HbDialog *popup = static_cast(sender()); + + if (popup && aAction == popup->actions().first()) + { + QDate date = static_cast(popup->contentWidget())->date(); + changeDate(date); + } + +} + // End of File diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp --- a/phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp Fri May 14 15:42:23 2010 +0300 @@ -35,6 +35,7 @@ #include "cnthistoryview.h" #include "cnteditview.h" #include "cntmycardselectionview.h" +#include "cntimportsview.h" #include "cntextensionmanager.h" CntDefaultViewFactory::CntDefaultViewFactory(): @@ -102,6 +103,8 @@ return new CntGroupActionsView(); case historyView: return new CntHistoryView(); + case importsView: + return new CntImportsView(); default: return createPluginView(aId); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp --- a/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp Fri May 14 15:42:23 2010 +0300 @@ -23,38 +23,34 @@ #include #include #include "cntviewnavigator.h" -#include +#include "simutility.h" CntDefaultViewManager::CntDefaultViewManager( HbMainWindow* aWindow ) : QObject(), mFactory(NULL), mCurrent(NULL), mOldView(NULL), mNavigator(NULL), - mMainWindow( aWindow ) + mMainWindow( aWindow ), + mSimUtility(NULL) { setViewFactory(new CntDefaultViewFactory()); setViewNavigator(new CntViewNavigator(this)); -#ifndef __WINS__ int error = -1; - SimUtility simUtility = SimUtility(SimUtility::AdnStore, error); - if (error == 0) + mSimUtility = new SimUtility(SimUtility::AdnStore, error); + if (error != 0) { - SimUtility::AvailableStores store = simUtility.getAvailableStores(error); - if (error == 0 && store.AdnStorePresent) - { - QContactManager* manager = QContactManager::fromUri(SIM_BACKEND_ADN); - mBackends.append( manager ); - } + delete mSimUtility; + mSimUtility = 0; } -#endif } CntDefaultViewManager::~CntDefaultViewManager() { qDeleteAll(mDefaults.values()); delete mFactory; + delete mSimUtility; } void CntDefaultViewManager::setViewFactory( CntAbstractViewFactory* aFactory ) @@ -79,12 +75,16 @@ QFlags flags; int back = mNavigator->back( flags ); - + + foreach( int k, aArgs.keys() ) + { + mArgs.insert( k, aArgs.value(k) ); + } mArgs.insert(EViewId, back ); - mArgs.insert(ESelectedAction, aArgs.value(ESelectedAction)); - mArgs.insert(ESelectedContact, aArgs.value(ESelectedContact)); - mArgs.insert(ESelectedGroupContact, aArgs.value(ESelectedGroupContact)); - mArgs.insert(ESelectedDetail, aArgs.value(ESelectedDetail)); +// mArgs.insert(ESelectedAction, aArgs.value(ESelectedAction)); +// mArgs.insert(ESelectedContact, aArgs.value(ESelectedContact)); +// mArgs.insert(ESelectedGroupContact, aArgs.value(ESelectedGroupContact)); +// mArgs.insert(ESelectedDetail, aArgs.value(ESelectedDetail)); if (mArgs.value(EViewId).toInt() != noView) { @@ -110,6 +110,7 @@ } } QContactManager* manager = QContactManager::fromUri( aType ); + if ( manager ) { mBackends.append( manager ); @@ -143,6 +144,13 @@ 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 ); + } + mMainWindow->setInteractive(true); } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntdetaileditor.cpp --- a/phonebookui/pbkcommonui/src/cntdetaileditor.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdetaileditor.cpp Fri May 14 15:42:23 2010 +0300 @@ -16,6 +16,7 @@ */ #include "cntdetaileditor.h" #include "cnteditorfactory.h" +#include "cntgroupeditormodel.h" #include #include #include @@ -23,11 +24,15 @@ #include #include #include +#include +#include +#include const char *CNT_DETAILEDITOR_XML = ":/xml/contacts_detail_editor.docml"; CntDetailEditor::CntDetailEditor( int aId ) : QObject(), + mDataFormModel(NULL), mId(aId), mView(NULL), mLoader(NULL), @@ -42,7 +47,6 @@ } else { mView = static_cast (document()->findWidget(QString("view"))); - mDataForm = static_cast (document()->findWidget(QString("dataForm"))); } @@ -76,6 +80,7 @@ void CntDetailEditor::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { mViewManager = aMgr; + mArgs = aArgs; //don't loose the params while swiching between editview and editorviews. mCancel = static_cast(document()->findObject("cnt:discardchanges")); mView->menu()->addAction( mCancel ); @@ -94,11 +99,10 @@ if ( aArgs.value(ESelectedAction).toString() == "add" ) { mDataFormModel->insertDetailField(); } - - HbMainWindow* window = mView->mainWindow(); - if ( window ) { - connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(handleOrientation(Qt::Orientation))); - handleOrientation(window->orientation()); + + if ( mId == groupEditorView ) + { + connect( mDataForm, SIGNAL(itemShown(const QModelIndex&)), this, SLOT(handleItemShown(const QModelIndex&)) ); } } @@ -134,19 +138,27 @@ mDataFormModel->insertDetailField(); } -void CntDetailEditor::handleOrientation(Qt::Orientation aOrientation) +void CntDetailEditor::handleItemShown(const QModelIndex& aIndex ) { - Q_UNUSED(aOrientation); + if ( mId == groupEditorView ) + { + CntGroupEditorModel* groupModel = static_cast( mDataFormModel ); + if ( groupModel->isConferenceNumber(aIndex) ) + { + HbDataFormViewItem* viewItem = static_cast(mDataForm->itemByIndex( aIndex )); + HbLineEdit* edit = static_cast( viewItem->dataItemContentWidget() ); + edit->setInputMethodHints( Qt::ImhDialableCharactersOnly ); + } + } } void CntDetailEditor::discardChanges() { QContact selected( *mDataFormModel->contact() ); - CntViewParameters args; QVariant var; var.setValue(selected); - args.insert(ESelectedContact, var); - mViewManager->back( args ); + mArgs.insert(ESelectedContact, var); + mViewManager->back( mArgs ); } void CntDetailEditor::saveChanges() @@ -154,11 +166,10 @@ mDataFormModel->saveContactDetails(); QContact selected( *mDataFormModel->contact() ); - CntViewParameters args; QVariant var; var.setValue(selected); - args.insert(ESelectedContact, var); - mViewManager->back( args ); + mArgs.insert(ESelectedContact, var); + mViewManager->back( mArgs ); } void CntDetailEditor::setHeader(QString aHeader) @@ -171,8 +182,17 @@ void CntDetailEditor::setDetails(CntDetailEditorModel* aModel, HbAbstractViewItem* aPrototype) { + //Append custom view item prototype + if ( aPrototype ) + { + QList protos = mDataForm->itemPrototypes(); + protos.append( aPrototype ); + mDataForm->setItemPrototypes( protos ); + } + mDataFormModel = aModel; - mDataForm->setModel(mDataFormModel, aPrototype); + mDataForm->setModel( mDataFormModel ); + } int CntDetailEditor::viewId() const diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntdetailpopup.cpp --- a/phonebookui/pbkcommonui/src/cntdetailpopup.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdetailpopup.cpp Fri May 14 15:42:23 2010 +0300 @@ -27,10 +27,12 @@ QTM_USE_NAMESPACE -CntDetailPopup::CntDetailPopup(QGraphicsItem *parent): +CntDetailPopup::CntDetailPopup(QGraphicsItem *parent, CntViewIdList aList ): HbDialog(parent), mListModel(NULL), - mListView(NULL) + mListView(NULL), + mSelectedDetail(0), + mViewIdList( aList ) { mListView = new HbListView(this); mListModel = new QStandardItemModel(this); @@ -39,11 +41,11 @@ addListItem("qtg_small_email", hbTrId("txt_phob_list_email"), emailEditorView ); addListItem("qtg_small_url_address", hbTrId("txt_phob_list_url"), urlEditorView); addListItem("qtg_small_location", hbTrId("txt_phob_list_address"), addressEditorView ); - addListItem("qtg_small_note", hbTrId("txt_phob_formlabel_note"), noteEditorView); - addListItem("qtg_small_sound", hbTrId("txt_phob_formlabel_personal_ringing_tone"), noView ); - addListItem("qtg_small_calendar", hbTrId("txt_phob_formlabel_date"), dateEditorView); - addListItem("qtg_small_company_details", hbTrId("txt_phob_formlabel_company_details"), companyEditorView); - addListItem("qtg_small_family", hbTrId("txt_phob_formlabel_family"), familyDetailEditorView); + addListItem("qtg_small_note", hbTrId("txt_phob_list_note"), noteEditorView); + addListItem("qtg_small_sound", hbTrId("txt_phob_list_personal_ringing_tone"), noView ); + addListItem("qtg_small_calendar", hbTrId("txt_phob_list_date"), dateEditorView); + addListItem("qtg_small_company_details", hbTrId("txt_phob_list_company_details"), companyEditorView); + addListItem("qtg_small_family", hbTrId("txt_phob_list_family"), familyDetailEditorView); mListView->setModel(mListModel); mListView->setSelectionMode(HbAbstractItemView::NoSelection); @@ -51,16 +53,17 @@ HbListViewItem* prototype = mListView->listItemPrototype(); prototype->setGraphicsSize( HbListViewItem::SmallIcon ); - HbGroupBox *headingLabel = new HbGroupBox(); - HbLabel *label = new HbLabel(hbTrId("txt_phob_title_add_field")); - headingLabel->setContentWidget(label); + HbLabel *label = new HbLabel(this); + label->setPlainText(hbTrId("txt_phob_title_add_field")); - setHeadingWidget(headingLabel); + setHeadingWidget(label); setContentWidget(mListView); - HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel")); - setSecondaryAction(mSecondaryAction); - setTimeout(0); + HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"), this); + addAction(cancelAction); + setTimeout(HbDialog::NoTimeout); + setDismissPolicy(HbDialog::NoDismiss); + setAttribute(Qt::WA_DeleteOnClose, true); setModal(true); connect(mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(listItemSelected(QModelIndex))); @@ -72,38 +75,30 @@ void CntDetailPopup::listItemSelected(QModelIndex index) { - mSelectedDetail = mListModel->item(index.row(), 1)->text(); + mSelectedDetail = mListModel->item(index.row())->data(Qt::UserRole).toInt(); close(); } -QString CntDetailPopup::selectedDetail() +int CntDetailPopup::selectedDetail() { return mSelectedDetail; } -int CntDetailPopup::selectDetail() +void CntDetailPopup::selectDetail( CntViewIdList aList, QObject *receiver, const char *member ) { - CntDetailPopup *popup = new CntDetailPopup(); - QString result; - - HbAction *action = popup->exec(); - - if (action != popup->secondaryAction() && !popup->selectedDetail().isEmpty()) - { - result = popup->selectedDetail(); - } - delete popup; - - return result.toInt(); + CntDetailPopup *popup = new CntDetailPopup( NULL, aList ); + + popup->open(receiver, member); } void CntDetailPopup::addListItem(QString aIcon, QString label, int aId ) { - QList items; - QStandardItem *labelItem = new QStandardItem(HbIcon(aIcon).qicon(), label); - QString id; - QStandardItem *idItem = new QStandardItem( id.number(aId) ); + if ( !mViewIdList.contains(aId) ) + { + QStandardItem *labelItem = new QStandardItem(label); + labelItem->setData(HbIcon(aIcon), Qt::DecorationRole); + labelItem->setData(aId, Qt::UserRole); - items << labelItem << idItem; - mListModel->appendRow(items); + mListModel->appendRow(labelItem); + } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnteditorfactory.cpp --- a/phonebookui/pbkcommonui/src/cnteditorfactory.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditorfactory.cpp Fri May 14 15:42:23 2010 +0300 @@ -109,7 +109,7 @@ case addressEditorView: { - aEditor.setDetails(new CntAddressModel(new QContact(aContact)), NULL); + aEditor.setDetails(new CntAddressModel(new QContact(aContact)), new CntAddressViewItem() ); aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_address_details")); break; } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnteditview.cpp --- a/phonebookui/pbkcommonui/src/cnteditview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditview.cpp Fri May 14 15:42:23 2010 +0300 @@ -20,7 +20,7 @@ #include "cntabstractviewmanager.h" #include - +#include "qtpbkglobal.h" #include "cntdetailpopup.h" #include "cnteditviewdetailitem.h" #include "cnteditviewheadingitem.h" @@ -36,8 +36,8 @@ CntEditView::CntEditView() : d_ptr(new CntEditViewPrivate()) { Q_D( CntEditView ); - connect( d_ptr, SIGNAL(contactUpdated()), this, SIGNAL(contactUpdated()) ); - connect( d_ptr, SIGNAL(contactRemoved()), this, SIGNAL(contactRemoved()) ); + connect( d_ptr, SIGNAL(contactUpdated(bool)), this, SIGNAL(contactUpdated(bool)) ); + connect( d_ptr, SIGNAL(contactRemoved(bool)), this, SIGNAL(contactRemoved(bool)) ); connect( d_ptr, SIGNAL(changesDiscarded()), this, SIGNAL(changesDiscarded()) ); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnteditview_p.cpp --- a/phonebookui/pbkcommonui/src/cnteditview_p.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditview_p.cpp Fri May 14 15:42:23 2010 +0300 @@ -26,19 +26,22 @@ #include #include #include +#include #include #include #include #include #include #include +#include const char *CNT_EDIT_XML = ":/xml/contacts_ev.docml"; CntEditViewPrivate::CntEditViewPrivate() : mModel( NULL ), mImageLabel( NULL ), -mThumbnailManager( NULL ) +mThumbnailManager( NULL ), +mContact( NULL ) { mDocument = new CntDocumentLoader; @@ -64,8 +67,7 @@ mDelete = static_cast( mDocument->findObject("cnt:deletecontact") ); HbAction* add = static_cast( mDocument->findObject("cnt:adddetail_options") ); - HbAction* removeContact = static_cast( mDocument->findObject("cnt:deletecontact") ); - + connect( add, SIGNAL(triggered()), this, SLOT(addDetailItem()) ); connect( mDelete, SIGNAL(triggered()), this, SLOT(deleteContact()) ); connect( mDiscard, SIGNAL(triggered()), this, SLOT(discardChanges()) ); @@ -86,6 +88,7 @@ delete mListView; delete mModel; delete mContact; + delete mThumbnailManager; } @@ -106,6 +109,8 @@ void CntEditViewPrivate::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { mMgr = aMgr; + mArgs = aArgs; + if ( mView->navigationAction() != mSoftkey) { mView->setNavigationAction(mSoftkey); @@ -117,19 +122,41 @@ setOrientation(window->orientation()); } + QVariant selectedAction = mArgs.value( EMyCard ); + QString myCard = selectedAction.toString(); + QVariant contact = aArgs.value( ESelectedContact ); mContact = new QContact( contact.value() ); QContactLocalId localId = mContact->localId(); QContactManager* cm = mMgr->contactManager(SYMBIAN_BACKEND); QContactLocalId selfContactId = cm->selfContactId(); + mIsMyCard = ( localId == selfContactId && localId != 0 ) || myCard == "myCard"; + + // if "MyCard", set slightly different heading and options menu + if ( mIsMyCard ) + { + mSave->setText(hbTrId("txt_phob_opt_save_my_card")); + mDelete->setText(hbTrId("txt_phob_opt_clear_my_card")); + HbGroupBox* groupBox = static_cast( mDocument->findWidget("groupBox") ); + if ( groupBox ) + { + groupBox->setHeading(hbTrId("txt_phob_subtitle_edit_my_details")); + } + } + + if ( localId == 0 && !mIsMyCard ) + { + HbMenu* menu = mView->menu(); + menu->removeAction( mDelete ); + } - HbMenu* menu = mView->menu(); // don't delete contact which is "MyCard" or not saved yet or both. - if ( localId == selfContactId && selfContactId != 0 && mContact->details().count() <= 4 || localId == 0 ) + if ( mIsMyCard && (mContact->details().count() <= 4 || localId == 0) ) { mDelete->setEnabled( false ); } + // save and discard disabled if no changes found if ( (*mContact) == cm->contact( mContact->localId()) ) { @@ -169,13 +196,13 @@ { // open editor view QVariant id = item->data( ERoleEditorViewId ); - CntViewParameters viewParameters; - viewParameters.insert(EViewId, id.toInt()); + mArgs.insert(EViewId, id.toInt()); + QVariant var; var.setValue(*mContact); - viewParameters.insert(ESelectedContact, var); - - mMgr->changeView( viewParameters ); + mArgs.insert(ESelectedContact, var); + mArgs.insert(ESelectedAction, QString() ); + mMgr->changeView( mArgs ); } } @@ -193,92 +220,129 @@ // only detail items are able to show context specific menu else { - QVariant cd = item->data( ERoleContactDetail ); - - HbMenu* menu = new HbMenu(); - menu->addActions( createPopup(item) ); - HbAction* selected = menu->exec( aCoords ); - - if ( selected ) + HbMenu* menu = createPopup( aItem->modelIndex(), item ); + menu->setAttribute( Qt::WA_DeleteOnClose, true ); + menu->setPreferredPos( aCoords ); + menu->setModal( true ); + menu->open( this, SLOT(handleMenuAction(HbAction*)) ); + } +} + +void CntEditViewPrivate::handleMenuAction( HbAction* aAction ) +{ + int row = aAction->data().toInt(); + QModelIndex index = mModel->index(row, 0); + CntEditViewItem* item = mModel->itemAt( index ); + if ( aAction ) + { + switch ( aAction->commandRole() ) + { + case HbAction::EditRole: { - switch ( selected->commandRole() ) - { - case HbAction::EditRole: - { - editDetail( item ); - } - break; - - case HbAction::NewRole: - { - addDetail( item ); - } - break; - - case HbAction::DeleteRole: - { - removeDetail( item, aItem->modelIndex() ); - } - break; - - default: - break; - } + editDetail( item ); + } + break; + + case HbAction::NewRole: + { + addDetail( item ); } + break; - delete menu; + case HbAction::DeleteRole: + { + removeDetail( item, index ); + } + break; + + default: + break; + } } } void CntEditViewPrivate::addDetailItem() { - int detailEditorId = CntDetailPopup::selectDetail(); - if (detailEditorId != noView ) + CntViewIdList list; + mModel->allInUseFields( list ); + + CntDetailPopup::selectDetail( list, this, SLOT(handleAddDetailItem(HbAction*)) ); +} + +void CntEditViewPrivate::handleAddDetailItem(HbAction *aAction) +{ + CntDetailPopup *popup = static_cast(sender()); + + if (popup && aAction != popup->actions().first()) { - CntViewParameters viewParameters; - viewParameters.insert(EViewId, detailEditorId ); - switch ( detailEditorId ) + int id = popup->selectedDetail(); + + if (id != noView ) { - case phoneNumberEditorView: - case emailEditorView: - case urlEditorView: - case noteEditorView: - viewParameters.insert( ESelectedAction, "add" ); - break; - case addressEditorView: - case dateEditorView: - case companyEditorView: - case familyDetailEditorView: - viewParameters.insert( ESelectedAction, "focus" ); - break; - default: - break; + mArgs.insert(EViewId, id ); + + switch ( id ) + { + case phoneNumberEditorView: + case emailEditorView: + case urlEditorView: + case noteEditorView: + mArgs.insert( ESelectedAction, "add" ); + break; + case addressEditorView: + case dateEditorView: + case companyEditorView: + case familyDetailEditorView: + mArgs.insert( ESelectedAction, "focus" ); + break; + default: + break; + } + QVariant var; + var.setValue(*mContact); + mArgs.insert(ESelectedContact, var); + mMgr->changeView( mArgs ); } - QVariant var; - var.setValue(*mContact); - viewParameters.insert(ESelectedContact, var); - mMgr->changeView(viewParameters); } } void CntEditViewPrivate::deleteContact() { - QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND ); - QString name = cm->synthesizedDisplayLabel( *mContact ); + if ( mIsMyCard ) + { + HbMessageBox::question(hbTrId("txt_phob_info_clear_my_card"), this, + SLOT(handleDeleteContact(HbAction*)), + hbTrId("txt_phob_button_clear"), + hbTrId("txt_common_button_cancel")); + } + 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_phob_button_delete"), hbTrId("txt_common_button_cancel")); + } +} - HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_delete_1").arg(name), HbMessageBox::MessageTypeQuestion); - note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - HbAction *selected = note->exec(); - if (selected == note->primaryAction()) +void CntEditViewPrivate::handleDeleteContact(HbAction *action) +{ + HbMessageBox *dlg = static_cast(sender()); + if(dlg && action == dlg->actions().first()) { - cm->removeContact( mContact->localId() ); - emit contactRemoved(); + QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND ); + + if ( mIsMyCard ) + { + mContact->clearDetails(); + emit contactUpdated(cm->saveContact(mContact)); + } + else + { + emit contactRemoved(cm->removeContact( mContact->localId() )); + } - CntViewParameters viewParameters; - mMgr->back( viewParameters ); + mMgr->back( mArgs ); } - delete note; } void CntEditViewPrivate::discardChanges() @@ -301,17 +365,68 @@ void CntEditViewPrivate::saveChanges() { QContactManager* mgr = mMgr->contactManager( SYMBIAN_BACKEND ); - mgr->saveContact( mContact ); - emit contactUpdated(); + bool isSavedContact = mContact->localId() > 0; - QVariant var; - var.setValue(*mContact); - - CntViewParameters viewParameters; - viewParameters.insert(ESelectedContact, var); - viewParameters.insert( ESelectedAction, "save" ); + // if the contact is really changed or a new one + if ( (*mContact) != mgr->contact(mContact->localId()) || !isSavedContact ) + { + int detailCount = mContact->details().count(); + + // If its a new contact + if ( !isSavedContact ) + { + if ( detailCount > 2 ) + { + bool success = mgr->saveContact( mContact ); + if ( success && mIsMyCard ) + { + mgr->setSelfContactId( mContact->localId() ); + } + QVariant var; + var.setValue(*mContact); + mArgs.insert(ESelectedContact, var); + mArgs.insert( ESelectedAction, success ? "save" : "failed" ); + emit contactUpdated(success); + } + } + 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 contactRemoved(success); + if ( success ) + { + mArgs.insert( ESelectedAction, "delete" ); + QVariant contact; + contact.setValue( c ); + mArgs.insert( ESelectedContact, contact ); + } + } + else + { + bool success = mgr->saveContact(mContact); + mArgs.insert( ESelectedAction, success ? "save" : "failed"); + + QVariant var; + var.setValue(*mContact); + mArgs.insert(ESelectedContact, var); + + emit contactUpdated( success ); + } + } + } + else + { + emit changesDiscarded(); + } - mMgr->back( viewParameters ); + mMgr->back( mArgs ); } void CntEditViewPrivate::openNameEditor() @@ -319,11 +434,11 @@ QVariant var; var.setValue(*mContact); - CntViewParameters viewParameters; - viewParameters.insert(EViewId, namesEditorView); - viewParameters.insert(ESelectedContact, var); + mArgs.insert(EViewId, namesEditorView); + mArgs.insert(ESelectedAction, QString()); + mArgs.insert(ESelectedContact, var); - mMgr->changeView( viewParameters ); + mMgr->changeView( mArgs ); } void CntEditViewPrivate::openImageEditor() @@ -331,11 +446,11 @@ QVariant var; var.setValue(*mContact); - CntViewParameters viewParameters; - viewParameters.insert(ESelectedContact, var); - viewParameters.insert(EViewId, imageEditorView ); + mArgs.insert(ESelectedContact, var); + mArgs.insert(ESelectedAction, QString()); + mArgs.insert(EViewId, imageEditorView ); - mMgr->changeView( viewParameters ); + mMgr->changeView( mArgs ); } void CntEditViewPrivate::loadAvatar() @@ -367,27 +482,15 @@ } } -QList CntEditViewPrivate::createPopup( CntEditViewItem* aDetail ) +HbMenu* CntEditViewPrivate::createPopup( const QModelIndex aIndex, CntEditViewItem* aDetail ) { - QList actions; + HbMenu* menu = new HbMenu(); CntStringMapper* map = new CntStringMapper(); QVariant cd = aDetail->data( ERoleContactDetail ); QContactDetail detail = cd.value(); - HbAction* edit = static_cast(mDocument->findObject("cnt:editdetail")); - - HbAction* add = static_cast(mDocument->findObject("cnt:adddetail_popup")); - QString text = add->text(); - add->setText( text.arg( "%1", map->getMappedDetail(detail.definitionName())) ); - - HbAction* del = static_cast(mDocument->findObject("cnt:deletedetail")); - text = edit->text(); - del->setText( text.arg("%1", map->getMappedDetail(detail.definitionName())) ); - - add->setCommandRole( HbAction::NewRole ); - edit->setCommandRole( HbAction::EditRole ); - del->setCommandRole( HbAction::DeleteRole ); - + QVariant data( aIndex.row() ); + if ( !mModel->isEmptyItem(aDetail) ) { // add is supported only on these items: @@ -399,17 +502,51 @@ def == QContactUrl::DefinitionName || def == QContactNote::DefinitionName ) { - actions.append( add ); + HbAction* add = menu->addAction(HbParameterLengthLimiter( + map->getContactEditorAddLocString(detail.definitionName(), ""))); + add->setCommandRole( HbAction::NewRole ); + add->setData( data ); + } + + QString context; + QString subtype; + if ( def == QContactPhoneNumber::DefinitionName ) + { + QContactPhoneNumber number(detail); + context = number.contexts().isEmpty() ? QString() : number.contexts().first(); + subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first(); } - actions.append( edit ); - actions.append( del ); + else if ( def == QContactOnlineAccount::DefinitionName ) + { + QContactOnlineAccount number(detail); + context = number.contexts().isEmpty() ? QString() : number.contexts().first(); + subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first(); + } + else if ( def == QContactFamily::DefinitionName ) + { + QStringList fields = aDetail->data(ERoleContactDetailFields).toStringList(); + subtype = fields.first(); + } + else + { + context = QString(); + subtype = detail.definitionName(); + } + HbAction* edit = menu->addAction(HbParameterLengthLimiter(map->getContactEditorEditLocString(subtype, context))); + HbAction* del = menu->addAction(HbParameterLengthLimiter(map->getContactEditorDelLocString(subtype, context))); + edit->setCommandRole( HbAction::EditRole ); + del->setCommandRole( HbAction::DeleteRole ); + edit->setData( data ); + del->setData( data ); } else { - actions.append( edit ); + HbAction* edit = menu->addAction(HbParameterLengthLimiter(map->getContactEditorEditLocString(detail.definitionName(), ""))); + edit->setCommandRole( HbAction::EditRole ); + edit->setData( data ); } - delete map; - return actions; + + return menu; } void CntEditViewPrivate::addDetail( CntEditViewItem* aDetail ) @@ -428,14 +565,15 @@ void CntEditViewPrivate::editDetail( CntEditViewItem* aDetail ) { QVariant id = aDetail->data( ERoleEditorViewId ); - CntViewParameters viewParameters; - viewParameters.insert(EViewId, id.toInt()); + + mArgs.insert(EViewId, id.toInt()); + mArgs.insert(ESelectedAction, QString() ); QVariant var; var.setValue(*mContact); - viewParameters.insert(ESelectedContact, var); + mArgs.insert(ESelectedContact, var); - mMgr->changeView( viewParameters ); + mMgr->changeView( mArgs ); } void CntEditViewPrivate::removeDetail( CntEditViewItem* aDetail, const QModelIndex& aIndex ) diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -24,8 +24,6 @@ #include #include #include -#include -#include #include #include @@ -102,400 +100,4 @@ { Q_UNUSED( coords ); } -// -//void CntEditViewDetailItem::createPrimitives() -//{ -//// if (!icon.isNull()) -//// { -//// if (!mIcon) -//// { -//// mIcon = new HbIconItem(this); -//// mIcon->setIcon(icon); -//// //style()->setItemName(mIcon, "icon"); -//// } -//// } -//// else -//// { -//// if (mIcon) -//// { -//// delete mIcon; -//// } -//// mIcon = 0; -//// } -//// -//// if (!text.isNull()) -//// { -//// if (!mLabel) -//// { -//// mLabel = new HbTextItem(this); -//// mLabel->setText(text); -//// //style()->setItemName(mLabel, "text"); -//// } -//// } -//// else -//// { -//// if (mLabel) -//// { -//// delete mLabel; -//// } -//// mLabel = 0; -//// } -//// -//// if (!valueText.isNull()) -//// { -//// if (!mContent) -//// { -//// mContent = new HbTextItem(this); -//// mContent->setText(valueText); -//// mContent->setTextWrapping(Hb::TextNoWrap); -//// // style()->setItemName(mContent, "valueText"); -//// -//// // make sure phone number truncation characters are placed -//// // on left side of the phone number. -//// if ( mDetail.definitionName() == QContactPhoneNumber::DefinitionName ) -//// { -//// mContent->setElideMode( Qt::ElideLeft ); -//// } -//// } -//// } -//// else -//// { -//// if (mContent) -//// { -//// delete mContent; -//// } -//// mContent = 0; -//// } -//// -//// if (!mFrameItem) -//// { -//// mFrameItem = new HbFrameItem(this); -//// mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_normal"); -//// mFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); -//// mFrameItem->setZValue(-2); -//// //style()->setItemName(mFrameItem, "background"); -//// } -//// -//// if (!mFocusItem) -//// { -//// mFocusItem = new HbFrameItem(this); -//// mFocusItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_pressed"); -//// mFocusItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); -//// mFocusItem->setZValue(-1); -//// mFocusItem->setVisible(false); -//// //style()->setItemName(mFocusItem, "highlight"); -//// } -//} -// -//void CntEditViewDetailItem::recreatePrimitives() -//{ -//// HbWidget::recreatePrimitives(); -//// -//// delete mIcon; -//// mIcon = 0; -//// -//// delete mLabel; -//// mLabel = 0; -//// -//// delete mContent; -//// mContent = 0; -//// -//// delete mFrameItem; -//// mFrameItem = 0; -//// -//// delete mFocusItem; -//// mFocusItem = 0; -//// -//// createPrimitives(); -//} -// -//void CntEditViewDetailItem::initGesture() -//{ -//// mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); -//// mGestureLongpressed = new HbGesture(HbGesture::longpress, 5); -//// mGestureFilter->addGesture(mGestureLongpressed); -//// mGestureFilter->setLongpressAnimation(true); -//// installSceneEventFilter(mGestureFilter); -//// -//// connect(mGestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(onLongPress(QPointF))); -//} -// -//void CntEditViewDetailItem::onLongPress(const QPointF &point) -//{ -// mHasFocus = false; -// updatePrimitives(); -// emit longPressed(point); -//} -// -//void CntEditViewDetailItem::setDetail(const QContactDetail &detail, const QString &type) -//{ -//// bool doPolish = false; -//// if (!mDetail.isEmpty() && detail != mDetail) -//// { -//// text.clear(); -//// valueText.clear(); -//// icon.clear(); -//// doPolish = true; -//// } -//// mDetail = detail; -//// mType = type; -//// -//// QString context; -//// if (mDetail.contexts().count()) -//// { -//// context = mStringMapper.getMappedDetail(detail.contexts().at(0)); -//// } -//// -//// // phone number -//// if (mDetail.definitionName() == QContactPhoneNumber::DefinitionName) -//// { -//// QContactPhoneNumber number = mDetail; -//// if (number.isEmpty()) -//// { -//// text = hbTrId("txt_phob_list_add_phone_number"); -//// icon = HbIcon(mStringMapper.getMappedIcon(number.definitionName())); -//// } -//// else if ( !number.subTypes().isEmpty() ) -//// { -//// QStringList list; -//// list << mStringMapper.getMappedDetail(number.subTypes().at(0)) << context; -//// text = list.join(" "); -//// valueText = number.number(); -//// icon = HbIcon(mStringMapper.getMappedIcon(number.subTypes().at(0))); -//// } -//// } -//// -//// // email address -//// if (mDetail.definitionName() == QContactEmailAddress::DefinitionName) -//// { -//// QContactEmailAddress email = mDetail; -//// if (email.isEmpty()) -//// { -//// text = hbTrId("txt_phob_list_add_email_address"); -//// icon = HbIcon(mStringMapper.getMappedIcon(email.definitionName())); -//// } -//// else -//// { -//// QStringList list; -//// list << mStringMapper.getMappedDetail(email.definitionName()) << context; -//// text = list.join(" "); -//// valueText = email.emailAddress(); -//// icon = HbIcon(mStringMapper.getMappedIcon(email.definitionName())); -//// } -//// } -//// -//// // postal address -//// if (mDetail.definitionName() == QContactAddress::DefinitionName) -//// { -//// QContactAddress address = mDetail; -//// if (address.isEmpty()) -//// { -//// text = qtTrId("Add postal address"); -//// icon = HbIcon(mStringMapper.getMappedIcon(address.definitionName())); -//// } -//// else -//// { -//// QStringList nameList; -//// nameList << mStringMapper.getMappedDetail(address.definitionName()) << context; -//// text = nameList.join(" "); -//// QStringList list; -//// if (!address.street().isEmpty()) -//// list << address.street(); -//// if (!address.postcode().isEmpty()) -//// list << address.postcode(); -//// if (!address.postOfficeBox().isEmpty()) -//// list << address.postOfficeBox(); -//// if (!address.locality().isEmpty()) -//// list << address.locality(); -//// if (!address.region().isEmpty()) -//// list << address.region(); -//// if (!address.country().isEmpty()) -//// list << address.country(); -//// -//// QString data = list.join(", "); -//// valueText = data; -//// } -//// } -//// -//// // online account -//// if (mDetail.definitionName() == QContactOnlineAccount::DefinitionName) -//// { -//// QContactOnlineAccount account = mDetail; -//// if (account.isEmpty()) -//// { -//// text = hbTrId("Add IM address"); -//// icon = HbIcon(mStringMapper.getMappedIcon(account.definitionName())); -//// } -//// else if ( !account.subTypes().isEmpty() ) -//// { -//// QStringList list; -//// list << mStringMapper.getMappedDetail(account.subTypes().at(0)) << context; -//// text = list.join(" "); -//// valueText = account.accountUri(); -//// icon = HbIcon(mStringMapper.getMappedIcon(account.subTypes().at(0))); -//// } -//// } -//// -//// // url address -//// if (mDetail.definitionName() == QContactUrl::DefinitionName) -//// { -//// QContactUrl url = mDetail; -//// if (url.isEmpty()) -//// { -//// text = hbTrId("txt_phob_list_add_url_address"); -//// icon = HbIcon(mStringMapper.getMappedIcon(url.definitionName())); -//// } -//// else -//// { -//// QStringList list; -//// list << mStringMapper.getMappedDetail(url.definitionName()) << context; -//// text = list.join(" "); -//// valueText = url.url(); -//// icon = HbIcon(mStringMapper.getMappedIcon(url.definitionName())); -//// } -//// } -//// -//// // company details -//// if (mDetail.definitionName() == QContactOrganization::DefinitionName) -//// { -//// QContactOrganization org = mDetail; -//// -//// // general details -//// if (mType == QContactOrganization::DefinitionName) -//// { -//// text = mStringMapper.getMappedDetail(org.definitionName()); -//// QStringList list; -//// if(!org.title().isEmpty()) -//// list << org.title(); -//// if(!org.name().isEmpty()) -//// list << org.name(); -//// if(!org.department().isEmpty()) -//// list << org.department().join(" "); -//// valueText = list.join(", "); -//// -//// } -//// // assistant name -//// else if (mType == QContactOrganization::FieldAssistantName) -//// { -//// text = mStringMapper.getMappedDetail(QContactOrganization::FieldAssistantName); -//// valueText = org.assistantName(); -//// } -//// } -//// -//// // birthday -//// if (mDetail.definitionName() == QContactBirthday::DefinitionName) -//// { -//// QContactBirthday bDay = mDetail; -//// -//// text = mStringMapper.getMappedDetail(bDay.definitionName()); -//// valueText = bDay.date().toString("dd MMMM yyyy"); -//// } -//// -//// // anniversary -//// if (mDetail.definitionName() == QContactAnniversary::DefinitionName) -//// { -//// QContactAnniversary anniversary = mDetail; -//// -//// text = mStringMapper.getMappedDetail(anniversary.definitionName()); -//// valueText = anniversary.originalDate().toString("dd MMMM yyyy"); -//// } -//// -//// // ringing tone -//// if (mDetail.definitionName() == QContactAvatar::DefinitionName) -//// { -//// QContactAvatar avatar = mDetail; -//// -//// text = mStringMapper.getMappedDetail(QContactAvatar::SubTypeAudioRingtone); -//// valueText = avatar.avatar(); -//// } -//// -//// // note -//// if (mDetail.definitionName() == QContactNote::DefinitionName) -//// { -//// QContactNote note = mDetail; -//// -//// text = mStringMapper.getMappedDetail(note.definitionName()); -//// valueText = note.note(); -//// } -//// -//// // family details -//// if (mDetail.definitionName() == QContactFamily::DefinitionName) -//// { -//// QContactFamily family = mDetail; -//// -//// // spouse -//// if (mType == QContactFamily::FieldSpouse) -//// { -//// text = mStringMapper.getMappedDetail(QContactFamily::FieldSpouse); -//// valueText = family.spouse(); -//// -//// } -//// // children -//// else if (mType == QContactFamily::FieldChildren) -//// { -//// text = mStringMapper.getMappedDetail(QContactFamily::FieldChildren); -//// valueText = family.children().join(", "); -//// } -//// } -//// -//// recreatePrimitives(); -//// if (doPolish) -//// { -//// repolish(); -//// } -//} -// -//QContactDetail CntEditViewDetailItem::detail() -//{ -// return mDetail; -//} -// -//QString CntEditViewDetailItem::fieldType() -//{ -// return mType; -//} -// -//void CntEditViewDetailItem::updatePrimitives() -//{ -// //HbWidget::updatePrimitives(); -// if (mHasFocus) -// { -// mFocusItem->setVisible(true); -// HbEffect::start(mFocusItem, QString("frameitem"), QString("pressed")); -// } -// else -// { -// HbEffect::start(mFocusItem, QString("frameitem"), QString("released")); -// } -//} -// -//void CntEditViewDetailItem::mousePressEvent(QGraphicsSceneMouseEvent *event) -//{ -// HbInstantFeedback::play(HbFeedback::Basic); -// event->accept(); -// mHasFocus = true; -// updatePrimitives(); -//} -// -//void CntEditViewDetailItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -//{ -//// if (!rect().contains(event->pos()) && mHasFocus) -//// { -//// mHasFocus = false; -//// updatePrimitives(); -//// } -//// event->accept(); -//} -// -// -//void CntEditViewDetailItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -//{ -// bool hadFocus = mHasFocus; -// mHasFocus = false; -//// if (rect().contains(event->pos()) && hadFocus) -//// { -//// updatePrimitives(); -//// emit clicked(); -//// } -//// event->accept(); -//} + diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -156,7 +156,7 @@ icon.clear(); // icon label shows default icon first - icon = HbIcon("qtg_large_avatar"); + icon = HbIcon("qtg_large_add_contact_picture"); QContactName name = contact->detail(); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnteditviewitembuilder.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewitembuilder.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditviewitembuilder.cpp Fri May 14 15:42:23 2010 +0300 @@ -43,7 +43,7 @@ QContactPhoneNumber::FieldNumber, phoneNumberEditorView ); detailItem->addText( hbTrId("txt_phob_list_add_phone_number") ); - detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactPhoneNumber::DefinitionName)) ); + detailItem->addIcon( HbIcon(mMap->getContactEditorIconString(QContactPhoneNumber::DefinitionName, "")) ); list.append( detailItem ); } // existing phonenumber(s) @@ -61,8 +61,8 @@ QContactPhoneNumber::FieldNumber, phoneNumberEditorView); - detailItem->addIcon( mMap->getMappedIcon(subtype) ); - detailItem->addText( mMap->getLocString(subtype, context) ); + detailItem->addIcon( mMap->getContactEditorIconString(subtype, context) ); + detailItem->addText( mMap->getContactEditorLocString(subtype, context) ); detailItem->addText( number.number() ); list.append( detailItem ); } @@ -84,13 +84,15 @@ number, QContactOnlineAccount::FieldAccountUri, phoneNumberEditorView); - detailItem->addIcon( mMap->getMappedIcon(subtype) ); + detailItem->addIcon( mMap->getContactEditorIconString(subtype, context) ); if ( subtype == QContactOnlineAccount::SubTypeSip ) { detailItem->addText( hbTrId("txt_phob_formlabel_val_sip") ); + detailItem->addText( number.accountUri() ); + list.append( detailItem ); } - else + else if ( subtype == QContactOnlineAccount::SubTypeSipVoip ) { if ( context == QContactOnlineAccount::ContextHome ) detailItem->addText( hbTrId("txt_phob_dblist_internet_telephone_home") ); @@ -98,9 +100,14 @@ detailItem->addText( hbTrId("txt_phob_dblist_internet_telephone_work") ); else detailItem->addText( hbTrId("txt_phob_dblist_internet_telephone") ); + + detailItem->addText( number.accountUri() ); + list.append( detailItem ); } - detailItem->addText( number.accountUri() ); - list.append( detailItem ); + else + { + /* Other subtypes of QContactOnlineAccount are not supported by UI */ + } } } } @@ -121,7 +128,7 @@ QContactEmailAddress::FieldEmailAddress, emailEditorView); detailItem->addText( hbTrId("txt_phob_list_add_email_address") ); - detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactEmailAddress::DefinitionName)) ); + detailItem->addIcon( HbIcon(mMap->getContactEditorIconString(QContactEmailAddress::DefinitionName, "")) ); list.append( detailItem ); } // existing email(s) @@ -135,7 +142,7 @@ address, QContactEmailAddress::FieldEmailAddress, emailEditorView); - detailItem->addIcon( mMap->getMappedIcon(QContactEmailAddress::DefinitionName) ); + detailItem->addIcon( mMap->getContactEditorIconString(QContactEmailAddress::DefinitionName, context) ); if ( context == QContactEmailAddress::ContextHome ) detailItem->addText(hbTrId("txt_phob_formlabel_email_home")); @@ -168,7 +175,7 @@ fieldList, addressEditorView); detailItem->addText( hbTrId("txt_phob_list_add_address") ); - detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactAddress::DefinitionName)) ); + detailItem->addIcon( HbIcon(mMap->getContactEditorIconString(QContactAddress::DefinitionName, "")) ); list.append( detailItem ); } return list; @@ -187,7 +194,7 @@ QContactUrl::FieldUrl, urlEditorView ); detailItem->addText( hbTrId("txt_phob_list_add_url_address") ); - detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactUrl::DefinitionName)) ); + detailItem->addIcon( HbIcon(mMap->getContactEditorIconString(QContactUrl::DefinitionName, "")) ); list.append( detailItem ); } // existing url(s) @@ -201,12 +208,12 @@ url, QContactUrl::FieldUrl, urlEditorView ); - detailItem->addIcon( mMap->getMappedIcon(QContactUrl::DefinitionName) ); + detailItem->addIcon( mMap->getContactEditorIconString(QContactUrl::DefinitionName, context) ); if ( context == QContactUrl::ContextHome ) - detailItem->addText( hbTrId("txt_phob_dblist_url_home") ); + detailItem->addText( hbTrId("txt_phob_formlabel_address_home") ); else if ( context == QContactUrl::ContextWork ) - detailItem->addText( hbTrId("txt_phob_dblist_url_work") ); + detailItem->addText( hbTrId("txt_phob_formlabel_address_work") ); else detailItem->addText( hbTrId("txt_phob_list_url") ); @@ -236,16 +243,16 @@ QString address = valueList.join(" ").trimmed(); if ( !address.isEmpty() ) { - QString context = addr.contexts().isEmpty() ? "" : mMap->getMappedDetail(addr.contexts().first() ); + QString context = addr.contexts().isEmpty() ? "" : addr.contexts().first(); CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( addr, fieldList, addressEditorView); if ( context == QContactAddress::ContextHome ) - detailItem->addText(hbTrId("txt_phob_dblist_url_home")); + detailItem->addText(hbTrId("txt_phob_formlabel_address_home")); else if ( context == QContactAddress::ContextWork ) - detailItem->addText(hbTrId("txt_phob_dblist_url_work")); + detailItem->addText(hbTrId("txt_phob_formlabel_address_work")); else detailItem->addText(hbTrId("txt_phob_list_address")); @@ -408,14 +415,15 @@ org.setName( QString() ); org.setDepartment( QStringList() ); } + aContact.saveDetail(&org); if ( org.assistantName().isEmpty() && org.title().isEmpty() && org.name().isEmpty() && org.department().isEmpty() ) + { aContact.removeDetail(&org); - else - aContact.saveDetail(&org); + } } else if ( aDetail.definitionName() == QContactFamily::DefinitionName ) @@ -430,10 +438,12 @@ family.setChildren( QStringList() ); } + aContact.saveDetail( &family ); + if ( family.spouse().isEmpty() && family.children().isEmpty() ) + { aContact.removeDetail( &family ); - else - aContact.saveDetail( &family ); + } } else { diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnteditviewlistmodel.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewlistmodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditviewlistmodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -160,6 +160,7 @@ void CntEditViewListModel::refreshExtensionItems( const QModelIndex& aIndex ) { + Q_UNUSED( aIndex ); beginResetModel(); // remove all extension items for( int i(mItemList.count()-1); i >= 0; i-- ) @@ -185,6 +186,69 @@ endResetModel(); } +void CntEditViewListModel::allInUseFields( CntViewIdList& aList ) +{ + foreach ( KLookupKey key, mLookupTable.keys() ) + { + int index = mLookupTable.value( key ); + if ( index != -1 ) + { + switch (key) + { + case EAddressDetail: + { + // Considered to be in use if all address contexts have been added + QList addrList = mContact->details(); + if ( addrList.count() >= 3 ) // no context, context home, context work + aList.append( addressEditorView ); + } + break; + + case ECompany: + { + // Considered in use if some details and assistant exists + QContactOrganization org = mContact->detail( QContactOrganization::DefinitionName ); + if ( !org.assistantName().isEmpty() && + (!org.name().isEmpty() || !org.department().isEmpty() || !org.title().isEmpty()) ) + aList.append( companyEditorView ); + } + break; + + case EDate: + { + QContactBirthday bd = mContact->detail( QContactBirthday::DefinitionName ); + QContactAnniversary anniversary = mContact->detail( QContactAnniversary::DefinitionName ); + // considered as in use when both birthday and anniversary has a valid date + if ( bd.date().isValid() && anniversary.originalDate().isValid() ) + aList.append( dateEditorView ); + } + break; + + case EFamily: + { + QContactFamily family = mContact->detail( QContactFamily::DefinitionName ); + if ( !family.children().isEmpty() && !family.spouse().isEmpty() ) + aList.append( familyDetailEditorView ); + } + break; + + case ERingingTone: + { + /* + QContactRingtone tone = mContact->detail( QContactRingtone::DefinitionName ); + if ( !tone.audioRingtoneUrl().isEmpty() ) + aList.append( ringingToneEditor ); + */ + } + break; + + default: + break; + } + } + } +} + void CntEditViewListModel::refresh() { beginResetModel(); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntemaileditormodel.cpp --- a/phonebookui/pbkcommonui/src/cntemaileditormodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntemaileditormodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -42,7 +42,6 @@ void CntEmailEditorModel::insertDetailField() { QContactEmailAddress newAddr; - CntDetailModelItem* item = new CntDetailModelItem( newAddr ); appendDataFormItem( item, invisibleRootItem() ); } @@ -53,10 +52,11 @@ int count( root->childCount() ); for ( int i(0); i < count; i++ ) { CntDetailModelItem* item = static_cast( root->childAt(i) ); - QContactEmailAddress address = item->detail(); - QString email = address.emailAddress(); - if ( email.length() > 0 ) { - mContact->saveDetail( &address ); + QContactDetail address = item->detail(); + mContact->saveDetail( &address ); + + if ( address.value(QContactEmailAddress::FieldEmailAddress).isEmpty() ) { + mContact->removeDetail( &address ); } } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -76,8 +76,7 @@ CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); QContactDetail detail = item->detail(); - HbEditorInterface editorInterface( mEdit ); - editorInterface.setFilter( HbEmailAddressFilter::instance() ); + mEdit->setInputMethodHints( Qt::ImhEmailCharactersOnly ); constructSubTypeModel( detail.contexts() ); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp --- a/phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp Fri May 14 15:42:23 2010 +0300 @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include #include @@ -92,8 +94,15 @@ mFavoriteListView = static_cast (mDocumentLoader.findWidget("listView")); mFavoriteListView->setUniformItemSizes(true); + mFavoriteListView->setFrictionEnabled(true); + mFavoriteListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); + mFavoriteListView->verticalScrollBar()->setInteractive(true); connect(mFavoriteListView, SIGNAL(longPressed(HbAbstractViewItem *, const QPointF &)), this, SLOT(onLongPressed(HbAbstractViewItem *, const QPointF &))); + + HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView); + indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); + indexFeedback->setItemView(mFavoriteListView); HbFrameBackground frame; frame.setFrameGraphicsName("qtg_fr_list_normal"); @@ -141,17 +150,20 @@ { // call a dialog to display the contacts CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), mContact); - mFavoriteListView->setModel(0); + groupSelectionPopup->populateListOfContact(); - HbAction* action = groupSelectionPopup->exec(); - if (action == groupSelectionPopup->primaryAction()) + groupSelectionPopup->open(this, SLOT(handleManageFavorites(HbAction*))); +} + +void CntFavoritesMemberView::handleManageFavorites(HbAction *action) +{ + CntGroupSelectionPopup *groupSelectionPopup = static_cast(sender()); + + if (groupSelectionPopup && action == groupSelectionPopup->actions().first()) { groupSelectionPopup->saveOldGroup(); } - delete groupSelectionPopup; - - mFavoriteListView->setModel(mModel); } @@ -160,11 +172,15 @@ */ void CntFavoritesMemberView::onLongPressed (HbAbstractViewItem *aItem, const QPointF &aCoords) { + QVariant data( aItem->modelIndex().row() ); + QModelIndex index = aItem->modelIndex(); QVariant variant = index.data(Qt::UserRole+1); const QMap map = variant.toMap(); HbMenu *menu = new HbMenu(); + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->setPreferredPos( aCoords ); HbAction *openContactAction = 0; HbAction *editContactAction = 0; @@ -177,30 +193,40 @@ editContactAction = menu->addAction(hbTrId("txt_common_menu_edit")); removeFromFavoritesAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_favorites")); sendToHsAction = menu->addAction(hbTrId("Send to HS")); + + openContactAction->setData( data ); + editContactAction->setData( data ); + removeFromFavoritesAction->setData( data ); + sendToHsAction->setData( data ); - HbAction *selectedAction = menu->exec(aCoords); + menu->open(this, SLOT(handleMenu(HbAction*))); +} - if (selectedAction) +void CntFavoritesMemberView::handleMenu(HbAction* action) { - if (selectedAction == openContactAction) + int row = action->data().toInt(); + HbMenu *menuItem = static_cast(sender()); + QModelIndex index = mModel->index(row, 0); + + int id = index.data(Qt::UserRole).toInt(); + + if ( action == menuItem->actions().first() ) { openContact(index); } - else if (selectedAction == editContactAction) + else if (action == menuItem->actions().at(1)) { editContact(index); } - else if (selectedAction == removeFromFavoritesAction) - { - removeFromFavorites(index); - } - else if (selectedAction == sendToHsAction) + else if (action == menuItem->actions().at(2)) { -// sendToHs(index); + removeFromFavorites(index); } + else if (action == menuItem->actions().at(3)) + { + // sendToHs(index); + } } - menu->deleteLater(); -} void CntFavoritesMemberView::openContact(const QModelIndex &index) { @@ -236,11 +262,11 @@ void CntFavoritesMemberView::removeFromFavorites(const QModelIndex &index) { // get contact id using index - QContact selectedContact = mModel->contact(index); - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(mContact->id()); - relationship.setSecond(selectedContact.id()); - mViewManager->contactManager(SYMBIAN_BACKEND)->removeRelationship(relationship); + QContact selectedContact = mModel->contact(index); + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(mContact->id()); + relationship.setSecond(selectedContact.id()); + mViewManager->contactManager(SYMBIAN_BACKEND)->removeRelationship(relationship); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntfavoritesview.cpp --- a/phonebookui/pbkcommonui/src/cntfavoritesview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntfavoritesview.cpp Fri May 14 15:42:23 2010 +0300 @@ -84,25 +84,35 @@ // call a dialog to display the contacts CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), mContact); groupSelectionPopup->populateListOfContact(); - HbAction* action = groupSelectionPopup->exec(); - - if (action == groupSelectionPopup->primaryAction()) - { - groupSelectionPopup->saveOldGroup(); - delete groupSelectionPopup; - - CntViewParameters viewParameters; - viewParameters.insert(EViewId, FavoritesMemberView); - QVariant var; - var.setValue(*mContact); - viewParameters.insert(ESelectedContact, var); - mViewManager->changeView(viewParameters); - } - else if (action == groupSelectionPopup->secondaryAction()) - { - delete groupSelectionPopup; - showPreviousView(); - } + groupSelectionPopup->open(this, SLOT(handleMemberSelection(HbAction*))); +} + +void CntFavoritesView::handleMemberSelection(HbAction *action) +{ + CntGroupSelectionPopup *groupSelectionPopup = static_cast(sender()); + + if (groupSelectionPopup && action == groupSelectionPopup->actions().first()) + { + bool membersSaved = groupSelectionPopup->saveOldGroup(); + + if (membersSaved) + { + CntViewParameters viewParameters; + viewParameters.insert(EViewId, FavoritesMemberView); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); + } + else + { + showPreviousView(); + } + } + else if (groupSelectionPopup && action == groupSelectionPopup->actions().at(1)) + { + showPreviousView(); + } } void CntFavoritesView::setOrientation(Qt::Orientation orientation) diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntfetchcontactsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntfetchcontactsview.cpp Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,363 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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) +{ + mSearchPanel = new HbSearchPanel(); + mSearchPanel->setVisible(false); + connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(closeFind())); + connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString))); + + mLayout = new QGraphicsLinearLayout(Qt::Vertical); + + mContainerWidget = new HbWidget(); + + // set up the list with all contacts + QList sortOrders; + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); + sortOrders.append(sortOrderFirstName); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); + sortOrders.append(sortOrderLastName); + + QContactDetailFilter contactsFilter; + contactsFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + contactsFilter.setValue(QString(QLatin1String(QContactType::TypeContact))); + mCntModel = new MobCntModel(mManager, contactsFilter, sortOrders, false); +} + +CntFetchContacts::~CntFetchContacts() +{ + delete mCntModel; + mCntModel = NULL; + + delete mVirtualKeyboard; + mVirtualKeyboard = NULL; + + delete mIndexFeedback; + mIndexFeedback = NULL; +} + +/*! +Query to see if the user decided to press Cancel after selecting +group members. Must be called to see if results are valid. +*/ +bool CntFetchContacts::wasCanceled() const +{ + return mWasCanceled; +} + +void CntFetchContacts::setDetails(QString aTitle, QString aButtonText) +{ + mButtonText = aButtonText; + + if (!mLabel) { + mLabel = new HbLabel(aTitle); + } +} + +/*! +Brings up a list of contacts, awaiting user response. This function is asynchronous. +When a response is given, a clicked signal will be sent. +*/ +void CntFetchContacts::displayContacts(DisplayType aType, HbAbstractItemView::SelectionMode aMode, QSet aContacts) +{ + switch (aType) { + case view: + { + // TODO Currently only services will need a view + break; + } + + case popup: + { + doInitialize(aMode,aContacts); + markMembersInView(); + connectSignal(); + showPopup(); + + mLayout->addItem(mSearchPanel); + mContainerWidget->setLayout(mLayout); + mContainerWidget->setPreferredHeight(mListView->mainWindow()->size().height()); + mContainerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + break; + } + + default: + break; + } +} + +QSet CntFetchContacts::getSelectedContacts() const +{ + return mCurrentlySelected; +} + +void CntFetchContacts::closeFind() +{ + if (mSearchPanel) { + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + QString typeContact = QContactType::TypeContact; + filter.setValue(typeContact); + + mSearchPanel->deleteLater(); + } +} + +void CntFetchContacts::setFilter(const QString &filterString) +{ + QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts); + + QContactDetailFilter detailfilter; + detailfilter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName, QContactDisplayLabel::FieldLabel); + detailfilter.setMatchFlags(QContactFilter::MatchStartsWith); + detailfilter.setValue(searchList); + + mCntModel->setFilterAndSortOrder(detailfilter); + + markMembersInView(); + + if (mCntModel->rowCount() == 0) { + mLayout->removeItem(mListView); + + if (mEmptyListLabel) { + qreal searchHeight = mSearchPanel->size().height(); + HbLabel* heading = static_cast(mPopup->headingWidget()); + qreal heightToSet = mPopup->size().height() - mVirtualKeyboard->keyboardArea().height() - searchHeight - heading->size().height(); + mEmptyListLabel->setMaximumHeight(heightToSet); + mEmptyListLabel->setVisible(true); + mLayout->insertItem(0, mEmptyListLabel); + } + + mListView->setVisible(false); + mSearchPanel->setVisible(true); + } + else { + if (mEmptyListLabel) { + mEmptyListLabel->setVisible(false); + } + mLayout->removeItem(mEmptyListLabel); + mLayout->insertItem(0, mListView); + mListView->setVisible(true); + } +} + +void CntFetchContacts::handleKeypadOpen() +{ + qreal searchHeight = mSearchPanel->size().height(); + HbLabel* heading = static_cast(mPopup->headingWidget()); + qreal heightToSet = mPopup->size().height() - mVirtualKeyboard->keyboardArea().height() - searchHeight - heading->size().height(); + + if (mEmptyListLabel) { + mEmptyListLabel->setMaximumHeight( heightToSet - mEmptyListLabel->size().height() ); + } + + mListView->setMaximumHeight(heightToSet); +} + +void CntFetchContacts::handleKeypadClose() +{ + mListView->setMaximumHeight(mPopup->size().height()); + + if (mEmptyListLabel) { + mEmptyListLabel->setMaximumHeight(mPopup->size().height()); + } +} + +void CntFetchContacts::handleUserResponse(HbAction* action) +{ + HbDialog *popup = static_cast(sender()); + + bool userCanceled = (action == mSecondaryAction); + if (popup && userCanceled) { + mCurrentlySelected.clear(); + + // Notify that the user canceled. + mWasCanceled = true; + } + else { + mWasCanceled = false; + } + + emit clicked(); +} + +void CntFetchContacts::memberSelectionChanged(const QModelIndex &index) +{ + if (!index.isValid()) return; + + if (mSelectionMode == HbAbstractItemView::SingleSelection) { + mCurrentlySelected.clear(); + } + + QContactLocalId contactId = mCntModel->contact(index).localId(); + + bool isSelected = mListView->selectionModel()->isSelected(index); + if (isSelected != mCurrentlySelected.contains(contactId)) { + if (isSelected) { + mCurrentlySelected.insert(contactId); + } + else { + mCurrentlySelected.remove(contactId); + } + } +} + +void CntFetchContacts::doInitialize(HbAbstractItemView::SelectionMode aMode, + QSet aContacts) +{ + mSelectionMode = aMode; + mCurrentlySelected = aContacts; + + mSearchPanel->setVisible(true); + + mPopup = new HbDialog; + mListView = new HbListView(mPopup); + mListView->setModel(mCntModel); + mListView->setSelectionMode(mSelectionMode); + mListView->setFrictionEnabled(true); + mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); + mListView->verticalScrollBar()->setInteractive(true); + + HbListViewItem *prototype = mListView->listItemPrototype(); + prototype->setGraphicsSize(HbListViewItem::Thumbnail); + prototype->setStretchingStyle(HbListViewItem::StretchLandscape); + + mIndexFeedback = new HbIndexFeedback(mPopup); + mIndexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); + mIndexFeedback->setItemView(mListView); + + // Note that the layout takes ownership of the item(s) it contains. + if (!mCntModel->rowCount()) { + mListView->setVisible(false); + if (!mEmptyListLabel) { + mEmptyListLabel = new HbTextItem(hbTrId("(no matching contacts)")); + mEmptyListLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + mEmptyListLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); + mEmptyListLabel->setAlignment(Qt::AlignCenter); + mLayout->insertItem(0, mEmptyListLabel); + } + } + else { + mLayout->addItem(mListView); + } + + mCntModel->showMyCard(false); +} + +void CntFetchContacts::connectSignal() +{ + connect(mListView, SIGNAL(activated(const QModelIndex&)), + this, SLOT(memberSelectionChanged(const QModelIndex&))); +} + +void CntFetchContacts::showPopup() +{ + mPopup->setTimeout(HbPopup::NoTimeout); + mPopup->setDismissPolicy(HbPopup::NoDismiss); + mPopup->setModal(true); + mPopup->setContentWidget(mContainerWidget); + + if (!mVirtualKeyboard) { + mVirtualKeyboard = new HbStaticVkbHost(mPopup); + connect(mVirtualKeyboard, SIGNAL(keypadOpened()), this, SLOT(handleKeypadOpen())); + connect(mVirtualKeyboard, SIGNAL(keypadClosed()), this, SLOT(handleKeypadClose())); + } + + if (!mLabel) { + mLabel = new HbLabel(hbTrId("txt_phob_title_contacts")); + } + mPopup->setHeadingWidget(mLabel); + + if (!mButtonText.isEmpty()) { + mPrimaryAction = new HbAction(hbTrId(mButtonText.toAscii())); + mPopup->addAction(mPrimaryAction); + } + + mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel")); + mPopup->addAction(mSecondaryAction); + + mPopup->open(this, SLOT(handleUserResponse(HbAction*))); +} + +void CntFetchContacts::markMembersInView() +{ + // if there are no contacts matching the current filter, + // show "no matching contacts" label + if (mCntModel->rowCount() == 0) { + if (!mEmptyListLabel) { + mEmptyListLabel = new HbTextItem(hbTrId("(no matching contacts)")); + mEmptyListLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + mEmptyListLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); + mEmptyListLabel->setAlignment(Qt::AlignCenter); + mLayout->insertItem(1, mEmptyListLabel); + } + } + else { + mLayout->removeItem(mEmptyListLabel); + delete mEmptyListLabel; + mEmptyListLabel = 0; + } + + // Mark group members in the listview + foreach (QContactLocalId id, mCurrentlySelected) { + QContact contact = mManager->contact(id); + QModelIndex contactIndex = mCntModel->indexOfContact(contact); + mListView->selectionModel()->select(contactIndex, QItemSelectionModel::Select); + } +} + +// End of file diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntgroupactionsview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp Fri May 14 15:42:23 2010 +0300 @@ -137,6 +137,7 @@ mListView->itemPrototypes().first()->setDefaultFrame(frame); mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); + mListView->listItemPrototype()->setStretchingStyle(HbListViewItem::StretchLandscape); mModel = new QStandardItemModel(); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp --- a/phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp Fri May 14 15:42:23 2010 +0300 @@ -17,16 +17,10 @@ #include "cntgroupdeletepopup.h" -#include #include #include -#include -#include +#include #include -#include -#include -#include - CntGroupDeletePopup::CntGroupDeletePopup(QContactManager *manager, QGraphicsItem *parent): HbDialog(parent), @@ -45,15 +39,13 @@ void CntGroupDeletePopup::populateListOfGroup() { - HbGroupBox *headingLabel = new HbGroupBox(); - HbLabel *label = new HbLabel(hbTrId("txt_phob_opt_delete_groups")); - headingLabel->setContentWidget(label); + HbGroupBox *headingLabel = new HbGroupBox(this); + headingLabel->setHeading(hbTrId("txt_phob_opt_delete_groups")); setHeadingWidget(headingLabel); mListView = new HbListView(this); - mModel->initializeGroupsList(); //Get the index of the contacts @@ -66,20 +58,22 @@ setContentWidget(mListView); - setTimeout(0); + setTimeout(HbDialog::NoTimeout); + setDismissPolicy(HbDialog::NoDismiss); setModal(true); + setAttribute(Qt::WA_DeleteOnClose, true); - HbAction *mPrimaryAction = new HbAction(hbTrId("Delete selected")); - setPrimaryAction(mPrimaryAction); + HbAction *mPrimaryAction = new HbAction(hbTrId("Delete selected"), this); + addAction(mPrimaryAction); - HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel")); - setSecondaryAction(mSecondaryAction); + HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), this); + addAction(mSecondaryAction); } -void CntGroupDeletePopup::deleteGroup() +QList CntGroupDeletePopup::deleteGroup() const { QModelIndexList indexes = mListView->selectionModel()->selection().indexes(); - QList selectionList; + QList selectionList; for (int i = 0; i < indexes.count(); i++) { QContact contact = mModel->contact(indexes[i]); @@ -88,5 +82,7 @@ } QMap errors; - bool result = mContactManager->removeContacts(selectionList, &errors); + mContactManager->removeContacts(selectionList, &errors); + + return selectionList; } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntgroupdeletepopupmodel.cpp --- a/phonebookui/pbkcommonui/src/cntgroupdeletepopupmodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupdeletepopupmodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -48,8 +48,17 @@ 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 groupContactIds = mContactManager->contactIds(groupFilter); + QList groupsOrder; + groupsOrder.append(sortOrderGroupName); + + QList groupContactIds = mContactManager->contactIds(groupFilter, groupsOrder); + if (!groupContactIds.isEmpty()) { for(int i = 0;i < groupContactIds.count();i++) diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp --- a/phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -39,28 +39,33 @@ iGroupName = nameDetails.first(); iGroupConfCallNumber = numberDetails.first(); - HbDataFormModelItem::DataItemType text = HbDataFormModelItem::TextItem; - HbDataFormModelItem* groupname = new HbDataFormModelItem(text, hbTrId("txt_phob_formlabel_group_name")); - HbDataFormModelItem* conferenceNumber = new HbDataFormModelItem(text, hbTrId("Conference Call number")); + HbDataFormModelItem::DataItemType type = HbDataFormModelItem::TextItem; + iNameItem = new HbDataFormModelItem(type, hbTrId("txt_phob_formlabel_group_name")); + iNumberItem = new HbDataFormModelItem(type, hbTrId("txt_phob_formlabel_conference_number")); - groupname->setContentWidgetData("text", iGroupName.customLabel()); - conferenceNumber->setContentWidgetData("text", iGroupConfCallNumber.number()); + iNameItem->setContentWidgetData("text", iGroupName.customLabel()); + iNumberItem->setContentWidgetData("text", iGroupConfCallNumber.number() ); HbDataFormModelItem* root = invisibleRootItem(); - appendDataFormItem(groupname, root); - appendDataFormItem(conferenceNumber, root); + appendDataFormItem( iNameItem, root); + appendDataFormItem( iNumberItem, root); } CntGroupEditorModel::~CntGroupEditorModel() { } +bool CntGroupEditorModel::isConferenceNumber( const QModelIndex& aIndex ) +{ + return ( itemFromIndex( aIndex ) == iNumberItem ); +} + void CntGroupEditorModel::saveContactDetails() { HbDataFormModelItem* root = invisibleRootItem(); - iGroupName.setCustomLabel(root->childAt( 0 )->contentWidgetData("text").toString().trimmed()); - iGroupConfCallNumber.setNumber(root->childAt( 1 )->contentWidgetData("text").toString().trimmed()); + iGroupName.setCustomLabel( iNameItem->contentWidgetData("text").toString().trimmed()); + iGroupConfCallNumber.setNumber( iNumberItem->contentWidgetData("text").toString().trimmed()); mContact->saveDetail( &iGroupName ); mContact->saveDetail( &iGroupConfCallNumber ); @@ -73,7 +78,7 @@ if(iGroupConfCallNumber.number().isEmpty()) { - mContact->removeDetail( &iGroupConfCallNumber ); + mContact->removeDetail( &iGroupConfCallNumber ); } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntgroupmemberview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp Fri May 14 15:42:23 2010 +0300 @@ -16,26 +16,27 @@ */ #include "cntgroupmemberview.h" +#include "cntfetchcontactsview.h" #include "cntcontactcardheadingitem.h" -#include "cntgroupselectionpopup.h" #include "qtpbkglobal.h" #include "cntimagelabel.h" +#include "cntimageutility.h" #include +#include #include #include #include #include +#include +#include #include #include #include +#include #include #include #include - -#include - -#include #include "cntdocumentloader.h" const char *CNT_GROUPMEMBERVIEW_XML = ":/xml/contacts_groupmembers.docml"; @@ -60,8 +61,11 @@ mViewManager(NULL), mHeadingItem(NULL), mModel(NULL), + mImageLabel(NULL), mListView(NULL), - mImageLabel(NULL) + mFetchView(NULL), + mIsPreviousImageEditorView(false), + mAvatar(NULL) { mDocument = new CntDocumentLoader; @@ -88,6 +92,7 @@ SLOT(showContactView(const QModelIndex&))); mHeadingItem = static_cast( mDocument->findWidget("editViewHeading") ); + connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawImageMenu(const QPointF&))); // menu actions mEditGroupAction = static_cast( mDocument->findObject("cnt:editgroupdetails")); @@ -105,7 +110,7 @@ mThumbnailManager = new ThumbnailManager(this); mThumbnailManager->setMode(ThumbnailManager::Default); mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); - mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailMedium); + mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailLarge); connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), this, SLOT(thumbnailReady(QPixmap, void*, int, int))); @@ -123,6 +128,12 @@ delete mModel; mModel = 0; + + delete mFetchView; + mFetchView = 0; + + delete mAvatar; + mAvatar = NULL; } void CntGroupMemberView::setOrientation(Qt::Orientation orientation) @@ -151,6 +162,11 @@ QVariant contact = aArgs.value( ESelectedContact ); mGroupContact = new QContact( contact.value() ); + if (aArgs.value(ECustomParam).toInt() == imageEditorView) + { + mIsPreviousImageEditorView = true; + } + HbMainWindow* window = mView->mainWindow(); if ( window ) { @@ -166,16 +182,21 @@ { if (details.at(i).imageUrl().isValid()) { - mThumbnailManager->getThumbnail(details.at(i).imageUrl().toString()); + mAvatar = new QContactAvatar(details.at(i)); + mThumbnailManager->getThumbnail(mAvatar->imageUrl().toString()); break; } } // create list & model mListView->setFrictionEnabled(true); - mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); + mListView->verticalScrollBar()->setInteractive(true); mListView->setUniformItemSizes(true); mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); + HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView); + indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); + indexFeedback->setItemView(mListView); HbFrameBackground frame; frame.setFrameGraphicsName("qtg_fr_list_normal"); @@ -201,14 +222,17 @@ sortOrders.append(sortOrderFirstName); sortOrders.append(sortOrderLastName); - mModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), rFilter, sortOrders, false); + mModel = new MobCntModel(getContactManager(), rFilter, sortOrders, false); mListView->setModel(mModel); if (aArgs.value(ESelectedAction).toString() == "save") { - QString name = mViewManager->contactManager(SYMBIAN_BACKEND)->synthesizedDisplayLabel(*mGroupContact); + QString name = getContactManager()->synthesizedDisplayLabel(*mGroupContact); HbNotificationDialog::launchDialog(hbTrId("Group \"%1\" saved").arg(name)); } + + mFetchView = new CntFetchContacts(mViewManager->contactManager( SYMBIAN_BACKEND )); + connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleManageMembers())); } void CntGroupMemberView::deactivate() @@ -218,6 +242,15 @@ void CntGroupMemberView::showPreviousView() { + //save an avatar + if (mIsPreviousImageEditorView) + { + if (!mAvatar->imageUrl().isEmpty()) + { + mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact); + } + } + CntViewParameters viewParameters; mViewManager->back(viewParameters); } @@ -234,19 +267,68 @@ void CntGroupMemberView::manageMembers() { - // save the group here - CntGroupSelectionPopup *groupSelectionPopup = - new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), mGroupContact); - mListView->setModel(0); - groupSelectionPopup->populateListOfContact(); + QContactRelationshipFilter membersFilter; + membersFilter.setRelationshipType(QContactRelationship::HasMember); + membersFilter.setRelatedContactRole(QContactRelationshipFilter::First); + membersFilter.setRelatedContactId(mGroupContact->id()); + mOriginalGroupMembers = getContactManager()->contactIds(membersFilter); + + QSet contactsSet = mOriginalGroupMembers.toSet(); + QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); + QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); + mFetchView->setDetails(HbParameterLengthLimiter(hbTrId("txt_phob_subtitle_1_group")).arg(groupName), + hbTrId("Save")); + mFetchView->displayContacts(CntFetchContacts::popup, + HbAbstractItemView::MultiSelection, + contactsSet); +} + +void CntGroupMemberView::handleManageMembers() +{ + QSet selectedContacts = mFetchView->getSelectedContacts(); + + if (mFetchView->wasCanceled()) { + delete mFetchView; + mFetchView = 0; + return; + } + + QList removedMemberships; + QList addedMemberships; + + QSet removedMembers = mOriginalGroupMembers.toSet() - selectedContacts; - HbAction* action = groupSelectionPopup->exec(); - if (action == groupSelectionPopup->primaryAction()) - { - groupSelectionPopup->saveOldGroup(); + // TODO Notice the duplication with these loops. Refactor to use one only + foreach (QContactLocalId id, removedMembers) { + QContact contact = getContactManager()->contact(id); + + // new contact added to the group + QContactRelationship membership; + membership.setRelationshipType(QContactRelationship::HasMember); + membership.setFirst(mGroupContact->id()); + membership.setSecond(contact.id()); + removedMemberships.append(membership); } - delete groupSelectionPopup; - mListView->setModel(mModel); + + QSet addedMembers = selectedContacts - mOriginalGroupMembers.toSet(); + foreach (QContactLocalId id, addedMembers) { + QContact contact = getContactManager()->contact(id); + + // new contact added to the group + QContactRelationship membership; + membership.setRelationshipType(QContactRelationship::HasMember); + membership.setFirst(mGroupContact->id()); + membership.setSecond(contact.id()); + addedMemberships.append(membership); + } + + if (!addedMemberships.isEmpty()) { + getContactManager()->saveRelationships(&addedMemberships); + } + + if (!removedMemberships.isEmpty()) { + getContactManager()->removeRelationships(removedMemberships); + } } void CntGroupMemberView::editGroup() @@ -261,36 +343,23 @@ void CntGroupMemberView::deleteGroup() { - // the delete command - HbDialog popup; - - // disable dismissing & timout - popup.setDismissPolicy(HbDialog::NoDismiss); - popup.setTimeout(HbDialog::NoTimeout); - - QString groupName = mGroupContact->displayLabel(); - HbLabel *headingLabel = new HbLabel(hbTrId("Delete %1 group?").arg(groupName), &popup); - headingLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); - popup.setHeadingWidget(headingLabel); + QString groupName = mGroupContact->displayLabel(); + 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_phob_button_delete"), hbTrId("txt_common_button_cancel"), headingLabel); +} - // Set a label widget as content widget in the dialog - HbLabel *label = new HbLabel(&popup); - label->setPlainText("Only group will be removed, contacts can be found from All contacts list"); - label->setTextWrapping(Hb::TextWordWrap); - label->setElideMode(Qt::ElideNone); - label->setFontSpec(HbFontSpec(HbFontSpec::Secondary)); - popup.setContentWidget(label); - - // Sets the primary action and secondary action - popup.setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"),&popup)); - popup.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"),&popup)); - - HbAction* action = popup.exec(); - if (action == popup.primaryAction()) - { - mViewManager->contactManager(SYMBIAN_BACKEND)->removeContact(mGroupContact->localId()); - showPreviousView(); - } +void CntGroupMemberView::handleDeleteGroup(HbAction *action) +{ + HbDialog *popup = static_cast(sender()); + + if (popup && action == popup->actions().first()) + { + getContactManager()->removeContact(mGroupContact->localId()); + showPreviousView(); + } } /*! @@ -298,9 +367,14 @@ */ void CntGroupMemberView::showContextMenu(HbAbstractViewItem *aItem, const QPointF &aCoords) { + QVariant data( aItem->modelIndex().row() ); + QModelIndex index = aItem->modelIndex(); HbMenu *menu = new HbMenu(); + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->setPreferredPos( aCoords ); + HbAction *removeFromGroupAction = 0; HbAction *openContactAction = 0; HbAction *editContactAction = 0; @@ -309,27 +383,36 @@ editContactAction = menu->addAction(hbTrId("txt_common_menu_edit")); removeFromGroupAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_group")); + openContactAction->setData( data ); + editContactAction->setData( data ); + removeFromGroupAction->setData( data ); - HbAction *selectedAction = menu->exec(aCoords); + menu->open(this, SLOT(handleMenu(HbAction*))); +} - if (selectedAction) - { - if (selectedAction == removeFromGroupAction) +void CntGroupMemberView::handleMenu(HbAction* action) +{ + int row = action->data().toInt(); + HbMenu *menuItem = static_cast(sender()); + QModelIndex index = mModel->index(row, 0); + + int id = index.data(Qt::UserRole).toInt(); + + if ( action == menuItem->actions().first() ) { - removeFromGroup(index); + showContactView(index); } - else if (selectedAction == editContactAction) - { - editContact(index); - } - else if (selectedAction == openContactAction) + else if (action == menuItem->actions().at(1)) { - showContactView(index); + editContact(index); } - } - menu->deleteLater(); + else if (action == menuItem->actions().at(2)) + { + removeFromGroup(index); + } } + /*! Called after user clicked on the listview. */ @@ -356,7 +439,7 @@ relationship.setRelationshipType(QContactRelationship::HasMember); relationship.setFirst(mGroupContact->id()); relationship.setSecond(selectedContact.id()); - mViewManager->contactManager(SYMBIAN_BACKEND)->removeRelationship(relationship); + getContactManager()->removeRelationship(relationship); } void CntGroupMemberView::editContact(const QModelIndex &index) @@ -397,6 +480,66 @@ mViewManager->changeView( viewParameters ); } +QContactManager* CntGroupMemberView::getContactManager() +{ + if (!mViewManager) return NULL; + + return mViewManager->contactManager(SYMBIAN_BACKEND); +} + +/*! +Draw the image specific content menu +*/ +void CntGroupMemberView::drawImageMenu(const QPointF &aCoords) +{ + HbMenu *menu = new HbMenu(); + HbAction *changeImageAction = menu->addAction(hbTrId("txt_phob_menu_change_picture")); + HbAction *removeAction = menu->addAction(hbTrId("txt_phob_menu_remove_image")); + menu->setPreferredPos(aCoords); + menu->open(this, SLOT(handleImageMenu(HbAction*))); +} + +void CntGroupMemberView::handleImageMenu(HbAction* action) +{ + HbMenu *menuItem = static_cast(sender()); + if ( action == menuItem->actions().first() ) { + changeImage(); + } + else if (action == menuItem->actions().at(1)) { + removeImage(); + } +} + +void CntGroupMemberView::changeImage() +{ + CntViewParameters viewParameters; + viewParameters.insert(EViewId, imageEditorView); + QVariant var; + var.setValue(*mGroupContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); +} + +void CntGroupMemberView::removeImage() +{ +if (mAvatar) + { + if (!mAvatar->imageUrl().isEmpty()) + { + mGroupContact->removeDetail(mAvatar); + // Check if image removable. + CntImageUtility imageUtility; + if(imageUtility.isImageRemovable(mAvatar->imageUrl().toString())) + { + imageUtility.removeImage(mAvatar->imageUrl().toString()); + } + mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact); + mHeadingItem->setIcon(HbIcon("qtg_large_avatar")); + + } + } +} + // end of file diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp --- a/phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp Fri May 14 15:42:23 2010 +0300 @@ -17,17 +17,18 @@ #include "cntgroupselectionpopup.h" -#include #include #include #include #include +#include +#include #include #include -#include #include #include #include +#include CntGroupSelectionPopup::CntGroupSelectionPopup(QContactManager *manager, QContact *contact, QGraphicsItem *parent): @@ -36,7 +37,7 @@ mEmptyListLabel(NULL), mContactManager(manager), mContact(contact) -{ +{ QList sortOrders; QContactSortOrder sortOrderFirstName; sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); @@ -76,7 +77,7 @@ QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); HbGroupBox *headingLabel = new HbGroupBox(this); - headingLabel->setHeading(hbTrId("txt_phob_title_members_of_1_group").arg(groupName)); + headingLabel->setHeading(HbParameterLengthLimiter(hbTrId("txt_phob_title_members_of_1_group")).arg(groupName)); setHeadingWidget(headingLabel); @@ -101,9 +102,13 @@ // set the listview to multiSelection mode, this will bring MarkAll functionality (from Orbit) mListView->setSelectionMode(HbAbstractItemView::MultiSelection); mListView->setFrictionEnabled(true); - mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); + mListView->verticalScrollBar()->setInteractive(true); HbListViewItem *prototype = mListView->listItemPrototype(); prototype->setGraphicsSize(HbListViewItem::Thumbnail); + HbIndexFeedback *indexFeedback = new HbIndexFeedback(this); + indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); + indexFeedback->setItemView(mListView); for (int i=0; i < countContacts; i++ ) { @@ -116,6 +121,7 @@ setTimeout(HbPopup::NoTimeout); setDismissPolicy(HbPopup::NoDismiss); setModal(true); + setAttribute(Qt::WA_DeleteOnClose, true); // Note that the layout takes ownership of the item(s) it contains. if (!mCntModel->rowCount()) @@ -136,19 +142,23 @@ } mContainerLayout->addItem(mSearchPanel); mContainerWidget->setLayout(mContainerLayout); - mContainerWidget->setPreferredHeight(mainWindow()->size().height()); + HbMainWindow* window = mainWindow(); + if ( window ) + { + mContainerWidget->setPreferredHeight(window->size().height()); + } mContainerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setContentWidget(mContainerWidget); - HbAction *mPrimaryAction = new HbAction(hbTrId("Save")); - setPrimaryAction(mPrimaryAction); + HbAction *mPrimaryAction = new HbAction(hbTrId("Save"), this); + addAction(mPrimaryAction); - HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel")); - setSecondaryAction(mSecondaryAction); + HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), this); + addAction(mSecondaryAction); } -void CntGroupSelectionPopup::saveNewGroup() +bool CntGroupSelectionPopup::saveNewGroup() { // Save the relationship from the selection model of the member selection list QModelIndexList indexes = mListView->selectionModel()->selection().indexes(); @@ -167,9 +177,11 @@ // save relationship mContactManager->saveRelationship(&relationship); } + + return indexes.count() > 0; } -void CntGroupSelectionPopup::saveOldGroup() +bool CntGroupSelectionPopup::saveOldGroup() { // Use relationship filter to get list of contacts in the relationship (if any) QContactRelationshipFilter rFilter; @@ -228,6 +240,8 @@ QMap errors; mContactManager->removeRelationships(removedRelationships, &errors); mContactManager->saveRelationships(&addedRelationships, &errors); + + return (removedRelationships.count() > 0 || addedRelationships.count() > 0); } void CntGroupSelectionPopup::closeFind() diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnthistoryview.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnthistoryview.cpp Fri May 14 15:42:23 2010 +0300 @@ -26,6 +26,9 @@ #include #include #include +#include +#include +#include #include "cnthistoryviewitem.h" #include "qtpbkglobal.h" @@ -102,9 +105,11 @@ //construct listview mHistoryListView = static_cast(docLoader()->findWidget(QString("listView"))); + mHistoryListView->setLayoutName("history"); CntHistoryViewItem *item = new CntHistoryViewItem; + item->setSecondaryTextRowCount(1, 3); + item->setGraphicsSize(HbListViewItem::SmallIcon); mHistoryListView->setItemPrototype(item); //ownership is taken - mHistoryListView->setUniformItemSizes(true); // Connect listview items to respective slots connect(mHistoryListView, SIGNAL(activated(const QModelIndex &)), @@ -116,14 +121,23 @@ //start listening to the events amount changing in the model connect(mHistoryModel, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(updateScrollingPosition())); + connect(mHistoryModel, SIGNAL(rowsInserted(const QModelIndex &, int, int)), + this, SLOT(showClearHistoryMenu())); connect(mHistoryModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(updateScrollingPosition())); + connect(mHistoryModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), + this, SLOT(showClearHistoryMenu())); connect(mHistoryModel, SIGNAL(layoutChanged()), this, SLOT(updateScrollingPosition())); // Connect the menu options to respective slots - HbAction* clearHistory = static_cast(docLoader()->findObject("cnt:clearhistory")); - connect(clearHistory, SIGNAL(triggered()), this, SLOT(clearHistory())); + mClearHistory = static_cast(docLoader()->findObject("cnt:clearhistory")); + connect(mClearHistory, SIGNAL(triggered()), this, SLOT(clearHistory())); + showClearHistoryMenu(); + + HbMainWindow* mainWindow = mView->mainWindow(); + connect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(updateScrollingPosition())); } /*! @@ -139,23 +153,28 @@ } /* -Clear communications history +Query the user for clearing communications history */ void CntHistoryView::clearHistory() { // Ask the use if they want to clear the history - HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_clear_communications_history_with_1"), - HbMessageBox::MessageTypeQuestion); + QString name = mContact->displayLabel(); - note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - HbAction *selected = note->exec(); - if (selected == note->primaryAction()) + HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_clear_communications_history_with_1")).arg(name), this, + SLOT(handleClearHistory(HbAction*)), hbTrId("txt_phob_button_delete"), hbTrId("txt_common_button_cancel")); +} + +/* +Handle the selected action for clearing history +*/ +void CntHistoryView::handleClearHistory(HbAction *action) +{ + HbMessageBox *note = static_cast(sender()); + + if (note && action == note->actions().first()) { - // Clear comm history mHistoryModel->clearHistory(); } - delete note; } /*! @@ -164,13 +183,10 @@ */ void CntHistoryView::itemActivated(const QModelIndex &index) { - QVariant itemType = index.data(CntHistoryModel::ItemTypeRole); - - if (!itemType.isValid()) - return; + int flags = index.data(CntHistoryModel::FlagsRole).toInt(); // If the list item is a call log a call is made to that item - if (itemType.toInt() == CntHistoryModel::CallLog) { + if (flags & CntHistoryModel::CallLog) { // Make a call QVariant v = index.data(CntHistoryModel::PhoneNumberRole); if (!v.isValid()) @@ -182,6 +198,18 @@ snd << v.toString(); snd.send(); } + else if (flags & CntHistoryModel::Message) { + // Open conversation view + QVariant v = index.data(CntHistoryModel::PhoneNumberRole); + if (!v.isValid()) + return; + + QString service("com.nokia.services.hbserviceprovider.conversationview"); + QString type("send(QString,qint32,QString)"); + XQServiceRequest snd(service, type, false); + snd << v.toString() << mContact->localId() << mContact->displayLabel(); + snd.send(); + } } /*! @@ -197,6 +225,18 @@ } /*! +Show or hide the clear history menu +*/ +void CntHistoryView::showClearHistoryMenu() +{ + if (mHistoryModel->rowCount() > 0) { + mClearHistory->setEnabled(true); + } else { + mClearHistory->setEnabled(false); + } +} + +/*! * Document loader */ HbDocumentLoader* CntHistoryView::docLoader() diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -18,14 +18,20 @@ #include "cnthistoryviewitem.h" #include +#include +#include + +#define NEW_EVENT_FRAME "qtg_fr_list_new_item" //--------------------------------------------------------------- // HbListViewItem::HbListViewItem // Constructor //--------------------------------------------------------------- CntHistoryViewItem::CntHistoryViewItem(QGraphicsItem* parent) -: HbAbstractViewItem(parent), -itemWidget(NULL) +: HbListViewItem(parent), + mIncoming(false), + mNewMessage(false), + mNewItem(NULL) { } @@ -35,15 +41,7 @@ //--------------------------------------------------------------- HbAbstractViewItem* CntHistoryViewItem::createItem() { - return new CntHistoryViewItem(*this); -} - -//--------------------------------------------------------------- -// HbListViewItem::polish -// -//--------------------------------------------------------------- -void CntHistoryViewItem::polish(HbStyleParameters& /*params*/) -{ + return new CntHistoryViewItem(*this); } //--------------------------------------------------------------- @@ -52,55 +50,27 @@ //--------------------------------------------------------------- void CntHistoryViewItem::updateChildItems() { - QStringList data = modelIndex().data(Qt::DisplayRole).toStringList(); - QString iconName = modelIndex().data(Qt::DecorationRole).toString(); - bool incoming = false; - bool newMessage = false; - bool status = false; - if (modelIndex().data(CntHistoryModel::DirectionRole).toInt(&status) == CntHistoryModel::Incoming) { - incoming = true; - } - // This indication applies to smses only - if (modelIndex().data(CntHistoryModel::ItemTypeRole).toInt(&status) == CntHistoryModel::Message && - modelIndex().data(CntHistoryModel::SeenStatusRole).toInt(&status) == CntHistoryModel::Unseen) { - newMessage = true; - } - - QGraphicsLinearLayout* currentLayout = static_cast(layout()); - - if (currentLayout == NULL) { + int flags = modelIndex().data(CntHistoryModel::FlagsRole).toInt(); + mIncoming = flags & CntHistoryModel::Incoming ? true : false; + mNewMessage = flags & CntHistoryModel::Unseen ? true : false; - currentLayout = new QGraphicsLinearLayout(this); - currentLayout->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - currentLayout->setOrientation(Qt::Horizontal); - currentLayout->setContentsMargins(0,0,0,0); - - //Create item widget - itemWidget = new CntHistoryViewItemWidget(this); - currentLayout->addItem(itemWidget); - - //Update item widget contents - itemWidget->setDetails(data.at(0), data.at(1), data.at(2), iconName, incoming, newMessage); - - setLayout(currentLayout); - - } else { - // Find the itemWidget item from the layout and remove it - int i = 0; - while( itemWidget != static_cast(currentLayout->itemAt(i)) ) { - i++; + if (mNewMessage) + { + if (!mNewItem) + { + mNewItem = new HbFrameItem(NEW_EVENT_FRAME, HbFrameDrawer::ThreePiecesVertical, this); + style()->setItemName(mNewItem, "newitem"); } - currentLayout->removeAt(i); - delete itemWidget; - - //Create new item widget - itemWidget = new CntHistoryViewItemWidget(this); - currentLayout->addItem(itemWidget); - - //Update item widget contents - itemWidget->setDetails(data.at(0), data.at(1), data.at(2), iconName, incoming, newMessage); - - updateGeometry(); } + else + { + if (mNewItem) + { + delete mNewItem; + mNewItem = NULL; + } + } + + HbListViewItem::updateChildItems(); } // EOF diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp Mon May 03 12:24:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,165 +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 "cnthistoryviewitemwidget.h" - -#include -#include -#include -#include - -#define INCOMING_EVENT_FRAME "qtg_fr_convlist_received_normal" -#define OUTGOING_EVENT_FRAME "qtg_fr_convlist_sent_normal" -#define NEW_EVENT_FRAME "qtg_fr_list_new_item" - -CntHistoryViewItemWidget::CntHistoryViewItemWidget(QGraphicsItem *parent) : - HbWidget(parent), - mIconLabel(NULL), - mTitleLabel(NULL), - mBodyTextLabel(NULL), - mTimeStampLabel(NULL), - mFrameLabel(NULL), - mNewItemLabel(NULL), - mIncoming(false), - mNewMessage(false) -{ -} - -CntHistoryViewItemWidget::~CntHistoryViewItemWidget() -{ -} - -void CntHistoryViewItemWidget::createPrimitives() -{ - //create frame first so it's painted below text labels - if (!mFrameLabel) { - HbFrameDrawer* frameDrawer = NULL; - if (mIncoming) { - frameDrawer = new HbFrameDrawer(INCOMING_EVENT_FRAME, HbFrameDrawer::NinePieces); - } else { - frameDrawer = new HbFrameDrawer(OUTGOING_EVENT_FRAME, HbFrameDrawer::NinePieces); - } - mFrameLabel = new HbFrameItem(frameDrawer, this); - style()->setItemName(mFrameLabel, "frame"); - } - - if (mNewMessage && !mNewItemLabel) { - HbFrameDrawer* frameDrawer = new HbFrameDrawer(NEW_EVENT_FRAME, HbFrameDrawer::ThreePiecesVertical); - mNewItemLabel = new HbFrameItem(frameDrawer, this); - style()->setItemName(mNewItemLabel, "newItem"); - } - - //create icon - if (!mIcon.isNull()) { - if (!mIconLabel) { - mIconLabel = new HbIconItem(this); - mIconLabel->setIcon(mIcon); - style()->setItemName(mIconLabel, "icon"); - } - } else { - if (mIconLabel) { - delete mIconLabel; - } - mIconLabel = NULL; - } - - //create title - if (!mTitle.isNull()) { - if (!mTitleLabel) { - mTitleLabel = new HbTextItem(this); - mTitleLabel->setText(mTitle); - mTitleLabel->setTextWrapping(Hb::TextWordWrap); - style()->setItemName(mTitleLabel, "title"); - } - } else { - if (mTitleLabel) { - delete mTitleLabel; - } - mTitleLabel = NULL; - } - - //create body text - if (!mBodyText.isNull()) { - if (!mBodyTextLabel) { - mBodyTextLabel = new HbTextItem(this); - mBodyTextLabel->setText(mBodyText); - style()->setItemName(mBodyTextLabel, "bodyText"); - } - } else { - if (mBodyTextLabel) { - delete mBodyTextLabel; - } - mBodyTextLabel = NULL; - } - - //create timestamp - if (!mTimeStamp.isNull()) { - if (!mTimeStampLabel) { - mTimeStampLabel = new HbTextItem(this); - mTimeStampLabel->setText(mTimeStamp); - style()->setItemName(mTimeStampLabel, "timeStamp"); - } - } else { - if (mTimeStampLabel) { - delete mTimeStampLabel; - } - mTimeStampLabel = NULL; - } -} - -void CntHistoryViewItemWidget::recreatePrimitives() -{ - HbWidget::recreatePrimitives(); - - delete mIconLabel; - mIconLabel = NULL; - - delete mTitleLabel; - mTitleLabel = NULL; - - delete mBodyTextLabel; - mBodyTextLabel = NULL; - - delete mTimeStampLabel; - mTimeStampLabel = NULL; - - createPrimitives(); -} - - -void CntHistoryViewItemWidget::updatePrimitives() -{ - HbWidget::updatePrimitives(); -} - -void CntHistoryViewItemWidget::setDetails(QString title, QString bodyText, - QString timeStamp, QString iconName, bool incoming, bool newMessage) -{ - mIcon.clear(); - mTitle.clear(); - mBodyText.clear(); - mTimeStamp.clear(); - - mIcon.setIconName(iconName); - mTitle = title; - mBodyText = bodyText; - mTimeStamp = timeStamp; - mIncoming = incoming; - mNewMessage = newMessage; - - recreatePrimitives(); -} diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntimageeditorview.cpp --- a/phonebookui/pbkcommonui/src/cntimageeditorview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntimageeditorview.cpp Fri May 14 15:42:23 2010 +0300 @@ -102,16 +102,21 @@ */ void CntImageEditorView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { + mViewManager = aMgr; + mArgs = aArgs; + if (mView->navigationAction() != mSoftkey) mView->setNavigationAction(mSoftkey); HbMainWindow* window = mView->mainWindow(); + if ( window ) + { connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); - setOrientation(window->orientation()); + setOrientation(window->orientation()); + } - mContact = new QContact(aArgs.value(ESelectedContact).value()); - mViewManager = aMgr; - + mContact = new QContact(mArgs.value(ESelectedContact).value()); + // set the correct image if the contact already has an image set mImageLabel = static_cast(mDocumentLoader.findWidget(QString("cnt_image_label"))); QList details = mContact->details(); @@ -209,20 +214,26 @@ mContact->removeDetail(mAvatar); } - CntViewParameters args; QVariant var; var.setValue(*mContact); - args.insert(ESelectedContact, var); - mViewManager->back( args ); + + mArgs.insert(ESelectedContact, var); + mArgs.insert(ECustomParam, viewId()); + mViewManager->back( mArgs ); } void CntImageEditorView::removeImage() { - int err; - CntImageUtility imageUtility; - if(!mAvatar->imageUrl().isEmpty() - && imageUtility.removeImage(mAvatar->imageUrl().toString(),err)) + QString filePath=mAvatar->imageUrl().toString(); + if(!filePath.isEmpty()) { + // Check if image removable. + CntImageUtility imageUtility; + if(imageUtility.isImageRemovable(filePath)) + { + imageUtility.removeImage(filePath); + } + mAvatar->setImageUrl(QUrl()); mImageLabel->clear(); mImageLabel->setIcon(HbIcon("qtg_large_avatar")); @@ -238,17 +249,30 @@ if(value.canConvert()) { CntImageUtility imageUtility; - int err; - QString imagepath; - - if(imageUtility.createImage(value.toString(),imagepath,err)) + if(imageUtility.isMassStorageAvailable()) { - // If image exists, delete - if(!mAvatar->imageUrl().isEmpty()) - imageUtility.removeImage(mAvatar->imageUrl().toString(),err); + /* Copy image and create thumbnail + * When contact image removed only copy is deleted + */ + QString imagepath; + if(imageUtility.createImage(value.toString(),imagepath)) + { + // If image already assigned, delete + QString filePath=mAvatar->imageUrl().toString(); + if(!filePath.isEmpty() + && imageUtility.isImageRemovable(filePath)) + imageUtility.removeImage(filePath); - mAvatar->setImageUrl(QUrl(imagepath)); - mThumbnailManager->getThumbnail(imagepath); + mAvatar->setImageUrl(QUrl(imagepath)); + mThumbnailManager->getThumbnail(imagepath); + mRemoveImage->setEnabled(true); + } + } + else + { + // No mass memory, use the orginal image + mAvatar->setImageUrl(QUrl(value.toString())); + mThumbnailManager->getThumbnail(value.toString()); mRemoveImage->setEnabled(true); } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntimportsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntimportsview.cpp Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,632 @@ +/* +* 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 "cntimportsview.h" +#include "qtpbkglobal.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char *CNT_IMPORT_UI_XML = ":/xml/contacts_sim.docml"; +const int KTimerValue = 1; // used as 1 msec timer for saving ADN contacts from SIM + +CntImportsView::CntImportsView() : mContactSimManagerADN(0), + mContactSimManagerSDN(0), + mFetchRequestADN(0), + mFetchRequestSDN(0), + mListView(0), + mSimUtility(0), + mAdnEntriesPresent(0), + mImportSimPopup(0), + mSaveCount(0), + mFetchIsDone(0), + mTimerId(0), + mAdnStorePresent(0), + mSdnStorePresent(0), + mSimPresent(0), + mAdnStoreEntries(0), + mSimError(0), + mWaitingForAdnCache(0) +{ + bool ok = false; + mDocumentLoader.load(CNT_IMPORT_UI_XML, &ok); + + if (ok) + { + mView = static_cast(mDocumentLoader.findWidget(QString("view"))); + } + else + { + qFatal("Unable to read :/xml/contacts_sim.docml"); + } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + +} + +void CntImportsView::deactivate() +{ +} + + +CntImportsView::~CntImportsView() +{ + mView->deleteLater(); + delete mFetchRequestADN; + delete mFetchRequestSDN; + delete mModel; + delete mSimUtility; +} + +/*! +Activates a previous view +*/ +void CntImportsView::showPreviousView() +{ + CntViewParameters args; + mViewManager->back(args); +} + +/* +Activates a default view +*/ +void CntImportsView::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs) +{ + Q_UNUSED(aArgs); + //back button + HbMainWindow* window = mView->mainWindow(); + if (mView->navigationAction() != mSoftkey) + { + mView->setNavigationAction(mSoftkey); + } + + mViewManager = aMgr; + mContactSymbianManager = mViewManager->contactManager(SYMBIAN_BACKEND); + + // Sim Utility info fetch + int getSimInfoError(0); + int storesError(0); + + int error = -1; + mSimUtility = new SimUtility(SimUtility::AdnStore, error); + if (error != 0) + { + delete mSimUtility; + mSimUtility = 0; + mSimError = true; + } + else + { + // check what stores are there + SimUtility::AvailableStores stores = mSimUtility->getAvailableStores(storesError); + if(!storesError) + { + mSimPresent = stores.SimPresent; + mAdnStorePresent = stores.AdnStorePresent; + mSdnStorePresent = stores.SdnStorePresent; + } + + //check there are ADN contacts + if (mAdnStorePresent) + { + SimUtility::SimInfo simInfo = mSimUtility->getSimInfo(getSimInfoError); + if (!getSimInfoError) + { + // sim entries are present + mAdnStoreEntries = simInfo.usedEntries; + if (mAdnStoreEntries > 0) + { + mAdnEntriesPresent = true; + } + } + else + { + if (getSimInfoError == KErrNotReady) + { + //ADN store is not accessible, e.g. because of active FDN + //Or ADN cache is not ready yet, so wait for this + mAdnStorePresent = true; + mAdnEntriesPresent = true; + mWaitingForAdnCache = true; + connect(mSimUtility, SIGNAL(adnCacheStatusReady(SimUtility::CacheStatus&, int)), this, SLOT(adnCacheStatusReady(SimUtility::CacheStatus&, int))); + if (!mSimUtility->notifyAdnCacheStatus()) { + mAdnStorePresent = false; + mAdnEntriesPresent = false; + mWaitingForAdnCache = false; + } + } + else + { + simInfoErrorMessage(getSimInfoError); + } + } + } + } + + mListView = static_cast(mDocumentLoader.findWidget(QString("listView"))); + + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mListView->itemPrototypes().first()->setDefaultFrame(frame); + + mListView->setUniformItemSizes(true); + + connect(mListView, SIGNAL(activated (const QModelIndex&)), + this, SLOT(onListViewActivated(const QModelIndex&))); + + mModel = new QStandardItemModel(); + + QStandardItem *importSimItem = new QStandardItem(); + QStringList simList; + + QString simImport(hbTrId("txt_phob_dblist_import_from_sim")); + QString simNoContacts(hbTrId("txt_phob_dblist_import_from_1_val_no_sim_contacts")); + QString simNoCard(hbTrId("txt_phob_dblist_import_from_ovi_val_no_sim_card")); + + // check if SIM card is there + if (mSimError) + { + simList << simImport; + importSimItem->setEnabled(false); + } + else if (!(mAdnStorePresent || mSdnStorePresent)) + { + // Both stores are not present + // disable the QStandardItem + if (!mSimPresent) + { + simList << simImport << simNoCard; + } + else + { + simList << simImport << simNoContacts; + } + importSimItem->setEnabled(false); + } + else if (!(mAdnEntriesPresent || mSdnStorePresent)) + { + // Sim card is present + // No ADN entries are there + // no SDN entries are there + simList << simImport << simNoContacts; + importSimItem->setEnabled(false); + } + else + { + // SIM card is present + //ADN entries or SDN entries are there + simList << simImport ; + } + importSimItem->setData(simList, Qt::DisplayRole); + importSimItem->setData(HbIcon("qtg_large_sim"), Qt::DecorationRole); + + mModel->insertRow(0,importSimItem); + + QStandardItem *importDeviceItem = new QStandardItem(); + QStringList deviceList; + QString deviceImport(hbTrId("txt_phob_dblist_import_from_device")); + deviceList << deviceImport; + importDeviceItem->setData(deviceList, Qt::DisplayRole); + importDeviceItem->setData(HbIcon("qtg_large_data_import"), Qt::DecorationRole); + importDeviceItem->setEnabled(false); + + mModel->insertRow(1,importDeviceItem); + + mListView->setModel(mModel); + mListView->setSelectionMode(HbAbstractItemView::NoSelection); +} + +void CntImportsView::simInfoErrorMessage(int infoError) +{ + Q_UNUSED(infoError); + QString errorMessage; + errorMessage.append(hbTrId("sim_card_not_accessable")); + HbNotificationDialog::launchDialog(errorMessage); + mSimError = true; +} + +void CntImportsView::onListViewActivated(const QModelIndex &index) +{ + int row = index.row(); + if ( row == 0 ) // row 0 has "Imports from SIM" + { + if (!startSimImport()) + { + //show error note + simInfoErrorMessage(KErrAccessDenied); + } + else + { + //start popup and progress + showWaitNote(); + } + } +} + + +bool CntImportsView::startSimImport() +{ + bool started = false; + + delete mFetchRequestADN; + mFetchRequestADN = 0; + delete mFetchRequestSDN; + mFetchRequestSDN = 0; + + if (mWaitingForAdnCache) + { + //show progress dialog and wait when ADN cache is ready + started = true; + } + else + { + if(mAdnStorePresent) + { + mContactSimManagerADN = mViewManager->contactManager(SIM_BACKEND_ADN); + mFetchRequestADN = new QContactFetchRequest; + mFetchRequestADN->setManager(mContactSimManagerADN); + connect(mFetchRequestADN, SIGNAL(resultsAvailable()), this, SLOT(importFetchResultReceivedADN())); + } + + if(mSdnStorePresent) + { + mContactSimManagerSDN = mViewManager->contactManager(SIM_BACKEND_SDN); + // SDN store fetch request + mFetchRequestSDN = new QContactFetchRequest; + mFetchRequestSDN->setManager(mContactSimManagerSDN); + connect(mFetchRequestSDN, SIGNAL(resultsAvailable()), this, SLOT(importFetchResultReceivedSDN())); + } + + if(mAdnEntriesPresent > 0 && mContactSimManagerADN->error() == QContactManager::NoError) + { + // ADN contacts are there, start fetch + mFetchRequestADN->start(); + started = true; + } + else if (mSdnStorePresent && mContactSimManagerSDN->error() == QContactManager::NoError) + { + //start fetch of SDN contacts since ADN contacts are not there + mFetchRequestSDN->start(); + started = true; + } + } + return started; +} + +void CntImportsView::stopSimImport() +{ + mImportSimPopup->close(); + if (mFetchIsDone) + { + // indicates that timer has been started + killTimer(mTimerId); + } + mSaveSimContactsList.clear(); + mSaveSimContactsListSDN.clear(); + + showSimImportResults(); + + if (mFetchRequestADN != NULL) + { + mFetchRequestADN->cancel(); + } + if (mFetchRequestSDN != NULL) + { + mFetchRequestSDN->cancel(); + } + +} + +void CntImportsView::importFetchResultReceivedADN() +{ + QList simContactsList = mFetchRequestADN->contacts(); + if (simContactsList.isEmpty()) + { + // No sim contacts, jump to fetching SDN contacts + fetchSDNContacts(); + } + else + { + // save ADN contacts + + int count = simContactsList.count(); + foreach(QContact contact, simContactsList) + { + if (contact.localId() > 0) + { + //delete local id before saving to different storage + QScopedPointer contactId(new QContactId()); + contactId->setLocalId(0); + contactId->setManagerUri(QString()); + contact.setId(*contactId); + + // custom label contains name information, save it to the first name + QList names = contact.details(QContactName::DefinitionName); + if (names.count() > 0) + { + QContactName name = static_cast(names.at(0)); + name.setFirstName(name.customLabel()); + name.setCustomLabel(QString()); + contact.saveDetail(&name); + } + + //update phone numbers to contain default subtype + QList numbers = contact.details(QContactPhoneNumber::DefinitionName); + for (int i = 0; i < numbers.count(); i++) + { + QContactPhoneNumber number = static_cast(numbers.at(i)); + number.setSubTypes(QContactPhoneNumber::SubTypeMobile); + contact.saveDetail(&number); + } + + //remove sync target details, it's read-only. + QList syncTargets = contact.details(QContactSyncTarget::DefinitionName); + for (int j = 0; j < syncTargets.count(); j++) + { + QContactSyncTarget syncTarget = static_cast(syncTargets.at(j)); + contact.removeDetail(&syncTarget); + } + + contact.setType(QContactType::TypeContact); + mSaveSimContactsList.append(contact); + + } + } + // save the list synchronously because async cancelling of save request is + // not supported in symbian backend at the time of this implementation + + if (!(mSaveSimContactsList.isEmpty())) + { + // indicates that there is one or more sim contact that has been fetched + // create a timer and start saving synchronously one by one + // when cancel is pressed, kill the timer + + mTimerId = startTimer(KTimerValue); // starting a 1 msec timer + mFetchIsDone = true; + mSaveCount = 0; + } + + } +} + +void CntImportsView::timerEvent(QTimerEvent *event) +{ + Q_UNUSED(event); + if (!(mSaveCount >= mSaveSimContactsList.count())) // while mSaveCount is less than or equal to mSaveSimContactsList.count() + { + QContact unSavedContact = mSaveSimContactsList.at(mSaveCount); + mContactSymbianManager->saveContact(&unSavedContact); + mSaveCount++; + //use another counter to check number of actual saved if saveContact() fails + } + else + { + // saving complete + killTimer(mTimerId); + mSaveSimContactsList.clear(); + + // ADN contacts fetching and saving is done + // Now start SDN fetching and save + fetchSDNContacts(); + } +} + +void CntImportsView::showWaitNote() +{ + mImportSimPopup = new HbDialog(); + mImportSimPopup->setDismissPolicy(HbDialog::NoDismiss); + mImportSimPopup->setTimeout(0); + mImportSimPopup->setBackgroundFaded(true); + mImportSimPopup->setAttribute(Qt::WA_DeleteOnClose, true); + + HbGroupBox *groupBox = new HbGroupBox; + groupBox->setHeading(hbTrId("txt_phob_title_import_contacts")); + mImportSimPopup->setHeadingWidget(groupBox); + + QGraphicsLinearLayout *containerLayout = new QGraphicsLinearLayout(Qt::Vertical); + containerLayout->setContentsMargins(0, 0, 0, 0); + containerLayout->setSpacing(10); + + HbLabel *icon = new HbLabel(); + icon->setIcon(HbIcon("qtg_large_sim")); + + HbLabel *simText= new HbLabel(); + simText->setPlainText(hbTrId("txt_phob_info_importing_contacts_from_sim")); + simText->setTextWrapping(Hb::TextWordWrap); + simText->setElideMode(Qt::ElideNone); + + HbProgressBar *progressBar = new HbProgressBar; + progressBar->setRange(0,0); + + HbPushButton *stopButton = new HbPushButton; + stopButton->setText(hbTrId("txt_phob_button_cancel")); + connect(stopButton, SIGNAL(clicked()), this, SLOT(stopSimImport())); + + QGraphicsLinearLayout *containerLayout1 = new QGraphicsLinearLayout(Qt::Horizontal); + containerLayout1->addItem(icon); + containerLayout1->addItem(simText); + + QGraphicsWidget *containerWidget = new QGraphicsWidget; + containerLayout->addItem(containerLayout1); + containerLayout->addItem(progressBar); + containerLayout->addItem(stopButton); + containerWidget->setLayout(containerLayout); + mImportSimPopup->setContentWidget(containerWidget); + mSaveCount = 0; + mImportSimPopup->open(); +} + +void CntImportsView::showSimImportResults() const +{ + QString results; + results.append(hbTrId("txt_phob_dpophead_ln_contacts_imported", mSaveCount)); + HbNotificationDialog::launchDialog(results); +} + +void CntImportsView::fetchSDNContacts() +{ + if (mSdnStorePresent && mContactSimManagerSDN->error() == QContactManager::NoError) + { + mFetchRequestSDN->start(); + } + else + { + // no SDN contacts to fetch + showSimImportResults(); + mImportSimPopup->close(); + // Importing finished, go back to NamesView + showPreviousView(); + } +} + +void CntImportsView::importFetchResultReceivedSDN() +{ + QList simContactsListSDN = mFetchRequestSDN->contacts(); + if (simContactsListSDN.isEmpty()) + { + //No sdn contacts present + showSimImportResults(); + mSaveSimContactsListSDN.clear(); + mImportSimPopup->close(); + // Importing finished, go back to NamesView + showPreviousView(); + } + else + { + // SAVE SDN CONTACTS + int count = simContactsListSDN.count(); + foreach(QContact contact, simContactsListSDN) + { + if (contact.localId() > 0) + { + //delete local id before saving to different storage + QScopedPointer contactId(new QContactId()); + contactId->setLocalId(0); + contactId->setManagerUri(QString()); + contact.setId(*contactId); + + //custom label contains name information, save it to the first name + QList names = contact.details(QContactName::DefinitionName); + if (names.count() > 0) + { + QContactName name = static_cast(names.at(0)); + name.setFirstName(name.customLabel()); + name.setCustomLabel(QString()); + contact.saveDetail(&name); + } + + //update phone numbers to contain default subtype + QList numbers = contact.details(QContactPhoneNumber::DefinitionName); + for (int i = 0; i < numbers.count(); i++) + { + QContactPhoneNumber number = static_cast(numbers.at(i)); + number.setSubTypes(QContactPhoneNumber::SubTypeMobile); + contact.saveDetail(&number); + } + + //remove sync target details, it's read-only. + QList syncTargets = contact.details(QContactSyncTarget::DefinitionName); + for (int j = 0; j < syncTargets.count(); j++) + { + QContactSyncTarget syncTarget = static_cast(syncTargets.at(j)); + contact.removeDetail(&syncTarget); + } + + contact.setType(QContactType::TypeContact); + mSaveSimContactsListSDN.append(contact); + + } + } + // save the list synchronously because async cancelling of save request is + // not supported in symbian backend at the time of this implementation + + if (!(mSaveSimContactsListSDN.isEmpty())) + { + // indicates that there is one or more SDN sim contact that has been fetched + QMap errorMap; + mContactSymbianManager->saveContacts(&mSaveSimContactsListSDN,&errorMap); + // check number of contacts really saved + mSaveCount = mSaveCount + mSaveSimContactsListSDN.count(); + } + + // no more SDN contacts to fetch + showSimImportResults(); + mSaveSimContactsListSDN.clear(); + mImportSimPopup->close(); + // Importing finished, go back to NamesView + showPreviousView(); + } +} + +void CntImportsView::adnCacheStatusReady(SimUtility::CacheStatus& cacheStatus, int error) +{ + mWaitingForAdnCache = false; + //update ADN store info... + if (error != 0 || cacheStatus == SimUtility::ECacheFailed) + { + mAdnStorePresent = false; + mAdnEntriesPresent = false; + } + else + { + //check if there are ADN contacts + mAdnStorePresent = true; + mAdnEntriesPresent = false; + int getSimInfoError = -1; + SimUtility::SimInfo simInfo = mSimUtility->getSimInfo(getSimInfoError); + if (!getSimInfoError) + { + // sim entries are present + mAdnStoreEntries = simInfo.usedEntries; + if (mAdnStoreEntries > 0) + { + mAdnEntriesPresent = true; + } + } + } + + //and start SIM contacts import, if user tapped "SIM import" + if(mImportSimPopup != NULL && mImportSimPopup->isActive()) + { + if (!startSimImport()) + { + //dismiss wait note + mImportSimPopup->close(); + //and show error note + simInfoErrorMessage(KErrAccessDenied); + } + } +} + +// EOF diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntmycardview.cpp --- a/phonebookui/pbkcommonui/src/cntmycardview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntmycardview.cpp Fri May 14 15:42:23 2010 +0300 @@ -16,6 +16,7 @@ */ #include "cntmycardview.h" +#include "cntfetchcontactsview.h" #include "qtpbkglobal.h" #include #include @@ -26,7 +27,8 @@ CntMyCardView::CntMyCardView() : mContact(NULL), - mViewManager(NULL) + mViewManager(NULL), + mFetchView(NULL) { bool ok = false; mDocumentLoader.load(CNT_MYCARD_UI_XML, &ok); @@ -51,6 +53,9 @@ delete mContact; mContact = 0; + + delete mFetchView; + mFetchView = NULL; } /*! @@ -67,6 +72,8 @@ */ void CntMyCardView::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs) { + mViewManager = aMgr; + if (mView->navigationAction() != mSoftkey) mView->setNavigationAction(mSoftkey); @@ -75,8 +82,6 @@ setOrientation(window->orientation()); mContact = new QContact(aArgs.value(ESelectedContact).value()); - mViewManager = aMgr; - HbPushButton *newButton = static_cast(mDocumentLoader.findWidget(QString("cnt_button_new"))); connect(newButton, SIGNAL(clicked()), this, SLOT(openNameEditor())); @@ -91,6 +96,9 @@ { chooseButton->setEnabled(false); } + + mFetchView = new CntFetchContacts(mViewManager->contactManager( SYMBIAN_BACKEND )); + connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleMultiCardSelection())); } void CntMyCardView::deactivate() @@ -117,13 +125,10 @@ */ void CntMyCardView::openNameEditor() { - //create a new my card contact - QContactManager* mgr = mViewManager->contactManager( SYMBIAN_BACKEND ); - mgr->saveContact(mContact); - mgr->setSelfContactId(mContact->localId()); - //open the contact editor CntViewParameters viewParameters; viewParameters.insert(EViewId, editView); + viewParameters.insert(EMyCard, "myCard" ); + QVariant var; var.setValue(*mContact); viewParameters.insert(ESelectedContact, var); @@ -135,8 +140,27 @@ */ void CntMyCardView::openMyCardSelectionView() { + // Display a list of contacts to choose a mycard from. + mFetchView->setDetails(hbTrId("txt_phob_subtitle_my_card"),hbTrId("Save")); + QSet emptyContactsSet; + mFetchView->displayContacts(CntFetchContacts::popup, + HbAbstractItemView::SingleSelection, + emptyContactsSet); +} + +void CntMyCardView::handleMultiCardSelection() +{ + QContactManager* manager = mViewManager->contactManager( SYMBIAN_BACKEND ); + + QSet selectedContacts = mFetchView->getSelectedContacts(); + + if ( !mFetchView->wasCanceled() && !selectedContacts.isEmpty() ) { + QList selectedContactsList = selectedContacts.values(); + manager->setSelfContactId(selectedContactsList.front()); + } + CntViewParameters viewParameters; - viewParameters.insert(EViewId, myCardSelectionView); + viewParameters.insert(EViewId, namesView); mViewManager->changeView(viewParameters); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntnamesview_p.cpp --- a/phonebookui/pbkcommonui/src/cntnamesview_p.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntnamesview_p.cpp Fri May 14 15:42:23 2010 +0300 @@ -17,6 +17,7 @@ #include "cntnamesview_p.h" #include "cntaction.h" +#include "cntfetchcontactsview.h" #include "cntextensionmanager.h" #include "qtpbkglobal.h" @@ -43,11 +44,13 @@ #include #include #include +#include #include #include const char *CNT_CONTACTLIST_XML = ":/xml/contacts_namelist.docml"; +static const int CNT_MIN_ROW_COUNT = 2; CntNamesViewPrivate::CntNamesViewPrivate(CntExtensionManager &extensionManager) : QObject(), @@ -61,6 +64,8 @@ mLoader(NULL), mLayout(NULL), mMenuBuilder(NULL), + mHandledContactId(0), + mFetchView(NULL), mIsDefault(true), mId( namesView ) { @@ -70,31 +75,32 @@ qFatal("Unable to read %S", CNT_CONTACTLIST_XML); } mView = static_cast (document()->findWidget("view")); - + mVirtualKeyboard = new HbStaticVkbHost(mView); connect(mVirtualKeyboard, SIGNAL(keypadOpened()), this, SLOT(handleKeypadOpen())); connect(mVirtualKeyboard, SIGNAL(keypadClosed()), this, SLOT(handleKeypadClose())); mSoftkey = new HbAction(Hb::BackNaviAction, mView); - HbAction* newContact = static_cast (document()->findObject("cnt:newcontact")); + mNewContact = static_cast (document()->findObject("cnt:newcontact")); + mMultipleDeleter = static_cast (document()->findObject("cnt:delete")); HbAction* findContacts = static_cast (document()->findObject("cnt:find")); HbAction* groups = static_cast (document()->findObject("cnt:groups")); - HbAction* importSim = static_cast (document()->findObject("cnt:importsim")); + mImportSim = static_cast (document()->findObject("cnt:importsim")); HbAction* extension = static_cast (document()->findObject("cnt:activity")); connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); - connect(newContact, SIGNAL(triggered()), this, SLOT(createNewContact())); + connect(mNewContact, SIGNAL(triggered()), this, SLOT(createNewContact())); + connect(mMultipleDeleter, SIGNAL(triggered()), this, SLOT(deleteMultipleContacts())); connect(findContacts, SIGNAL(triggered()), this, SLOT(showFinder())); connect(groups, SIGNAL(triggered()), this, SLOT(showCollectionView())); - connect(importSim, SIGNAL(triggered()), this, SLOT(importSim())); + connect(mImportSim, SIGNAL(triggered()), this, SLOT(importSim())); connect(extension, SIGNAL(triggered()), this, SLOT(handleExtensionAction())); connect(list(), SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this, SLOT(showContextMenu(HbAbstractViewItem*,QPointF))); connect(list(), SIGNAL(activated (const QModelIndex&)), this, SLOT(showContactView(const QModelIndex&))); - } CntNamesViewPrivate::~CntNamesViewPrivate() @@ -150,50 +156,52 @@ filter.setValue(typeContact); mListModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), filter, sortOrders); + list()->setModel(mListModel); + } - list()->setModel(mListModel); - mMenuBuilder = new CntActionMenuBuilder( mListModel->myCardId() ); connect( mMenuBuilder, SIGNAL(deleteContact(QContact&)), this, SLOT(deleteContact(QContact&)) ); connect( mMenuBuilder, SIGNAL(editContact(QContact&)), this, SLOT(showContactEditorView(QContact&)) ); connect( mMenuBuilder, SIGNAL(openContact(QContact&)), this, SLOT(showContactView(QContact&)) ); connect( mMenuBuilder, SIGNAL(performContactAction(QContact&,QString)), this, SLOT(executeAction(QContact&,QString))); - + if ( mView->navigationAction() != mSoftkey) { mView->setNavigationAction(mSoftkey); } QContactManager* contactManager = aMgr->contactManager( SYMBIAN_BACKEND ); - QString action = aArgs.value(ESelectedAction).toString(); - if ( action == "save" ) + if ( aArgs.contains(ESelectedContact) ) { - QString name = contactManager->synthesizedDisplayLabel( aArgs.value(ESelectedContact).value() ); - HbNotificationDialog::launchDialog(qtTrId("Contact \"%1\" saved").arg(name)); - - scrollTo( aArgs.value(ESelectedContact).value() ); + QContact selectedContact = aArgs.value(ESelectedContact).value(); + QString action = aArgs.value(ESelectedAction).toString(); + + if ( action == "save" ) + { + QString name = contactManager->synthesizedDisplayLabel( selectedContact ); + HbNotificationDialog::launchDialog(qtTrId("Contact \"%1\" saved").arg(name)); + } + + else if ( action == "delete" ) + { + QString name = contactManager->synthesizedDisplayLabel( selectedContact ); + HbNotificationDialog::launchDialog(qtTrId("%1 deleted").arg(name)); + } + else if ( action == "failed") + { + HbNotificationDialog::launchDialog(qtTrId("SAVING FAILED!")); + } } - - else if ( action == "delete" ) - { - QString name = contactManager->synthesizedDisplayLabel( aArgs.value(ESelectedContact).value() ); - HbNotificationDialog::launchDialog(qtTrId("%1 deleted").arg(name)); - } - else if ( action == "failed") - { - HbNotificationDialog::launchDialog(qtTrId("SAVING FAILED!")); - } + + bool multipleContacts = mListModel->rowCount() >= CNT_MIN_ROW_COUNT; + mMultipleDeleter->setEnabled(multipleContacts); } void CntNamesViewPrivate::deactivate() { hideFinder(); - // Don't delete the model, default views will retain it between - // activate/deactivate. do it in destructor. - list()->setModel(NULL); - delete mMenuBuilder; mMenuBuilder = NULL; @@ -202,18 +210,6 @@ mSearchPanel = NULL; } -void CntNamesViewPrivate::scrollTo(const QContact &aContact) -{ - if (mListModel) - { - QModelIndex index = mListModel->indexOfContact(aContact); - - if (index.isValid()) - { - list()->scrollTo(index); - } - } -} void CntNamesViewPrivate::setFilter(const QString &filterString) { QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts); @@ -275,6 +271,10 @@ showBanner(hbTrId("txt_phob_subtitle_find_all_contacts")); mView->toolBar()->hide(); + mImportSim->setVisible(false); + mNewContact->setVisible(false); + mMultipleDeleter->setVisible(false); + setFilter(QString()); list()->setVisible(true); @@ -304,6 +304,9 @@ mListModel->setFilterAndSortOrder(filter); mListModel->showMyCard(true); + mNewContact->setVisible(true); + mImportSim->setVisible(true); + mMultipleDeleter->setVisible(true); mView->toolBar()->show(); } @@ -342,9 +345,60 @@ void CntNamesViewPrivate::createNewContact() { QContact newContact; + newContact.setType( QContactType::TypeContact ); + showContactEditorView(newContact); } +void CntNamesViewPrivate::deleteContact(QContact& aContact) +{ + QContactManager* manager = mViewManager->contactManager( SYMBIAN_BACKEND ); + QString name = manager->synthesizedDisplayLabel(aContact); + + mHandledContactId = aContact.localId(); + + HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(HbAction*)), + hbTrId("txt_phob_button_delete"), hbTrId("txt_common_button_cancel")); +} + +void CntNamesViewPrivate::deleteMultipleContacts() +{ + if (!mFetchView) { + mFetchView = new CntFetchContacts(mViewManager->contactManager( SYMBIAN_BACKEND )); + connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleDeleteMultipleContacts())); + } + + mFetchView->setDetails(hbTrId("txt_phob_opt_delete_contact"),hbTrId("txt_phob_button_delete")); + QSet emptyContactsSet; + + // Pop up a list of contacts for deletion + mFetchView->displayContacts(CntFetchContacts::popup, + HbAbstractItemView::MultiSelection, + emptyContactsSet); +} + +void CntNamesViewPrivate::handleDeleteMultipleContacts() +{ + QSet selectedContacts = mFetchView->getSelectedContacts(); + + QContactManager* manager = mViewManager->contactManager( SYMBIAN_BACKEND ); + if ( !mFetchView->wasCanceled() && !selectedContacts.isEmpty() ) { + QList selectedContactsList = selectedContacts.values(); + foreach (QContactLocalId id, selectedContactsList) { + QContact contact = manager->contact(id); + + manager->removeContact(contact.localId()); + } + } + + if (mListModel->rowCount() < CNT_MIN_ROW_COUNT) { + mMultipleDeleter->setEnabled(false); + } + + delete mFetchView; + mFetchView = NULL; +} + void CntNamesViewPrivate::showContactView( const QModelIndex& aIndex ) { QContact c = mListModel->contact(aIndex); @@ -369,7 +423,10 @@ void CntNamesViewPrivate::showContextMenu(HbAbstractViewItem* aItem, QPointF aPoint) { QContact contact = mListModel->contact(aItem->modelIndex()); - mMenuBuilder->execActionMenu( contact, aPoint ); + HbMenu* menu = mMenuBuilder->actionMenu( contact ); + menu->setPreferredPos( aPoint ); + menu->setAttribute( Qt::WA_DeleteOnClose, true ); + menu->open(); } void CntNamesViewPrivate::executeAction( QContact& aContact, QString aAction ) @@ -384,25 +441,16 @@ aAction->deleteLater(); } -void CntNamesViewPrivate::deleteContact(QContact& aContact) +void CntNamesViewPrivate::handleDeleteContact( HbAction* aAction ) { - QContactManager* manager = mViewManager->contactManager( SYMBIAN_BACKEND ); - QString name = manager->synthesizedDisplayLabel(aContact); - - HbMessageBox *note = new HbMessageBox( - hbTrId("txt_phob_info_delete_1").arg(name), - HbMessageBox::MessageTypeQuestion); - - note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - - HbAction *selected = note->exec(); - if (selected == note->primaryAction()) + HbMessageBox *note = static_cast(sender()); + + if (note && aAction == note->actions().first()) { - manager->removeContact(aContact.localId()); - HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_1_deleted").arg(name)); + mViewManager->contactManager( SYMBIAN_BACKEND )->removeContact(mHandledContactId); } - delete note; + + mHandledContactId = 0; } void CntNamesViewPrivate::showContactEditorView(QContact& aContact) @@ -426,54 +474,9 @@ void CntNamesViewPrivate::importSim() { - int copied(0); - int failed(0); - QContactManager* simManager = mViewManager->contactManager( SIM_BACKEND ); - QContactManager* symbianManager = mViewManager->contactManager( SYMBIAN_BACKEND ); - - QList contactIds = simManager->contactIds(); - if (contactIds.count() == 0) { - HbMessageBox::information("Nothing to copy: SIM card is empty or not accessible."); - return; - } - - foreach(QContactLocalId id, contactIds) { - QContact contact = simManager->contact(id); - if (contact.localId() > 0) { - //delete local id before saving to different storage - QScopedPointer contactId(new QContactId()); - contactId->setLocalId(0); - contactId->setManagerUri(QString()); - contact.setId(*contactId); - - // custom label contains name information, save it to the first name - QList names = contact.details(QContactName::DefinitionName); - if (names.count() > 0) { - QContactName name = static_cast(names.at(0)); - name.setFirstName(name.customLabel()); - name.setCustomLabel(QString()); - contact.saveDetail(&name); - } - - if (symbianManager->saveContact(&contact)) { - copied++; - } - else { - failed++; - } - } - else { - failed++; - } - } - - QString resultMessage; - resultMessage.setNum(copied); - resultMessage.append(" contact copied, "); - resultMessage.append(QString().setNum(failed)); - resultMessage.append(" failed."); - - HbMessageBox::information(resultMessage); + CntViewParameters args; + args.insert(EViewId, importsView); + mViewManager->changeView(args); } @@ -488,6 +491,7 @@ mListView->setFrictionEnabled(true); mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); + mListView->listItemPrototype()->setStretchingStyle(HbListViewItem::StretchLandscape); mListView->verticalScrollBar()->setInteractive(true); HbFrameBackground frame; @@ -500,6 +504,8 @@ HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView); indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); indexFeedback->setItemView(mListView); + + connect( mListView, SIGNAL(scrollPositionChanged(const QPointF&)), this, SLOT(handleScroll(const QPointF&)) ); } return mListView; } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp --- a/phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -21,15 +21,8 @@ CntNoteEditorModel::CntNoteEditorModel( QContact* aContact ) : CntDetailEditorModel( aContact ) { - QList noteList = mContact->details(); - if ( noteList.isEmpty() ) - { - QContactNote emptyNote; - noteList.append( emptyNote ); - } - HbDataFormModelItem* root = invisibleRootItem(); - foreach ( QContactNote note, noteList ) + foreach ( QContactNote note, mContact->details() ) { CntDetailModelItem* item = new CntDetailModelItem(note); appendDataFormItem( item, root ); @@ -53,9 +46,12 @@ int count( root->childCount() ); for ( int i(0); i < count; i++ ) { CntDetailModelItem* detail = static_cast( root->childAt(i) ); - QContactNote note = detail->detail(); - if ( note.note().length() > 0 ) { - mContact->saveDetail( ¬e ); + QContactDetail note = detail->detail(); + mContact->saveDetail( ¬e ); + + if ( note.value(QContactNote::FieldNote).isEmpty() ) + { + mContact->removeDetail( ¬e ); } } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -64,7 +64,7 @@ mEdit->setMinRows( CNT_NOTE_EDITOR_MIN_ROWCOUNT ); mEdit->setText( detail.note() ); - HbLabel* label = new HbLabel(hbTrId("Note")); + HbLabel* label = new HbLabel(hbTrId("txt_phob_formlabel_note")); mLayout->addItem(label); mLayout->addItem(mEdit); widget->setLayout( mLayout ); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntphonenumbermodel.cpp --- a/phonebookui/pbkcommonui/src/cntphonenumbermodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntphonenumbermodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -35,10 +35,13 @@ // if there's no details, add if ( all.isEmpty() ) { - QContactPhoneNumber number; - number.setSubTypes( QContactPhoneNumber::SubTypeMobile ); - - all.append( number ); + QContactPhoneNumber mobileNumber; + mobileNumber.setSubTypes( QContactPhoneNumber::SubTypeMobile ); + all.append( mobileNumber ); + + QContactPhoneNumber landLineNumber; + landLineNumber.setSubTypes( QContactPhoneNumber::SubTypeLandline ); + all.append( landLineNumber ); } HbDataFormModelItem* root = invisibleRootItem(); @@ -54,7 +57,7 @@ { QContactPhoneNumber number; number.setSubTypes( QContactPhoneNumber::SubTypeMobile ); - + appendDataFormItem( new CntDetailModelItem(number), invisibleRootItem() ); } @@ -65,25 +68,21 @@ for ( int i = 0; i < count; i++ ) { CntDetailModelItem* item = static_cast( root->childAt(i) ); QContactDetail detail = item->detail(); + mContact->saveDetail( &detail ); if ( detail.definitionName() == QContactPhoneNumber::DefinitionName ) { - QContactPhoneNumber phonenumber = detail; - if ( phonenumber.number().length() > 0 ) { - mContact->saveDetail( &phonenumber ); - } + if ( detail.value(QContactPhoneNumber::FieldNumber).isEmpty() ) + mContact->removeDetail( &detail ); } - else if ( detail.definitionName() == QContactOnlineAccount::DefinitionName ) + + if ( detail.definitionName() == QContactOnlineAccount::DefinitionName ) { - QContactOnlineAccount account = detail; - if ( account.accountUri().length() > 0 ) { - mContact->saveDetail( &account ); + if ( detail.value(QContactOnlineAccount::FieldAccountUri).isEmpty() ) + { + mContact->removeDetail( &detail ); } } - else { - /* should never be here */ - qWarning() << "Unknown: " << detail.definitionName(); - } } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -40,14 +40,12 @@ CntDetailViewItem( aParent ), mBox(NULL), mEdit(NULL), -mFilter(NULL), mLayout(NULL) { } CntPhoneNumberViewItem::~CntPhoneNumberViewItem() { - delete mFilter; } HbAbstractViewItem* CntPhoneNumberViewItem::createItem() @@ -118,8 +116,7 @@ HbWidget* widget = new HbWidget(); mBox = new HbComboBox(); mEdit = new HbLineEdit(); - mFilter = new HbEditorInterface( mEdit ); - + widget->setLayout( mLayout ); mLayout->addItem( mBox ); @@ -167,8 +164,7 @@ void CntPhoneNumberViewItem::constructPhoneNumber( CntDetailModelItem* aItem, QString aSubType, QStringList aContext ) { - mFilter->setFilter( HbPhoneNumberFilter::instance() ); - mFilter->setUpAsPhoneNumberEditor(); + mEdit->setInputMethodHints( Qt::ImhDialableCharactersOnly ); mEdit->setMaxLength( CNT_PHONENUMBER_EDITOR_MAXLENGTH ); QContactDetail detail = aItem->detail(); @@ -178,7 +174,7 @@ { // also we need to remove the old online account and replace it // with phonenumber - CntDetailEditorModel* model = static_cast( aItem->model() ); + CntDetailEditorModel* model = static_cast( itemView()->model() ); QContact* contact = model->contact(); contact->removeDetail( &detail ); @@ -199,9 +195,8 @@ void CntPhoneNumberViewItem::constructOnlineAccount( CntDetailModelItem* aItem, QString aSubType, QStringList aContext ) { - mFilter->setFilter( HbEmailAddressFilter::instance() ); - mFilter->setUpAsCompletingEmailField(); mEdit->setMaxLength( CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH ); + mEdit->setInputMethodHints( Qt::ImhUrlCharactersOnly ); QContactDetail detail = aItem->detail(); // check if the detail type needs to changed @@ -209,7 +204,7 @@ { // also we need to remove the old phonenumber and replace it // with online account - CntDetailEditorModel* model = static_cast( aItem->model() ); + CntDetailEditorModel* model = static_cast( itemView()->model() ); QContact* contact = model->contact(); contact->removeDetail( &detail ); @@ -270,20 +265,20 @@ model->appendRow(mobilework); QStandardItem *land = new QStandardItem; - land->setText(hbTrId("txt_phob_setlabel_val_phone")); + land->setText(hbTrId("txt_phob_dblist_phone")); land->setData(subTypeLandline, DetailSubType); land->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); model->appendRow(land); QStandardItem *landhome = new QStandardItem; - landhome->setText(hbTrId("txt_phob_setlabel_val_phone_home")); + landhome->setText(hbTrId("txt_phob_dblist_phone_home")); landhome->setData(subTypeLandline, DetailSubType); landhome->setData(contextHome, DetailContext); landhome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); model->appendRow(landhome); QStandardItem *landwork = new QStandardItem; - landwork->setText(hbTrId("txt_phob_setlabel_val_phone_work")); + landwork->setText(hbTrId("txt_phob_dblist_phone_work")); landwork->setData(subTypeLandline, DetailSubType); landwork->setData(contextWork, DetailContext); landwork->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); @@ -310,19 +305,19 @@ model->appendRow(faxwork); QStandardItem *pager = new QStandardItem; - pager->setText(hbTrId("txt_phob_setlabel_val_pager")); + pager->setText(hbTrId("txt_phob_dblist_pager")); pager->setData(subTypePager, DetailSubType); pager->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); model->appendRow(pager); QStandardItem *assistant = new QStandardItem; - assistant->setText(hbTrId("txt_phob_setlabel_val_assistant")); + assistant->setText(hbTrId("txt_phob_dblist_assistant")); assistant->setData(subTypeAssistant, DetailSubType); assistant->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); model->appendRow(assistant); QStandardItem *carPhone = new QStandardItem; - carPhone->setText(hbTrId("txt_phob_setlabel_val_car")); + carPhone->setText(hbTrId("txt_phob_dblist_car")); carPhone->setData(subTypeCarPhone, DetailSubType); carPhone->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, DetailMaxLength); model->appendRow(carPhone); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnturleditormodel.cpp --- a/phonebookui/pbkcommonui/src/cnturleditormodel.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnturleditormodel.cpp Fri May 14 15:42:23 2010 +0300 @@ -22,7 +22,7 @@ CntUrlEditorModel::CntUrlEditorModel(QContact* aContact) : CntDetailEditorModel(aContact) { - QList urlList = mContact->details (); + QList urlList = mContact->details(); if (urlList.isEmpty()) { QContactUrl url; url.setSubType(QContactUrl::SubTypeHomePage); @@ -43,7 +43,7 @@ { QContactUrl url; url.setSubType(QContactUrl::SubTypeHomePage); - + appendDataFormItem( new CntDetailModelItem(url), invisibleRootItem() ); } @@ -54,9 +54,12 @@ int count(root->childCount()); for (int i(0); i < count; i++) { CntDetailModelItem* detail = static_cast (root->childAt(i)); - QContactUrl url = detail->detail(); - if (url.url().length() > 0) { - mContact->saveDetail(&url); + QContactDetail url = detail->detail(); + mContact->saveDetail( &url ); + + if ( url.value(QContactUrl::FieldUrl).isEmpty() ) + { + mContact->removeDetail( &url ); } } } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp Fri May 14 15:42:23 2010 +0300 @@ -69,8 +69,7 @@ CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); QContactUrl detail = item->detail(); - HbEditorInterface editorInterface( mEdit ); - editorInterface.setFilter( HbUrlFilter::instance() ); + mEdit->setInputMethodHints( Qt::ImhUrlCharactersOnly ); constructSubTypeModel( detail.contexts() ); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/phonebookservices/inc/cntserviceeditview.h --- a/phonebookui/phonebookservices/inc/cntserviceeditview.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntserviceeditview.h Fri May 14 15:42:23 2010 +0300 @@ -36,8 +36,8 @@ int viewId() const { return serviceEditView; } private slots: - void doContactUpdated(); - void doContactRemoved(); + void doContactUpdated(bool aSuccess); + void doContactRemoved(bool aSuccess); void doChangesDiscarded(); //public slots: diff -r de1630741fbe -r 2a11b5b00470 phonebookui/phonebookservices/inc/cntservicehandler.h --- a/phonebookui/phonebookservices/inc/cntservicehandler.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntservicehandler.h Fri May 14 15:42:23 2010 +0300 @@ -75,8 +75,8 @@ void launchAssignContactCard(QContact contact, QContactDetail detail); private: - void removeFields(QContact& contact); - void removeDetails(QContact& contact); + void removeNotSupportedFields(QContact& contact); + void removeNotSupportedDetails(QContact& contact); private: int mCurrentRequestIndex; diff -r de1630741fbe -r 2a11b5b00470 phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp --- a/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp Fri May 14 15:42:23 2010 +0300 @@ -64,7 +64,7 @@ CntServicesContact servicesContact; //get the name - servicesContact.mDisplayName = mgr->synthesizedDisplayLabel(contact); + servicesContact.mDisplayName = contact.displayLabel(); //get the phonenumber QList phonenumbers = contact.details(); diff -r de1630741fbe -r 2a11b5b00470 phonebookui/phonebookservices/src/cntserviceeditview.cpp --- a/phonebookui/phonebookservices/src/cntserviceeditview.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntserviceeditview.cpp Fri May 14 15:42:23 2010 +0300 @@ -22,8 +22,8 @@ CntServiceEditView::CntServiceEditView(CntServiceHandler *aServiceHandler ) : CntEditView(), mServiceHandler(aServiceHandler) { - connect( this, SIGNAL(contactUpdated()), this, SLOT(doContactUpdated()) ); - connect( this, SIGNAL(contactRemoved()), this, SLOT(doContactRemoved()) ); + connect( this, SIGNAL(contactUpdated(bool)), this, SLOT(doContactUpdated(bool)) ); + connect( this, SIGNAL(contactRemoved(bool)), this, SLOT(doContactRemoved(bool)) ); connect( this, SIGNAL(changesDiscarded()), this, SLOT(doChangesDiscarded()) ); } @@ -31,16 +31,18 @@ { } -void CntServiceEditView::doContactUpdated() +void CntServiceEditView::doContactUpdated(bool aSuccess) { connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); - mServiceHandler->completeEdit(1); + int retValue = aSuccess ? 1 : 0; + mServiceHandler->completeEdit(retValue); } -void CntServiceEditView::doContactRemoved() +void CntServiceEditView::doContactRemoved(bool aSuccess) { connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); - mServiceHandler->completeEdit(-1); + int retValue = aSuccess ? -1 : 0; + mServiceHandler->completeEdit(retValue); } void CntServiceEditView::doChangesDiscarded() diff -r de1630741fbe -r 2a11b5b00470 phonebookui/phonebookservices/src/cntservicehandler.cpp --- a/phonebookui/phonebookservices/src/cntservicehandler.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicehandler.cpp Fri May 14 15:42:23 2010 +0300 @@ -24,6 +24,7 @@ #include #include +#include /* NOTE! THIS SERVICE WILL BE RENAMED TO com.nokia.services.phonebook.Services */ CntServiceHandler::CntServiceHandler(QObject *parent): @@ -33,23 +34,22 @@ publishAll(); // Definition names supported in symbian back-end - QString def("%1"); - m_definitionNames << def.arg(QContactName::DefinitionName); - m_definitionNames << def.arg(QContactNickname::DefinitionName); - m_definitionNames << def.arg(QContactPhoneNumber::DefinitionName); - m_definitionNames << def.arg(QContactEmailAddress::DefinitionName); - m_definitionNames << def.arg(QContactAddress::DefinitionName); - m_definitionNames << def.arg(QContactUrl::DefinitionName); - m_definitionNames << def.arg(QContactBirthday::DefinitionName); - m_definitionNames << def.arg(QContactOrganization::DefinitionName); - m_definitionNames << def.arg(QContactSyncTarget::DefinitionName); - m_definitionNames << def.arg(QContactNote::DefinitionName); - m_definitionNames << def.arg(QContactFamily::DefinitionName); - m_definitionNames << def.arg(QContactAvatar::DefinitionName); - m_definitionNames << def.arg(QContactAnniversary::DefinitionName); - m_definitionNames << def.arg(QContactGeoLocation::DefinitionName); - m_definitionNames << def.arg(QContactGender::DefinitionName); - m_definitionNames << def.arg(QContactOnlineAccount::DefinitionName); + 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() @@ -145,39 +145,35 @@ // Use the resulting document(s)... QVersitContactImporter importer; QList versitDocuments = reader.results(); - if(versitDocuments.count() > 0) - { - contact = importer.importContacts(versitDocuments).first(); - } + if (versitDocuments.count() > 0 + && importer.importDocuments(versitDocuments)) + { + QList contacts = importer.contacts(); + if (contacts.count() > 0) + contact = contacts.first(); + } file.close(); - // Save photo to image file - // image file used in phonebook to generate thumbnail - QList details = contact.details(); - if (details.count() > 0) + // Save thumbnail images + QList details = contact.details(); + for (int i = 0;i < details.count();i++) + { + if (!details.at(i).thumbnail().isNull()) { - for (int i = 0;i < details.count();i++) + QString imagepath; + QPixmap pixmap = QPixmap::fromImage(details.at(i).thumbnail()); + if (imageUtility.createImage(pixmap,imagepath)) { - if (details.at(i).subType() == QContactAvatar::SubTypeImage) - { - if(!details.at(i).pixmap().isNull()) - { - int err; - QString imagepath; - QPixmap pixmap(details.at(i).pixmap()); - if(imageUtility.createImage(pixmap,imagepath,err)) - { - // Update contact detail - QContactAvatar detail=details.at(i); - detail.setAvatar(imagepath); - contact.saveDetail(&detail); - } - } - } + // Update contact detail + QContactAvatar detail=details.at(i); + detail.setImageUrl(imagepath); + contact.saveDetail(&detail); } } - removeDetails(contact); - removeFields(contact); + } + + removeNotSupportedDetails(contact); + removeNotSupportedFields(contact); emit launchEditor(contact); mCurrentRequestIndex = setCurrentRequestAsync(); @@ -186,245 +182,85 @@ /* * Remove details not supported in symbian back-end. */ -void CntServiceHandler::removeDetails(QContact& contact) +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::removeFields(QContact& contact) +void CntServiceHandler::removeNotSupportedFields(QContact& contact) { - // Replace 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() == QContactBirthday::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactBirthday saveBod; - QContactBirthday bodDetail = static_cast(detail); - - if(!bodDetail.date().isNull()) - saveBod.setDate(bodDetail.date()); - - contact.removeDetail(&bodDetail); - contact.saveDetail(&saveBod); - } - else if(detail.definitionName() == QContactNickname::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactNickname saveName; - QContactNickname nameDetail = static_cast(detail); - - if(!nameDetail.nickname().isEmpty()) - saveName.setNickname(nameDetail.nickname()); - - contact.removeDetail(&nameDetail); - contact.saveDetail(&saveName); - } - else if(detail.definitionName() == QContactNote::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactNote saveNote; - QContactNote noteDetail = static_cast(detail); - - if(!noteDetail.note().isEmpty()) - saveNote.setNote(noteDetail.note()); - - contact.removeDetail(¬eDetail); - contact.saveDetail(&saveNote); - } - else if(detail.definitionName() == QContactOrganization::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactOrganization saveOrg; - QContactOrganization orgDetail = static_cast(detail); - - if(!orgDetail.name().isEmpty()) - saveOrg.setName(orgDetail.name()); - if(!orgDetail.title().isEmpty()) - saveOrg.setTitle(orgDetail.title()); - if(!orgDetail.assistantName().isEmpty()) - saveOrg.setAssistantName(orgDetail.assistantName()); - if(!orgDetail.department().isEmpty()) - saveOrg.setDepartment(orgDetail.department()); - - if(orgDetail.contexts().size() > 0 - && (orgDetail.contexts().contains(QContactDetail::ContextHome) - || orgDetail.contexts().contains(QContactDetail::ContextWork))) - { - saveOrg.setContexts(orgDetail.contexts()); - } - - contact.removeDetail(&orgDetail); - contact.saveDetail(&saveOrg); - } - else if(detail.definitionName() == QContactAddress::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactAddress saveAddr; + if (detail.definitionName() == QContactAddress::DefinitionName) + { QContactAddress addrDetail = static_cast(detail); - if(!addrDetail.street().isEmpty()) - saveAddr.setStreet(addrDetail.street()); - if(!addrDetail.locality().isEmpty()) - saveAddr.setLocality(addrDetail.locality()); - if(!addrDetail.region().isEmpty()) - saveAddr.setRegion(addrDetail.region()); - if(!addrDetail.postcode().isEmpty()) - saveAddr.setPostcode(addrDetail.postcode()); - if(!addrDetail.country().isEmpty()) - saveAddr.setCountry(addrDetail.country()); - if(!addrDetail.postOfficeBox().isEmpty()) - saveAddr.setPostOfficeBox(addrDetail.postOfficeBox()); - - if(addrDetail.contexts().size() > 0 - && (addrDetail.contexts().contains(QContactDetail::ContextHome) - || addrDetail.contexts().contains(QContactDetail::ContextWork))) - { - saveAddr.setContexts(addrDetail.contexts()); - } - - contact.removeDetail(&addrDetail); - contact.saveDetail(&saveAddr); - } - else if(detail.definitionName() == QContactAnniversary::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactAnniversary saveAnniv; + // Sub-types not supported + if (detail.removeValue(QContactAddress::FieldSubTypes)) + contact.saveDetail(&detail); + } + else if (detail.definitionName() == QContactAnniversary::DefinitionName) + { QContactAnniversary annivDetail = static_cast(detail); - if(!annivDetail.originalDate().isNull()) - saveAnniv.setOriginalDate(annivDetail.originalDate()); - if(!annivDetail.event().isEmpty()) - saveAnniv.setEvent(annivDetail.event()); - - contact.removeDetail(&annivDetail); - contact.saveDetail(&saveAnniv); - } - else if(detail.definitionName() == QContactGender::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactGender saveGender; - QContactGender genderDetail = static_cast(detail); - - if(!genderDetail.gender().isEmpty()) - saveGender.setGender(genderDetail.gender()); + // Sub-types not supported + if (detail.removeValue(QContactAnniversary::FieldSubType)) + contact.saveDetail(&detail); - contact.removeDetail(&genderDetail); - contact.saveDetail(&saveGender); - } - else if(detail.definitionName() == QContactGeoLocation::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactGeoLocation saveGeo; - QContactGeoLocation geoDetail = static_cast(detail); - - QString latitude,longitude; - latitude.setNum(geoDetail.latitude()); - longitude.setNum(geoDetail.longitude()); - - if(!latitude.isEmpty()) - saveGeo.setLatitude(geoDetail.latitude()); - if(!longitude.isEmpty()) - saveGeo.setLongitude(geoDetail.longitude()); - - if(geoDetail.contexts().size() > 0 - && (geoDetail.contexts().contains(QContactDetail::ContextHome) - || geoDetail.contexts().contains(QContactDetail::ContextWork))) - { - saveGeo.setContexts(geoDetail.contexts()); - } - - contact.removeDetail(&geoDetail); - contact.saveDetail(&saveGeo); - } - else if(detail.definitionName() == QContactPhoneNumber::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactPhoneNumber savePhone; + // Context not supported + if (detail.removeValue(QContactDetail::FieldContext)) + contact.saveDetail(&detail); + } + else if (detail.definitionName() == QContactPhoneNumber::DefinitionName) + { QContactPhoneNumber phoneDetail = static_cast(detail); - if(!phoneDetail.number().isEmpty()) - savePhone.setNumber(phoneDetail.number()); - - if(phoneDetail.subTypes().size() > 0) - savePhone.setSubTypes(phoneDetail.subTypes()); - - if(phoneDetail.contexts().size() > 0 - && (phoneDetail.contexts().contains(QContactDetail::ContextHome) - || phoneDetail.contexts().contains(QContactDetail::ContextWork))) - { - savePhone.setContexts(phoneDetail.contexts()); - } - - contact.removeDetail(&phoneDetail); - contact.saveDetail(&savePhone); + if (phoneDetail.subTypes().size() == 0) + { + // No Sub-type found, set as SubTypeMobile + phoneDetail.setSubTypes(QContactPhoneNumber::SubTypeMobile); + contact.saveDetail(&phoneDetail); } - else if(detail.definitionName() == QContactOnlineAccount::DefinitionName) + else if (phoneDetail.subTypes().size() > 0 ) { - // Not all fields are supported in symbian back-end, replace - QContactOnlineAccount saveOnlineAcc; - QContactOnlineAccount onlineAccDetail = static_cast(detail); - - if(!onlineAccDetail.accountUri().isEmpty()) - saveOnlineAcc.setAccountUri(onlineAccDetail.accountUri()); - if(!onlineAccDetail.serviceProvider().isEmpty()) - saveOnlineAcc.setServiceProvider(onlineAccDetail.serviceProvider()); - if(!onlineAccDetail.presence().isEmpty()) - saveOnlineAcc.setPresence(onlineAccDetail.presence()); - if(!onlineAccDetail.statusMessage().isEmpty()) - saveOnlineAcc.setStatusMessage(onlineAccDetail.statusMessage()); - - if(onlineAccDetail.subTypes().size() > 0) - saveOnlineAcc.setSubTypes(onlineAccDetail.subTypes()); - - if(onlineAccDetail.contexts().size() > 0 - && (onlineAccDetail.contexts().contains(QContactDetail::ContextHome) - || onlineAccDetail.contexts().contains(QContactDetail::ContextWork))) + // Sub-types not supported + if (phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeVoice) + || phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeMessagingCapable) + || phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeVideo)) { - saveOnlineAcc.setContexts(onlineAccDetail.contexts()); + // Replace as SubTypeMobile + phoneDetail.setSubTypes(QContactPhoneNumber::SubTypeMobile); + contact.saveDetail(&phoneDetail); } - - contact.removeDetail(&onlineAccDetail); - contact.saveDetail(&saveOnlineAcc); } - else if(detail.definitionName() == QContactUrl::DefinitionName) - { - // Not all fields are supported in symbian back-end, replace - QContactUrl saveUrl; + } + else if (detail.definitionName() == QContactUrl::DefinitionName) + { QContactUrl urlDetail = static_cast(detail); - if(!urlDetail.url().isEmpty()) - saveUrl.setUrl(urlDetail.url()); - QString stype=QContactUrl::SubTypeHomePage; - if(urlDetail.subType().compare(stype) == 0) - { - saveUrl.setSubType(stype); - } - - if(urlDetail.contexts().size() > 0 - && (urlDetail.contexts().contains(QContactDetail::ContextHome) - || urlDetail.contexts().contains(QContactDetail::ContextWork))) - { - saveUrl.setContexts(urlDetail.contexts()); - } - - contact.removeDetail(&urlDetail); - contact.saveDetail(&saveUrl); + 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) diff -r de1630741fbe -r 2a11b5b00470 phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp --- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp Fri May 14 15:42:23 2010 +0300 @@ -29,10 +29,10 @@ #include #include + testPbkServices::testPbkServices(HbMainWindow *aParent) { - mSndFetch=0; - mSndEdit=0; + mRequest=NULL; mMainWindow=aParent; setParent(aParent); @@ -40,139 +40,178 @@ testPbkServices::~testPbkServices() { - + if (mRequest) + { + delete mRequest; + mRequest=0; + } } void testPbkServices::launchEditorNumber() { - if (mSndEdit) - { - delete mSndEdit; - mSndEdit=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editCreateNew(QString,QString)", false); - connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); - - QString type = QContactPhoneNumber::DefinitionName; - *mSndEdit << type; - *mSndEdit << "1234567"; - - QVariant retValue; - bool res=mSndEdit->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editCreateNew(QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onEditCompleted(const QVariant&))); + + args << QContactPhoneNumber::DefinitionName.operator QVariant(); + args << "1234567"; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchEditorEmail() { - if (mSndEdit) - { - delete mSndEdit; - mSndEdit=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editCreateNew(QString,QString)", false); - connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); - - QString type = QContactEmailAddress::DefinitionName; - *mSndEdit << type; - *mSndEdit << "email@mailprovider.com"; - - QVariant retValue; - bool res=mSndEdit->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editCreateNew(QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onEditCompleted(const QVariant&))); + + args << QContactEmailAddress::DefinitionName.operator QVariant(); + args << "email@mailprovider.com"; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchEditorOnlineAccount() { - if (mSndEdit) - { - delete mSndEdit; - mSndEdit=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editCreateNew(QString,QString)", false); - connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); - - QString type = QContactOnlineAccount::DefinitionName; - *mSndEdit << type; - *mSndEdit << "account@provider.com"; - - QVariant retValue; - bool res=mSndEdit->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editCreateNew(QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onEditCompleted(const QVariant&))); + + args << QContactOnlineAccount::DefinitionName.operator QVariant(); + args << "account@provider.com"; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchEditorVCard() { - if (mSndEdit) - { - delete mSndEdit; - mSndEdit=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editCreateNew(QString)", false); - connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); - - QString filename("C:\\data\\Others\\testvcard.vcf"); - *mSndEdit << filename; - - QVariant retValue; - bool res=mSndEdit->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editCreateNew(QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onEditCompleted(const QVariant&))); + + args << "C:\\data\\Others\\testvcard.vcf"; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchUpdateEditorNumber() { - if (mSndEdit) - { - delete mSndEdit; - mSndEdit=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editUpdateExisting(QString,QString)", false); - connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); - - QString type = QContactPhoneNumber::DefinitionName; - *mSndEdit << type; - *mSndEdit << "1234567"; - - QVariant retValue; - bool res=mSndEdit->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editUpdateExisting(QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onEditCompleted(const QVariant&))); + + args << QContactPhoneNumber::DefinitionName.operator QVariant(); + args << "1234567"; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchUpdateEditorEmail() { - if (mSndEdit) - { - delete mSndEdit; - mSndEdit=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editUpdateExisting(QString,QString)", false); - connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); - - QString type = QContactEmailAddress::DefinitionName; - *mSndEdit << type; - *mSndEdit << "email@mailprovider.com"; - - QVariant retValue; - bool res=mSndEdit->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editUpdateExisting(QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onEditCompleted(const QVariant&))); + + args << QContactEmailAddress::DefinitionName.operator QVariant(); + args << "email@mailprovider.com"; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchUpdateEditorOnlineAccount() { - if (mSndEdit) - { - delete mSndEdit; - mSndEdit=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editUpdateExisting(QString,QString)", false); - connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); - - QString type = QContactOnlineAccount::DefinitionName; - *mSndEdit << type; - *mSndEdit << "account@provider.com"; - - QVariant retValue; - bool res=mSndEdit->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editUpdateExisting(QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onEditCompleted(const QVariant&))); + + args << QContactOnlineAccount::DefinitionName.operator QVariant(); + args << "account@provider.com"; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::onEditCompleted(const QVariant& value) @@ -197,84 +236,103 @@ void testPbkServices::launchFetch() { - - if (mSndFetch) - { - delete mSndFetch; - mSndFetch=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - //XQServiceRequest snd("com.nokia.services.hbserviceprovider.Dialer","dial(QString)",true); - mSndFetch = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "fetch(QString,QString,QString)",false); - connect(mSndFetch, SIGNAL(requestCompleted(QVariant)), this, SLOT(onRequestCompleted(QVariant))); - - *mSndFetch << "Non-filtered multi-fetch"; - *mSndFetch << KCntActionAll; - *mSndFetch << KCntFilterDisplayAll; - - QVariant retValue; - bool res=mSndFetch->send(retValue); - + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("fetch(QString,QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onRequestCompleted(const QVariant&))); + + args << "Non-filtered multi-fetch"; + args << KCntActionAll; + args << KCntFilterDisplayAll; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchSingleFetch() { - if (mSndFetch) - { - delete mSndFetch; - mSndFetch=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - mSndFetch = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "Dofetch(QString,QString,QString,QString)",false); - connect(mSndFetch, SIGNAL(requestCompleted(QVariant)), this, SLOT(onRequestCompleted(QVariant))); - - *mSndFetch << "Single-fetching"; - *mSndFetch << KCntActionAll; - *mSndFetch << KCntFilterDisplayAll; - *mSndFetch << KCntSingleSelectionMode; - - QVariant retValue; - bool res=mSndFetch->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("Dofetch(QString,QString,QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onRequestCompleted(const QVariant&))); + + args << "Single-fetching"; + args << KCntActionAll; + args << KCntFilterDisplayAll; + args << KCntSingleSelectionMode; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchSmsFilteredFetch() { - - if (mSndFetch) - { - delete mSndFetch; - mSndFetch=0; - } + if (mRequest) + { + delete mRequest; + mRequest=0; + } - //XQServiceRequest snd("com.nokia.services.hbserviceprovider.Dialer","dial(QString)",true); - mSndFetch = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "fetch(QString,QString,QString)",false); - connect(mSndFetch, SIGNAL(requestCompleted(QVariant)), this, SLOT(onRequestCompleted(QVariant))); - - *mSndFetch << "Filtered multi-fetch"; - *mSndFetch << KCntActionSms; - *mSndFetch << KCntFilterDisplayAll; - - QVariant retValue; - bool res=mSndFetch->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("fetch(QString,QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onRequestCompleted(const QVariant&))); + + args << "Filtered multi-fetch"; + args << KCntActionSms; + args << KCntFilterDisplayAll; + + mRequest->setArguments(args); + mRequest->send(); } void testPbkServices::launchEmailFilteredFetch() { + if (mRequest) + { + delete mRequest; + mRequest=0; + } - if (mSndFetch) - { - delete mSndFetch; - mSndFetch=0; - } - mSndFetch = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "fetch(QString,QString,QString)",false); - connect(mSndFetch, SIGNAL(requestCompleted(QVariant)), this, SLOT(onRequestCompleted(QVariant))); - - *mSndFetch << "Filtered multi-fetch"; - *mSndFetch << KCntActionEmail; - *mSndFetch << KCntFilterDisplayAll; - - QVariant retValue; - bool res=mSndFetch->send(retValue); + QVariantList args; + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("fetch(QString,QString,QString)"); + XQApplicationManager appMng; + mRequest = appMng.create(serviceName, "Fetch", operation, true); // embedded + + // Result handlers + connect (mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(onRequestCompleted(const QVariant&))); + + args << "Filtered multi-fetch"; + args << KCntActionEmail; + args << KCntFilterDisplayAll; + + mRequest->setArguments(args); + mRequest->send(); } diff -r de1630741fbe -r 2a11b5b00470 phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h --- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h Mon May 03 12:24:20 2010 +0300 +++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h Fri May 14 15:42:23 2010 +0300 @@ -22,7 +22,7 @@ #include #include //defines Q_SFW_EXPORT -#include +#include class HbMainWindow; @@ -51,9 +51,8 @@ private: - XQServiceRequest *mSndFetch; - XQServiceRequest *mSndEdit; - HbMainWindow *mMainWindow; + XQAiwRequest *mRequest; + HbMainWindow *mMainWindow; }; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiandatabase.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiandatabase.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiandatabase.h Fri May 14 15:42:23 2010 +0300 @@ -89,11 +89,11 @@ QSet groupMembersL(QContactLocalId groupId); private: - CContactDatabase* m_contactDatabase; #ifndef SYMBIAN_BACKEND_USE_SQLITE CContactChangeNotifier* m_contactChangeNotifier; #endif QContactManagerEngine *m_engine; + CContactDatabase* m_contactDatabase; QList m_contactsEmitted; QContactLocalId m_currentOwnCardId; QMap > m_groupContents; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h Fri May 14 15:42:23 2010 +0300 @@ -71,6 +71,7 @@ class QContactAbstractRequest; QTM_END_NAMESPACE class CntSymbianDatabase; +class CntSymbianSrvConnection; class CntTransformContact; class CntAbstractContactFilter; class CntAbstractContactSorter; @@ -165,16 +166,22 @@ bool cancelRequest(QContactAbstractRequest* req); bool waitForRequestProgress(QContactAbstractRequest* req, int msecs); bool waitForRequestFinished(QContactAbstractRequest* req, int msecs); + + /* Delete contact image */ + void deleteContactImage(const QString& filePath); private slots: void performAsynchronousOperation(); private: CntSymbianDatabase *m_dataBase; + CntSymbianSrvConnection *m_srvConnection; QString m_managerUri; CntTransformContact *m_transformContact; CntAbstractContactFilter *m_contactFilter; +#ifndef SYMBIAN_BACKEND_USE_SQLITE CntAbstractContactSorter *m_contactSorter; +#endif CntRelationship *m_relationship; CntDisplayLabel *m_displayLabel; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h Fri May 14 15:42:23 2010 +0300 @@ -56,6 +56,9 @@ Q_OBJECT public: + +enum SearchMethod { Undefinded, ZerosEndOfFirstToken }; +public: CntSqlSearch(); QString CreatePredictiveSearch(const QString &pattern); @@ -86,6 +89,9 @@ const QString& lower2, const QString& upper2) const; + QString TwoDifferentTokensSearch(const QString& pattern, + const QStringList& tokens) const; + QString ExactMatch(const QString& pattern, QString table = "") const; QString CreateJoinTableSearch(QString pattern, QStringList numbers) const; @@ -97,6 +103,10 @@ QString UpperLimit( const QString &pattern ) const; QString LowerLimit( const QString &pattern ) const; + + QString ChangeStringPadings( const QString &pattern ) const; + + bool TestPattern( const QString &pattern, SearchMethod searchMethod = Undefinded ) const; QString Pad( const QString &pattern, char padChar ) const; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h Fri May 14 15:42:23 2010 +0300 @@ -56,7 +56,7 @@ class CntSymbianFilter : public CntAbstractContactFilter { public: - CntSymbianFilter(QContactManagerEngine& manager, CContactDatabase& contactDatabase, const CntTransformContact &transformContact); + CntSymbianFilter(QContactManagerEngine& manager, CContactDatabase& contactDatabase, CntSymbianSrvConnection &srvConnection, const CntTransformContact &transformContact); ~CntSymbianFilter(); /* from CntAbstractContactFilter */ @@ -77,7 +77,7 @@ CContactDatabase& m_contactDatabase; CntDbInfo* m_dbInfo; const CntTransformContact &m_transformContact; - CntSymbianSrvConnection* m_srvConnection; + CntSymbianSrvConnection& m_srvConnection; QMap m_filterMap; }; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h Fri May 14 15:42:23 2010 +0300 @@ -45,6 +45,7 @@ #include #include #include +#include // User includes @@ -59,25 +60,30 @@ { public: /*Constructor and destructor*/ - CntSymbianSrvConnection(); + CntSymbianSrvConnection(QContactManagerEngine* engine); ~CntSymbianSrvConnection(); public: /* QT like functions */ QList searchContacts(const QString& searchQuery, - QContactManager::Error* error); + QContactManager::Error* error); + QContact searchContactName(QContactLocalId contactId, + QContactManager::Error* error); + QList searchAllContactNames(QContactManager::Error* error); private: /* Symbian Leaving functions */ - QList searchContactsL(const TDesC& aSearchQuery); + QList searchContactIdsL(const TDesC& aSqlQuery); + QList searchContactNamesL(const TDesC& aSqlQuery); + void readContactsToBufferL(const TDesC& aSqlQuery); void ConnectSrvL(); void OpenDatabaseL(); TVersion Version() const; TDes8& GetReceivingBufferL(TInt aSize=0); - QList UnpackCntIdArrayL(); private: /* member varibles */ + QContactManagerEngine* m_manager; CBufFlat* m_buffer; TInt m_maxBufferSize; TPtr8 m_bufPtr; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h Fri May 14 15:42:23 2010 +0300 @@ -88,6 +88,7 @@ Address, URL, OnlineAccount, + Presence, Birthday, Organisation, Avatar, diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h Fri May 14 15:42:23 2010 +0300 @@ -50,16 +50,6 @@ class CntTransformOnlineAccount : public CntTransformContactData { - enum TPresnceMap - { - EPresenceOffline, - EPresenceAvailable, - EPresenceHidden, - EPresenceBusy, - EPresenceAway, - EPresenceExtendedAway, - EPresenceUnknown - }; public: CntTransformOnlineAccount(); @@ -75,10 +65,6 @@ void reset(); private: - quint32 encodePresence(QString aPresence); - QString decodePresence(quint32 aPresence); - -private: quint32 m_detailCounter; }; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformpresence.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformpresence.h Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifdef SYMBIAN_BACKEND_USE_SQLITE + +#ifndef TRANSFORMPRESENCE_H +#define TRANSFORMPRESENCE_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformPresence : public CntTransformContactData +{ +public: + CntTransformPresence(); + +protected: + QList transformDetailL(const QContactDetail &detail); + QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); + bool supportsField(TUint32 fieldType) const; + bool supportsDetail(QString detailName) const; + QList supportedSortingFieldTypes(QString detailFieldName) const; + bool supportsSubType(const QString& subType) const; + quint32 getIdForField(const QString& fieldName) const; + void detailDefinitions(QMap &definitions, const QString& contactType) const; + void reset(); + +private: + QContactPresence::PresenceState decodePresence(QString presence); + +private: + quint32 m_detailCounter; +}; + +#endif // TRANSFORMPRESENCE_H + +#endif // SYMBIAN_BACKEND_USE_SQLITE diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Fri May 14 15:42:23 2010 +0300 @@ -40,12 +40,17 @@ ****************************************************************************/ #include #include +#include #include #include #include +#include +#include + #include +#include #include "cntsymbianengine.h" #include "qcontactchangeset.h" @@ -57,10 +62,13 @@ #include "cntsymbiansorterdbms.h" #include "cntrelationship.h" #include "cntdisplaylabel.h" +#include "cntsymbiansrvconnection.h" typedef QList QContactLocalIdList; typedef QPair QOwnCardPair; +const char* CNT_IMAGES_FOLDER = "Data\\20022EF9\\"; + // NOTE: There is a bug with RVCT compiler which causes the local stack // variable to corrupt if the called function leaves. As a workaround we are // reserving the objects from heap so it will not get corrupted. @@ -79,17 +87,18 @@ *error = QContactManager::NoError; m_dataBase = new CntSymbianDatabase(this, error); - - //Database opened successfully - if(*error == QContactManager::NoError) { + + // Database opened successfully + if (*error == QContactManager::NoError) { m_managerUri = QContactManager::buildUri(CNT_SYMBIAN_MANAGER_NAME, parameters); m_transformContact = new CntTransformContact; + m_srvConnection = new CntSymbianSrvConnection(this); #ifdef SYMBIAN_BACKEND_USE_SQLITE - m_contactFilter = new CntSymbianFilter(*this, *m_dataBase->contactDatabase(), *m_transformContact); + m_contactFilter = new CntSymbianFilter(*this, *m_dataBase->contactDatabase(), *m_srvConnection, *m_transformContact); #else m_contactFilter = new CntSymbianFilter(*m_dataBase->contactDatabase()); + m_contactSorter = new CntSymbianSorterDbms(*m_dataBase->contactDatabase(), *m_transformContact); #endif - m_contactSorter = new CntSymbianSorterDbms(*m_dataBase->contactDatabase(), *m_transformContact); m_relationship = new CntRelationship(m_dataBase->contactDatabase(), m_managerUri); m_displayLabel = new CntDisplayLabel(); } @@ -99,8 +108,11 @@ { delete m_contactFilter; // needs to be deleted before database delete m_dataBase; + delete m_srvConnection; delete m_transformContact; +#ifndef SYMBIAN_BACKEND_USE_SQLITE delete m_contactSorter; +#endif delete m_relationship; delete m_displayLabel; } @@ -120,7 +132,7 @@ bool filterSupported(true); result = m_contactFilter->contacts(filter, sortOrders, filterSupported, error); - + #ifdef SYMBIAN_BACKEND_USE_SQLITE // Remove possible false positives @@ -150,48 +162,24 @@ return result; } -#if 0 -// These functions are not used anymore - there is always a filter (which may be the default filter) -QList CntSymbianEngine::contactIds(const QList& sortOrders, QContactManager::Error* error) const -{ - // Check if sorting is supported by backend - if(m_contactSorter->sortOrderSupported(sortOrders)) - return m_contactSorter->contacts(sortOrders,error); - - // Backend does not support this sorting. - // Fall back to slow QContact-level sorting method. - - // Get unsorted contact ids - QList noSortOrders; - QList unsortedIds = m_contactSorter->contacts(noSortOrders, error); - if (*error != QContactManager::NoError) - return QList(); - - // Sort contacts - return slowSort(unsortedIds, sortOrders, error); -} - -QList CntSymbianEngine::contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error* error) const -{ - *error = QContactManager::NoError; - QList contacts; - QList contactIds = this->contactIds(sortOrders, error); - if (*error == QContactManager::NoError ) { - foreach (QContactLocalId id, contactIds) { - QContact contact = this->contact(id, definitionRestrictions, error); - if (*error != QContactManager::NoError) { - return QList(); // return empty list if error occurred - } - contacts.append(contact); - } - } - return contacts; -} -#endif - QList CntSymbianEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fh, QContactManager::Error* error) const { *error = QContactManager::NoError; + + // special case: use optimized fetch if + // * only display labels are requested + // * the filter is a detail filter for QContactType's TypeContact + // * there are no sort orders + QStringList detailRestrictions = fh.detailDefinitionsHint(); + if (detailRestrictions.count() == 1 && + detailRestrictions.at(0) == QContactDisplayLabel::DefinitionName && + filter.type() == QContactFilter::ContactDetailFilter && + QContactDetailFilter(filter).detailDefinitionName() == QContactType::DefinitionName && + QContactDetailFilter(filter).value().toString() == QContactType::TypeContact && + sortOrders.isEmpty()) { + return m_srvConnection->searchAllContactNames(error); + } + QList contacts; QList contactIds = this->contactIds(filter, sortOrders, error); if (*error == QContactManager::NoError ) { @@ -203,6 +191,7 @@ contacts.append(contact); } } + return contacts; } @@ -216,8 +205,15 @@ */ QContact CntSymbianEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { + // special case: use optimized fetch if only display label is requested + QStringList detailRestrictions = fetchHint.detailDefinitionsHint(); + if (detailRestrictions.count() == 1 && + detailRestrictions.at(0) == QContactDisplayLabel::DefinitionName) { + return m_srvConnection->searchContactName(contactId, error); + } + QContact* contact = new QContact(); - TRAPD(err, *contact = fetchContactL(contactId, fetchHint.detailDefinitionsHint())); + TRAPD(err, *contact = fetchContactL(contactId, detailRestrictions)); CntSymbianTransformError::transformError(err, error); if(*error == QContactManager::NoError) { @@ -567,6 +563,20 @@ TContactItemId cId = static_cast(id); //TODO: add code to remove all relationships. + + // Read the contact from the CContactDatabase + CContactItem* contactItem = m_dataBase->contactDatabase()->ReadContactL(cId); + CleanupStack::PushL(contactItem); + QContact contact = m_transformContact->transformContactL(*contactItem); + + // Delete contact images + QList details = contact.details(); + for (int i = 0;i < details.count();i++) { + if (!details.at(i).imageUrl().isEmpty()) { + deleteContactImage(details.at(i).imageUrl().toString()); + } + } + CleanupStack::PopAndDestroy(contactItem); m_dataBase->contactDatabase()->DeleteContactL(cId); #ifdef SYMBIAN_BACKEND_S60_VERSION_32 @@ -732,6 +742,42 @@ return returnValue; } +void CntSymbianEngine::deleteContactImage(const QString& filePath) +{ + RFs fsSession; + int drive; + int err = KErrNone; + + // Connect to file session + err= fsSession.Connect(); + if(err!=KErrNone) + return; + + // Get the drive/volume details + TVolumeInfo vInfo; + err = DriveInfo::GetDefaultDrive(DriveInfo::EDefaultMassStorage, drive); + if (KErrNone==err) { + err = fsSession.Volume(vInfo, drive); + } + + // Delete image saved in contacts images folder + // Folder :/Data/20022EF9 + if(KErrNone==err) { + // Get the root path + TFileName tPath; + PathInfo::GetRootPath(tPath, drive); + QString basePath = QString::fromUtf16(tPath.Ptr(), tPath.Length()); + + QDir dir(basePath); + if (dir.cd(CNT_IMAGES_FOLDER)) { + basePath=QDir::toNativeSeparators(dir.path()); + if(filePath.startsWith(basePath)) { + dir.remove(filePath); + } + } + } + fsSession.Close(); +} QMap CntSymbianEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const { diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp Fri May 14 15:42:23 2010 +0300 @@ -150,7 +150,7 @@ // Default sort order QString col; if(s.caseSensitivity() == Qt::CaseInsensitive) - col= ' ' + columnName + ' ' + "COLLATE NOCASE ASC"; + col= ' ' + columnName + ' ' + "COLLATE CompareC3"; else col= ' ' + columnName + ' ' + "ASC"; list.append(col); diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp Fri May 14 15:42:23 2010 +0300 @@ -41,6 +41,8 @@ #include #include "cntsqlsearch.h" +#include +#include const char KLimitLength = 15; const int KTwoTokens = 2; @@ -48,6 +50,7 @@ const char KLowerLimitPadding = '0'; const char KUpperLimitPadding = 'F'; const int KMinimumSearchPatternLength = 1; +const int KHexadecimalBase = 16; #define ORDER_BY_FIRSTNAME_LASTNAME " ORDER BY first_name, last_name ASC;" @@ -62,6 +65,13 @@ const QString KColumn3 = "nbr3"; const QString KColumn4 = "nbr4"; +// Special handling for characters that originate from * and # keys +const QChar KStarChar('*'); +const QChar KPlusChar('+'); +const QChar KPChar('p'); +const QChar KWChar('w'); +const QChar KHashChar('#'); + CntSqlSearch::CntSqlSearch() { @@ -100,15 +110,16 @@ QString CntSqlSearch::CreatePredictiveSearch(const QString &pattern) { int len = pattern.length(); + QString newPattern = ChangeStringPadings(pattern); // For best performance, handle 1 digit case first if (len == KMinimumSearchPatternLength) { // Case 1 - return SELECT_CONTACT_ID + SelectTable(pattern) + ORDER_BY_FIRSTNAME_LASTNAME; + return SELECT_CONTACT_ID + SelectTable(newPattern) + ORDER_BY_FIRSTNAME_LASTNAME; } if (len <= KLimitLength && len > KMinimumSearchPatternLength) { - return CreateQuery(pattern); + return CreateQuery(newPattern); } return QString(""); // Invalid pattern @@ -116,68 +127,86 @@ QString CntSqlSearch::SelectTable(const QString &pattern) const { - QString predictivesearch; - if (pattern.length() == 0) - { - return ""; - } - switch (pattern.at(0).digitValue()) - { - case 0: - { - predictivesearch = QString("predictivesearch0"); - } - break; - case 1: + QString predictivesearch; + QStringList tokens = GetTokens(pattern); + bool ok; + if (pattern.length() == 0) + { + return ""; + } + QString firstNumber(pattern.at(0)); + uint hex = firstNumber.toUInt(&ok, 16); + if (!ok) { - predictivesearch = QString("predictivesearch1"); - } - break; - case 2: - { - predictivesearch = QString("predictivesearch2"); - } - break; - case 3: - { - predictivesearch = QString("predictivesearch3"); - } - break; - case 4: - { - predictivesearch = QString("predictivesearch4"); + // TODO: handle error (=invalid characters in pattern) } - break; - case 5: + switch (hex) { - predictivesearch = QString("predictivesearch5"); - } - break; - case 6: - { - predictivesearch = QString("predictivesearch6"); - } - break; - case 7: - { - predictivesearch = QString("predictivesearch7"); + case 0: + { + predictivesearch = QString("predictivesearch0"); + } + break; + case 1: + { + predictivesearch = QString("predictivesearch1"); + } + break; + case 2: + { + predictivesearch = QString("predictivesearch2"); + } + break; + case 3: + { + predictivesearch = QString("predictivesearch3"); + } + break; + case 4: + { + predictivesearch = QString("predictivesearch4"); + } + break; + case 5: + { + predictivesearch = QString("predictivesearch5"); + } + break; + case 6: + { + predictivesearch = QString("predictivesearch6"); + } + break; + case 7: + { + predictivesearch = QString("predictivesearch7"); + } + break; + case 8: + { + predictivesearch = QString("predictivesearch8"); + } + break; + case 9: + { + predictivesearch = QString("predictivesearch9"); + } + break; + case 10: + { + predictivesearch = QString("predictivesearch10"); + } + break; + case 11: + { + predictivesearch = QString("predictivesearch11"); + } + break; + default: // error + predictivesearch = ""; + break; } - break; - case 8: - { - predictivesearch = QString("predictivesearch8"); - } - break; - case 9: - { - predictivesearch = QString("predictivesearch9"); - } - break; - default: // error - predictivesearch = ""; - break; - } - return predictivesearch; + return predictivesearch; } // Even if there are over 2 tokens, make 2 tokens. @@ -186,7 +215,7 @@ // E.g. "0010230" results tokens "001" and "230" and // "001230045067800900" tokens "00123" and "45067800900". QStringList CntSqlSearch::GetTokens(const QString& pattern) const - { + { const QChar KZero('0'); QStringList tokens = pattern.split(KZero, QString::SkipEmptyParts); if (tokens.count() < KTwoTokens) @@ -212,17 +241,17 @@ } twoTokens.append(pattern.mid(i)); return twoTokens; - } + } // pattern length is between KMinimumSearchPatternLength...KLimitLength QString CntSqlSearch::CreateQuery(const QString& pattern) const { - QStringList tokens = GetTokens(pattern); + QStringList tokens = GetTokens(pattern); if (tokens.count() < KTwoTokens) { - if( tokens.count() == KOneToken && !tokens.at(0).contains("0") && !pattern.startsWith('0') && pattern.endsWith('0')) + if( TestPattern(pattern, CntSqlSearch::ZerosEndOfFirstToken)) { - return IdenticalTokensSearch(pattern, tokens) + Order(tokens); // Case 6 + return TwoDifferentTokensSearch(pattern, tokens); // Case 6 } else { @@ -316,7 +345,7 @@ // and Y means: (value > lower-limit-2 AND value < upper-limit-2) QString CntSqlSearch::SearchTokensFromOneTable(const QString& pattern, const QStringList& tokens) const - { + { QString token = tokens.at(0); QString lower = LowerLimit(token); QString upper = UpperLimit(token); @@ -363,6 +392,26 @@ return query; } + +QString CntSqlSearch::TwoDifferentTokensSearch(const QString& pattern, const QStringList& tokens) const + { + QString token = tokens.at(0); + QString sortPatern = pattern; + sortPatern.truncate(pattern.length()-1); +#if defined(USE_DEMORGAN) + QString query(SELECT_CONTACT_ID + SelectTable(pattern) + " WHERE NOT(NOT" + + ExactMatch(sortPatern) + + " AND NOT" + ExactMatch(pattern) + ")"); +#else + QString query(SELECT_CONTACT_ID + SelectTable(pattern) + " WHERE (" + + ExactMatch(sortPatern) + // exact match (e.g. "2") + ") OR " + ExactMatch(pattern)); // exact match (e.g. "20") +#endif + query += Order(tokens); + return query; + } + + // Put individual AND / OR operations in such order that in most cases there is // no need to evaluate all arguments of the AND / OR. // In case of AND, put the less likely condition on the left side of AND. @@ -547,24 +596,27 @@ } QString CntSqlSearch::ExactMatchColumns(QStringList numbers) const - { - - QString firstColumn = numbers.at(0); - QString secondColumn = numbers.at(1); + { + const int KFirstColumn = 0; + const int KSecondColumn = 1; + QString firstColumn = numbers.at(KFirstColumn); + QString secondColumn = numbers.at(KSecondColumn); - if( firstColumn.count() > 1 && secondColumn.count() > 1) - { - return "(" + ExactMatch(numbers.at(0), SelectTable(numbers.at(0))) + " AND " + ExactMatch(numbers.at(1), SelectTable(numbers.at(1))) + ")"; - } - else if(firstColumn.count() > 1) - { - return ExactMatch(numbers.at(0), SelectTable(numbers.at(0))); - } - else - { - return ExactMatch(numbers.at(1), SelectTable(numbers.at(1))); - } + if( firstColumn.count() > 1 && secondColumn.count() > 1) + { + return "(" + ExactMatch(numbers.at(KFirstColumn), SelectTable(numbers.at(KFirstColumn))) + + " AND " + + ExactMatch(numbers.at(KSecondColumn), SelectTable(numbers.at(KSecondColumn))) + ")"; } + else if(firstColumn.count() > 1) + { + return ExactMatch(numbers.at(KFirstColumn), SelectTable(numbers.at(KFirstColumn))); + } + else + { + return ExactMatch(numbers.at(KSecondColumn), SelectTable(numbers.at(KSecondColumn))); + } + } QString CntSqlSearch::Order(QStringList tokens) const { @@ -576,6 +628,46 @@ return QString(ORDER_BY_FIRSTNAME_LASTNAME); } +QString CntSqlSearch::ChangeStringPadings( const QString &pattern ) const + { + QString newPattern = pattern; + if (QLocale::system().language() == QLocale::Thai) + { + newPattern.remove(KStarChar, Qt::CaseInsensitive); + newPattern.remove(KPlusChar, Qt::CaseInsensitive); + newPattern.remove(KPChar, Qt::CaseInsensitive); + newPattern.remove(KWChar, Qt::CaseInsensitive); + newPattern.remove(KHashChar, Qt::CaseInsensitive); + } + else + { + newPattern.replace(KStarChar, 'A'); + newPattern.replace(KPlusChar, 'A'); + newPattern.replace(KPChar, 'A'); + newPattern.replace(KWChar, 'A'); + newPattern.replace(KHashChar, 'B'); + } + return newPattern; + } + +bool CntSqlSearch::TestPattern( const QString &pattern, SearchMethod searchMethod ) const + { + QStringList tokens = GetTokens(pattern); + if (!tokens.isEmpty() && !pattern.isEmpty()) + { + if (CntSqlSearch::ZerosEndOfFirstToken == searchMethod) + { + if( tokens.count() == KOneToken && !tokens.at(0).contains("0") + && !pattern.startsWith('0') && pattern.count('0') == 1 + && pattern.endsWith('0')) + { + return true; + } + } + } + return false; + } + QString CntSqlSearch::Pad( const QString &pattern, char padChar ) const { int padCount = KLimitLength - pattern.length(); @@ -592,7 +684,6 @@ result.append(padChar); } } - const int KHexadecimalBase = 16; bool ok; // Use signed int to prevent underflow when replaced is "00...00" qint64 value = result.toLongLong(&ok, KHexadecimalBase); diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp Fri May 14 15:42:23 2010 +0300 @@ -61,37 +61,31 @@ #include -CntSymbianFilter::CntSymbianFilter(QContactManagerEngine& /*manager*/, CContactDatabase& contactDatabase, const CntTransformContact &transformContact): +CntSymbianFilter::CntSymbianFilter(QContactManagerEngine& /*manager*/, CContactDatabase& contactDatabase, CntSymbianSrvConnection &srvConnection, const CntTransformContact &transformContact): m_contactDatabase(contactDatabase), - m_transformContact(transformContact) + m_transformContact(transformContact), + m_srvConnection(srvConnection) { - m_srvConnection = new CntSymbianSrvConnection(); m_dbInfo = new CntDbInfo(); initializeFilters(); - } void CntSymbianFilter::initializeFilters() - { - m_filterMap.insert(QContactFilter::ContactDetailFilter, new CntFilterDetail(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::DefaultFilter, new CntFilterDefault(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::IntersectionFilter, new CntFilterIntersection(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::UnionFilter, new CntFilterUnion(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::RelationshipFilter, new CntFilterRelationship(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::InvalidFilter, new CntFilterInvalid(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::ContactDetailRangeFilter, new CntFilterdetailrange(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::ChangeLogFilter, new CntFilterChangeLog(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::ActionFilter, new CntFilterAction(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - m_filterMap.insert(QContactFilter::LocalIdFilter, new CntFilterLocalId(m_contactDatabase,*m_srvConnection,*m_dbInfo)); - - } - - +{ + m_filterMap.insert(QContactFilter::ContactDetailFilter, new CntFilterDetail(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::DefaultFilter, new CntFilterDefault(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::IntersectionFilter, new CntFilterIntersection(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::UnionFilter, new CntFilterUnion(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::RelationshipFilter, new CntFilterRelationship(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::InvalidFilter, new CntFilterInvalid(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::ContactDetailRangeFilter, new CntFilterdetailrange(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::ChangeLogFilter, new CntFilterChangeLog(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::ActionFilter, new CntFilterAction(m_contactDatabase,m_srvConnection,*m_dbInfo)); + m_filterMap.insert(QContactFilter::LocalIdFilter, new CntFilterLocalId(m_contactDatabase,m_srvConnection,*m_dbInfo)); +} CntSymbianFilter::~CntSymbianFilter() { - - //delete the all filters from the map QMap::iterator itr; @@ -102,7 +96,6 @@ value = 0; } - delete m_srvConnection; delete m_dbInfo; } diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp Fri May 14 15:42:23 2010 +0300 @@ -41,6 +41,9 @@ //system includes #include #include +#include +#include +#include //user includes #include "cntsymbiansrvconnection.h" @@ -48,7 +51,7 @@ // Constants // To be removed. Should be defined in a header file -#define KCntSearchResultIdLists 99 +#define KCntSearchResultList 99 #define KCntOpenDataBase 100 // = KCapabilityReadUserData _LIT(KCntServerExe,"CNTSRV.EXE"); // Name of the exe for the Contacts server. @@ -69,7 +72,8 @@ /*! * The constructor */ -CntSymbianSrvConnection::CntSymbianSrvConnection() : +CntSymbianSrvConnection::CntSymbianSrvConnection(QContactManagerEngine* manager) : + m_manager(manager), m_buffer(0), m_bufPtr(0,0,0), m_isInitialized(false) @@ -93,22 +97,140 @@ * \return the list of matched contact ids */ QList CntSymbianSrvConnection::searchContacts(const QString& sqlQuery, - QContactManager::Error* error) + QContactManager::Error* error) { QList list; TPtrC queryPtr(reinterpret_cast(sqlQuery.utf16())); - TRAPD(err, list = searchContactsL(queryPtr)); + TRAPD(err, list = searchContactIdsL(queryPtr)); + CntSymbianTransformError::transformError(err, error); + return list; +} + +/*! + * Fetches all contact names from the database. If there are more than 3000 contacts, + * only the first (by id) 3000 contacts will be fetched due to RAM restrictions. + * + * \a error On return, contains the possible error. + * \return the list of contact names (stored in QContact objects) + */ +QList CntSymbianSrvConnection::searchAllContactNames(QContactManager::Error* error) +{ + QList list; + TRAPD(err, list = searchContactNamesL(_L("SELECT contact_id, first_name, last_name, company_name FROM contact WHERE (type_flags>>24)=0"))); CntSymbianTransformError::transformError(err, error); return list; } /*! + * Query the SQL database + * + * \a id Id of the contact whose name to search + * \a error On return, contains the possible error. + * \return the list of matched contact ids + */ +QContact CntSymbianSrvConnection::searchContactName(QContactLocalId id, + QContactManager::Error* error) +{ + QList list; + + // Fetch results from the server + TBuf<100> sqlQuery; + sqlQuery.Format(_L("SELECT contact_id, first_name, last_name, company_name FROM contact WHERE contact_id = %d"), id); + TRAPD(err, list = searchContactNamesL(sqlQuery)); + CntSymbianTransformError::transformError(err, error); + + if (list.size() == 0) { + *error = QContactManager::DoesNotExistError; + return QContact(); + } + + return list.at(0); +} + +/*! + * The leaving function that queries the SQL database + * + * \a aSqlQuery An SQL query + * \return the list of matched contact ids + */ +QList CntSymbianSrvConnection::searchContactIdsL(const TDesC& aSqlQuery) +{ + readContactsToBufferL(aSqlQuery); + + RBufReadStream readStream; + QList list; + TInt item; + + readStream.Open(*m_buffer); + while ((item = readStream.ReadInt32L()) != 0) { + list << item; + } + + return list; +} + +/*! * The leaving function that queries the SQL database * * \a aSqlQuery An SQL query * \return the list of matched contact ids */ -QList CntSymbianSrvConnection::searchContactsL(const TDesC& aSqlQuery) +QList CntSymbianSrvConnection::searchContactNamesL(const TDesC& aSqlQuery) +{ + readContactsToBufferL(aSqlQuery); + + RBufReadStream readStream; + QList contacts; + TInt id; + TBuf<256> firstName; + TBuf<256> lastName; + TBuf<256> company; + + readStream.Open(*m_buffer); + while ((id = readStream.ReadInt32L()) != 0) { + readStream >> firstName; + readStream >> lastName; + readStream >> company; + + QContact contact, tempContact; + + QContactName name; + name.setFirstName(QString::fromUtf16(firstName.Ptr(), firstName.Length())); + name.setLastName(QString::fromUtf16(lastName.Ptr(), lastName.Length())); + tempContact.saveDetail(&name); + + QContactOrganization organization; + organization.setName(QString::fromUtf16(company.Ptr(), company.Length())); + tempContact.saveDetail(&organization); + + QContactManager::Error error(QContactManager::NoError); + QString label = m_manager->synthesizedDisplayLabel(tempContact, &error); + if (error != QContactManager::NoError) { + continue; + } + tempContact.clearDetails(); + + m_manager->setContactDisplayLabel(&contact, label); + + QContactId contactId; + contactId.setLocalId(id); + contactId.setManagerUri(m_manager->managerUri()); + contact.setId(contactId); + + contacts << contact; + } + + return contacts; +} + + +/*! + * The leaving function that queries the SQL database + * + * \a id database id of the contact + * \return the list of matched contact names + */ +void CntSymbianSrvConnection::readContactsToBufferL(const TDesC& sqlQuery) { // Initialize connection if it is not initialized yet. if (!m_isInitialized) { @@ -116,24 +238,20 @@ OpenDatabaseL(); m_isInitialized = true; } - - // Fetch results from the server + TIpcArgs args; args.Set(0, &GetReceivingBufferL()); - args.Set(1, &aSqlQuery); - TInt newBuffSize = SendReceive(KCntSearchResultIdLists, args); + args.Set(1, &sqlQuery); + TInt newBuffSize = SendReceive(KCntSearchResultList, args); User::LeaveIfError(newBuffSize); - if (newBuffSize > 0) - { + if (newBuffSize > 0) { args.Set(0, &GetReceivingBufferL(newBuffSize)); - args.Set(1,&aSqlQuery); - User::LeaveIfError(newBuffSize = SendReceive(KCntSearchResultIdLists, args)); - } - - // Unpack the contact ids into an list - return UnpackCntIdArrayL(); + args.Set(1, &sqlQuery); + User::LeaveIfError(SendReceive(KCntSearchResultList, args)); + } } + /*! * Connect to / create a cntsrv server session */ @@ -217,23 +335,3 @@ m_bufPtr.Set(m_buffer->Ptr(0)); return m_bufPtr; } - -/*! - * Unpack results from a buffer stream and store in a list - * - * \return list of matched contact ids - */ -QList CntSymbianSrvConnection::UnpackCntIdArrayL() -{ - RBufReadStream readStream; - QList list; - TContactItemId item; - - readStream.Open(*m_buffer); - int count = readStream.ReadInt32L(); - for (int i=0; i> item; - list.append(item); - } - return list; -} diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp Fri May 14 15:42:23 2010 +0300 @@ -99,8 +99,9 @@ bool CntTransformAvatar::supportsField(TUint32 fieldType) const { bool ret = false; - if (fieldType == KUidContactFieldCodImage.iUid) + if (fieldType == KUidContactFieldCodImage.iUid) { ret = true; + } return ret; } @@ -128,7 +129,6 @@ */ bool CntTransformAvatar::supportsSubType(const QString& /*subType*/) const { - // XXX todo return false; } @@ -138,10 +138,12 @@ * \a fieldName The name of the supported field * \return fieldId for the fieldName, 0 if not supported */ -quint32 CntTransformAvatar::getIdForField(const QString& /*fieldName*/) const +quint32 CntTransformAvatar::getIdForField(const QString& fieldName) const { - // XXX todo - return 0; + if (QContactAvatar::FieldImageUrl == fieldName) + return 0; + else + return 0; } /*! diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp Fri May 14 15:42:23 2010 +0300 @@ -49,6 +49,7 @@ #include "cnttransformaddress.h" #include "cnttransformbirthday.h" #include "cnttransformonlineaccount.h" +#include "cnttransformpresence.h" #include "cnttransformorganisation.h" #include "cnttransformavatar.h" #include "cnttransformringtone.h" @@ -125,6 +126,9 @@ // 3.2.3 and 5.0 releases), it may be safer not to include online account // at all. m_transformContactData.insert(OnlineAccount, new CntTransformOnlineAccount); + + // not supported on pre-10.1 + m_transformContactData.insert(Presence, new CntTransformPresence); #else // Empty transform class for removing unsupported detail definitions diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp Fri May 14 15:42:23 2010 +0300 @@ -119,37 +119,14 @@ // Transform Service Provider Text TPtrC ServiceProviderText(reinterpret_cast(onlineAccount.serviceProvider().utf16())); - if(ServiceProviderText.Length()) { - CContactItemField* serviceProviderField = CContactItemField::NewLC(KStorageTypeText); - serviceProviderField->TextStorage()->SetTextL(ServiceProviderText); - serviceProviderField->AddFieldTypeL(KUidContactFieldServiceProvider); - serviceProviderField->SetUserFlags(m_detailCounter); - fieldList.append(serviceProviderField); - CleanupStack::Pop(serviceProviderField); - } - - //FIXME:no presence in onlineaccount anymore.. -// // Transform presence informaiton -// TPtrC presenceText(reinterpret_cast(onlineAccount.presence().utf16())); -// if(presenceText.Length()) { -// QString presence = QString::number(encodePresence(onlineAccount.presence())); -// CContactItemField* presenceField = CContactItemField::NewLC(KStorageTypeText); -// TPtrC presenceEncodedText(reinterpret_cast(presence.utf16())); -// presenceField->TextStorage()->SetTextL(presenceEncodedText); -// presenceField->AddFieldTypeL(KUidContactFieldPresence); -// fieldList.append(presenceField); -// CleanupStack::Pop(presenceField); -// } - -// // Transform statusMessage -// TPtrC statusMsgText(reinterpret_cast(onlineAccount.statusMessage().utf16())); -// if(statusMsgText.Length()) { -// CContactItemField* statusMsgField = CContactItemField::NewLC(KStorageTypeText); -// statusMsgField->TextStorage()->SetTextL(statusMsgText); -// statusMsgField->AddFieldTypeL(KUidContactFieldStatusMsg); -// fieldList.append(statusMsgField); -// CleanupStack::Pop(statusMsgField); -// } + if(ServiceProviderText.Length()) { + CContactItemField* serviceProviderField = CContactItemField::NewLC(KStorageTypeText); + serviceProviderField->TextStorage()->SetTextL(ServiceProviderText); + serviceProviderField->AddFieldTypeL(KUidContactFieldServiceProvider); + serviceProviderField->SetUserFlags(m_detailCounter); + fieldList.append(serviceProviderField); + CleanupStack::Pop(serviceProviderField); + } } if(fieldList.count() > 0) { @@ -201,15 +178,6 @@ else if (field.ContentType().FieldType(i) == KUidContactFieldServiceProvider) { onlineAccount->setServiceProvider(onlineAccountString); } - //Presence - else if (field.ContentType().FieldType(i) == KUidContactFieldPresence) { - QString presenceInfo = decodePresence(onlineAccountString.toInt()); -// onlineAccount->setPresence(presenceInfo); - } - //Status Message - else if (field.ContentType().FieldType(i) == KUidContactFieldStatusMsg) { -// onlineAccount->setStatusMessage(onlineAccountString); - } } // set context @@ -225,9 +193,7 @@ bool ret = false; if (fieldType == KUidContactFieldSIPID.iUid || fieldType == KUidContactFieldIMPP.iUid || - fieldType == KUidContactFieldServiceProvider.iUid || - fieldType == KUidContactFieldPresence.iUid || - fieldType == KUidContactFieldStatusMsg.iUid ) + fieldType == KUidContactFieldServiceProvider.iUid ) { ret = true; } @@ -328,55 +294,6 @@ m_detailCounter = 0; } -/*! - * Encode the presence information. - * \a aPresence - */ -quint32 CntTransformOnlineAccount::encodePresence(QString aPresence) -{ - //FIXME:presence -// if (QContactPresence::PresenceAvailable == aPresence) -// return CntTransformOnlineAccount::EPresenceAvailable; -// else if (QContactPresence::PresenceHidden == aPresence) -// return CntTransformOnlineAccount::EPresenceHidden; -// else if (QContactPresence::PresenceBusy == aPresence) -// return CntTransformOnlineAccount::EPresenceBusy; -// else if (QContactPresence::PresenceAway == aPresence) -// return CntTransformOnlineAccount::EPresenceAway; -// else if (QContactPresence::PresenceExtendedAway == aPresence) -// return CntTransformOnlineAccount::EPresenceExtendedAway; -// else if (QContactPresence::PresenceUnknown == aPresence) -// return CntTransformOnlineAccount::EPresenceUnknown; -// else - return CntTransformOnlineAccount::EPresenceOffline; -} - - - -/*! - * Decode the presence information. - * \a aPresence - */ -QString CntTransformOnlineAccount::decodePresence(quint32 aPresence) -{ - //FIXME:presence -// if (CntTransformOnlineAccount::EPresenceAvailable == aPresence) -// return QContactPresence::PresenceAvailable; -// else if (CntTransformOnlineAccount::EPresenceHidden == aPresence) -// return QContactPresence::PresenceHidden; -// else if (CntTransformOnlineAccount::EPresenceBusy == aPresence) -// return QContactPresence::PresenceBusy; -// else if ( CntTransformOnlineAccount::EPresenceAway == aPresence) -// return QContactPresence::PresenceAway; -// else if ( CntTransformOnlineAccount::EPresenceExtendedAway == aPresence) -// return QContactPresence::PresenceExtendedAway; -// else if ( CntTransformOnlineAccount::EPresenceUnknown == aPresence) -// return QContactPresence::PresenceUnknown; -// else -// return QContactPresence::PresenceOffline; - return QString(); -} - #endif // SYMBIAN_BACKEND_USE_SQLITE // End of file diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformpresence.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformpresence.cpp Fri May 14 15:42:23 2010 +0300 @@ -0,0 +1,251 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifdef SYMBIAN_BACKEND_USE_SQLITE + +#include "cnttransformpresence.h" +#include "cntmodelextuids.h" + +CntTransformPresence::CntTransformPresence() : +m_detailCounter(0) +{ +} + +QList CntTransformPresence::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactPresence::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to presence + const QContactPresence &presenceDetail(static_cast(detail)); + + // Transform presence informaiton + if(presenceDetail.presenceState() != QContactPresence::PresenceUnknown) { + QString presence = QString::number(presenceDetail.presenceState()); + CContactItemField* presenceField = CContactItemField::NewLC(KStorageTypeText); + TPtrC presenceEncodedText(reinterpret_cast(presence.utf16())); + presenceField->TextStorage()->SetTextL(presenceEncodedText); + presenceField->AddFieldTypeL(KUidContactFieldPresence); + presenceField->SetUserFlags(m_detailCounter); + fieldList.append(presenceField); + CleanupStack::Pop(presenceField); + } + + // Transform statusMessage + TPtrC statusMsgText(reinterpret_cast(presenceDetail.presenceStateText().utf16())); + if(statusMsgText.Length()) { + CContactItemField* statusMsgField = CContactItemField::NewLC(KStorageTypeText); + statusMsgField->TextStorage()->SetTextL(statusMsgText); + statusMsgField->AddFieldTypeL(KUidContactFieldStatusMsg); + statusMsgField->SetUserFlags(m_detailCounter); + fieldList.append(statusMsgField); + CleanupStack::Pop(statusMsgField); + } + + if(fieldList.count() > 0) { + m_detailCounter++; + } + + return fieldList; +} + +QContactDetail *CntTransformPresence::transformItemField(const CContactItemField& field, const QContact &contact) +{ + QList presenceDetails = contact.details(QContactPresence::DefinitionName); + //check what presence detail the provided field belongs to. if there is no such detail yet, + //let's create it. + if (presenceDetails.count() <= field.UserFlags()) { + for (int i = presenceDetails.count(); i <= field.UserFlags(); i++) { + QContactPresence *presence = new QContactPresence(); + QContact& currentContact = const_cast(contact); + currentContact.saveDetail(presence); + } + presenceDetails = contact.details(QContactPresence::DefinitionName); + } + QContactPresence *presenceDetail = new QContactPresence(presenceDetails.at(field.UserFlags())); + + CContactTextField* storage = field.TextStorage(); + QString presenceString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + //Presence + if (field.ContentType().FieldType(i) == KUidContactFieldPresence) { + QContactPresence::PresenceState presenceState = decodePresence(presenceString); + presenceDetail->setPresenceState(presenceState); + } + //Status Message + else if (field.ContentType().FieldType(i) == KUidContactFieldStatusMsg) { + presenceDetail->setPresenceStateText(presenceString); + } + } + + // set context + for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) { + setContexts(field.ContentType().FieldType(i), *presenceDetail); + } + + return presenceDetail; +} + +bool CntTransformPresence::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldPresence.iUid || + fieldType == KUidContactFieldStatusMsg.iUid ) + { + ret = true; + } + return ret; +} + +bool CntTransformPresence::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactPresence::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformPresence::supportedSortingFieldTypes(QString /*detailFieldName*/) const +{ + // Sorting not supported + return QList(); +} + + +/*! + * Checks whether the subtype is supported + * + * \a subType The subtype to be checked + * \return True if this subtype is supported + */ +bool CntTransformPresence::supportsSubType(const QString& /*subType*/) const +{ + return false; +} + +/*! + * Returns the filed id corresponding to a field + * + * \a fieldName The name of the supported field + * \return fieldId for the fieldName, 0 if not supported + */ +quint32 CntTransformPresence::getIdForField(const QString& fieldName) const +{ + if (QContactPresence::FieldPresenceState == fieldName) + return KUidContactFieldPresence.iUid; + if (QContactPresence::FieldPresenceStateText == fieldName) + return KUidContactFieldStatusMsg.iUid; + else + return 0; +} + +/*! + * Modifies the detail definitions. The default detail definitions are + * queried from QContactManagerEngine::schemaDefinitions and then modified + * with this function in the transform leaf classes. + * + * \a definitions The detail definitions to modify. + * \a contactType The contact type the definitions apply for. + */ +void CntTransformPresence::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactPresence::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactPresence::DefinitionName); + QMap fields = d.fields(); + QContactDetailFieldDefinition f; + + // Don't support "ContextOther" + f.setDataType(QVariant::StringList); + f.setAllowableValues(QVariantList() + << QLatin1String(QContactDetail::ContextHome) + << QLatin1String(QContactDetail::ContextWork)); + fields[QContactDetail::FieldContext] = f; + d.setFields(fields); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} + +/*! + * Reset internal variables. + */ +void CntTransformPresence::reset() +{ + m_detailCounter = 0; +} + +/*! + * Decode the presence information. + * \a aPresence + */ +QContactPresence::PresenceState CntTransformPresence::decodePresence(QString presence) +{ + bool ok = false; + int presenceInt = presence.toInt(&ok); + if (!ok){ + return QContactPresence::PresenceUnknown; + } + + if (presenceInt == QContactPresence::PresenceAvailable) + return QContactPresence::PresenceAvailable; + else if (presenceInt == QContactPresence::PresenceHidden) + return QContactPresence::PresenceHidden; + else if (presenceInt == QContactPresence::PresenceBusy) + return QContactPresence::PresenceBusy; + else if (presenceInt == QContactPresence::PresenceAway) + return QContactPresence::PresenceAway; + else if (presenceInt == QContactPresence::PresenceExtendedAway) + return QContactPresence::PresenceExtendedAway; + else if (presenceInt == QContactPresence::PresenceOffline) + return QContactPresence::PresenceOffline; + else + return QContactPresence::PresenceUnknown; +} + +#endif // SYMBIAN_BACKEND_USE_SQLITE + +// End of file diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformringtone.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformringtone.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformringtone.cpp Fri May 14 15:42:23 2010 +0300 @@ -71,7 +71,6 @@ { QContactRingtone *ringtone = new QContactRingtone(contact.detail()); - // XXX ringtone can have multiple values from different fields glommed together CContactTextField* storage = field.TextStorage(); QString ringtoneString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); @@ -82,8 +81,6 @@ ringtone->setVideoRingtoneUrl(ringtoneString); } - // XXX need to remove old one somehow - return ringtone; } @@ -121,7 +118,6 @@ */ bool CntTransformRingtone::supportsSubType(const QString& /*subType*/) const { - // XXX todo return false; } @@ -131,10 +127,14 @@ * \a fieldName The name of the supported field * \return fieldId for the fieldName, 0 if not supported */ -quint32 CntTransformRingtone::getIdForField(const QString& /*fieldName*/) const +quint32 CntTransformRingtone::getIdForField(const QString& fieldName) const { - // XXX todo - return 0; + if (QContactRingtone::FieldAudioRingtoneUrl == fieldName) + return 0; + else if (QContactRingtone::FieldVideoRingtoneUrl == fieldName) + return 0; + else + return 0; } /*! diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbian/symbian.pro --- a/qtcontactsmobility/plugins/contacts/symbian/symbian.pro Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/symbian.pro Fri May 14 15:42:23 2010 +0300 @@ -40,6 +40,7 @@ inc/transform/cnttransformurl.h \ inc/transform/cnttransformbirthday.h \ inc/transform/cnttransformonlineaccount.h \ + inc/transform/cnttransformpresence.h \ inc/transform/cnttransformorganisation.h \ inc/transform/cnttransformringtone.h \ inc/transform/cnttransformthumbnail.h \ @@ -85,6 +86,7 @@ src/transform/cnttransformurl.cpp \ src/transform/cnttransformbirthday.cpp \ src/transform/cnttransformonlineaccount.cpp \ + src/transform/cnttransformpresence.cpp \ src/transform/cnttransformorganisation.cpp \ src/transform/cnttransformringtone.cpp \ src/transform/cnttransformthumbnail.cpp \ @@ -136,7 +138,8 @@ -lfbscli \ -limageconversion \ -lbitmaptransforms \ - -lbafl + -lbafl \ + -lplatformenv target.path = /sys/bin INSTALLS += target diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp Fri May 14 15:42:23 2010 +0300 @@ -82,8 +82,8 @@ convertStoreNameL(storeName); // SDN store is always read only - if (m_storeName == KParameterValueSimStoreNameSdn) - m_readOnlyAccess = true; + //if (m_storeName == KParameterValueSimStoreNameSdn) + // m_readOnlyAccess = true; // Open etel server User::LeaveIfError(m_etelServer.Connect()); @@ -432,7 +432,7 @@ QString nameString = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); name.setCustomLabel(nameString); if (m_readOnlyAccess) - m_engine.setReadOnlyAccessConstraint(&name); + m_engine.setReadOnlyAccessConstraint(&name); currentContact.saveDetail(&name); QContactManager::Error error(QContactManager::NoError); m_engine.setContactDisplayLabel(¤tContact, m_engine.synthesizedDisplayLabel(currentContact, &error)); diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp Fri May 14 15:42:23 2010 +0300 @@ -560,7 +560,6 @@ f.setFilters(filters); return canonicalizedFilter(f); } - break; case QContactFilter::IntersectionFilter: { @@ -589,7 +588,6 @@ f.setFilters(filters); return f; } - break; case QContactFilter::UnionFilter: { @@ -618,7 +616,6 @@ f.setFilters(filters); return f; } - break; case QContactFilter::LocalIdFilter: { diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp --- a/qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp Fri May 14 15:42:23 2010 +0300 @@ -257,7 +257,12 @@ const QContactDetail& detail) { QContactPhoneNumber phoneNumber = static_cast(detail); - encodeParameters(property, phoneNumber.contexts(), phoneNumber.subTypes()); + QStringList subTypes = phoneNumber.subTypes(); + encodeParameters(property, phoneNumber.contexts(), subTypes); + if (subTypes.contains(QContactPhoneNumber::SubTypeAssistant)) + property.setName(QLatin1String("X-ASSISTANT-TEL")); + else + property.setName(QLatin1String("TEL")); property.setValue(phoneNumber.number()); } diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp --- a/qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp Fri May 14 15:42:23 2010 +0300 @@ -248,6 +248,8 @@ QContactPhoneNumber phone; phone.setNumber(property.value()); phone.setSubTypes(extractSubTypes(property)); + if (property.name() == QLatin1String("X-ASSISTANT-TEL")) + phone.setSubTypes(QContactPhoneNumber::SubTypeAssistant); saveDetailWithContext(contact, &phone, extractContexts(property)); return true; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/src/versit/qversitdefs_p.h --- a/qtcontactsmobility/src/versit/qversitdefs_p.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitdefs_p.h Fri May 14 15:42:23 2010 +0300 @@ -135,6 +135,8 @@ ""}, {"X-ASSISTANT", QContactOrganization::DefinitionName.latin1(), QContactOrganization::FieldAssistantName.latin1()}, + {"X-ASSISTANT-TEL", QContactPhoneNumber::DefinitionName.latin1(), + QContactPhoneNumber::SubTypeAssistant.latin1()}, {"X-CHILDREN", QContactFamily::DefinitionName.latin1(), QContactFamily::FieldChildren.latin1()}, {"X-EPOCSECONDNAME",QContactNickname::DefinitionName.latin1(), diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/src/versit/qversitproperty.cpp --- a/qtcontactsmobility/src/versit/qversitproperty.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitproperty.cpp Fri May 14 15:42:23 2010 +0300 @@ -120,10 +120,19 @@ /*! Returns true if this is equal to \a other; false otherwise. */ bool QVersitProperty::operator==(const QVersitProperty& other) const { - return d->mGroups == other.d->mGroups && + bool equal = d->mGroups == other.d->mGroups && d->mName == other.d->mName && d->mParameters == other.d->mParameters && - d->mValue == other.d->mValue; + d->mValueType == other.d->mValueType; + if (!equal) + return false; + + // QVariant doesn't support == on QVersitDocuments - do it manually + if (d->mValue.userType() == qMetaTypeId()) + return other.d->mValue.userType() == qMetaTypeId() + && d->mValue.value() == other.d->mValue.value(); + else + return d->mValue == other.d->mValue; } /*! Returns true if this is not equal to \a other; false otherwise. */ diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/src/versit/qversitreader_p.cpp --- a/qtcontactsmobility/src/versit/qversitreader_p.cpp Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitreader_p.cpp Fri May 14 15:42:23 2010 +0300 @@ -242,6 +242,14 @@ QVersitProperty::ListType); mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("CATEGORIES")), QVersitProperty::ListType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("X-CHILDREN")), + QVersitProperty::ListType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("X-CHILDREN")), + QVersitProperty::ListType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("X-NICKNAME")), + QVersitProperty::ListType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("X-NICKNAME")), + QVersitProperty::ListType); } /*! Destroy a reader. */ @@ -422,6 +430,11 @@ QVersitProperty property; property.setGroups(groupsAndName.first); property.setName(groupsAndName.second); + // set the propertyValueType + QPair key = + qMakePair(versitType, property.name()); + if (mValueTypeMap.contains(key)) + property.setValueType(mValueTypeMap.value(key)); if (versitType == QVersitDocument::VCard21Type) parseVCard21Property(cursor, property, lineReader); @@ -440,8 +453,7 @@ property.setParameters(extractVCard21PropertyParams(cursor, lineReader.codec())); QByteArray value = extractPropertyValue(cursor); - if (mValueTypeMap.value(qMakePair(QVersitDocument::VCard21Type, property.name())) - == QVersitProperty::VersitDocumentType) { + if (property.valueType() == QVersitProperty::VersitDocumentType) { // Hack to handle cases where start of document is on the same or next line as "AGENT:" bool foundBegin = false; if (value == "BEGIN:VCARD") { @@ -462,9 +474,10 @@ QVariant valueVariant(decodeCharset(value, property, lineReader.codec(), &codec)); bool isBinary = unencode(valueVariant, cursor, property, codec, lineReader); property.setValue(valueVariant); - if (!isBinary) { - splitStructuredValue(QVersitDocument::VCard21Type, property, false); - } + if (isBinary) + property.setValueType(QVersitProperty::BinaryType); + else + splitStructuredValue(property, false); } } @@ -481,8 +494,7 @@ QTextCodec* codec; QString valueString(decodeCharset(value, property, lineReader.codec(), &codec)); - if (mValueTypeMap.value(qMakePair(QVersitDocument::VCard30Type, property.name())) - == QVersitProperty::VersitDocumentType) { + if (property.valueType() == QVersitProperty::VersitDocumentType) { removeBackSlashEscaping(valueString); // Make a line reader from the value of the property. QByteArray subDocumentValue(codec->fromUnicode(valueString)); @@ -501,8 +513,10 @@ QVariant valueVariant(valueString); bool isBinary = unencode(valueVariant, cursor, property, codec, lineReader); property.setValue(valueVariant); - if (!isBinary) { - bool isList = splitStructuredValue(QVersitDocument::VCard30Type, property, true); + if (isBinary) { + property.setValueType(QVersitProperty::BinaryType); + } else { + bool isList = splitStructuredValue(property, true); // Do backslash unescaping if (isList) { QStringList list = property.value(); @@ -868,23 +882,19 @@ * exit). */ bool QVersitReaderPrivate::splitStructuredValue( - QVersitDocument::VersitType type, QVersitProperty& property, + QVersitProperty& property, bool hasEscapedBackslashes) const { QVariant variant = property.variantValue(); - QPair key = qMakePair(type, property.name()); - if (mValueTypeMap.contains(key)) { - if (mValueTypeMap.value(key) == QVersitProperty::CompoundType) { - variant.setValue(splitValue(variant.toString(), QLatin1Char(';'), - QString::KeepEmptyParts, hasEscapedBackslashes)); - property.setValue(variant); - property.setValueType(QVersitProperty::CompoundType); - } else if (mValueTypeMap.value(key) == QVersitProperty::ListType) { - variant.setValue(splitValue(variant.toString(), QLatin1Char(','), - QString::SkipEmptyParts, hasEscapedBackslashes)); - property.setValue(variant); - property.setValueType(QVersitProperty::ListType); - } + if (property.valueType() == QVersitProperty::CompoundType) { + variant.setValue(splitValue(variant.toString(), QLatin1Char(';'), + QString::KeepEmptyParts, hasEscapedBackslashes)); + property.setValue(variant); + return true; + } else if (property.valueType() == QVersitProperty::ListType) { + variant.setValue(splitValue(variant.toString(), QLatin1Char(','), + QString::SkipEmptyParts, hasEscapedBackslashes)); + property.setValue(variant); return true; } return false; diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/src/versit/qversitreader_p.h --- a/qtcontactsmobility/src/versit/qversitreader_p.h Mon May 03 12:24:20 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitreader_p.h Fri May 14 15:42:23 2010 +0300 @@ -206,8 +206,7 @@ QString paramName(const QByteArray& parameter, QTextCodec* codec) const; QString paramValue(const QByteArray& parameter, QTextCodec* codec) const; static bool containsAt(const QByteArray& text, const QByteArray& ba, int index); - bool splitStructuredValue(QVersitDocument::VersitType type, - QVersitProperty& property, + bool splitStructuredValue(QVersitProperty& property, bool hasEscapedBackslashes) const; static QStringList splitValue(const QString& string, const QChar& sep, diff -r de1630741fbe -r 2a11b5b00470 qtcontactsmobility/tests/auto/qversit/testdata/gmail.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/gmail.vcf Mon May 03 12:24:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -BEGIN:VCARD -VERSION:3.0 -FN:Test Contact -N:Contact;Test;;; -EMAIL;TYPE=INTERNET;TYPE=HOME:a@b.com -TEL;TYPE=CELL:1234 -ADR;TYPE=HOME:;address;;;;; -ORG:company -TITLE:title -BDAY:1900-01-01 -URL;TYPE=HOME:website -END:VCARD -BEGIN:VCARD -VERSION:3.0 -FN:Test Contact 2 -N:2;Test;Contact;; -EMAIL;TYPE=INTERNET;TYPE=HOME:a@b.com -TEL;TYPE=CELL:1234 -ADR;TYPE=HOME:;address;;;;; -ORG:ノキア -TITLE:title -BDAY:1900-01-01 -URL;TYPE=HOME:website -END:VCARD