16bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov/* 26bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 36bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * 46bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 56bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * you may not use this file except in compliance with the License. 66bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * You may obtain a copy of the License at 76bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * 86bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 96bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * 106bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 116bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 126bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * See the License for the specific language governing permissions and 146bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * limitations under the License. 156bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov */ 168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 186bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov 1987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoroimport com.android.providers.contacts.tests.R; 20f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikovimport com.google.android.collect.Lists; 21f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 2273f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikovimport android.accounts.Account; 23f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikovimport android.content.ContentProviderOperation; 24f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikovimport android.content.ContentProviderResult; 256bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikovimport android.content.ContentUris; 26f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikovimport android.content.ContentValues; 27a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikovimport android.database.Cursor; 286bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikovimport android.net.Uri; 29f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikovimport android.provider.ContactsContract; 30b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 31f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 32f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 33dee54bb86f3608730f0b9f37d8982a7f6b280a85Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 3487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoroimport android.provider.ContactsContract.Contacts.Photo; 355b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikovimport android.provider.ContactsContract.Contacts.AggregationSuggestions; 36f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikovimport android.provider.ContactsContract.Data; 37f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 38f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 396bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 406bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov 416bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov/** 427a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov * Unit tests for {@link ContactAggregator}. 436bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * 446bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * Run the test like this: 456bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * <code> 468920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.ContactAggregatorTest -w \ 4728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 486bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov * </code> 496bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov */ 506bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov@LargeTest 51d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovpublic class ContactAggregatorTest extends BaseContactsProvider2Test { 5290dfb8e292caac95c84767aeea6069fad0052373Dmitri Plotnikov 530dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov private static final Account ACCOUNT_1 = new Account("account_name_1", "account_type_1"); 540dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov private static final Account ACCOUNT_2 = new Account("account_name_2", "account_type_2"); 550dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov private static final Account ACCOUNT_3 = new Account("account_name_3", "account_type_3"); 560dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 5731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov private static final String[] AGGREGATION_EXCEPTION_PROJECTION = new String[] { 58b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov AggregationExceptions.TYPE, 590c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1, 600c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 61b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov }; 62b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 63b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public void testCrudAggregationExceptions() throws Exception { 643d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov long rawContactId1 = createRawContactWithName("zz", "top"); 653d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov long rawContactId2 = createRawContactWithName("aa", "bottom"); 66b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 670c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 680c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 690c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov 700c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov String selection = "(" + AggregationExceptions.RAW_CONTACT_ID1 + "=" + rawContactId1 710c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov + " AND " + AggregationExceptions.RAW_CONTACT_ID2 + "=" + rawContactId2 720c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov + ") OR (" + AggregationExceptions.RAW_CONTACT_ID1 + "=" + rawContactId2 730c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov + " AND " + AggregationExceptions.RAW_CONTACT_ID2 + "=" + rawContactId1 + ")"; 74b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 75b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov // Refetch the row we have just inserted 76127071b6305023a79b7d8f473ef6887843389f6eDmitri Plotnikov Cursor c = mResolver.query(AggregationExceptions.CONTENT_URI, 770c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AGGREGATION_EXCEPTION_PROJECTION, selection, null, null); 78b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 79b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov assertTrue(c.moveToFirst()); 800c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertEquals(AggregationExceptions.TYPE_KEEP_TOGETHER, c.getInt(0)); 810c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertTrue((rawContactId1 == c.getLong(1) && rawContactId2 == c.getLong(2)) 820c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov || (rawContactId2 == c.getLong(1) && rawContactId1 == c.getLong(2))); 83b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov assertFalse(c.moveToNext()); 84b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov c.close(); 85b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 86127071b6305023a79b7d8f473ef6887843389f6eDmitri Plotnikov // Change from TYPE_KEEP_IN to TYPE_KEEP_OUT 870c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 880c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 89127071b6305023a79b7d8f473ef6887843389f6eDmitri Plotnikov 900c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov c = mResolver.query(AggregationExceptions.CONTENT_URI, AGGREGATION_EXCEPTION_PROJECTION, 910c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov selection, null, null); 92b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 93b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov assertTrue(c.moveToFirst()); 940c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertEquals(AggregationExceptions.TYPE_KEEP_SEPARATE, c.getInt(0)); 950c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertTrue((rawContactId1 == c.getLong(1) && rawContactId2 == c.getLong(2)) 960c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov || (rawContactId2 == c.getLong(1) && rawContactId1 == c.getLong(2))); 97b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov assertFalse(c.moveToNext()); 98b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov c.close(); 99b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 100127071b6305023a79b7d8f473ef6887843389f6eDmitri Plotnikov // Delete the rule 1010c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_AUTOMATIC, 1020c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 103b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 104b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov // Verify that the row is gone 1050c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov c = mResolver.query(AggregationExceptions.CONTENT_URI, AGGREGATION_EXCEPTION_PROJECTION, 1060c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov selection, null, null); 107b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov assertFalse(c.moveToFirst()); 108b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov c.close(); 109b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov } 110b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 111a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void testAggregationCreatesNewAggregate() { 112d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 113a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 1145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Uri resultUri = insertStructuredName(rawContactId, "Johna", "Smitha"); 1156bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov 1166bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov // Parse the URI and confirm that it contains an ID 117a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov assertTrue(ContentUris.parseId(resultUri) != 0); 118a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 119d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 120d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertTrue(contactId != 0); 121a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 122d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String displayName = queryDisplayName(contactId); 123a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov assertEquals("Johna Smitha", displayName); 124a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 125a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 1260dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov public void testNonAggregationFromSameAccount() { 1270dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 1280dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_1); 1290dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 1300dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov } 1310dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 132a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void testAggregationOfExactFullNameMatch() { 1330dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 134d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johnb", "Smithb"); 135a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 1360dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 137d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Johnb", "Smithb"); 138a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 139d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Johnb Smithb"); 140a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 141a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 142f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public void testAggregationIgnoresInvisibleContact() { 143f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov Account account = new Account("accountName", "accountType"); 144f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov createAutoAddGroup(account); 145f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 146f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId1 = createRawContact(account); 147f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId1, "Flynn", "Ryder"); 148f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 149f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov // Hide by removing from all groups 150f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov removeGroupMemberships(rawContactId1); 151f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 152f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId2 = createRawContact(account); 153f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId2, "Flynn", "Ryder"); 154f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 155f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId3 = createRawContact(ACCOUNT_2); 156f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId3, "Flynn", "Ryder"); 157f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 158f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 159f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 160f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertAggregated(rawContactId2, rawContactId3, "Flynn Ryder"); 161f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 162f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 163a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void testAggregationOfCaseInsensitiveFullNameMatch() { 1640dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 165d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johnc", "Smithc"); 166a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 1670dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 168d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Johnc", "smithc"); 169a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 170d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Johnc Smithc"); 171a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 172a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 173a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void testAggregationOfLastNameMatch() { 1740dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 175d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, null, "Johnd"); 176a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 1770dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 178d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, null, "johnd"); 179a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 180d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Johnd"); 1816bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov } 1826bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov 183a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void testNonAggregationOfFirstNameMatch() { 1840dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 185d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johne", "Smithe"); 186a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 1870dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 188d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Johne", null); 189a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 190d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 191a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 192a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 193a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov // TODO: should this be allowed to match? 194a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void testNonAggregationOfLastNameMatch() { 1950dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 196d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johnf", "Smithf"); 197a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 1980dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 199d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, null, "Smithf"); 200a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 201d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 202a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 203a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 204a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void testAggregationOfConcatenatedFullNameMatch() { 2050dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 206d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johng", "Smithg"); 207a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 2080dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 209d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "johngsmithg", null); 210a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 211d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Johng Smithg"); 212a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 213a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 21490dfb8e292caac95c84767aeea6069fad0052373Dmitri Plotnikov public void testAggregationOfNormalizedFullNameMatch() { 2150dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 216d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "H\u00e9l\u00e8ne", "Bj\u00f8rn"); 21790dfb8e292caac95c84767aeea6069fad0052373Dmitri Plotnikov 2180dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 219d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "helene bjorn", null); 22090dfb8e292caac95c84767aeea6069fad0052373Dmitri Plotnikov 221d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "H\u00e9l\u00e8ne Bj\u00f8rn"); 22290dfb8e292caac95c84767aeea6069fad0052373Dmitri Plotnikov } 22390dfb8e292caac95c84767aeea6069fad0052373Dmitri Plotnikov 22473f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov public void testAggregationOfNormalizedFullNameMatchWithReadOnlyAccount() { 22573f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov long rawContactId1 = createRawContact(new Account("acct", READ_ONLY_ACCOUNT_TYPE)); 22673f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov insertStructuredName(rawContactId1, "H\u00e9l\u00e8ne", "Bj\u00f8rn"); 22773f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov 22873f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov long rawContactId2 = createRawContact(); 22973f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov insertStructuredName(rawContactId2, "helene bjorn", null); 23073f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov 23173f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "helene bjorn"); 23273f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov } 23373f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov 234f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov public void testAggregationOfNumericNames() { 2350dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 236f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov insertStructuredName(rawContactId1, "123", null); 237f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 2380dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 239f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov insertStructuredName(rawContactId2, "1-2-3", null); 240f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 241f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "1-2-3"); 242f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov } 243f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 244f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov public void testAggregationOfInconsistentlyParsedNames() { 2450dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 246f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 247f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov ContentValues values = new ContentValues(); 248f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "604 Arizona Ave"); 249f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "604"); 250f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Arizona"); 251f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Ave"); 252f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov insertStructuredName(rawContactId1, values); 253f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 2540dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 255f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.clear(); 256f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "604 Arizona Ave"); 257f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "604"); 258f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Arizona Ave"); 259f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov insertStructuredName(rawContactId2, values); 260f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 261f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "604 Arizona Ave"); 262f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov } 263f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 264f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov public void testAggregationBasedOnMiddleName() { 265f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov ContentValues values = new ContentValues(); 2660dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 267f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 268f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "Abigale"); 269f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "James"); 270f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 271f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov insertStructuredName(rawContactId1, values); 272f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 2730dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 274f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.clear(); 275f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 276f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "Marie"); 277f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "James"); 278f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov insertStructuredName(rawContactId2, values); 279f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 280f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 281f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov } 282f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 283bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov public void testAggregationBasedOnPhoneNumberNoNameData() { 2840dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 285d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1231"); 286bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 2870dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 288d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1231"); 289bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 290d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 291bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 292bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 2930dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov public void testNonAggregationBasedOnPhoneNumberNoNameDataSameAccount() { 2940dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 2950dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1231"); 2960dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 2970dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 2980dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1231"); 2990dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 3000dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId3 = createRawContact(ACCOUNT_1); 3010dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov insertPhoneNumber(rawContactId3, "888-555-1231"); 3020dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 3030dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 3040dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 3050dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 3060dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov } 3070dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 308bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov public void testAggregationBasedOnPhoneNumberWhenTargetAggregateHasNoName() { 3090dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 310d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1232"); 311bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3120dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 313d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Johnl", "Smithl"); 314d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1232"); 315bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 316d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 317bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 318bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 319bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov public void testAggregationBasedOnPhoneNumberWhenNewContactHasNoName() { 3200dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 321d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johnm", "Smithm"); 322d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1233"); 323bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3240dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 325d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1233"); 326bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 327d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 328bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 329bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 330bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov public void testAggregationBasedOnPhoneNumberWithDifferentNames() { 3310dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 332d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Baby", "Bear"); 333d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1235"); 334bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3350dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 336d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Blind", "Mouse"); 337d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1235"); 338bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 339d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 340bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 341bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 342ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov public void testAggregationBasedOnPhoneNumberWithJustFirstName() { 3430dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 344ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov insertStructuredName(rawContactId1, "Chick", "Notnull"); 345ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1236"); 346ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov 3470dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 348ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov insertStructuredName(rawContactId2, "Chick", null); 349ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1236"); 350ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov 351ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 352ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov } 353ff776f8b3b9ca16aed64085060fe3ac1a68f955fDmitri Plotnikov 354a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationBasedOnEmailNoNameData() { 3550dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 356d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId1, "lightning@android.com"); 357a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 3580dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 359d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId2, "lightning@android.com"); 360a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 361d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 362a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 363a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 364a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationBasedOnEmailWhenTargetAggregateHasNoName() { 3650dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 366d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId1, "mcqueen@android.com"); 367a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 3680dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 369d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Lightning", "McQueen"); 370d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId2, "mcqueen@android.com"); 371a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 37225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Lightning McQueen"); 373a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 374a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 375a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationBasedOnEmailWhenNewContactHasNoName() { 3760dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 377d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Doc", "Hudson"); 378d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId1, "doc@android.com"); 379a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 3800dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 381d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId2, "doc@android.com"); 382a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 383d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 384a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 385a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 386a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationBasedOnEmailWithDifferentNames() { 3870dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 388d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Chick", "Hicks"); 389d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId1, "hicky@android.com"); 390a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 3910dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 392d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Luigi", "Guido"); 393d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId2, "hicky@android.com"); 394a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 395d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 396a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 397a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 398a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationByCommonNicknameWithLastName() { 3990dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 400d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Bill", "Gore"); 401b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 4020dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 403d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "William", "Gore"); 404b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 405d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "William Gore"); 406b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 407b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 408a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationByCommonNicknameOnly() { 4090dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 410d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Lawrence", null); 411a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 4120dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 413d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Larry", null); 414a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 415d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Lawrence"); 416a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 417a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 418a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationByNicknameNoStructuredName() { 4190dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 420d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertNickname(rawContactId1, "Frozone"); 421a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 4220dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 423d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertNickname(rawContactId2, "Frozone"); 424a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 425d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 426a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 427a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 428a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationByNicknameWithDifferentNames() { 4290dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 430d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Helen", "Parr"); 431d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertNickname(rawContactId1, "Elastigirl"); 432b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 4330dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 434d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Shawn", "Johnson"); 435d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertNickname(rawContactId2, "Elastigirl"); 436b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 437d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 438b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 439b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 4403684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov public void testNonAggregationOnOrganization() { 4413684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov ContentValues values = new ContentValues(); 4423684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov values.put(Organization.TITLE, "Monsters, Inc"); 4430dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 4443684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov insertOrganization(rawContactId1, values); 4453684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov insertNickname(rawContactId1, "Boo"); 4463684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov 4470dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 4483684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov insertOrganization(rawContactId2, values); 4493684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov insertNickname(rawContactId2, "Rendall"); // To force reaggregation 4503684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov 4513684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 4523684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov } 4533684089aba82df3f7a0c111e7c96ed8b0380e57aDmitri Plotnikov 4547a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov public void testAggregationExceptionKeepIn() { 4550dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 456d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johnk", "Smithk"); 457b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 4580dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 459d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Johnkx", "Smithkx"); 460b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 461d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 462d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 46380c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov 4640c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 4650c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 466b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 467d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Johnkx Smithkx"); 46880c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov 46980c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov // Assert that the empty aggregate got removed 470d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long newContactId1 = queryContactId(rawContactId1); 471d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov if (contactId1 != newContactId1) { 472d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor cursor = queryContact(contactId1); 47380c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov assertFalse(cursor.moveToFirst()); 47480c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov cursor.close(); 47580c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov } else { 476d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor cursor = queryContact(contactId2); 47780c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov assertFalse(cursor.moveToFirst()); 47880c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov cursor.close(); 47980c457131bd22afe34828d1a5d15e90bb5f43375Dmitri Plotnikov } 480b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov } 481b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 4827a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov public void testAggregationExceptionKeepOut() { 4830dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 484d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johnh", "Smithh"); 4857a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 4860dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 487d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Johnh", "Smithh"); 4887a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 4890c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 4900c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 4917a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 492d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 4937a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov } 4947a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 4957a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov public void testAggregationExceptionKeepOutCheckUpdatesDisplayName() { 4960dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 497d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Johni", "Smithi"); 4987a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 4990dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 500d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Johnj", "Smithj"); 5017a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 5020dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId3 = createRawContact(ACCOUNT_3); 503dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov insertStructuredName(rawContactId3, "Johnm", "Smithm"); 504dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov 5050c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 5060c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 507dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 508dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov rawContactId1, rawContactId3); 509dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 510dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov rawContactId2, rawContactId3); 5117a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 512dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Johnm Smithm"); 513dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertAggregated(rawContactId1, rawContactId3); 5147a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 5150c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 5160c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 517dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 518dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov rawContactId1, rawContactId3); 5197a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 520d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 521dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 5227a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 523d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String displayName1 = queryDisplayName(queryContactId(rawContactId1)); 5247a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov assertEquals("Johni Smithi", displayName1); 5257a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 526dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertAggregated(rawContactId2, rawContactId3, "Johnm Smithm"); 527dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov 528dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 529dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov rawContactId2, rawContactId3); 530dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 531dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 532dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 533dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov 534dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov String displayName2 = queryDisplayName(queryContactId(rawContactId1)); 535dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertEquals("Johni Smithi", displayName2); 536dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov 537dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov String displayName3 = queryDisplayName(queryContactId(rawContactId2)); 538dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertEquals("Johnj Smithj", displayName3); 539dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov 540dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov String displayName4 = queryDisplayName(queryContactId(rawContactId3)); 541dea3ee5e7f84be2abfe35837a460cbe779d319dbDmitri Plotnikov assertEquals("Johnm Smithm", displayName4); 5427a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov } 5437a39bf269294a8130ddd463460b9b36cf4ff74a8Dmitri Plotnikov 5440dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov public void testNonAggregationWithMultipleAffinities() { 5450dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 5460dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_1); 5470dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 5480dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 5490dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov // There are two aggregates this raw contact could join, so it should join neither 5500dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId3 = createRawContactWithName("John", "Doe", ACCOUNT_2); 5510dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 5520dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 5530dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 5540dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov // Just in case - let's make sure the original two did not get aggregated in the process 5550dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 5560dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov } 5570dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 5580dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov public void testSplitBecauseOfMultipleAffinities() { 5590dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 5600dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_2); 5610dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 5620dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 5630dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov // The aggregate this raw contact could join has a raw contact from the same account, 5640dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov // let's not aggregate and break up the existing aggregate because of the ambiguity 5650dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId3 = createRawContactWithName("John", "Doe", ACCOUNT_1); 5660dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 5670dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 5680dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 5690dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov } 5700dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 571f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public void testReaggregationWhenBecomesInvisible() { 572f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov Account account = new Account("accountName", "accountType"); 573f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov createAutoAddGroup(account); 574f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 575f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId1 = createRawContact(account); 576f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId1, "Flynn", "Ryder"); 577f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 578f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 579f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId2, "Flynn", "Ryder"); 580f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 581f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId3 = createRawContact(account); 582f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId3, "Flynn", "Ryder"); 583f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 584f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 585f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 586f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 587f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 588f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov // Hide by removing from all groups 589f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov removeGroupMemberships(rawContactId3); 590f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 591f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Flynn Ryder"); 592f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 593f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 594f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 595f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 596f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public void testReaggregationWhenBecomesInvisibleSecondaryDataMatch() { 597f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov Account account = new Account("accountName", "accountType"); 598f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov createAutoAddGroup(account); 599f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 600f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId1 = createRawContact(account); 601f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId1, "Flynn", "Ryder"); 602f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertPhoneNumber(rawContactId1, "1234567890"); 603f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 604f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 605f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1234567890"); 606f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 607f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId3 = createRawContact(account); 608f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId3, "Flynn", "Ryder"); 609f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 610f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 611f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 612f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 613f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 614f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov // Hide by removing from all groups 615f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov removeGroupMemberships(rawContactId3); 616f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 617f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Flynn Ryder"); 618f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 619f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 620f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 621f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 622f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public void testReaggregationWhenBecomesVisible() { 623f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov Account account = new Account("accountName", "accountType"); 624f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long groupId = createAutoAddGroup(account); 625f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 626f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId1 = createRawContact(account); 627f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId1, "Flynn", "Ryder"); 628f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 629f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 630f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId2, "Flynn", "Ryder"); 631f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 632f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov long rawContactId3 = createRawContact(account); 633f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov removeGroupMemberships(rawContactId3); 634f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertStructuredName(rawContactId3, "Flynn", "Ryder"); 635f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 636f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Flynn Ryder"); 637f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 638f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 639f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 640f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov insertGroupMembership(rawContactId3, groupId); 641f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 642f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 643f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId2, rawContactId3); 644f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 645f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 646f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 6470dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov public void testNonSplitBecauseOfMultipleAffinitiesWhenOverridden() { 6480dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 6490dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_2); 6500dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId3 = createRawContactWithName("John", "Doe", ACCOUNT_3); 651afcfc0005f7c93d46c28cdd8e18f956287ca0d18Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 652afcfc0005f7c93d46c28cdd8e18f956287ca0d18Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId3); 6530dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov setAggregationException( 6540dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 6550dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 6560dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId3); 6570dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 6580dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov // The aggregate this raw contact could join has a raw contact from the same account, 6590dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov // let's not aggregate and break up the existing aggregate because of the ambiguity 6600dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId4 = createRawContactWithName("John", "Doe", ACCOUNT_1); 6610dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); // Aggregation exception 6620dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId3); 6630dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId4); 6640dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov assertNotAggregated(rawContactId3, rawContactId4); 6650dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov } 6660dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov 667bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov public void testAggregationSuggestionsBasedOnName() { 668d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 669d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Duane", null); 67031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov 671cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov // Exact name match 672d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 673d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Duane", null); 6740c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 6750c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 67631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov 677cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov // Edit distance == 0.84 678d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId3 = createRawContact(); 679d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId3, "Dwayne", null); 680cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov 681cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov // Edit distance == 0.6 682d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId4 = createRawContact(); 683d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId4, "Donny", null); 684cceca0d48bc5b0c7fc20b987439add82f734a8f5Dmitri Plotnikov 685d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 686d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 687d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId3 = queryContactId(rawContactId3); 68831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov 689d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSuggestions(contactId1, contactId2, contactId3); 69031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov } 691bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 692bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov public void testAggregationSuggestionsBasedOnPhoneNumber() { 693bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 694bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov // Create two contacts that would not be aggregated because of name mismatch 695d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 696d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Lord", "Farquaad"); 697d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1236"); 698bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 699d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 700d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Talking", "Donkey"); 701d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1236"); 702bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 703d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 704d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 705d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertTrue(contactId1 != contactId2); 706bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 707d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSuggestions(contactId1, contactId2); 708a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 709bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 710a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationSuggestionsBasedOnEmailAddress() { 711bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 712a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov // Create two contacts that would not be aggregated because of name mismatch 713d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 714d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Carl", "Fredricksen"); 715d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId1, "up@android.com"); 716bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 717d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 718d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Charles", "Muntz"); 719d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertEmail(rawContactId2, "up@android.com"); 720a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 721d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 722d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 723d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertTrue(contactId1 != contactId2); 724a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 725d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSuggestions(contactId1, contactId2); 726a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 727a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 728a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationSuggestionsBasedOnEmailAddressApproximateMatch() { 729a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 730a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov // Create two contacts that would not be aggregated because of name mismatch 731d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 732d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Bob", null); 7336581e1d13b9f310c2d7def2d2645f25158814107Dmitri Plotnikov insertEmail(rawContactId1, "incredible@android.com"); 734a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 735d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 736d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Lucius", "Best"); 7376581e1d13b9f310c2d7def2d2645f25158814107Dmitri Plotnikov insertEmail(rawContactId2, "incrediball@android.com"); 738a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 739d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 740d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 741d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertTrue(contactId1 != contactId2); 742a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 743d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSuggestions(contactId1, contactId2); 744bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 745b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 746b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public void testAggregationSuggestionsBasedOnNickname() { 747d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 748d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Peter", "Parker"); 749d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertNickname(rawContactId1, "Spider-Man"); 750a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 751d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 752d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Manny", "Spider"); 753a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 754d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 7550c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 7560c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 757a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 758d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 759d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSuggestions(contactId1, contactId2); 760a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 761a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 762a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationSuggestionsBasedOnNicknameMatchingName() { 763d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 764d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Clark", "Kent"); 765d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertNickname(rawContactId1, "Superman"); 766a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 767d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 768d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Roy", "Williams"); 769d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertNickname(rawContactId2, "superman"); 770a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 771d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 7720c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 7730c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 774a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 775d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 776d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSuggestions(contactId1, contactId2); 777a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 778a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 779a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public void testAggregationSuggestionsBasedOnCommonNickname() { 780d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 781d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId1, "Dick", "Cherry"); 782b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 783d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 784d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov insertStructuredName(rawContactId2, "Richard", "Cherry"); 785b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 7860c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 7870c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 788b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 789dee54bb86f3608730f0b9f37d8982a7f6b280a85Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 790d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 791d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSuggestions(contactId1, contactId2); 792a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 793a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 7942d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov public void testAggregationSuggestionsBasedOnPhoneNumberWithFilter() { 7952d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov 7962d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov // Create two contacts that would not be aggregated because of name mismatch 7972d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov long rawContactId1 = createRawContact(); 7982d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov insertStructuredName(rawContactId1, "Lord", "Farquaad"); 7992d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov insertPhoneNumber(rawContactId1, "(888)555-1236"); 8002d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov 8012d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov long rawContactId2 = createRawContact(); 8022d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov insertStructuredName(rawContactId2, "Talking", "Donkey"); 8032d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov insertPhoneNumber(rawContactId2, "1(888)555-1236"); 8042d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov 8052d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 8062d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 8072d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov assertTrue(contactId1 != contactId2); 8082d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov 8092d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov assertSuggestions(contactId1, "talk", contactId2); 8102d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov assertSuggestions(contactId1, "don", contactId2); 8112d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov assertSuggestions(contactId1, "", contactId2); 8122d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov assertSuggestions(contactId1, "eddie"); 8132d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov } 8142d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov 815767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov public void testChoosePhotoSetBeforeAggregation() { 816d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 817767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setContactAccount(rawContactId1, "donut", "donut_act"); 818767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov insertPhoto(rawContactId1); 819767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov 820767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov long rawContactId2 = createRawContact(); 821767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setContactAccount(rawContactId2, "cupcake", "cupcake_act"); 822767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov long cupcakeId = ContentUris.parseId(insertPhoto(rawContactId2)); 823767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov 824767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov long rawContactId3 = createRawContact(); 825767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setContactAccount(rawContactId3, "froyo", "froyo_act"); 826767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov insertPhoto(rawContactId3); 827767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov 828767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 829767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov rawContactId1, rawContactId2); 830767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 831767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov rawContactId1, rawContactId3); 832767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov assertEquals(cupcakeId, queryPhotoId(queryContactId(rawContactId2))); 833767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov } 834767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov 835767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov public void testChoosePhotoSetAfterAggregation() { 836767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov long rawContactId1 = createRawContact(); 837767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setContactAccount(rawContactId1, "donut", "donut_act"); 8380c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov insertPhoto(rawContactId1); 839ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 840d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId2 = createRawContact(); 8410c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 8420c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 843767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setContactAccount(rawContactId2, "cupcake", "cupcake_act"); 844d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long cupcakeId = ContentUris.parseId(insertPhoto(rawContactId2)); 845ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 846d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId3 = createRawContact(); 8470c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 8480c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId3); 849767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov setContactAccount(rawContactId3, "froyo", "froyo_act"); 8500c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov insertPhoto(rawContactId3); 851ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 852d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertEquals(cupcakeId, queryPhotoId(queryContactId(rawContactId2))); 853ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar } 854ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 85587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Note that for the following tests of photo aggregation, the accounts are being used to 85687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // set the typical photo priority that each raw contact would have, based on 85787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // SynchronousContactsProvider2.createPhotoPriorityResolver. The relative priorities 85887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // specified there are: 85987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // cupcake: 3 86087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // donut: 2 86187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // froyo: 1 86287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // <other>: 0 86387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 86487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro public void testChooseLargerPhotoByDimensions() { 86587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Donut photo is 256x256. 86687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId1 = createRawContact(); 86787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId1, "donut", "donut_act"); 86887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long normalEarthDataId = ContentUris.parseId( 86987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId1, R.drawable.earth_normal)); 87087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long normalEarthPhotoFileId = getStoredLongValue( 87187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, normalEarthDataId), 87287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro Photo.PHOTO_FILE_ID); 87387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 87487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Cupcake would normally have priority, but its photo is 200x200. 87587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId2 = createRawContact(); 87687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId2, "cupcake", "cupcake_act"); 87787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId2, R.drawable.earth_200); 87887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 87987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 88087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro rawContactId1, rawContactId2); 88187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 88287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Larger photo (by dimensions) wins. 88387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro assertEquals(normalEarthPhotoFileId, queryPhotoFileId(queryContactId(rawContactId1))); 88487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro } 88587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 88687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro public void testChooseLargerPhotoByFileSize() { 88787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Donut photo is a 256x256 photo of a nebula. 88887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId1 = createRawContact(); 88987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId1, "donut", "donut_act"); 89087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long nebulaDataId = ContentUris.parseId( 89187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId1, R.drawable.nebula)); 89287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long nebulaPhotoFileId = getStoredLongValue( 89387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, nebulaDataId), 89487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro Photo.PHOTO_FILE_ID); 89587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 89687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Cupcake would normally have priority, but its photo (of a galaxy) has the same dimensions 89787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // as Donut's, but a smaller filesize. 89887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId2 = createRawContact(); 89987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId2, "cupcake", "cupcake_act"); 90087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId2, R.drawable.galaxy); 90187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 90287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 90387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro rawContactId1, rawContactId2); 90487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 90587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Larger photo (by filesize) wins. 90687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro assertEquals(nebulaPhotoFileId, queryPhotoFileId(queryContactId(rawContactId1))); 90787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro } 90887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 90987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro public void testChooseFilePhotoOverThumbnail() { 91087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Donut photo is a 256x256 photo of Earth. 91187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId1 = createRawContact(); 91287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId1, "donut", "donut_act"); 91387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long normalEarthDataId = ContentUris.parseId( 91487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId1, R.drawable.earth_normal)); 91587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long normalEarthPhotoFileId = getStoredLongValue( 91687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, normalEarthDataId), 91787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro Photo.PHOTO_FILE_ID); 91887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 91987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Cupcake would normally have priority, but its photo of Earth is thumbnail-sized. 92087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId2 = createRawContact(); 92187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId2, "cupcake", "cupcake_act"); 92287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId2, R.drawable.earth_small); 92387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 92487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 92587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro rawContactId1, rawContactId2); 92687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 92787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Larger photo (by filesize) wins. 92887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro assertEquals(normalEarthPhotoFileId, queryPhotoFileId(queryContactId(rawContactId1))); 92987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro } 93087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 93187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro public void testFallbackToAccountPriorityForSamePhoto() { 93287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Donut photo is a 256x256 photo of Earth. 93387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId1 = createRawContact(); 93487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId1, "donut", "donut_act"); 93587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId1, R.drawable.earth_normal); 93687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 93787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Cupcake has the same 256x256 photo of Earth. 93887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId2 = createRawContact(); 93987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId2, "cupcake", "cupcake_act"); 94087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long cupcakeEarthDataId = ContentUris.parseId( 94187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId2, R.drawable.earth_normal)); 94287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long cupcakeEarthPhotoFileId = getStoredLongValue( 94387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, cupcakeEarthDataId), 94487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro Photo.PHOTO_FILE_ID); 94587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 94687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 94787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro rawContactId1, rawContactId2); 94887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 94987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Cupcake's version of the photo wins, falling back to account priority. 95087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro assertEquals(cupcakeEarthPhotoFileId, queryPhotoFileId(queryContactId(rawContactId1))); 95187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro } 95287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 95387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro public void testFallbackToAccountPriorityForDifferingThumbnails() { 95487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Donut photo is a 96x96 thumbnail of Earth. 95587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId1 = createRawContact(); 95687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId1, "donut", "donut_act"); 95787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId1, R.drawable.earth_small); 95887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 95987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // Cupcake photo is the 96x96 "no contact" placeholder (smaller filesize than the Earth 96087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // picture, but thumbnail filesizes are ignored in the aggregator). 96187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long rawContactId2 = createRawContact(); 96287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setContactAccount(rawContactId2, "cupcake", "cupcake_act"); 96387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro long cupcakeDataId = ContentUris.parseId( 96487614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro insertPhoto(rawContactId2, R.drawable.ic_contact_picture)); 96587614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 96687614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 96787614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro rawContactId1, rawContactId2); 96887614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 96987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro // The Cupcake thumbnail wins, by account priority.. 97087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro assertEquals(cupcakeDataId, queryPhotoId(queryContactId(rawContactId1))); 97187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro } 97287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 973f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov public void testDisplayNameSources() { 974f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov long rawContactId = createRawContact(); 975f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov long contactId = queryContactId(rawContactId); 976f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 977f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertNull(queryDisplayName(contactId)); 978f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 979f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov insertEmail(rawContactId, "eclair@android.com"); 980f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("eclair@android.com", queryDisplayName(contactId)); 981f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 982f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov insertPhoneNumber(rawContactId, "800-555-5555"); 983f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("800-555-5555", queryDisplayName(contactId)); 984f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 985f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov ContentValues values = new ContentValues(); 986f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov values.put(Organization.COMPANY, "Android"); 987f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov insertOrganization(rawContactId, values); 988f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("Android", queryDisplayName(contactId)); 989f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 990f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov insertNickname(rawContactId, "Dro"); 991f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("Dro", queryDisplayName(contactId)); 992f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 993f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov values.clear(); 994f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "Eclair"); 995f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Android"); 996f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov insertStructuredName(rawContactId, values); 997f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("Eclair Android", queryDisplayName(contactId)); 998f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 999f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 1000f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov public void testVerifiedName() { 10010dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContactWithName("test1", "TEST1", ACCOUNT_1); 1002f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov storeValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.NAME_VERIFIED, "1"); 10030dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContactWithName("test2", "TEST2", ACCOUNT_2); 10040dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId3 = createRawContactWithName("test3", "TEST3 LONG", ACCOUNT_3); 1005f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 1006f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, 1007f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov rawContactId2); 1008f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, 1009f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov rawContactId3); 1010f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 1011f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 1012f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 1013f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov // Should be the verified name 1014f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("test1 TEST1", queryDisplayName(contactId)); 1015f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 1016f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov // Mark a different name as verified - this should reset the NAME_VERIFIED field 1017f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov // for the other rawContacts 1018f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov storeValue(RawContacts.CONTENT_URI, rawContactId2, RawContacts.NAME_VERIFIED, "1"); 1019f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertStoredValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.NAME_VERIFIED, 0); 1020f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("test2 TEST2", queryDisplayName(contactId)); 1021f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 1022f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov // Reset the NAME_VERIFIED flag - now the most complex of the three names should win 1023f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov storeValue(RawContacts.CONTENT_URI, rawContactId2, RawContacts.NAME_VERIFIED, "0"); 1024f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertEquals("test3 TEST3 LONG", queryDisplayName(contactId)); 1025f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 1026f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 1027f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov public void testAggregationModeSuspendedSeparateTransactions() { 1028f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1029f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov // Setting aggregation mode to SUSPENDED should prevent aggregation from happening 10300dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId1 = createRawContact(ACCOUNT_1); 1031f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov storeValue(RawContacts.CONTENT_URI, rawContactId1, 1032f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED); 1033f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov Uri name1 = insertStructuredName(rawContactId1, "THE", "SAME"); 1034f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 10350dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov long rawContactId2 = createRawContact(ACCOUNT_2); 1036f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov storeValue(RawContacts.CONTENT_URI, rawContactId2, 1037f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED); 1038f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov insertStructuredName(rawContactId2, "THE", "SAME"); 1039f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1040f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 1041f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1042f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov // Changing aggregation mode to DEFAULT should change nothing 1043f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov storeValue(RawContacts.CONTENT_URI, rawContactId1, 1044f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT); 1045f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov storeValue(RawContacts.CONTENT_URI, rawContactId2, 1046f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT); 1047f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 1048f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1049f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov // Changing the name should trigger aggregation 1050f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov storeValue(name1, StructuredName.GIVEN_NAME, "the"); 1051f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 1052f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov } 1053f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1054f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov public void testAggregationModeInitializedAsSuspended() throws Exception { 1055f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1056f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov // Setting aggregation mode to SUSPENDED should prevent aggregation from happening 1057f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 1058f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED) 1059f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1060f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 1061f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 1062f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 1063f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 1064f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 1065f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1066f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo3 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 1067f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED) 1068f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1069f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo4 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 1070f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 2) 1071f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 1072f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 1073f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 1074f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1075f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo5 = ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI) 1076f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelection(RawContacts._ID + "=?", new String[1]) 1077f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelectionBackReference(0, 0) 1078f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT) 1079f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1080f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo6 = ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI) 1081f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelection(RawContacts._ID + "=?", new String[1]) 1082f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelectionBackReference(0, 2) 1083f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT) 1084f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1085f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1086f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderResult[] results = 1087f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, 1088f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov Lists.newArrayList(cpo1, cpo2, cpo3, cpo4, cpo5, cpo6)); 1089f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1090f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov long rawContactId1 = ContentUris.parseId(results[0].uri); 1091f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov long rawContactId2 = ContentUris.parseId(results[2].uri); 1092f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1093f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 1094f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov } 1095f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1096f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov public void testAggregationModeUpdatedToSuspended() throws Exception { 1097f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1098f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov // Setting aggregation mode to SUSPENDED should prevent aggregation from happening 1099f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 1100f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValues(new ContentValues()) 1101f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1102f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 1103f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 1104f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 1105f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 1106f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 1107f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1108f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo3 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 1109f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValues(new ContentValues()) 1110f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1111f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo4 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 1112f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 2) 1113f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 1114f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 1115f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 1116f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1117f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo5 = ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI) 1118f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelection(RawContacts._ID + "=?", new String[1]) 1119f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelectionBackReference(0, 0) 1120f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED) 1121f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1122f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderOperation cpo6 = ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI) 1123f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelection(RawContacts._ID + "=?", new String[1]) 1124f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withSelectionBackReference(0, 2) 1125f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED) 1126f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov .build(); 1127f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1128f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentProviderResult[] results = 1129f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, 1130f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov Lists.newArrayList(cpo1, cpo2, cpo3, cpo4, cpo5, cpo6)); 1131f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1132f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov long rawContactId1 = ContentUris.parseId(results[0].uri); 1133f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov long rawContactId2 = ContentUris.parseId(results[2].uri); 1134f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 1135f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov assertNotAggregated(rawContactId1, rawContactId2); 1136f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov } 1137f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 113869cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov public void testAggregationModeSuspendedOverriddenByAggException() throws Exception { 113969cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 11400dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov .withValue(RawContacts.ACCOUNT_NAME, "a") 11410dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov .withValue(RawContacts.ACCOUNT_TYPE, "b") 114269cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .build(); 114369cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 114469cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 114569cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 114669cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 114769cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 114869cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .build(); 114969cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation cpo3 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 11500dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov .withValue(RawContacts.ACCOUNT_NAME, "c") 11510dce6bf7a86a78d3073327419f17395c3a2d2688Dmitri Plotnikov .withValue(RawContacts.ACCOUNT_TYPE, "d") 115269cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .build(); 115369cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation cpo4 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 115469cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 2) 115569cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 115669cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 115769cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 115869cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .build(); 115969cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation cpo5 = ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI) 116069cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withSelection(RawContacts._ID + "=?", new String[1]) 116169cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withSelectionBackReference(0, 0) 116269cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED) 116369cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .build(); 116469cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation cpo6 = ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI) 116569cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withSelection(RawContacts._ID + "=?", new String[1]) 116669cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withSelectionBackReference(0, 2) 116769cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_SUSPENDED) 116869cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .build(); 116969cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov 117069cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov // Checking that aggregation mode SUSPENDED should be overridden by inserting 117169cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov // an explicit aggregation exception 117269cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation cpo7 = 117369cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI) 117469cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1, 0) 117569cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, 2) 117669cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER) 117769cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov .build(); 117869cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov 117969cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov ContentProviderResult[] results = 118069cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, 118169cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov Lists.newArrayList(cpo1, cpo2, cpo3, cpo4, cpo5, cpo6, cpo7)); 118269cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov 118369cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov long rawContactId1 = ContentUris.parseId(results[0].uri); 118469cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov long rawContactId2 = ContentUris.parseId(results[2].uri); 118569cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov 118669cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 118769cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov } 118869cc3a2b09e2ffb606c6e52a71b604bba526d225Dmitri Plotnikov 11895b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov public void testAggregationSuggestionsQueryBuilderWithContactId() throws Exception { 11905b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov Uri uri = AggregationSuggestions.builder().setContactId(12).setLimit(7).build(); 11915b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov assertEquals("content://com.android.contacts/contacts/12/suggestions?limit=7", 11925b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov uri.toString()); 11935b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov } 11945b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 11955b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov public void testAggregationSuggestionsQueryBuilderWithValues() throws Exception { 11965b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov Uri uri = AggregationSuggestions.builder() 119776dfa406e2cde19c824983c37fc92c1c5bf63eecDaniel Lehmann .addParameter(AggregationSuggestions.PARAMETER_MATCH_NAME, "name1") 119876dfa406e2cde19c824983c37fc92c1c5bf63eecDaniel Lehmann .addParameter(AggregationSuggestions.PARAMETER_MATCH_NAME, "name2") 119976dfa406e2cde19c824983c37fc92c1c5bf63eecDaniel Lehmann .addParameter(AggregationSuggestions.PARAMETER_MATCH_EMAIL, "email1") 120076dfa406e2cde19c824983c37fc92c1c5bf63eecDaniel Lehmann .addParameter(AggregationSuggestions.PARAMETER_MATCH_EMAIL, "email2") 120176dfa406e2cde19c824983c37fc92c1c5bf63eecDaniel Lehmann .addParameter(AggregationSuggestions.PARAMETER_MATCH_PHONE, "phone1") 120276dfa406e2cde19c824983c37fc92c1c5bf63eecDaniel Lehmann .addParameter(AggregationSuggestions.PARAMETER_MATCH_NICKNAME, "nickname1") 12035b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov .setLimit(7) 12045b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov .build(); 12058727a729d5c0e875538025f0a85b3ac64c3a7745Dmitri Plotnikov assertEquals("content://com.android.contacts/contacts/0/suggestions?" 12065b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov + "limit=7" 12075b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov + "&query=name%3Aname1" 12085b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov + "&query=name%3Aname2" 12095b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov + "&query=email%3Aemail1" 12105b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov + "&query=email%3Aemail2" 12115b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov + "&query=phone%3Aphone1" 12125b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov + "&query=nickname%3Anickname1", uri.toString()); 12135b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov } 12145b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 1215f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov public void testAggregatedStatusUpdate() { 1216f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov long rawContactId1 = createRawContact(); 1217f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov Uri dataUri1 = insertStructuredName(rawContactId1, "john", "doe"); 1218f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov insertStatusUpdate(ContentUris.parseId(dataUri1), StatusUpdates.AWAY, "Green", 100, 1219f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 1220f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov long rawContactId2 = createRawContact(); 1221f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov Uri dataUri2 = insertStructuredName(rawContactId2, "john", "doe"); 1222f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov insertStatusUpdate(ContentUris.parseId(dataUri2), StatusUpdates.AVAILABLE, "Red", 50, 1223f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 1224f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov setAggregationException( 1225f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 1226f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 1227f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov assertStoredValue(getContactUriForRawContact(rawContactId1), 1228f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov Contacts.CONTACT_STATUS, "Green"); 1229f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 1230f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov // When we split these two raw contacts, their respective statuses should be restored 1231f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov setAggregationException( 1232f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov AggregationExceptions.TYPE_KEEP_SEPARATE, rawContactId1, rawContactId2); 1233f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 1234f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov assertStoredValue(getContactUriForRawContact(rawContactId1), 1235f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov Contacts.CONTACT_STATUS, "Green"); 1236f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 1237f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov assertStoredValue(getContactUriForRawContact(rawContactId2), 1238f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov Contacts.CONTACT_STATUS, "Red"); 1239f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov } 1240f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 12415b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov public void testAggregationSuggestionsByName() throws Exception { 12425b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov long rawContactId1 = createRawContactWithName("first1", "last1"); 12435b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov long rawContactId2 = createRawContactWithName("first2", "last2"); 12445b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 12455b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov Uri uri = AggregationSuggestions.builder() 124676dfa406e2cde19c824983c37fc92c1c5bf63eecDaniel Lehmann .addParameter(AggregationSuggestions.PARAMETER_MATCH_NAME, "last1 first1") 12475b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov .build(); 12485b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 12495b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov Cursor cursor = mResolver.query( 12505b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov uri, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null); 12515b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 12525b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov assertEquals(1, cursor.getCount()); 12535b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 12545b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov cursor.moveToFirst(); 12555b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 12565b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov ContentValues values = new ContentValues(); 12575b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov values.put(Contacts._ID, queryContactId(rawContactId1)); 12585b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "first1 last1"); 12595b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov assertCursorValues(cursor, values); 12605b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov cursor.close(); 12615b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov } 12625b3634b24d3c21618f96860e969fd5c9ba7d9ca8Dmitri Plotnikov 1263d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void assertSuggestions(long contactId, long... suggestions) { 1264d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final Uri aggregateUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 1265b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov Uri uri = Uri.withAppendedPath(aggregateUri, 1266d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.AggregationSuggestions.CONTENT_DIRECTORY); 12672d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov assertSuggestions(uri, suggestions); 12682d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov } 12692d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov 12702d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov private void assertSuggestions(long contactId, String filter, long... suggestions) { 12712d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov final Uri aggregateUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 12722d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov Uri uri = Uri.withAppendedPath(Uri.withAppendedPath(aggregateUri, 12732d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov Contacts.AggregationSuggestions.CONTENT_DIRECTORY), Uri.encode(filter)); 12742d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov assertSuggestions(uri, suggestions); 12752d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov } 12762d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov 12772d89933b87a15ae5ed5d6b6ec4220ac085695adaDmitri Plotnikov private void assertSuggestions(Uri uri, long... suggestions) { 12787581213e160c460671aebdb054b8afd2f138d99eDmitri Plotnikov final Cursor cursor = mResolver.query(uri, 127982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov new String[] { Contacts._ID, Contacts.CONTACT_PRESENCE }, 1280b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov null, null, null); 1281b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 1282a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov assertEquals(suggestions.length, cursor.getCount()); 1283b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 1284a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov for (int i = 0; i < suggestions.length; i++) { 1285a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov cursor.moveToNext(); 1286a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov assertEquals(suggestions[i], cursor.getLong(0)); 1287a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 1288b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 1289b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov cursor.close(); 1290b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 12916bc8c0d15f4eacd2e92e9064c88cdf0659524a0eDmitri Plotnikov} 1292