diff options
author | Zheng Fu <zhengfu@google.com> | 2014-09-04 16:26:29 -0700 |
---|---|---|
committer | Makoto Onuki <omakoto@google.com> | 2014-09-10 00:17:59 +0000 |
commit | 96ddeddc52c85710a10cd8266c054ff1b1c5a52b (patch) | |
tree | 3718b98a65f84d3f90c5bc8c6513b51a42af6ac0 | |
parent | 7dbd8145ead7949c62ea4467a1bb00419a3f9b65 (diff) | |
download | packages_providers_ContactsProvider-96ddeddc52c85710a10cd8266c054ff1b1c5a52b.zip packages_providers_ContactsProvider-96ddeddc52c85710a10cd8266c054ff1b1c5a52b.tar.gz packages_providers_ContactsProvider-96ddeddc52c85710a10cd8266c054ff1b1c5a52b.tar.bz2 |
Remove default settings during contacts aggregation.
Set is_super_primary to 0 for all the shared mime-types's data
between aggregated contacts.
Bug:5080996
Change-Id: Ie65259c11d719b343f234e5fccf883491e7992a7
3 files changed, 130 insertions, 2 deletions
diff --git a/src/com/android/providers/contacts/aggregation/ContactAggregator.java b/src/com/android/providers/contacts/aggregation/ContactAggregator.java index 390871c..e4044c2 100644 --- a/src/com/android/providers/contacts/aggregation/ContactAggregator.java +++ b/src/com/android/providers/contacts/aggregation/ContactAggregator.java @@ -797,6 +797,7 @@ public class ContactAggregator { mAggregatedPresenceDelete.execute(); } + clearSuperPrimarySetting(db, contactId, rawContactId); setContactIdAndMarkAggregated(rawContactId, contactId); computeAggregateData(db, contactId, mContactUpdate); mContactUpdate.bindLong(ContactReplaceSqlStatement.CONTACT_ID, contactId); @@ -815,6 +816,58 @@ public class ContactAggregator { } /** + * Find out which mime-types are shared by raw contact of {@code rawContactId} and raw contacts + * of {@code contactId}. Clear the is_super_primary settings for these mime-types. + */ + private void clearSuperPrimarySetting(SQLiteDatabase db, long contactId, long rawContactId) { + final String[] args = {String.valueOf(contactId), String.valueOf(rawContactId)}; + + // Find out which mime-types are shared by raw contact of rawContactId and raw contacts + // of contactId + int index = 0; + final StringBuilder mimeTypeCondition = new StringBuilder(); + mimeTypeCondition.append(" AND " + DataColumns.MIMETYPE_ID + " IN ("); + + final Cursor c = db.rawQuery( + "SELECT DISTINCT(a." + DataColumns.MIMETYPE_ID + ")" + + " FROM (SELECT " + DataColumns.MIMETYPE_ID + " FROM " + Tables.DATA + " WHERE " + + Data.RAW_CONTACT_ID + " IN (SELECT " + RawContacts._ID + " FROM " + + Tables.RAW_CONTACTS + " WHERE " + RawContacts.CONTACT_ID + "=?1)) AS a" + + " JOIN (SELECT " + DataColumns.MIMETYPE_ID + " FROM " + Tables.DATA + " WHERE " + + Data.RAW_CONTACT_ID + "=?2) AS b" + + " ON a." + DataColumns.MIMETYPE_ID + "=b." + DataColumns.MIMETYPE_ID, + args); + try { + c.moveToPosition(-1); + while (c.moveToNext()) { + if (index > 0) { + mimeTypeCondition.append(','); + } + mimeTypeCondition.append(c.getLong((0))); + index++; + } + } finally { + c.close(); + } + + // Clear is_super_primary setting for all the mime-types exist in both raw contact + // of rawContactId and raw contacts of contactId + String superPrimaryUpdateSql = "UPDATE " + Tables.DATA + + " SET " + Data.IS_SUPER_PRIMARY + "=0" + + " WHERE (" + Data.RAW_CONTACT_ID + + " IN (SELECT " + RawContacts._ID + " FROM " + Tables.RAW_CONTACTS + + " WHERE " + RawContacts.CONTACT_ID + "=?1)" + + " OR " + Data.RAW_CONTACT_ID + "=?2)"; + + if (index > 0) { + mimeTypeCondition.append(')'); + superPrimaryUpdateSql += mimeTypeCondition.toString(); + } + + db.execSQL(superPrimaryUpdateSql, args); + } + + /** * @return true if the raw contact of {@code rawContactId} can be joined into the existing * contact of {@code of contactId}. * diff --git a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java index b90e88b..ed0c06d 100644 --- a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java +++ b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java @@ -232,16 +232,24 @@ public abstract class BaseContactsProvider2Test extends PhotoLoadingTestCase { } protected Uri insertOrganization(long rawContactId, ContentValues values) { - return insertOrganization(rawContactId, values, false); + return insertOrganization(rawContactId, values, false, false); } protected Uri insertOrganization(long rawContactId, ContentValues values, boolean primary) { + return insertOrganization(rawContactId, values, primary, false); + } + + protected Uri insertOrganization(long rawContactId, ContentValues values, boolean primary, + boolean superPrimary) { values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); values.put(Organization.TYPE, Organization.TYPE_WORK); if (primary) { values.put(Data.IS_PRIMARY, 1); } + if (superPrimary) { + values.put(Data.IS_SUPER_PRIMARY, 1); + } Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); return resultUri; @@ -252,11 +260,21 @@ public abstract class BaseContactsProvider2Test extends PhotoLoadingTestCase { } protected Uri insertPhoneNumber(long rawContactId, String phoneNumber, boolean primary) { - return insertPhoneNumber(rawContactId, phoneNumber, primary, Phone.TYPE_HOME); + return insertPhoneNumber(rawContactId, phoneNumber, primary, false, Phone.TYPE_HOME); + } + + protected Uri insertPhoneNumber(long rawContactId, String phoneNumber, boolean primary, + boolean superPrimary) { + return insertPhoneNumber(rawContactId, phoneNumber, primary, superPrimary, Phone.TYPE_HOME); } protected Uri insertPhoneNumber(long rawContactId, String phoneNumber, boolean primary, int type) { + return insertPhoneNumber(rawContactId, phoneNumber, primary, false, type); + } + + protected Uri insertPhoneNumber(long rawContactId, String phoneNumber, boolean primary, + boolean superPrimary, int type) { ContentValues values = new ContentValues(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); @@ -265,6 +283,9 @@ public abstract class BaseContactsProvider2Test extends PhotoLoadingTestCase { if (primary) { values.put(Data.IS_PRIMARY, 1); } + if (superPrimary) { + values.put(Data.IS_SUPER_PRIMARY, 1); + } Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); return resultUri; @@ -712,6 +733,20 @@ public abstract class BaseContactsProvider2Test extends PhotoLoadingTestCase { } } + protected void assertSuperPrimary(Long dataId, boolean isSuperPrimary) { + final String[] projection = new String[]{Data.MIMETYPE, Data._ID, Data.IS_SUPER_PRIMARY}; + Cursor c = mResolver.query(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), + projection, null, null, null); + + c.moveToFirst(); + if (isSuperPrimary) { + assertEquals(1, c.getInt(c.getColumnIndexOrThrow(Data.IS_SUPER_PRIMARY))); + } else { + assertEquals(0, c.getInt(c.getColumnIndexOrThrow(Data.IS_SUPER_PRIMARY))); + } + + } + protected void assertDataRow(ContentValues actual, String expectedMimetype, Object... expectedArguments) { assertEquals(actual.toString(), expectedMimetype, actual.getAsString(Data.MIMETYPE)); diff --git a/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java b/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java index cb0766e..6ce98a7 100644 --- a/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java +++ b/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java @@ -1486,6 +1486,46 @@ public class ContactAggregatorTest extends BaseContactsProvider2Test { cursor.close(); } + public void testAggregation_clearSuperPrimary() { + // Three types of mime-type super primary merging are tested here + // 1. both raw contacts have super primary phone numbers + // 2. both raw contacts have emails, but only one has super primary email + // 3. only raw contact1 has organizations and it has set the super primary organization + ContentValues values = new ContentValues(); + long rawContactId1 = RawContactUtil.createRawContact(mResolver, ACCOUNT_1); + Uri uri_phone1 = insertPhoneNumber(rawContactId1, "(222)222-2222", false, false); + Uri uri_email1 = insertEmail(rawContactId1, "one@gmail.com", true, true); + values.clear(); + values.put(Organization.COMPANY, "Monsters Inc"); + Uri uri_org1 = insertOrganization(rawContactId1, values, true, true); + values.clear(); + values.put(Organization.TITLE, "CEO"); + Uri uri_org2 = insertOrganization(rawContactId1, values, false, false); + + long rawContactId2 = RawContactUtil.createRawContact(mResolver, ACCOUNT_2); + Uri uri_phone2 = insertPhoneNumber(rawContactId2, "(333)333-3333", false, false); + Uri uri_email2 = insertEmail(rawContactId2, "two@gmail.com", false, false); + + // Two raw contacts with same phone number will trigger the aggregation + Uri uri_phone3 = insertPhoneNumber(rawContactId1, "(111)111-1111", true, true); + Uri uri_phone4 = insertPhoneNumber(rawContactId2, "1(111)111-1111", true, true); + + // After aggregation, the super primary flag should be cleared for both case 1 and case 2, + // i.e., phone and email mime-types. Only case 3, i.e. organization mime-type, has the + // super primary flag unchanged. + assertAggregated(rawContactId1, rawContactId2); + assertSuperPrimary(ContentUris.parseId(uri_phone1), false); + assertSuperPrimary(ContentUris.parseId(uri_phone2), false); + assertSuperPrimary(ContentUris.parseId(uri_phone3), false); + assertSuperPrimary(ContentUris.parseId(uri_phone4), false); + + assertSuperPrimary(ContentUris.parseId(uri_email1), false); + assertSuperPrimary(ContentUris.parseId(uri_email2), false); + + assertSuperPrimary(ContentUris.parseId(uri_org1), true); + assertSuperPrimary(ContentUris.parseId(uri_org2), false); + } + private void assertSuggestions(long contactId, long... suggestions) { final Uri aggregateUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); Uri uri = Uri.withAppendedPath(aggregateUri, |