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 ¶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.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 ] )
}
/**