diff --git a/framework/assets/js/contact.js b/framework/assets/js/contact.js index 56dc0be6..64f548f0 100755 --- a/framework/assets/js/contact.js +++ b/framework/assets/js/contact.js @@ -17,24 +17,19 @@ * @param {ContactAddress[]} addresses array of addresses * @param {ContactField[]} ims instant messaging user ids * @param {ContactOrganization[]} organizations -* @param {DOMString} published date contact was first created -* @param {DOMString} updated date contact was last updated +* @param {DOMString} revision date contact was last updated * @param {DOMString} birthday contact's birthday -* @param (DOMString} anniversary contact's anniversary * @param {DOMString} gender contact's gender * @param {DOMString} note user notes about contact -* @param {DOMString} preferredUsername * @param {ContactField[]} photos -* @param {ContactField[]} tags -* @param {ContactField[]} relationships +* @param {ContactField[]} categories * @param {ContactField[]} urls contact's web sites * @param {ContactAccounts[]} accounts contact's online accounts * @param {DOMString} utcOffset UTC time zone offset * @param {DOMString} connected */ var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, published, updated, birthday, anniversary, gender, note, - preferredUsername, photos, tags, relationships, urls, accounts, utcOffset, connected) { + ims, organizations, revision, birthday, gender, note, photos, categories, urls, timezone) { this.id = id || null; this.rawId = null; this.displayName = displayName || null; @@ -45,20 +40,14 @@ var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, ad this.addresses = addresses || null; // ContactAddress[] this.ims = ims || null; // ContactField[] this.organizations = organizations || null; // ContactOrganization[] - this.published = published || null; - this.updated = updated || null; + this.revision = revision || null; this.birthday = birthday || null; - this.anniversary = anniversary || null; this.gender = gender || null; this.note = note || null; - this.preferredUsername = preferredUsername || null; this.photos = photos || null; // ContactField[] - this.tags = tags || null; // ContactField[] - this.relationships = relationships || null; // ContactField[] + this.categories = categories || null; // ContactField[] this.urls = urls || null; // ContactField[] - this.accounts = accounts || null; // ContactAccount[] - this.utcOffset = utcOffset || null; - this.connected = connected || null; + this.timezone = timezone || null; }; /** @@ -164,11 +153,11 @@ var ContactName = function(formatted, familyName, givenName, middle, prefix, suf * @param value * @param primary */ -var ContactField = function(type, value, primary) { +var ContactField = function(type, value, pref) { this.id = null; this.type = type || null; this.value = value || null; - this.primary = primary || null; + this.pref = pref || null; }; /** @@ -202,31 +191,13 @@ var ContactAddress = function(formatted, streetAddress, locality, region, postal * @param location * @param desc */ -var ContactOrganization = function(name, dept, title, startDate, endDate, location, desc) { +var ContactOrganization = function(name, dept, title) { this.id = null; this.name = name || null; this.department = dept || null; this.title = title || null; - this.startDate = startDate || null; - this.endDate = endDate || null; - this.location = location || null; - this.description = desc || null; }; -/** -* Contact account. -* @param {DOMString} id unique identifier, should only be set by native code -* @param domain -* @param username -* @param userid -*/ -var ContactAccount = function(domain, username, userid) { - this.id = null; - this.domain = domain || null; - this.username = username || null; - this.userid = userid || null; -} - /** * Represents a group of Contacts. */ @@ -284,13 +255,11 @@ Contacts.prototype.cast = function(pluginResult) { * ContactFindOptions. * @param filter used to match contacts against * @param multiple boolean used to determine if more than one contact should be returned - * @param limit maximum number of results to return from the contacts search * @param updatedSince return only contact records that have been updated on or after the given time */ -var ContactFindOptions = function(filter, multiple, limit, updatedSince) { +var ContactFindOptions = function(filter, multiple, updatedSince) { this.filter = filter || ''; - this.multiple = multiple || false; - this.limit = limit || 1; + this.multiple = multiple || true; this.updatedSince = updatedSince || ''; }; diff --git a/framework/src/com/phonegap/ContactAccessorSdk3_4.java b/framework/src/com/phonegap/ContactAccessorSdk3_4.java index 079491d6..446b5587 100644 --- a/framework/src/com/phonegap/ContactAccessorSdk3_4.java +++ b/framework/src/com/phonegap/ContactAccessorSdk3_4.java @@ -104,8 +104,8 @@ public class ContactAccessorSdk3_4 extends ContactAccessor { */ public JSONArray search(JSONArray fields, JSONObject options) { String searchTerm = ""; - int limit = 1; - boolean multiple = false; + int limit = Integer.MAX_VALUE; + boolean multiple = true; if (options != null) { searchTerm = options.optString("filter"); @@ -115,10 +115,13 @@ public class ContactAccessorSdk3_4 extends ContactAccessor { else { searchTerm = "%" + searchTerm + "%"; } - multiple = options.optBoolean("multiple"); - if (multiple) { - limit = options.optInt("limit"); - limit = limit > 0 ? limit : 1; + try { + multiple = options.getBoolean("multiple"); + if (!multiple) { + limit = 1; + } + } catch (JSONException e) { + // Multiple was not specified so we assume the default is true. } } else { @@ -312,7 +315,7 @@ public class ContactAccessorSdk3_4 extends ContactAccessor { try{ im.put("id", cursor.getString( cursor.getColumnIndex(ContactMethods._ID))); - im.put("primary", false); + im.put("perf", false); im.put("value", cursor.getString( cursor.getColumnIndex(ContactMethodsColumns.DATA))); im.put("type", getContactType(cursor.getInt( @@ -346,10 +349,6 @@ public class ContactAccessorSdk3_4 extends ContactAccessor { organization.put("name", cursor.getString(cursor.getColumnIndex(Organizations.COMPANY))); organization.put("title", cursor.getString(cursor.getColumnIndex(Organizations.TITLE))); // organization.put("department", cursor.getString(cursor.getColumnIndex(Organizations))); - // organization.put("description", cursor.getString(cursor.getColumnIndex(Organizations))); - // organization.put("endDate", cursor.getString(cursor.getColumnIndex(Organizations))); - // organization.put("location", cursor.getString(cursor.getColumnIndex(Organizations))); - // organization.put("startDate", cursor.getString(cursor.getColumnIndex(Organizations))); organizations.put(organization); } catch (JSONException e) { Log.e(LOG_TAG, e.getMessage(), e); @@ -404,7 +403,7 @@ public class ContactAccessorSdk3_4 extends ContactAccessor { phone = new JSONObject(); try{ phone.put("id", cursor.getString(cursor.getColumnIndex(Phones._ID))); - phone.put("primary", false); + phone.put("perf", false); phone.put("value", cursor.getString(cursor.getColumnIndex(Phones.NUMBER))); phone.put("type", getPhoneType(cursor.getInt(cursor.getColumnIndex(Phones.TYPE)))); phones.put(phone); @@ -433,7 +432,7 @@ public class ContactAccessorSdk3_4 extends ContactAccessor { email = new JSONObject(); try{ email.put("id", cursor.getString(cursor.getColumnIndex(ContactMethods._ID))); - email.put("primary", false); + email.put("perf", false); email.put("value", cursor.getString(cursor.getColumnIndex(ContactMethods.DATA))); // TODO Find out why adding an email type throws and exception //email.put("type", cursor.getString(cursor.getColumnIndex(ContactMethods.TYPE))); diff --git a/framework/src/com/phonegap/ContactAccessorSdk5.java b/framework/src/com/phonegap/ContactAccessorSdk5.java index 750ede76..c64a5461 100644 --- a/framework/src/com/phonegap/ContactAccessorSdk5.java +++ b/framework/src/com/phonegap/ContactAccessorSdk5.java @@ -115,26 +115,14 @@ public class ContactAccessorSdk5 extends ContactAccessor { dbMap.put("organizations.name", ContactsContract.CommonDataKinds.Organization.COMPANY); dbMap.put("organizations.department", ContactsContract.CommonDataKinds.Organization.DEPARTMENT); dbMap.put("organizations.title", ContactsContract.CommonDataKinds.Organization.TITLE); - dbMap.put("organizations.location", ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION); - dbMap.put("organizations.description", ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION); - //dbMap.put("published", null); - //dbMap.put("updated", null); + //dbMap.put("revision", null); dbMap.put("birthday", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); - dbMap.put("anniversary", ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); - //dbMap.put("gender", null); dbMap.put("note", ContactsContract.CommonDataKinds.Note.NOTE); - //dbMap.put("preferredUsername", null); dbMap.put("photos.value", ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - //dbMap.put("tags.value", null); - dbMap.put("relationships", ContactsContract.CommonDataKinds.Relation.NAME); - dbMap.put("relationships.value", ContactsContract.CommonDataKinds.Relation.NAME); + //dbMap.put("categories.value", null); dbMap.put("urls", ContactsContract.CommonDataKinds.Website.URL); dbMap.put("urls.value", ContactsContract.CommonDataKinds.Website.URL); - //dbMap.put("accounts.domain", null); - //dbMap.put("accounts.username", null); - //dbMap.put("accounts.userid", null); - //dbMap.put("utcOffset", null); - //dbMap.put("connected", null); + //dbMap.put("timezone", null); } /** @@ -159,8 +147,8 @@ public class ContactAccessorSdk5 extends ContactAccessor { // Get the find options String searchTerm = ""; - int limit = 1; - boolean multiple = false; + int limit = Integer.MAX_VALUE; + boolean multiple = true; if (options != null) { searchTerm = options.optString("filter"); @@ -170,10 +158,13 @@ public class ContactAccessorSdk5 extends ContactAccessor { else { searchTerm = "%" + searchTerm + "%"; } - multiple = options.optBoolean("multiple"); - if (multiple) { - limit = options.optInt("limit"); - limit = limit > 0 ? limit : 1; + try { + multiple = options.getBoolean("multiple"); + if (!multiple) { + limit = 1; + } + } catch (JSONException e) { + // Multiple was not specified so we assume the default is true. } } else { @@ -232,7 +223,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { JSONArray emails = new JSONArray(); JSONArray ims = new JSONArray(); JSONArray websites = new JSONArray(); - JSONArray relationships = new JSONArray(); JSONArray photos = new JSONArray(); if (c.getCount() > 0) { @@ -252,7 +242,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { // Populate the Contact object with it's arrays // and push the contact into the contacts array contacts.put(populateContact(contact, organizations, addresses, phones, - emails, ims, websites, relationships, photos)); + emails, ims, websites, photos)); // Clean up the objects contact = new JSONObject(); @@ -262,7 +252,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { emails = new JSONArray(); ims = new JSONArray(); websites = new JSONArray(); - relationships = new JSONArray(); photos = new JSONArray(); // Set newContact to true as we are starting to populate a new contact @@ -317,16 +306,8 @@ public class ContactAccessorSdk5 extends ContactAccessor { && isRequired("urls",populate)) { websites.put(websiteQuery(c)); } - else if (mimetype.equals(ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE) - && isRequired("relationships",populate)) { - relationships.put(relationshipQuery(c)); - } else if (mimetype.equals(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE)) { - if (ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY == c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE)) - && isRequired("anniversary",populate)) { - contact.put("anniversary", c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE))); - } - else if (ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY == c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE)) + if (ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY == c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE)) && isRequired("birthday",populate)) { contact.put("birthday", c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE))); } @@ -347,7 +328,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { // Push the last contact into the contacts array if (contacts.length() < limit) { contacts.put(populateContact(contact, organizations, addresses, phones, - emails, ims, websites, relationships, photos)); + emails, ims, websites, photos)); } } c.close(); @@ -402,13 +383,12 @@ public class ContactAccessorSdk5 extends ContactAccessor { * @param emails array of emails * @param ims array of instant messenger addresses * @param websites array of websites - * @param relationships array of relationships * @param photos * @return */ private JSONObject populateContact(JSONObject contact, JSONArray organizations, JSONArray addresses, JSONArray phones, JSONArray emails, - JSONArray ims, JSONArray websites, JSONArray relationships, JSONArray photos) { + JSONArray ims, JSONArray websites, JSONArray photos) { try { contact.put("organizations", organizations); contact.put("addresses", addresses); @@ -416,7 +396,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { contact.put("emails", emails); contact.put("ims", ims); contact.put("websites", websites); - contact.put("relationships", relationships); contact.put("photos", photos); } catch (JSONException e) { @@ -502,12 +481,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { // else if (key.startsWith("birthday")) { // where.add("(" + dbMap.get(key) + " LIKE ? AND " // + ContactsContract.Data.MIMETYPE + " = ? )"); -// } -// else if (key.startsWith("anniversary")) { -// where.add("(" + dbMap.get(key) + " LIKE ? AND " -// + ContactsContract.Data.MIMETYPE + " = ? )"); -// whereArgs.add(searchTerm); -// whereArgs.add(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); // } else if (key.startsWith("note")) { where.add("(" + dbMap.get(key) + " LIKE ? AND " @@ -515,12 +488,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { whereArgs.add(searchTerm); whereArgs.add(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); } - else if (key.startsWith("relationships")) { - where.add("(" + dbMap.get(key) + " LIKE ? AND " - + ContactsContract.Data.MIMETYPE + " = ? )"); - whereArgs.add(searchTerm); - whereArgs.add(ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE); - } else if (key.startsWith("urls")) { where.add("(" + dbMap.get(key) + " LIKE ? AND " + ContactsContract.Data.MIMETYPE + " = ? )"); @@ -563,13 +530,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { try { organization.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization._ID))); organization.put("department", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT))); - organization.put("description", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION))); - // TODO No endDate - // organization.put("endDate", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization))); - organization.put("location", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION))); organization.put("name", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY))); - // TODO no startDate - // organization.put("startDate", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization))); organization.put("title", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE))); } catch (JSONException e) { Log.e(LOG_TAG, e.getMessage(), e); @@ -641,7 +602,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { JSONObject phoneNumber = new JSONObject(); try { phoneNumber.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))); - phoneNumber.put("primary", false); // Android does not store primary attribute + phoneNumber.put("pref", false); // Android does not store pref attribute phoneNumber.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); phoneNumber.put("type", getPhoneType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)))); } catch (JSONException e) { @@ -662,7 +623,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { JSONObject email = new JSONObject(); try { email.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email._ID))); - email.put("primary", false); // Android does not store primary attribute + email.put("pref", false); // Android does not store pref attribute email.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))); email.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)))); } catch (JSONException e) { @@ -680,7 +641,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { JSONObject im = new JSONObject(); try { im.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im._ID))); - im.put("primary", false); // Android does not store primary attribute + im.put("pref", false); // Android does not store pref attribute im.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA))); im.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE)))); } catch (JSONException e) { @@ -698,7 +659,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { JSONObject website = new JSONObject(); try { website.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website._ID))); - website.put("primary", false); // Android does not store primary attribute + website.put("pref", false); // Android does not store pref attribute website.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL))); website.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE)))); } catch (JSONException e) { @@ -707,24 +668,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { return website; } - /** - * Create a ContactField JSONObject - * @param cursor the current database row - * @return a JSONObject representing a ContactField - */ - private JSONObject relationshipQuery(Cursor cursor) { - JSONObject relationship = new JSONObject(); - try { - relationship.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Relation._ID))); - relationship.put("primary", false); // Android does not store primary attribute - relationship.put("value", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Relation.NAME))); - relationship.put("type", getRelationshipType(cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Relation.TYPE)))); - } catch (JSONException e) { - Log.e(LOG_TAG, e.getMessage(), e); - } - return relationship; - } - /** * Create a ContactField JSONObject * @param contactId @@ -734,7 +677,7 @@ public class ContactAccessorSdk5 extends ContactAccessor { JSONObject photo = new JSONObject(); try { photo.put("id", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo._ID))); - photo.put("primary", false); + photo.put("pref", false); Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (new Long(contactId))); Uri photoUri = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); photo.put("value", photoUri.toString()); @@ -1004,8 +947,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); contentValues.put(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")); - contentValues.put(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION, getJsonString(org, "description")); - contentValues.put(ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION, getJsonString(org, "location")); contentValues.put(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")); contentValues.put(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")); @@ -1019,8 +960,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { ContactsContract.Data.MIMETYPE + "=?", new String[]{orgId, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}) .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) - .withValue(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION, getJsonString(org, "description")) - .withValue(ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION, getJsonString(org, "location")) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) .build()); @@ -1124,42 +1063,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { Log.d(LOG_TAG, "Could not get websites"); } - // Modify relationships - JSONArray relationships = null; - try { - relationships = contact.getJSONArray("relationships"); - if (relationships != null) { - for (int i=0; i ops, - JSONObject relationship) { - ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) - .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Relation.NAME, getJsonString(relationship, "value")) - .withValue(ContactsContract.CommonDataKinds.Relation.TYPE, getRelationshipType(getJsonString(relationship, "type"))) - .build()); - } - /** * Add a website to a list of database actions to be performed * @@ -1299,8 +1174,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) - .withValue(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION, getJsonString(org, "description")) - .withValue(ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION, getJsonString(org, "location")) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) .build()); @@ -1573,21 +1446,6 @@ public class ContactAccessorSdk5 extends ContactAccessor { Log.d(LOG_TAG, "Could not get websites"); } - // Add relationships - JSONArray relationships = null; - try { - relationships = contact.getJSONArray("relationships"); - if (relationships != null) { - for (int i=0; i