mirror of
https://github.com/apache/cordova-android.git
synced 2025-01-19 23:42:53 +08:00
322 lines
9.7 KiB
JavaScript
Executable File
322 lines
9.7 KiB
JavaScript
Executable File
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
if (!PhoneGap.hasResource("contact")) {
|
|
PhoneGap.addResource("contact");
|
|
|
|
/**
|
|
* Contains information about a single contact.
|
|
* @constructor
|
|
* @param {DOMString} id unique identifier
|
|
* @param {DOMString} displayName
|
|
* @param {ContactName} name
|
|
* @param {DOMString} nickname
|
|
* @param {Array.<ContactField>} phoneNumbers array of phone numbers
|
|
* @param {Array.<ContactField>} emails array of email addresses
|
|
* @param {Array.<ContactAddress>} addresses array of addresses
|
|
* @param {Array.<ContactField>} ims instant messaging user ids
|
|
* @param {Array.<ContactOrganization>} organizations
|
|
* @param {DOMString} birthday contact's birthday
|
|
* @param {DOMString} note user notes about contact
|
|
* @param {Array.<ContactField>} photos
|
|
* @param {Array.<ContactField>} categories
|
|
* @param {Array.<ContactField>} urls contact's web sites
|
|
*/
|
|
var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
|
|
ims, organizations, birthday, note, photos, categories, urls) {
|
|
this.id = id || null;
|
|
this.rawId = null;
|
|
this.displayName = displayName || null;
|
|
this.name = name || null; // ContactName
|
|
this.nickname = nickname || null;
|
|
this.phoneNumbers = phoneNumbers || null; // ContactField[]
|
|
this.emails = emails || null; // ContactField[]
|
|
this.addresses = addresses || null; // ContactAddress[]
|
|
this.ims = ims || null; // ContactField[]
|
|
this.organizations = organizations || null; // ContactOrganization[]
|
|
this.birthday = birthday || null;
|
|
this.note = note || null;
|
|
this.photos = photos || null; // ContactField[]
|
|
this.categories = categories || null; // ContactField[]
|
|
this.urls = urls || null; // ContactField[]
|
|
};
|
|
|
|
/**
|
|
* ContactError.
|
|
* An error code assigned by an implementation when an error has occurreds
|
|
* @constructor
|
|
*/
|
|
var ContactError = function() {
|
|
this.code=null;
|
|
};
|
|
|
|
/**
|
|
* Error codes
|
|
*/
|
|
ContactError.UNKNOWN_ERROR = 0;
|
|
ContactError.INVALID_ARGUMENT_ERROR = 1;
|
|
ContactError.TIMEOUT_ERROR = 2;
|
|
ContactError.PENDING_OPERATION_ERROR = 3;
|
|
ContactError.IO_ERROR = 4;
|
|
ContactError.NOT_SUPPORTED_ERROR = 5;
|
|
ContactError.PERMISSION_DENIED_ERROR = 20;
|
|
|
|
/**
|
|
* Removes contact from device storage.
|
|
* @param successCB success callback
|
|
* @param errorCB error callback
|
|
*/
|
|
Contact.prototype.remove = function(successCB, errorCB) {
|
|
if (this.id === null) {
|
|
var errorObj = new ContactError();
|
|
errorObj.code = ContactError.UNKNOWN_ERROR;
|
|
errorCB(errorObj);
|
|
}
|
|
else {
|
|
PhoneGap.exec(successCB, errorCB, "Contacts", "remove", [this.id]);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Creates a deep copy of this Contact.
|
|
* With the contact ID set to null.
|
|
* @return copy of this Contact
|
|
*/
|
|
Contact.prototype.clone = function() {
|
|
var clonedContact = PhoneGap.clone(this);
|
|
var i;
|
|
clonedContact.id = null;
|
|
clonedContact.rawId = null;
|
|
// Loop through and clear out any id's in phones, emails, etc.
|
|
if (clonedContact.phoneNumbers) {
|
|
for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
|
|
clonedContact.phoneNumbers[i].id = null;
|
|
}
|
|
}
|
|
if (clonedContact.emails) {
|
|
for (i = 0; i < clonedContact.emails.length; i++) {
|
|
clonedContact.emails[i].id = null;
|
|
}
|
|
}
|
|
if (clonedContact.addresses) {
|
|
for (i = 0; i < clonedContact.addresses.length; i++) {
|
|
clonedContact.addresses[i].id = null;
|
|
}
|
|
}
|
|
if (clonedContact.ims) {
|
|
for (i = 0; i < clonedContact.ims.length; i++) {
|
|
clonedContact.ims[i].id = null;
|
|
}
|
|
}
|
|
if (clonedContact.organizations) {
|
|
for (i = 0; i < clonedContact.organizations.length; i++) {
|
|
clonedContact.organizations[i].id = null;
|
|
}
|
|
}
|
|
if (clonedContact.tags) {
|
|
for (i = 0; i < clonedContact.tags.length; i++) {
|
|
clonedContact.tags[i].id = null;
|
|
}
|
|
}
|
|
if (clonedContact.photos) {
|
|
for (i = 0; i < clonedContact.photos.length; i++) {
|
|
clonedContact.photos[i].id = null;
|
|
}
|
|
}
|
|
if (clonedContact.urls) {
|
|
for (i = 0; i < clonedContact.urls.length; i++) {
|
|
clonedContact.urls[i].id = null;
|
|
}
|
|
}
|
|
return clonedContact;
|
|
};
|
|
|
|
/**
|
|
* Persists contact to device storage.
|
|
* @param successCB success callback
|
|
* @param errorCB error callback
|
|
*/
|
|
Contact.prototype.save = function(successCB, errorCB) {
|
|
PhoneGap.exec(successCB, errorCB, "Contacts", "save", [this]);
|
|
};
|
|
|
|
/**
|
|
* Contact name.
|
|
* @constructor
|
|
* @param formatted
|
|
* @param familyName
|
|
* @param givenName
|
|
* @param middle
|
|
* @param prefix
|
|
* @param suffix
|
|
*/
|
|
var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
|
|
this.formatted = formatted || null;
|
|
this.familyName = familyName || null;
|
|
this.givenName = givenName || null;
|
|
this.middleName = middle || null;
|
|
this.honorificPrefix = prefix || null;
|
|
this.honorificSuffix = suffix || null;
|
|
};
|
|
|
|
/**
|
|
* Generic contact field.
|
|
* @constructor
|
|
* @param {DOMString} id unique identifier, should only be set by native code
|
|
* @param type
|
|
* @param value
|
|
* @param pref
|
|
*/
|
|
var ContactField = function(type, value, pref) {
|
|
this.id = null;
|
|
this.type = type || null;
|
|
this.value = value || null;
|
|
this.pref = pref || null;
|
|
};
|
|
|
|
/**
|
|
* Contact address.
|
|
* @constructor
|
|
* @param {DOMString} id unique identifier, should only be set by native code
|
|
* @param formatted
|
|
* @param streetAddress
|
|
* @param locality
|
|
* @param region
|
|
* @param postalCode
|
|
* @param country
|
|
*/
|
|
var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
|
|
this.id = null;
|
|
this.pref = pref || null;
|
|
this.type = type || null;
|
|
this.formatted = formatted || null;
|
|
this.streetAddress = streetAddress || null;
|
|
this.locality = locality || null;
|
|
this.region = region || null;
|
|
this.postalCode = postalCode || null;
|
|
this.country = country || null;
|
|
};
|
|
|
|
/**
|
|
* Contact organization.
|
|
* @constructor
|
|
* @param {DOMString} id unique identifier, should only be set by native code
|
|
* @param name
|
|
* @param dept
|
|
* @param title
|
|
* @param startDate
|
|
* @param endDate
|
|
* @param location
|
|
* @param desc
|
|
*/
|
|
var ContactOrganization = function(pref, type, name, dept, title) {
|
|
this.id = null;
|
|
this.pref = pref || null;
|
|
this.type = type || null;
|
|
this.name = name || null;
|
|
this.department = dept || null;
|
|
this.title = title || null;
|
|
};
|
|
|
|
/**
|
|
* Represents a group of Contacts.
|
|
* @constructor
|
|
*/
|
|
var Contacts = function() {
|
|
this.inProgress = false;
|
|
this.records = [];
|
|
};
|
|
/**
|
|
* Returns an array of Contacts matching the search criteria.
|
|
* @param fields that should be searched
|
|
* @param successCB success callback
|
|
* @param errorCB error callback
|
|
* @param {ContactFindOptions} options that can be applied to contact searching
|
|
* @return array of Contacts matching search criteria
|
|
*/
|
|
Contacts.prototype.find = function(fields, successCB, errorCB, options) {
|
|
if (successCB === null) {
|
|
throw new TypeError("You must specify a success callback for the find command.");
|
|
}
|
|
if (fields === null || fields === "undefined" || fields.length === "undefined" || fields.length <= 0) {
|
|
if (typeof errorCB === "function") {
|
|
errorCB({"code": ContactError.INVALID_ARGUMENT_ERROR});
|
|
}
|
|
} else {
|
|
PhoneGap.exec(successCB, errorCB, "Contacts", "search", [fields, options]);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* This function creates a new contact, but it does not persist the contact
|
|
* to device storage. To persist the contact to device storage, invoke
|
|
* contact.save().
|
|
* @param properties an object who's properties will be examined to create a new Contact
|
|
* @returns new Contact object
|
|
*/
|
|
Contacts.prototype.create = function(properties) {
|
|
var i;
|
|
var contact = new Contact();
|
|
for (i in properties) {
|
|
if (contact[i] !== 'undefined') {
|
|
contact[i] = properties[i];
|
|
}
|
|
}
|
|
return contact;
|
|
};
|
|
|
|
/**
|
|
* This function returns and array of contacts. It is required as we need to convert raw
|
|
* JSON objects into concrete Contact objects. Currently this method is called after
|
|
* navigator.contacts.find but before the find methods success call back.
|
|
*
|
|
* @param jsonArray an array of JSON Objects that need to be converted to Contact objects.
|
|
* @returns an array of Contact objects
|
|
*/
|
|
Contacts.prototype.cast = function(pluginResult) {
|
|
var contacts = [];
|
|
var i;
|
|
for (i=0; i<pluginResult.message.length; i++) {
|
|
contacts.push(navigator.contacts.create(pluginResult.message[i]));
|
|
}
|
|
pluginResult.message = contacts;
|
|
return pluginResult;
|
|
};
|
|
|
|
/**
|
|
* ContactFindOptions.
|
|
* @constructor
|
|
* @param filter used to match contacts against
|
|
* @param multiple boolean used to determine if more than one contact should be returned
|
|
*/
|
|
var ContactFindOptions = function(filter, multiple) {
|
|
this.filter = filter || '';
|
|
this.multiple = multiple || false;
|
|
};
|
|
|
|
/**
|
|
* Add the contact interface into the browser.
|
|
*/
|
|
PhoneGap.addConstructor(function() {
|
|
if(typeof navigator.contacts === "undefined") {
|
|
navigator.contacts = new Contacts();
|
|
}
|
|
});
|
|
}
|