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