Save and remove support added for contacts
Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/commit/d39b3484 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/tree/d39b3484 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/diff/d39b3484 Branch: refs/heads/master Commit: d39b3484c3a333d42400a90f74cb8396522f7c92 Parents: b8243aa Author: Denis Kormalev <dkorma...@ics.com> Authored: Mon Mar 5 18:52:13 2012 +0400 Committer: Denis Kormalev <dkorma...@ics.com> Committed: Fri Mar 16 19:26:39 2012 +0400 ---------------------------------------------------------------------- src/plugins/contacts.cpp | 215 +++++++++++++++++++++++++++++++++++----- src/plugins/contacts.h | 2 +- www/basic.js | 60 ++++++++++-- www/js/contacts.js | 36 +++---- 4 files changed, 257 insertions(+), 56 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/d39b3484/src/plugins/contacts.cpp ---------------------------------------------------------------------- diff --git a/src/plugins/contacts.cpp b/src/plugins/contacts.cpp index 07f8d7a..a18ce21 100644 --- a/src/plugins/contacts.cpp +++ b/src/plugins/contacts.cpp @@ -2,7 +2,6 @@ #include "../pluginregistry.h" #include <QMap> -#include <QContactGuid> #include <QContactDisplayLabel> #include <QContactName> #include <QContactNickname> @@ -19,7 +18,6 @@ #include <QContactManager> #include <QContactUnionFilter> #include <QContactDetailFilter> - #include <QDebug> #ifdef QTM_USE_NAMESPACE @@ -41,7 +39,6 @@ Contacts::Contacts() : void Contacts::init() { m_fieldNamePairs.clear(); - m_fieldNamePairs["id"] = (QLatin1String)QContactGuid::DefinitionName; m_fieldNamePairs["displayName"] = (QLatin1String)QContactDisplayLabel::DefinitionName; m_fieldNamePairs["name"] = (QLatin1String)QContactName::DefinitionName; m_fieldNamePairs["nickname"] = (QLatin1String)QContactNickname::DefinitionName; @@ -62,36 +59,199 @@ void Contacts::init() void Contacts::saveContact(int scId, int ecId, const QVariantMap ¶ms) { - Q_UNUSED(scId); - Q_UNUSED(ecId); - - QContact *result = new QContact(); + QContact result; QList<QContactDetail *> detailsToDelete; - foreach (const QString& paramName, params.keys()) { - QString mobilityDetailName = cordovaFieldNameToQtDefinitionName(paramName); - if (mobilityDetailName.isEmpty()) + foreach (const QString& field, params.keys()) { + QString qtDefinitionName = cordovaFieldNameToQtDefinitionName(field); + if (qtDefinitionName.isEmpty()) continue; - QContactDetail *detail = new QContactDetail(mobilityDetailName); -// detail->setValue(params[paramName]); - detailsToDelete << detail; - result->saveDetail(detail); + + if (field == "nickname") { + QContactNickname *detail = new QContactNickname; + detail->setNickname(params[field].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } else if (field == "note") { + QContactNote *detail = new QContactNote; + detail->setNote(params[field].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } else if (field == "phoneNumbers") { + if (params[field].type() != QVariant::List) + continue; + QVariantList phonesList = params[field].toList(); + foreach (const QVariant &phoneDesc, phonesList) { + if (phoneDesc.type() != QVariant::Map) + continue; + QContactPhoneNumber *detail = new QContactPhoneNumber; + detail->setNumber(phoneDesc.toMap()["value"].toString()); + if (!phoneDesc.toMap()["type"].toString().isEmpty() && phoneDesc.toMap()["type"].toString() != "phone") + detail->setSubTypes(phoneDesc.toMap()["type"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "emails") { + if (params[field].type() != QVariant::List) + continue; + QVariantList emailsList = params[field].toList(); + foreach (const QVariant &emailDesc, emailsList) { + if (emailDesc.type() != QVariant::Map) + continue; + QContactEmailAddress *detail = new QContactEmailAddress; + detail->setEmailAddress(emailDesc.toMap()["value"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "ims") { + if (params[field].type() != QVariant::List) + continue; + QVariantList imsList = params[field].toList(); + foreach (const QVariant &imDesc, imsList) { + if (imDesc.type() != QVariant::Map) + continue; + QContactOnlineAccount *detail = new QContactOnlineAccount; + detail->setAccountUri(imDesc.toMap()["value"].toString()); + if (!imDesc.toMap()["type"].toString().isEmpty()) + detail->setSubTypes(imDesc.toMap()["type"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "photos") { + if (params[field].type() != QVariant::List) + continue; + QVariantList photosList = params[field].toList(); + foreach (const QVariant &photoDesc, photosList) { + if (photoDesc.type() != QVariant::Map) + continue; + //TODO: we need to decide should we support base64 images or not + if (photoDesc.toMap()["type"].toString() != "url") + continue; + QContactAvatar *detail = new QContactAvatar; + detail->setImageUrl(QUrl(photoDesc.toMap()["value"].toString())); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "urls") { + if (params[field].type() != QVariant::List) + continue; + QVariantList urlsList = params[field].toList(); + foreach (const QVariant &urlDesc, urlsList) { + if (urlDesc.type() != QVariant::Map) + continue; + QContactUrl *detail = new QContactUrl; + detail->setUrl(urlDesc.toMap()["value"].toString()); + if (!urlDesc.toMap()["type"].toString().isEmpty()) + detail->setSubType(urlDesc.toMap()["type"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "birthday") { + QContactBirthday *detail = new QContactBirthday; + detail->setDateTime(QDateTime::fromString(params[field].toString(), "yyyy-MM-ddThh:mm:ss.zzzZ")); + detailsToDelete << detail; + result.saveDetail(detail); + } else if (field == "organizations") { + + if (params[field].type() != QVariant::List) + continue; + QVariantList organizationsList = params[field].toList(); + foreach (const QVariant &organizationDesc, organizationsList) { + if (organizationDesc.type() != QVariant::Map) + continue; + QContactOrganization *detail = new QContactOrganization; + detail->setName(organizationDesc.toMap()["name"].toString()); + detail->setDepartment(QStringList() << organizationDesc.toMap()["department"].toString()); + detail->setRole(organizationDesc.toMap()["title"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + + } else if (field == "name") { + QContactName *detail = new QContactName; + QVariantMap nameMap = params[field].toMap(); + detail->setLastName(nameMap["familyName"].toString()); + detail->setFirstName(nameMap["givenName"].toString()); + detail->setMiddleName(nameMap["middleName"].toString()); + detail->setPrefix(nameMap["honorificPrefix"].toString()); + detail->setSuffix(nameMap["honorificSuffix"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + + } + result = m_manager->compatibleContact(result); + if (!m_manager->saveContact(&result)) { + switch (m_manager->error()) { + case QContactManager::DoesNotExistError: + case QContactManager::AlreadyExistsError: + case QContactManager::InvalidDetailError: + case QContactManager::InvalidRelationshipError: + case QContactManager::BadArgumentError: + case QContactManager::InvalidContactTypeError: + callback(ecId, "ContactError.INVALID_ARGUMENT_ERROR"); + break; + case QContactManager::DetailAccessError: + case QContactManager::PermissionsError: + callback(ecId, "ContactError.PERMISSION_DENIED_ERROR"); + break; + case QContactManager::NotSupportedError: + callback(ecId, "ContactError.NOT_SUPPORTED_ERROR"); + break; + case QContactManager::TimeoutError: + callback(ecId, "ContactError.TIMEOUT_ERROR"); + break; + case QContactManager::UnspecifiedError: + case QContactManager::LockedError: + case QContactManager::OutOfMemoryError: + case QContactManager::VersionMismatchError: + case QContactManager::LimitReachedError: + case QContactManager::NoError: + default: + callback(ecId, "ContactError.UNKNOWN_ERROR"); + break; + } + } else { + callback(scId, ""); } - m_manager->saveContact(result); - delete result; qDeleteAll(detailsToDelete); } -void Contacts::removeContact(int scId, int ecId, const QString &guid) +void Contacts::removeContact(int scId, int ecId, const QString &localId) { - Q_UNUSED(scId) - Q_UNUSED(ecId) + if (!m_manager->removeContact(localId.toUInt())) { + switch (m_manager->error()) { + case QContactManager::DoesNotExistError: + case QContactManager::AlreadyExistsError: + case QContactManager::InvalidDetailError: + case QContactManager::InvalidRelationshipError: + case QContactManager::BadArgumentError: + case QContactManager::InvalidContactTypeError: + callback(ecId, "ContactError.INVALID_ARGUMENT_ERROR"); + break; + case QContactManager::DetailAccessError: + case QContactManager::PermissionsError: + callback(ecId, "ContactError.PERMISSION_DENIED_ERROR"); + break; + case QContactManager::NotSupportedError: + callback(ecId, "ContactError.NOT_SUPPORTED_ERROR"); + break; + case QContactManager::TimeoutError: + callback(ecId, "ContactError.TIMEOUT_ERROR"); + break; + case QContactManager::UnspecifiedError: + case QContactManager::LockedError: + case QContactManager::OutOfMemoryError: + case QContactManager::VersionMismatchError: + case QContactManager::LimitReachedError: + case QContactManager::NoError: + default: + callback(ecId, "ContactError.UNKNOWN_ERROR"); + break; + } - QContactDetailFilter idFilter; - idFilter.setDetailDefinitionName(QContactGuid::DefinitionName, QContactGuid::FieldGuid); - idFilter.setValue(guid); - idFilter.setMatchFlags(QContactFilter::MatchExactly); - QList<QContactLocalId> contacts = m_manager->contactIds(idFilter); - m_manager->removeContacts(contacts); + } else { + callback(scId, ""); + } } void Contacts::findContacts(int scId, int ecId, const QStringList &fields, const QString &filter, bool multiple) @@ -150,14 +310,15 @@ QString Contacts::jsonedContact(const QContact &contact, const QStringList &fiel QStringList resultingFields = fields; if (resultingFields.empty()) resultingFields.append(m_fieldNamePairs.keys()); + if (!resultingFields.contains("id")) + resultingFields << "id"; QStringList fieldValuesList; foreach (const QString &field, resultingFields) { QString qtDefinitionName = cordovaFieldNameToQtDefinitionName(field); if (field == "id") { - QContactGuid detail = contact.detail(qtDefinitionName); fieldValuesList << QString("%1: \"%2\"") .arg(field) - .arg(detail.guid()); + .arg(contact.localId()); } else if (field == "displayName") { QContactDisplayLabel detail = contact.detail(qtDefinitionName); fieldValuesList << QString("%1: \"%2\"") http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/d39b3484/src/plugins/contacts.h ---------------------------------------------------------------------- diff --git a/src/plugins/contacts.h b/src/plugins/contacts.h index 95f5168..d25ecf6 100644 --- a/src/plugins/contacts.h +++ b/src/plugins/contacts.h @@ -40,7 +40,7 @@ signals: public slots: void saveContact(int scId, int ecId, const QVariantMap ¶ms); - void removeContact(int scId, int ecId, const QString &guid); + void removeContact(int scId, int ecId, const QString &localId); void findContacts(int scId, int ecId, const QStringList &fields, const QString &filter, bool multiple); private: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/d39b3484/www/basic.js ---------------------------------------------------------------------- diff --git a/www/basic.js b/www/basic.js index 80c7f76..e2bec10 100644 --- a/www/basic.js +++ b/www/basic.js @@ -2,6 +2,33 @@ * JavaScript file */ + +//TODO: remove later this method. Now it is needed for debugging +function dump(arr,level) { + var dumped_text = ""; + if(!level) level = 0; + + //The padding given at the beginning of the line. + var level_padding = ""; + for(var j=0;j<level+1;j++) level_padding += " "; + + if(typeof(arr) == 'object') { //Array/Hashes/Objects + for(var item in arr) { + var value = arr[item]; + + if(typeof(value) == 'object') { //If it is an array, + dumped_text += level_padding + "'" + item + "' ... :\n"; + dumped_text += dump(value,level+1); + } else { + dumped_text += level_padding + "'" + item + "' => \"" + value + "\";\n"; + } + } + } else { //Stings/Chars/Numbers etc. + dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; + } + return dumped_text; +} + var vibration_length = 1000; function get(id) @@ -152,6 +179,20 @@ function fileError( p_fileError ) { } +function displayGiven(contacts){ + var result = "" + for (var contact in contacts) { + result += contacts[contact].name.formatted + ": " + contacts[contact].phoneNumbers[0].value + "\n" + contacts[contact].remove(function() {searchForGiven()}) + } + + console.log(result) +} + +function searchForGiven() { + navigator.contacts.find(["name", "phoneNumbers", "nickname", "displayName", "emails", "ims", "addresses", "organizations", "birthday", "photos"], displayGiven, 0, {filter:"Given", multiple: true}) +} + /* * Register for the device ready event */ @@ -159,15 +200,18 @@ document.addEventListener( "deviceready", function() { console.log("basicjs.deviceReady") get( "debug_output" ).innerHTML = "Device Ready!<br/>"; - navigator.contacts.find(["name", "phoneNumbers", "nickname", "displayName", "emails"], - function(contacts){ - var result = "" - for (var contact in contacts) { - result += contacts[contact].name.formatted + ": " + contacts[contact].phoneNumbers[0].value + "\n" - } + var created = navigator.contacts.create({"name": {familyName: "Family", givenName: "Given"}, phoneNumbers: [{"value": "+123456789", pref: false, type: "work"}], emails: [{"value": "given.fam...@gmail.com", pref: false, type: "email"}, {"value": "gi...@family.com", pref: false, type: "email"}], birthday: new Date(1985, 4, 3, 0, 0, 0)}) + created.save(searchForGiven, 0) + +// navigator.contacts.find(["name", "phoneNumbers", "nickname", "displayName", "emails", "ims", "addresses", "organizations", "birthday", "photos"], +// function(contacts){ +// var result = "" +// for (var contact in contacts) { +// result += contacts[contact].name.formatted + ": " + contacts[contact].phoneNumbers[0].value + "\n" +// } - console.log(result) - }, 0, {filter:"mar", multiple: true}) +// console.log(result) +// }, 0, {filter:"mar", multiple: true}) }, false ); document.addEventListener( "resume", function() { http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/d39b3484/www/js/contacts.js ---------------------------------------------------------------------- diff --git a/www/js/contacts.js b/www/js/contacts.js index c8d5495..0ce22d9 100644 --- a/www/js/contacts.js +++ b/www/js/contacts.js @@ -194,22 +194,29 @@ Contact.prototype.clone = function() { return newContact } -Contact.prototype.remove = function(onSaveSuccess,onSaveError) { - if( typeof contactSuccess !== "function" ) return +Contact.prototype.remove = function(contactSuccess,contactError) { + console.log("Contact.remove 1: " + dump(this)) + if( typeof contactSuccess !== "function" ) contactSuccess = function() {} if( typeof contactError !== "function" ) contactError = function() {} //TODO: call onSaveError here if (this.id == null || this.id == "") return + console.log("Contact.remove 2") - Cordova.exec( function() { - contactSuccess() - }, contactError, "com.cordova.Contacts", "removeContact", [ this.id ] ) + Cordova.exec( contactSuccess, contactError, "com.cordova.Contacts", "removeContact", [ this.id ] ) + console.log("Contact.remove 3") +} +Contact.prototype.save = function(contactSuccess,contactError) { + console.log("Contact.save 1") + if( typeof contactSuccess !== "function" ) contactSuccess = function() {} + if( typeof contactError !== "function" ) contactError = function() {} - } + console.log("Contact.save 2: ") -Contact.prototype.save = function(onSaveSuccess,onSaveError) { + Cordova.exec( contactSuccess, contactError, "com.cordova.Contacts", "saveContact", [ this ] ) + console.log("Contact.save 3") } @@ -220,26 +227,15 @@ function ContactsManager() { } ContactsManager.prototype.create = function(properties) { - var result = new Contact() - for (var property in properties) { - if (typeof result[property] != 'undefined') - result[property] = properties[property] - } - return result + return Contact.create(properties) } ContactsManager.prototype.find = function(contactFields, contactSuccess, contactError, contactFindOptions) { // Check the callbacks - console.log("contacts.find 1") if( typeof contactSuccess !== "function" ) return - console.log("contacts.find 2") if( typeof contactError !== "function" ) contactError = function() {} - console.log("contacts.find 3") - Cordova.exec( function( contactsList ) { - contactSuccess( contactsList ) - }, contactError, "com.cordova.Contacts", "findContacts", [ contactFields, contactFindOptions.filter, contactFindOptions.multiple ] ) - console.log("contacts.find 4") + Cordova.exec( contactSuccess, contactError, "com.cordova.Contacts", "findContacts", [ contactFields, contactFindOptions.filter, contactFindOptions.multiple ] ) } /**