diff options
author | Raj Yengisetty <rajesh@cyngn.com> | 2014-11-11 19:47:47 -0800 |
---|---|---|
committer | Raj Yengisetty <rajesh@cyngn.com> | 2014-11-13 16:03:34 -0800 |
commit | 7e63d3885e016e83b64ccd98f14fcf309be2d6db (patch) | |
tree | 6c8dbf15fd68d5f30a8a162fded1fe0f734f70a0 | |
parent | e8f6f25eb974b5b064879a545233265e13b2dadf (diff) | |
download | android_packages_providers_ContactsProvider-7e63d3885e016e83b64ccd98f14fcf309be2d6db.tar.gz android_packages_providers_ContactsProvider-7e63d3885e016e83b64ccd98f14fcf309be2d6db.tar.bz2 android_packages_providers_ContactsProvider-7e63d3885e016e83b64ccd98f14fcf309be2d6db.zip |
ContactsProvider: Create add default contact as an overlay-able option
Change-Id: Icd5f3860e9d48d27bf069b4f10a511cc18b8aebf
-rw-r--r-- | res/values/cm_strings.xml | 5 | ||||
-rw-r--r-- | res/values/config.xml | 5 | ||||
-rw-r--r-- | src/com/android/providers/contacts/ContactsProvider2.java | 182 |
3 files changed, 192 insertions, 0 deletions
diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml index dcaff428..f811342a 100644 --- a/res/values/cm_strings.xml +++ b/res/values/cm_strings.xml @@ -19,4 +19,9 @@ <string name="group_family">Family</string> <string name="group_friend">Friends</string> <string name="group_work">Coworkers</string> + + <!-- Default Contact --> + <string name="preference_default_contact_name"></string> + <string name="preference_default_contact_number"></string> + <string name="preference_default_contact_email"></string> </resources> diff --git a/res/values/config.xml b/res/values/config.xml new file mode 100644 index 00000000..31836f3d --- /dev/null +++ b/res/values/config.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Default Contact --> + <bool name="preference_default_contact_saved">false</bool> +</resources> diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java index 7138fd49..d94191ca 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -203,6 +203,7 @@ public class ContactsProvider2 extends AbstractContactsProvider private static final int BACKGROUND_TASK_CHANGE_LOCALE = 9; private static final int BACKGROUND_TASK_CLEANUP_PHOTOS = 10; private static final int BACKGROUND_TASK_CLEAN_DELETE_LOG = 11; + private static final int BACKGROUND_TASK_ADD_DEFAULT_CONTACT = 12; // add for smart dialer private static final String[] NUMBER_2 = {"a","b","c"}; @@ -214,6 +215,10 @@ public class ContactsProvider2 extends AbstractContactsProvider private static final String[] NUMBER_8 = {"t","u","v"}; private static final String[] NUMBER_9 = {"w","x","y","z"}; + private static final String DEFAULT_CONTACT_PREFERENCE_SET = "DefaultSet"; + private static final String DEFAULT_CONTACT_PREFERENCE_RAW_CONTACT_ID = "DefaultContactId"; + private static final int DEFAULT_CONTACT_ID = -1; + /** Default for the maximum number of returned aggregation suggestions. */ private static final int DEFAULT_MAX_SUGGESTIONS = 5; @@ -1517,6 +1522,7 @@ public class ContactsProvider2 extends AbstractContactsProvider scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_PROVIDER_STATUS); scheduleBackgroundTask(BACKGROUND_TASK_OPEN_WRITE_ACCESS); scheduleBackgroundTask(BACKGROUND_TASK_CLEANUP_PHOTOS); + scheduleBackgroundTask(BACKGROUND_TASK_ADD_DEFAULT_CONTACT); return true; } @@ -1594,6 +1600,174 @@ public class ContactsProvider2 extends AbstractContactsProvider return new PhotoPriorityResolver(context); } + private boolean isDefaultContactRequired() { + Resources resources = getContext().getResources(); + + boolean contactSaved = resources.getBoolean(R.bool.preference_default_contact_saved); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + boolean exists = prefs.getBoolean(DEFAULT_CONTACT_PREFERENCE_SET, contactSaved); + + if (!exists) { + long rawContactId = prefs.getLong(DEFAULT_CONTACT_PREFERENCE_RAW_CONTACT_ID, + DEFAULT_CONTACT_ID); + if (rawContactId != -1 && checkDefaultContactInfo()) { + // Query to see if default contacts need to be updated + if (!verifyDefaultContact(rawContactId) && deleteDefaultContact(rawContactId)) { + return true; + } + } + } + + return exists; + } + + private boolean verifyDefaultContact(long rawContactId) { + Resources resources = getContext().getResources(); + + String defaultContactName = resources.getString( + R.string.preference_default_contact_name); + String defaultContactNumber = resources.getString( + R.string.preference_default_contact_number); + String defaultContactEmail = resources.getString( + R.string.preference_default_contact_email); + + boolean nameMatch = false, numberMatch = false, emailMatch = false; + + Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); + Uri entityUri = Uri.withAppendedPath(rawContactUri, RawContacts.Entity.CONTENT_DIRECTORY); + Cursor c = getContext().getContentResolver().query(entityUri, + new String[]{RawContacts.Entity.DATA_ID, + RawContacts.Entity.MIMETYPE, RawContacts.Entity.DATA1}, + null, null, null); + try { + if (c != null) { + while (c.moveToNext()) { + if (!c.isNull(0)) { + String mimeType = c.getString(1); + String data = c.getString(2); + + if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) { + if (defaultContactName.equals(data)) { + nameMatch = true; + } + } else if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) { + if (defaultContactNumber.equals(data)) { + numberMatch = true; + } + } else if (mimeType.equals(Email.CONTENT_ITEM_TYPE)) { + if (defaultContactEmail.equals(data)) { + emailMatch = true; + } + } + } + } + } + } finally { + if (c != null) { + c.close(); + } + } + + return (nameMatch && numberMatch && emailMatch); + } + + private boolean deleteDefaultContact(long rawContactId) { + Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); + + int deleted = getContext().getContentResolver().delete(rawContactUri, null, null); + + if (deleted > 0) { + return true; + } + + return false; + } + + private boolean checkDefaultContactInfo() { + Resources resources = getContext().getResources(); + + String defaultContactName = resources.getString( + R.string.preference_default_contact_name); + // TODO: For columns that aren't required create a map of resources + String defaultContactNumber = resources.getString( + R.string.preference_default_contact_number); + String defaultContactEmail = resources.getString( + R.string.preference_default_contact_email); + + return !(TextUtils.isEmpty(defaultContactName) || TextUtils.isEmpty(defaultContactNumber) + || TextUtils.isEmpty(defaultContactEmail)); + } + + // Check and add any default contacts + private void addDefaultContact() { + Resources resources = getContext().getResources(); + long rawContactId = -1; + + if (!checkDefaultContactInfo()) { + return; + } + + String defaultContactName = resources.getString( + R.string.preference_default_contact_name); + String defaultContactNumber = resources.getString( + R.string.preference_default_contact_number); + String defaultContactEmail = resources.getString( + R.string.preference_default_contact_email); + + ArrayList<ContentProviderOperation> ops = + new ArrayList<ContentProviderOperation>(); + int rawContactInsertIndex = ops.size(); + + ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) + .withValue(RawContacts.ACCOUNT_TYPE, null) + .withValue(RawContacts.ACCOUNT_NAME, null) + .build()); + + ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) + .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) + .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) + .withValue(StructuredName.DISPLAY_NAME, defaultContactName) + .build()); + + ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) + .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) + .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) + .withValue(Phone.NUMBER, defaultContactNumber) + .withValue(Phone.TYPE, Phone.TYPE_WORK) + .build()); + + ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) + .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) + .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) + .withValue(Email.DATA, defaultContactEmail) + .withValue(Email.TYPE, Email.TYPE_WORK) + .build()); + + ContentProviderResult[] results = null; + try { + results = getContext().getContentResolver().applyBatch( + ContactsContract.AUTHORITY, ops); + } catch (RemoteException e) { + e.printStackTrace(); + } catch (OperationApplicationException e) { + e.printStackTrace(); + } finally { + if (results != null && results.length >= 1) { + rawContactId = ContentUris.parseId(results[0].uri); + } + setDefaultContactEntered(rawContactId); + } + + } + + private void setDefaultContactEntered(long id) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean(DEFAULT_CONTACT_PREFERENCE_SET, false); + editor.putLong(DEFAULT_CONTACT_PREFERENCE_RAW_CONTACT_ID, id); + editor.commit(); + } + protected void scheduleBackgroundTask(int task) { mBackgroundHandler.sendEmptyMessage(task); } @@ -1697,6 +1871,14 @@ public class ContactsProvider2 extends AbstractContactsProvider case BACKGROUND_TASK_CLEAN_DELETE_LOG: { final SQLiteDatabase db = mDbHelper.get().getWritableDatabase(); DeletedContactsTableUtil.deleteOldLogs(db); + break; + } + + case BACKGROUND_TASK_ADD_DEFAULT_CONTACT: { + if (isDefaultContactRequired()) { + addDefaultContact(); + } + break; } } } |