You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by dk...@apache.org on 2012/03/19 13:01:23 UTC

[4/8] qt commit: Save and remove support added for contacts

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 <dk...@ics.com>
Authored: Mon Mar 5 18:52:13 2012 +0400
Committer: Denis Kormalev <dk...@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 &params)
 {
-    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 &params);
-    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.family@gmail.com", pref: false, type: "email"}, {"value": "given@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 ] )
         }
 
 /**