ContactsProvider2Test.java revision f7f747a00f4fa7a9e564507693419a5a8db0eb8f
1d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/* 2d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 4d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * you may not use this file except in compliance with the License. 6d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * You may obtain a copy of the License at 7d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 8d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 10d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * See the License for the specific language governing permissions and 14d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * limitations under the License. 15d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 18d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 19d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport com.android.internal.util.ArrayUtils; 20b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns; 21d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport com.google.android.collect.Lists; 22d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wongimport android.accounts.Account; 24d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderOperation; 25d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderResult; 26d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentUris; 27d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentValues; 289261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.content.Entity; 2933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.content.EntityIterator; 30d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.database.Cursor; 31d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.net.Uri; 3233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.os.RemoteException; 33c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract; 341b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikovimport android.provider.LiveFolders; 35d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 36c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 379261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.Data; 383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.PhoneLookup; 4033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 4189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikovimport android.provider.ContactsContract.Settings; 4282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.CommonDataKinds.Email; 449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 45bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millarimport android.provider.ContactsContract.CommonDataKinds.Im; 46a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaokaimport android.provider.ContactsContract.CommonDataKinds.Organization; 479261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.CommonDataKinds.Phone; 488e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 494097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 517d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekhimport android.test.MoreAsserts; 52d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 53d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 548920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens 55d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/** 56d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}. 57d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 58d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Run the test like this: 59d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * <code> 608920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.ContactsProvider2Test -w \ 6128f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 62d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * </code> 63d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 64d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov@LargeTest 65d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovpublic class ContactsProvider2Test extends BaseContactsProvider2Test { 66d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 673cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testRawContactsInsert() { 683cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 693cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 703cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_NAME, "a"); 713cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_TYPE, "b"); 723cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SOURCE_ID, "c"); 733cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.VERSION, 42); 743cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DIRTY, 1); 753cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DELETED, 1); 763cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED); 773cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 783cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 793cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 803cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 813cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC1, "e"); 823cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC2, "f"); 833cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC3, "g"); 843cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC4, "h"); 853cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 863cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values); 874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rowUri); 883cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 893cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(RawContacts.CONTENT_URI, values, RawContacts._ID, rawContactId); 9181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 923cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 933cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 943cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testDataInsert() { 954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("John", "Doe"); 964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov putDataValues(values, rawContactId); 994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 1004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 1014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 1044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(dataUri, values); 1054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Data.CONTENT_URI, values, Data._ID, dataId); 1074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under RawContacts 1094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 1104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactDataUri = 1114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri.withAppendedPath(rawContactUri, RawContacts.Data.CONTENT_DIRECTORY); 1124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(rawContactDataUri, values, Data._ID, dataId); 1134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under Contacts 1154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 1164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactDataUri = Uri.withAppendedPath(contactUri, Contacts.Data.CONTENT_DIRECTORY); 1174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(contactDataUri, values, Data._ID, dataId); 11881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 1194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 1203cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 12189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactDataQuery() { 12289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 12389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 12489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 12589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri1 = insertStructuredName(rawContactId1, "John", "Doe"); 12689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 12789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri2 = insertStructuredName(rawContactId2, "Jane", "Doe"); 12889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 12989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(dataUri1, account1); 13089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(dataUri2, account2); 13189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Data._ID, ContentUris.parseId(dataUri1)) ; 13289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Data._ID, ContentUris.parseId(dataUri2)) ; 13389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 13489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 1354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesQuery() { 1367d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 1373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 1384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 1414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 1424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 1434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 1484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertPhoneNumber(rawContactId, "18004664411"); 1494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long phoneId = ContentUris.parseId(uri); 1504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 1544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, phoneId); 1553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 1564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 1574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 1594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 1604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 1614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 1624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 1634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 1644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 1654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 1664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 1674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16848828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Phone.CONTENT_URI, phoneId), values); 1694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Phone.CONTENT_URI, values, Data._ID, phoneId); 1704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 1714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesFilterQuery() { 1735e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale"); 1745e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId1, "18004664411"); 1755e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId1, "1-800-466-4411"); 1765e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1775e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov long rawContactId2 = createRawContactWithName("Hot", "Tamale"); 1785e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1-800-466-4411"); 1795e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "tamale"); 1814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 1824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1845e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Phone.NUMBER, "1-800-466-4411"); 1854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 1864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 1875e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1895e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1-800-GOOG-411"); 1905e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri2, values); 1915e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1925e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "18004664"); 1935e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri3, values); 1945e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1955e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "encilada"); 1965e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 1974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 1984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 199e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public void testPhoneLookup() { 200e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov ContentValues values = new ContentValues(); 201e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 202e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 203e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 204e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 205e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 206e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 207e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 2084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 2094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 211e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 212e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.clear(); 213e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup._ID, queryContactId(rawContactId)); 214e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 215e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.NUMBER, "18004664411"); 216e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.TYPE, Phone.TYPE_HOME); 217e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.putNull(PhoneLookup.LABEL); 218e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.CUSTOM_RINGTONE, "d"); 219e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.SEND_TO_VOICEMAIL, 1); 2204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(lookupUri1, values); 2214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2224e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa // The strict comparation, adopted in Donut, does not allow the behavior like 2234e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa // "8004664411 == 4664411", while the loose comparation, which had been used in Cupcake 2244e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa // and reverted back into the default in Eclair, allows it. Hmm... 2254e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa final boolean useStrictComparation = 2264e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa mContext.getResources().getBoolean( 2274e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa com.android.internal.R.bool.config_use_strict_phone_number_comparation); 2284e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa final int expectedResult = (useStrictComparation ? 0 : 1); 2294e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa 230e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "4664411"); 2314e3790e646bce315a1b34c9dc474eb8152c8eea2Daisuke Miyakawa assertEquals(expectedResult, getCount(lookupUri2, null, null)); 2324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 2334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 234653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov public void testPhoneUpdate() { 235653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov ContentValues values = new ContentValues(); 236653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 237653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 238653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 239653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 240653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "18004664411"); 241653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 242653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 2435870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(lookupUri1, PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 244653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 245653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 246653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 247653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 248653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 249653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664422"); 2505870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(lookupUri2, PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 251653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 252653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Setting number to null will remove the phone lookup record 253653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 254653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.putNull(Phone.NUMBER); 255653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 256653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 257653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov assertEquals(0, getCount(lookupUri2, null, null)); 258653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 259653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Let's restore that phone lookup record 260653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 261653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 262653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 2635870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(lookupUri2, PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 26481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 265653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov } 266653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 2674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testEmailsQuery() { 2684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 2694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 2704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 2714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 2724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 2734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 2744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 2764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 2774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 2794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertEmail(rawContactId, "meghan@acme.com"); 2804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long emailId = ContentUris.parseId(uri); 2814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 2844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, emailId); 2854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 2864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 2874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 2884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "meghan@acme.com"); 2894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 2904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 2914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 2924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 2934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 2944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 2954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 2964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 2974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 29848828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 2994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Email.CONTENT_URI, values, Data._ID, emailId); 3004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3025e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsLookupQuery() { 3034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Hot", "Tamale"); 3044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertEmail(rawContactId, "tamale@acme.com"); 3054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3065e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "tamale@acme.com"); 3074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 3084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 3094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 3104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 3114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 3124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 3134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(filterUri1, values); 3144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3155e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "encilada@acme.com"); 3164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, getCount(filterUri2, null, null)); 3174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3195e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsFilterQuery() { 3205e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale"); 3215e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 3225e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 3235e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 3245e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov long rawContactId2 = createRawContactWithName("Hot", "Tamale"); 3255e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId2, "tamale@acme.com"); 3265e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 3275e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tam"); 3285e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov ContentValues values = new ContentValues(); 3295e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 3305e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 3315e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 3325e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 3335e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.putNull(Email.LABEL); 3345e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 3355e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 3365e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot"); 3375e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri2, values); 3385e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 3395e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hottamale"); 3405e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri3, values); 3415e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 3421e530df9f7e496dc47f77d4323c89bd413b79b64Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tamale@acme"); 3435e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri4, values); 3445e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 3455e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri5 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "encilada"); 3465e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 3475e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov } 3485e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 3494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPostalsQuery() { 3504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Alice", "Nextore"); 3514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 3524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 3534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 3564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, dataId); 3574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 3584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 3594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 3604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(StructuredPostal.FORMATTED_ADDRESS, "1600 Amphiteatre Ave, Mountain View"); 3614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Alice Nextore"); 3624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 36348828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 36448828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov values); 3654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(StructuredPostal.CONTENT_URI, values, Data._ID, dataId); 3664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testQueryContactData() { 3694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 3704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 37182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0); 3724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(contactUri, values); 3754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 3764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3780a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testQueryContactWithStatusUpdate() { 3794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 3804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 38182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0); 38282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 383ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 384ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 385ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelectionWithProjection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 3864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 388ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactFilterData() { 3894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 3904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values, "Stu", "Goulash", "18004664411", 39182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0); 39282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 393ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goulash"); 394ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 3954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 396ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goolish"); 3974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, getCount(filterUri2, null, null)); 3984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 400ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactStrequent() { 4014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 4024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Noah", "Tever", "18004664411", 40382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "a@acme.com", StatusUpdates.OFFLINE, 0, 0, 0); 4044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 4054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values2, "Sam", "Times", "18004664412", 40682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "b@acme.com", StatusUpdates.INVISIBLE, 3, 0, 0); 4074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values3 = new ContentValues(); 4084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values3, "Lotta", "Calling", "18004664413", 40982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "c@acme.com", StatusUpdates.AWAY, 5, 0, 0); 4104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values4 = new ContentValues(); 4114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values4, "Fay", "Veritt", "18004664414", 41282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0); 4134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 414ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Cursor c = mResolver.query(Contacts.CONTENT_STREQUENT_URI, null, null, null, 4154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Contacts._ID); 4164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(3, c.getCount()); 4174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 4184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values4); 4194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToNext(); 4204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values3); 4214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToNext(); 4224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values2); 4234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 4244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 425ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, "fay"); 4264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri, null, null, null, Contacts._ID); 4274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 4284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 4294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values4); 4304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 4314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 4324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 433ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactGroup() { 4344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long groupId = createGroup(null, "testGroup", "Test Group"); 4354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 4364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 4374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Best", "West", "18004664411", 43882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "west@acme.com", StatusUpdates.OFFLINE, 0, 0, groupId); 4394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 4404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 4414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values2, "Rest", "East", "18004664422", 44282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "east@acme.com", StatusUpdates.AVAILABLE, 0, 0, 0); 4434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 444ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 4454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Cursor c = mResolver.query(filterUri1, null, null, null, Contacts._ID); 4464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 4474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 4484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values1); 4494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 4504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 451ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 4524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri2, null, Contacts.DISPLAY_NAME + "=?", 4534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov new String[] { "Best West" }, Contacts._ID); 4544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 4554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 4564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 457ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Next Group"); 4584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri3, null, null, null, Contacts._ID); 4594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, c.getCount()); 4604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 4613cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 4623cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 4630a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testPhonesWithStatusUpdate() { 46419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 46519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov ContentValues values = new ContentValues(); 46619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 46719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 46819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 46919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 47019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 47119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.PHOTO_ID, photoId); 47219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 47319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664412"); 47419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog411@acme.com"); 47519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog412@acme.com"); 47619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 47782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 47882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.INVISIBLE, "Bad"); 47982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog412@acme.com", 48082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.AVAILABLE, "Good"); 48119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long contactId = queryContactId(rawContactId); 48219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 48382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri uri = Data.CONTENT_URI; 48419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 485a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov Cursor c = mResolver.query(uri, null, RawContacts.CONTACT_ID + "=" + contactId + " AND " 486a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", null, Phone.NUMBER); 48719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertEquals(2, c.getCount()); 48819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 48919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToFirst(); 49019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 49119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 49282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 4930a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 49419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 49519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 49619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 497a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 49819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 49919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 50019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToNext(); 50119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 50219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 50382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 5040a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 50519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 50619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664412"); 50719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 508a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 50919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 51019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 51119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.close(); 51219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov } 51319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 51489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testGroupQuery() { 51589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 51689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 51789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId1 = createGroup(account1, "e", "f"); 51889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId2 = createGroup(account2, "g", "h"); 51989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account1); 52089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account2); 52189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 52289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 52389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Groups._ID + "=" + groupId1, null, Groups._ID, groupId1) ; 52489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Groups._ID + "=" + groupId2, null, Groups._ID, groupId2) ; 52589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 52689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 5273cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testGroupInsert() { 5283cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 5293cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 5303cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_NAME, "a"); 5313cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_TYPE, "b"); 5323cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SOURCE_ID, "c"); 5333cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.VERSION, 42); 5343cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.GROUP_VISIBLE, 1); 5353cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE, "d"); 5363cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE_RES, 1234); 5373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.NOTES, "e"); 5383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.RES_PACKAGE, "f"); 5393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYSTEM_ID, "g"); 54094021b213e4db367f60b30fcbfe9019e28571784Fred Quintana values.put(Groups.DELETED, 1); 5413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC1, "h"); 5423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC2, "i"); 5433cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC3, "j"); 5443cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC4, "k"); 5453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 5463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(Groups.CONTENT_URI, values); 5473cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 54873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.DIRTY, 1); 5493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 5503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 5513cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 55289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testSettingsQuery() { 55389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 55489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 55589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account1, "0", "0"); 55689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account2, "1", "1"); 55789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account1); 55889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account2); 55989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 56089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 56189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.SHOULD_SYNC, "0") ; 56289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.UNGROUPED_VISIBLE, "0") ; 56389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.SHOULD_SYNC, "1") ; 56489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.UNGROUPED_VISIBLE, "1") ; 56589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 56689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 5674097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsUnspecified() { 568d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 5694097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 5704097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 5715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 5724097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 5735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertStructuredName(rawContactId, "Mr", "John", "Kevin", "von Smith", "Jr"); 5744097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 5754097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 57667c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov public void testDisplayNameParsingWhenPartsAreNull() { 57767c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov long rawContactId = createRawContact(); 57867c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov ContentValues values = new ContentValues(); 57967c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 58067c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 58167c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 58267c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov insertStructuredName(rawContactId, values); 58367c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov assertStructuredName(rawContactId, "Mr", "John", "Kevin", "von Smith", "Jr"); 58467c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov } 58567c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov 5864097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsSpecified() { 587d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 5884097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 5894097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 5904097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Johnson"); 5915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 5924097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 5935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertStructuredName(rawContactId, null, null, null, "Johnson", null); 5944097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 5954097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 59625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov public void testDisplayNameUpdate() { 59725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId1 = createRawContact(); 59825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertEmail(rawContactId1, "potato@acme.com", true); 59925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 60025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId2 = createRawContact(); 60125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertPhoneNumber(rawContactId2, "123456789", true); 60225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 6030c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 6040c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 60525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 60625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "123456789"); 60725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 60825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertStructuredName(rawContactId2, "Potato", "Head"); 60925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 61025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Potato Head"); 61181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 61225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 61325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 61401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov public void testDisplayNameFromData() { 61501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long rawContactId = createRawContact(); 61601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long contactId = queryContactId(rawContactId); 617a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka ContentValues values = new ContentValues(); 61801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 61901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 62001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 62101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 62201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "mike@monstersinc.com"); 62301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "mike@monstersinc.com"); 62401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 62501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "james@monstersinc.com", true); 62601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "james@monstersinc.com"); 62701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 62801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertPhoneNumber(rawContactId, "1-800-466-4411"); 62901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "1-800-466-4411"); 63001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 631a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is title without company, the title is display name. 632a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 633a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.TITLE, "Protagonist"); 634a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka Uri organizationUri = insertOrganization(rawContactId, values); 635a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "Protagonist"); 636a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 637a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there are title and company, the company is display name. 638a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 639a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.COMPANY, "Monsters Inc"); 640a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka mResolver.update(organizationUri, values, null, null); 64101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Monsters Inc"); 64201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 643a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is nickname, that is display name. 644a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertNickname(rawContactId, "Sully"); 645a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "Sully"); 646a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 647a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is structured name, that is display name. 648a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 649a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.GIVEN_NAME, "James"); 650a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.MIDDLE_NAME, "P."); 651a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.FAMILY_NAME, "Sullivan"); 652a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertStructuredName(rawContactId, values); 653a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "James Sullivan"); 65401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 65501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 656dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov public void testDisplayNameUpdateFromStructuredNameUpdate() { 657dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long rawContactId = createRawContact(); 658dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, "Slinky", "Dog"); 659dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 660dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long contactId = queryContactId(rawContactId); 661dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 662dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 663dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky Dog"); 664dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 665dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov ContentValues values = new ContentValues(); 666dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 667dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 668dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 669dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky"); 670dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 671dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 672dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 673dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 674dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 675dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 676dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dog"); 677dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 678dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 679dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Dog"); 680dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov } 681dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 682d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov public void testInsertDataWithContentProviderOperations() throws Exception { 683d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 684d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValues(new ContentValues()) 685d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 686d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 687d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 688d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 689d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 690d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 691d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 692d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderResult[] results = 693d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(cpo1, cpo2)); 694d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov long contactId = queryContactId(ContentUris.parseId(results[0].uri)); 695d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 696d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "John Doe"); 697d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov } 698d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov 699d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailDefault() { 700c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 701d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 702d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 703d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 704d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 705d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 706d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(0, sendToVoicemail); 707d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 708d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 709d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 710d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtone() { 711c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 712d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 713d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 714d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId, true, "foo"); 715d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, true, "foo"); 71681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 7178c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 7188c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov updateSendToVoicemailAndRingtoneWithSelection(contactId, false, "bar"); 7198c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, false, "bar"); 7208c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertNetworkNotified(false); 721d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 722d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 723d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailAndRingtoneAfterAggregation() { 7243cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("a", "b"); 725d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 726d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 727d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 7283cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("c", "d"); 729d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 730d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, true, "bar"); 731d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 732d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 7330c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 7340c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 735d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 736d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov // Both contacts had "send to VM", the contact now has the same value 737d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId1, true, "foo,bar"); // Either foo or bar 738d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 739d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 740d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testDoNotSendToVoicemailAfterAggregation() { 7413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("e", "f"); 742d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 743d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, null); 744d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 7453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("g", "h"); 746d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 747d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, null); 748d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 749d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 7500c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 7510c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 752d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 753d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Since one of the contacts had "don't send to VM" that setting wins for the aggregate 7540c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), false, null); 755d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 756d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 757d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtonePreservedAfterJoinAndSplit() { 7583cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("i", "j"); 759d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 760d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 761d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 7623cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("k", "l"); 763d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 764d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, "bar"); 765d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 766d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 7670c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 7680c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 769d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 770d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Split them 7710c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 7720c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 773d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 7743cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), true, "foo"); 775d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId2), false, "bar"); 776d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 777d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 77882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateInsert() { 7794dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov long rawContactId = createRawContact(); 7800a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 7810a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 7820a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 7830a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 7840a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 7850a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 7860a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.putNull(StatusUpdates.CUSTOM_PROTOCOL); 7870a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 7880a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PRESENCE, StatusUpdates.INVISIBLE); 7890a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 7900a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 100); 7910a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "a.b.c"); 7920a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 1234); 7930a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 2345); 7940a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 7950a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 7960a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 7970a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 7980a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 7990a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long contactId = queryContactId(rawContactId); 8000a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 8010a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8020a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 8030a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 8040a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Hiding"); 8050a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 8060a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "a.b.c"); 8070a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 1234); 8080a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 2345); 8090a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8100a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 8110a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8120a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 8130a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 8140a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Cloaked"); 8150a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 200); 8160a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "d.e.f"); 8170a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 4321); 8180a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 5432); 8190a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov mResolver.insert(StatusUpdates.CONTENT_URI, values); 8200a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8210a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 8220a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 8230a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Cloaked"); 8240a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 200); 8250a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "d.e.f"); 8260a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 4321); 8270a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 5432); 8280a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 8290a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 8300a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8310a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateInferAttribution() { 8320a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 8330a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 8340a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 8350a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8360a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 8370a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 8380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 8390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 8400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 8410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8420a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 8430a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8440a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 8450a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 8460a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, com.android.internal.R.string.imProtocolAim); 8470a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 8480a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8490a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 8500a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 8510a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 8520a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateMatchingImOrEmail() { 8530a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 8544dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 8554dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im"); 85682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertEmail(rawContactId, "m@acme.com"); 8574dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 8584dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (standard) 85982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available"); 8604dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 8614dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (custom) 86282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im", StatusUpdates.IDLE, "Idle"); 8634dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 8644dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on Email 86582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "m@acme.com", StatusUpdates.AWAY, "Away"); 8664dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 8674dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // No match 86882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_ICQ, null, "12345", StatusUpdates.DO_NOT_DISTURB, "Go away"); 8694dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 87082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Cursor c = mResolver.query(StatusUpdates.CONTENT_URI, new String[] { 87182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID, StatusUpdates.PROTOCOL, StatusUpdates.CUSTOM_PROTOCOL, 8720a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.PRESENCE, StatusUpdates.STATUS}, 87382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null, StatusUpdates.DATA_ID); 8744dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 87582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_AIM, null, StatusUpdates.AVAILABLE, "Available"); 8764dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 87782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_CUSTOM, "my_im_proto", StatusUpdates.IDLE, "Idle"); 8784dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 87982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_GOOGLE_TALK, null, StatusUpdates.AWAY, "Away"); 8804dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertFalse(c.moveToNext()); 8814dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov c.close(); 882bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 883bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 884bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 885bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 886bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 88782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 8880a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 889bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 890bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov } 891bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 89282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateUpdateAndDelete() { 893bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long rawContactId = createRawContact(); 894bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 895bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 896bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 897bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 898bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 899bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 90082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 90182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_STATUS); 902bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 903bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 90482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AWAY, "BUSY"); 90582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.DO_NOT_DISTURB, "GO AWAY"); 90682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri statusUri = 90782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available"); 90882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 909bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 91082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 91182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 912bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 913bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 9149705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for 9159705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status 9169705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status_ts 9179705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence 9189705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori long updatedTs = 200; 9199705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String testUpdate = "test_update"; 9209705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String selection = StatusUpdates.DATA_ID + "=" + statusId; 9219705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 9229705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 9239705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 9249705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 9259705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 9269705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 9279705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 9289705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 9299705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in status_updates table ONLY 9309705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in presence table are to be updated. 9319705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori updatedTs = 300; 9329705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori testUpdate = "test_update_new"; 9339705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 9349705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 9359705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 9369705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 9379705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 9389705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 9399705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the presence column value is still the old value 9409705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 9419705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 9429705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 9439705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in presence table ONLY 9449705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in status_updates table are to be updated. 9459705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 9469705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 9479705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test_new"); 9489705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 9499705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 9509705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the status_updates table is not updated 9519705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 9529705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 9539705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 9549705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 9559705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // effect "delete status_updates" operation and expect the following 9569705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // data deleted from status_updates table 9579705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence set to null 95882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov mResolver.delete(StatusUpdates.CONTENT_URI, StatusUpdates.DATA_ID + "=" + statusId, null); 9599705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 96082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 961a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 962a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 963a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 96482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateWithTimestamp() { 965a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long rawContactId = createRawContact(); 966a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 967a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 968a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 969a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long contactId = queryContactId(rawContactId); 970a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 97182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Offline", 80); 97282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Available", 100); 97382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", 0, "Busy", 90); 974a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 975a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov // Should return the latest status 976a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContentValues values = new ContentValues(); 97782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 97882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 979bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 9804dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 9814dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 98282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov private void assertStatusUpdate(Cursor c, int protocol, String customProtocol, int presence, 98382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String status) { 9844dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov ContentValues values = new ContentValues(); 98582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 98682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.CUSTOM_PROTOCOL, customProtocol); 98782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PRESENCE_STATUS, presence); 98882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS, status); 9894dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertCursorValues(c, values); 9904dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 9914dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 99282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testSingleStatusUpdateRowPerContact() { 993bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 994bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar String handle1 = "test@gmail.com"; 995bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 996d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 9974dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId1, protocol1, null, handle1); 998bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 99982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green"); 100082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AWAY, "Yellow"); 100182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(protocol1, null, handle1, StatusUpdates.INVISIBLE, "Red"); 1002bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 1003af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov Cursor c = queryContact(queryContactId(rawContactId1), 100482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov new String[] {Contacts.CONTACT_PRESENCE, Contacts.CONTACT_STATUS}); 10054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 1006bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 1007bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar c.moveToFirst(); 100882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(StatusUpdates.INVISIBLE, c.getInt(0)); 100982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals("Red", c.getString(1)); 1010bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 1011bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 1012d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void updateSendToVoicemailAndRingtone(long contactId, boolean sendToVoicemail, 1013d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String ringtone) { 1014d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 1015d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 1016d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (ringtone != null) { 1017d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 1018d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 1019d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 1020d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 1021d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov int count = mResolver.update(uri, values, null, null); 1022d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(1, count); 10238c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 10248c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 10258c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov private void updateSendToVoicemailAndRingtoneWithSelection(long contactId, 10268c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov boolean sendToVoicemail, String ringtone) { 10278c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov ContentValues values = new ContentValues(); 10288c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 10298c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov if (ringtone != null) { 10308c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 10318c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 10328c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 10338c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov int count = mResolver.update(Contacts.CONTENT_URI, values, Contacts._ID + "=" + contactId, 10348c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov null); 10358c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertEquals(1, count); 1036d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 1037d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 1038d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void assertSendToVoicemailAndRingtone(long contactId, boolean expectedSendToVoicemail, 1039d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String expectedRingtone) { 1040d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 1041d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 1042d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 1043d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(expectedSendToVoicemail ? 1 : 0, sendToVoicemail); 1044d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String ringtone = c.getString(c.getColumnIndex(Contacts.CUSTOM_RINGTONE)); 1045d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (expectedRingtone == null) { 1046d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertNull(ringtone); 1047d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } else { 1048d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(ArrayUtils.contains(expectedRingtone.split(","), ringtone)); 1049d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 1050d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 1051d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 10529261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 10539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testGroupCreationAfterMembershipInsert() { 1054d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 1055d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 10569261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 10579261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId = assertSingleGroup(NO_LONG, mAccount, "gsid1", null); 10589261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 1059d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov rawContactId1, groupId, "gsid1"); 10609261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 10619261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 10629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testGroupReuseAfterMembershipInsert() { 1063d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 10649261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 1065d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 10669261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 10679261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertSingleGroup(groupId1, mAccount, "gsid1", "title1"); 10689261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 1069d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov rawContactId1, groupId1, "gsid1"); 10709261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 10719261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 10729261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testGroupInsertFailureOnGroupIdConflict() { 1073d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 10749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 10759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 10769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 1077d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(GroupMembership.RAW_CONTACT_ID, rawContactId1); 10789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 10799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(GroupMembership.GROUP_SOURCE_ID, "gsid1"); 10809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(GroupMembership.GROUP_ROW_ID, groupId1); 10819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana try { 10829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana mResolver.insert(Data.CONTENT_URI, values); 10839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana fail("the insert was expected to fail, but it succeeded"); 10849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } catch (IllegalArgumentException e) { 10859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana // this was expected 10869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 10879261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 10889261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 10890be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov public void testContactVisibilityUpdateOnMembershipChange() { 10900be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long rawContactId = createRawContact(mAccount); 10910be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 10920be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 10930be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long visibleGroupId = createGroup(mAccount, "123", "Visible", 1); 10940be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long invisibleGroupId = createGroup(mAccount, "567", "Invisible", 0); 10950be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 10960be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership1 = insertGroupMembership(rawContactId, visibleGroupId); 10970be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 10980be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 10990be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership2 = insertGroupMembership(rawContactId, invisibleGroupId); 11000be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 11010be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 11020be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.delete(membership1, null, null); 11030be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 11040be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 11050be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov ContentValues values = new ContentValues(); 11060be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov values.put(GroupMembership.GROUP_ROW_ID, visibleGroupId); 11070be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 11080be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.update(membership2, values, null, null); 11090be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 11100be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 11110be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 11120be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov private void assertVisibility(long rawContactId, String expectedValue) { 11130be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, Contacts._ID + "=" + queryContactId(rawContactId), 11140be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov null, Contacts.IN_VISIBLE_GROUP, expectedValue); 11150be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 11160be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 11179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testContentEntityIterator() throws RemoteException { 11189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana // create multiple contacts and check that the selected ones are returned 11199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id; 11209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 11219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 11229261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId2 = createGroup(mAccount, "gsid2", "title2"); 11239261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 11243cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0"); 11253cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertGroupMembership(id, "gsid1"); 11263cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertEmail(id, "c0@email.com"); 11273cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertPhoneNumber(id, "5551212c0"); 11289261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 1129226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c1 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c1"); 11309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_0 = insertGroupMembership(id, "gsid1"); 11319261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_1 = insertGroupMembership(id, "gsid2"); 11329261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_2 = insertEmail(id, "c1@email.com"); 11339261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_3 = insertPhoneNumber(id, "5551212c1"); 11349261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 1135226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c2 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c2"); 11369261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_0 = insertGroupMembership(id, "gsid1"); 11379261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_1 = insertEmail(id, "c2@email.com"); 11389261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_2 = insertPhoneNumber(id, "5551212c2"); 11399261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 11403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long c3 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c3"); 11419261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_0 = insertGroupMembership(id, groupId2); 11429261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_1 = insertEmail(id, "c3@email.com"); 11439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_2 = insertPhoneNumber(id, "5551212c3"); 11449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 1145226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana EntityIterator iterator = mResolver.queryEntities( 1146226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, mAccount), 1147226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana RawContacts.SOURCE_ID + " in ('c1', 'c2', 'c3')", null, null); 11489261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Entity entity; 11499261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues[] subValues; 11509261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 11516cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c1, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 11529261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 11539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(4, subValues.length); 11549261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 11559261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_0, 11569261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 11579261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 11589261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], GroupMembership.CONTENT_ITEM_TYPE, 11599261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_1, 11609261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 11619261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 11629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Email.CONTENT_ITEM_TYPE, 11639261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_2, 11649261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c1@email.com"); 11659261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[3], Phone.CONTENT_ITEM_TYPE, 11669261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_3, 11679261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c1"); 11689261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 11699261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 11706cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c2, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 11719261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 11729261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 11739261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 11749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_0, 11759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 11769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 11779261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 11789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_1, 11799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c2@email.com"); 11809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 11819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_2, 11829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c2"); 11839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 11849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 11856cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c3, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 11869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 11879261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 11889261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 11899261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_0, 11909261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 11919261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 11929261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 11939261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_1, 11949261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c3@email.com"); 11959261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 11969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_2, 11979261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c3"); 11989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 11999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(iterator.hasNext()); 12003cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov iterator.close(); 12019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 120220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 120320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov public void testDataCreateUpdateDeleteByMimeType() throws Exception { 1204d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 120520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 120620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov ContentValues values = new ContentValues(); 12075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 120820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 120920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 121020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 121120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 121220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "old1"); 121320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "old2"); 121420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "old3"); 121520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "old4"); 121620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "old5"); 121720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "old6"); 121820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "old7"); 121920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "old8"); 122020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "old9"); 122120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "old10"); 122220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "old11"); 122320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "old12"); 122420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "old13"); 122520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "old14"); 122620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "old15"); 122720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Uri uri = mResolver.insert(Data.CONTENT_URI, values); 122820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 122981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 123020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 123120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.clear(); 123220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "newpackage"); 123320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 0); 123420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 0); 123520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "new1"); 123620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "new2"); 123720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "new3"); 123820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "new4"); 123920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "new5"); 124020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "new6"); 124120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "new7"); 124220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "new8"); 124320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "new9"); 124420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "new10"); 124520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "new11"); 124620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "new12"); 124720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "new13"); 124820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "new14"); 124920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "new15"); 12505ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mResolver.update(Data.CONTENT_URI, values, Data.RAW_CONTACT_ID + "=" + rawContactId + 125120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov " AND " + Data.MIMETYPE + "='testmimetype'", null); 125281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 125370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 125470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov // Should not be able to change IS_PRIMARY and IS_SUPER_PRIMARY by the above update 125570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 125670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 125720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 125820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 12595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov int count = mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 126020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null); 126120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals(1, count); 12625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertEquals(0, getCount(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 126333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null)); 126481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 126533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 126620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 126789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactQuery() { 126889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 126989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 127089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 127189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 127289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 127389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account1); 127489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account2); 127589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 127689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 127789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, RawContacts._ID, rawContactId1) ; 127889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, RawContacts._ID, rawContactId2) ; 127989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 128089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri1 = ContentUris.withAppendedId(uri1, rawContactId1); 128189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri2 = ContentUris.withAppendedId(uri2, rawContactId2); 128289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri1, RawContacts._ID, rawContactId1) ; 128389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri2, RawContacts._ID, rawContactId2) ; 128489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 128589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 1286373f7d2adc36680c31ff33e9ee12be865af6b5fbDmitri Plotnikov public void testRawContactDeletion() { 1287d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 12885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 128933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 12904dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 129182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 129282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.AVAILABLE, null); 1293a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1294a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 129533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 129633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 129782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 12984dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 129933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 130033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(uri, null, null); 130133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 13025870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 130381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 130433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 130533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov Uri permanentDeletionUri = uri.buildUpon().appendQueryParameter( 1306f6be85f72615168c836b05c03ab5fc80d4794a82Fred Quintana ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); 130733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 130833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 130933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 131033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 131182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 13124dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 1313a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 131481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 1315a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov } 1316a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 1317a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov public void testRawContactDeletionKeepingAggregateContact() { 1318a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long rawContactId1 = createRawContactWithName(); 1319a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long rawContactId2 = createRawContactWithName(); 1320a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 1321a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov // Same name - should be aggregated 1322a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 1323a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 1324a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 1325a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 1326a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 1327a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov Uri permanentDeletionUri = uri.buildUpon().appendQueryParameter( 1328f6be85f72615168c836b05c03ab5fc80d4794a82Fred Quintana ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); 1329a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 1330a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 1331a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(1, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 133220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 13331fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 1334e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong public void testRawContactDeletionWithAccounts() { 1335e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong long rawContactId = createRawContact(mAccount); 1336e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 1337e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 1338e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 133982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 134082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.AVAILABLE, null); 1341e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 1342e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong null, null)); 134382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 1344e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong + rawContactId, null)); 1345e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 1346e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Do not delete if we are deleting with wrong account. 1347e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithWrongAccountUri = 1348e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 1349e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountTwo.name) 1350e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccountTwo.type) 1351e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 1352e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong mResolver.delete(deleteWithWrongAccountUri, null, null); 1353e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 13545870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "0"); 1355e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 1356e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Delete if we are deleting with correct account. 1357e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithCorrectAccountUri = 1358e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 1359e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name) 1360e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type) 1361e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 1362e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong mResolver.delete(deleteWithCorrectAccountUri, null, null); 1363e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 13645870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 1365e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong } 1366e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 136770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong public void testContactDeletionAccountsUpdated() { 136870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId1 = createRawContact(mAccount); 136970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertEmail(rawContactId1, "account1@email.com"); 137070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId2 = createRawContact(mAccountTwo); 137170d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertEmail(rawContactId2, "account2@email.com"); 137270d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertImHandle(rawContactId2, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 137382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 137482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.AVAILABLE, null); 137570d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 137670d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // This is to ensure we do not delete contacts with null, null (account name, type) 137770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // accidentally. 137870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId3 = createRawContactWithName("James", "Sullivan"); 137970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertPhoneNumber(rawContactId3, "5234567890"); 138070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 138170d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong ContactsProvider2 cp = (ContactsProvider2) getProvider(); 138270d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 138370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong Account accountRemaining = new Account("account1", "account type1"); 138470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong cp.onAccountsUpdated(new Account[]{accountRemaining}); 138570d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong Cursor c = mResolver.query(RawContacts.CONTENT_URI, null, null, null, null); 138670d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong assertEquals(2, c.getCount()); 138782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 138870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong + rawContactId2, null)); 138970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong } 139070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 1391cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov public void testContactDeletion() { 1392cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe"); 1393cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe"); 1394cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 1395cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long contactId = queryContactId(rawContactId1); 1396cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 1397cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov mResolver.delete(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), null, null); 1398cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 1399cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1), 1400cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 1401cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2), 1402cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 1403cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov } 1404cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 140573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 140673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov long rawContactId = createRawContact(mAccount); 140773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 140873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 140973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = insertStructuredName(rawContactId, "John", "Doe"); 141073776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov clearDirty(rawContactUri); 1411f6be85f72615168c836b05c03ab5fc80d4794a82Fred Quintana Uri updateUri = uri.buildUpon() 1412f6be85f72615168c836b05c03ab5fc80d4794a82Fred Quintana .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); 141373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 141473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 141573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dough"); 141673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 14175870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, StructuredName.FAMILY_NAME, "Dough"); 141873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(rawContactUri, false); 141981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 14201fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 14211fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 142261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDirtyAndVersion() { 1423d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final long rawContactId = createRawContact(mAccount); 1424d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); 142573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 14261fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 14271fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 14281fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 14291fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.DIRTY, 0); 14301fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.SEND_TO_VOICEMAIL, 1); 143161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.AGGREGATION_MODE, 1432c100221f706afc08409e8317a27d6850b11c54d3Omari Stephens RawContacts.AGGREGATION_MODE_IMMEDIATE); 143361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.STARRED, 1); 14341fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(1, mResolver.update(uri, values, null, null)); 14351fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 14361fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 14371fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 143881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 14391fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 144061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "goo@woo.com"); 144161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 144281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 14431fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 14441fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 144561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 14461fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 144761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values = new ContentValues(); 144861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(Email.DATA, "goo@hoo.com"); 144961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.update(emailUri, values, null, null); 14501fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 145181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 14521fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 14531fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 145461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 14551fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 145661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(emailUri, null, null); 14571fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 145881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 14591fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 14601fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 146161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov } 14621fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 146361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactClearDirty() { 146461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 146561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 146661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 146761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov long version = getVersion(uri); 146861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov insertEmail(rawContactId, "goo@woo.com"); 14691fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 147061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 14711fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 14721fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 14731fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana clearDirty(uri); 14741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 14751fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 14761fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 14771fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 147861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDeletionSetsDirty() { 147961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 14801fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 148161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 14821fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 148361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 148461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, false); 148561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov 148661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(uri, null, null); 14875870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 148861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 148981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 149061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 149161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertEquals(version, getVersion(uri)); 14921fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 14934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1494074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov public void testGetPhotoUri() { 1495074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov ContentValues values = new ContentValues(); 1496074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1497074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1498074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 1499074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 1500074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 15013653cf1fa8fb36a96a7e4a6ebd615438877c3183Dmitri Plotnikov Uri twigUri = Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 15028e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov queryContactId(rawContactId)), Contacts.Photo.CONTENT_DIRECTORY); 1503074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 15043653cf1fa8fb36a96a7e4a6ebd615438877c3183Dmitri Plotnikov long twigId = Long.parseLong(getStoredValue(twigUri, Data._ID)); 15053653cf1fa8fb36a96a7e4a6ebd615438877c3183Dmitri Plotnikov assertEquals(ContentUris.parseId(photoUri), twigId); 1506074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov } 1507074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 1508732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov public void testSuperPrimaryPhoto() { 1509732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId1 = createRawContact(new Account("a", "a")); 1510732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri photoUri1 = insertPhoto(rawContactId1); 1511732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId1 = ContentUris.parseId(photoUri1); 1512732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 1513732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId2 = createRawContact(new Account("b", "b")); 1514732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri photoUri2 = insertPhoto(rawContactId2); 1515732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId2 = ContentUris.parseId(photoUri2); 1516732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 1517732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 1518732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 1519732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 1520732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 1521732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 1522732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 1523732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 1524732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 1525732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 1526732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 1527732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov ContentValues values = new ContentValues(); 1528732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 1529732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri2, values, null, null); 1530732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 1531732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 1532732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 1533732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 1534732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 1535732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId2); 1536732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 1537732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri1, values, null, null); 1538732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 1539732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov } 1540732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 15418e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public void testUpdatePhoto() { 15428e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov ContentValues values = new ContentValues(); 15438e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 15448e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 15458e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 15468e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 15478e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri twigUri = Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 15488e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov queryContactId(rawContactId)), Contacts.Photo.CONTENT_DIRECTORY); 15498e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 15508e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 15518e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 15528e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 15538e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.putNull(Photo.PHOTO); 15548e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 15558e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long photoId = ContentUris.parseId(dataUri); 15568e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 15578e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov assertNull(getStoredValue(twigUri, Data._ID)); 15588e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 15598e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 15608e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Photo.PHOTO, loadTestPhoto()); 15618e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov mResolver.update(dataUri, values, null, null); 156281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 15638e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 15648e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long twigId = Long.parseLong(getStoredValue(twigUri, Data._ID)); 15658e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov assertEquals(photoId, twigId); 15668e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov } 15678e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 15684e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactDataPhoto() { 15697d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a contact with a null photo 15707d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentValues values = new ContentValues(); 15717d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 15727d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh long rawContactId = ContentUris.parseId(rawContactUri); 15737d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 15747d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a photo 15757d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.RAW_CONTACT_ID, rawContactId); 15767d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 15777d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.putNull(Photo.PHOTO); 15787d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 15797d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // try to do an update before insert should return count == 0 15807d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri dataUri = Uri.withAppendedPath( 15817d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 15827d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh RawContacts.Data.CONTENT_DIRECTORY); 15837d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(0, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 15847d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 15857d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 15867d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh mResolver.insert(Data.CONTENT_URI, values); 15877d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 15887d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // save a photo to the db 15897d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.clear(); 15907d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 15917d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Photo.PHOTO, loadTestPhoto()); 15927d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(1, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 15937d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 15947d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 15957d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // verify the photo 15964e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Cursor storedPhoto = mResolver.query(dataUri, new String[] {Photo.PHOTO}, 15977d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Data.MIMETYPE + "=?", new String[] {Photo.CONTENT_ITEM_TYPE}, null); 15984e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov storedPhoto.moveToFirst(); 15997d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh MoreAsserts.assertEquals(loadTestPhoto(), storedPhoto.getBlob(0)); 16007d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh } 16017d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 16024e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactSetStarred() { 16034e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId1 = createRawContactWithName(); 16044e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 16054e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId2 = createRawContactWithName(); 16064e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 16074e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16084e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 16094e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16104e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 16114e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 16124e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 16134e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16144e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov ContentValues values = new ContentValues(); 16154e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "1"); 16164e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16174e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 16184e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16194e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 16204e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 16214e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 16224e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16234e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "0"); 16244e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 16254e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16264e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "0"); 16274e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 16284e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 16294e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16304e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(Contacts.STARRED, "1"); 16314e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(contactUri, values, null, null); 16324e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16334e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 16344e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "1"); 16354e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 16364e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov } 16374e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 16381b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov public void testLiveFolders() { 16391b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long rawContactId1 = createRawContactWithName("James", "Sullivan"); 16401b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov insertPhoneNumber(rawContactId1, "5234567890"); 16411b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 16421b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16431b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long rawContactId2 = createRawContactWithName("Mike", "Wazowski"); 16441b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 16451b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov storeValue(Contacts.CONTENT_URI, contactId2, Contacts.STARRED, "1"); 16461b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16471b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long rawContactId3 = createRawContactWithName("Randall", "Boggs"); 16481b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long contactId3 = queryContactId(rawContactId3); 16491b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long groupId = createGroup(NO_ACCOUNT, "src1", "VIP"); 16501b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov insertGroupMembership(rawContactId3, groupId); 16511b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16521b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 16531b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 16541b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/contacts"), 16551b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId1, "James Sullivan", 16561b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId2, "Mike Wazowski", 16571b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId3, "Randall Boggs"); 16581b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16591b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 16601b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 16611b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/contacts_with_phones"), 16621b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId1, "James Sullivan"); 16631b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16641b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 16651b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 16661b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/favorites"), 16671b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId2, "Mike Wazowski"); 16681b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16691b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 16701b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 16711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/contacts"), Uri.encode("VIP")), 16721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId3, "Randall Boggs"); 16731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } 16741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private void assertLiveFolderContents(Uri uri, Object... expected) { 16761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Cursor c = mResolver.query(uri, new String[]{LiveFolders._ID, LiveFolders.NAME}, 16771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov null, null, LiveFolders._ID); 16781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertEquals(expected.length/2, c.getCount()); 16791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov for (int i = 0; i < expected.length/2; i++) { 16801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertTrue(c.moveToNext()); 16811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertEquals(((Long)expected[i * 2]).longValue(), c.getLong(0)); 16821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertEquals(expected[i * 2 + 1], c.getString(1)); 16831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } 16841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov c.close(); 16851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } 16861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 1687f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testReadBooleanQueryParameter() { 1688f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", true, true); 1689f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", false, false); 1690f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=0", "bool", true, false); 1691f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1", "bool", false, true); 1692f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false", "bool", true, false); 1693f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=true", "bool", false, true); 1694f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=FaLsE", "bool", true, false); 1695f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false&some=some", "bool", true, false); 1696f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1&some=some", "bool", false, true); 1697f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?some=bool", "bool", true, true); 1698f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool", "bool", true, true); 1699f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 1700f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 1701f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertBooleanUriParameter(String uriString, String parameter, 1702f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov boolean defaultValue, boolean expectedValue) { 1703f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.readBooleanQueryParameter( 1704f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter, defaultValue)); 1705f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 1706f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 1707f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testGetQueryParameter() { 1708f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar", "param", null); 1709f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param", "param", null); 1710f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=", "param", ""); 1711f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val", "param", "val"); 1712f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val&some=some", "param", "val"); 1713f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val", "param", "val"); 1714f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val&else=else", "param", "val"); 1715f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=john%40doe.com", "param", "john@doe.com"); 1716f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 1717f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 1718f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertQueryParameter(String uriString, String parameter, String expectedValue) { 1719f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.getQueryParameter( 1720f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter)); 1721f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 1722f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 17234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private long createContact(ContentValues values, String firstName, String givenName, 17244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 17254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long groupId) { 17264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, starred); 17274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 17284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "beethoven5"); 17294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 17304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, timesContacted); 17314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 17324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 17334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, firstName, givenName); 17344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 17354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 17364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.PHOTO_ID, photoId); 1737f992bfab334b760d36a053fc0b439382dcfb51adDmitri Plotnikov insertPhoneNumber(rawContactId, phoneNumber); 1738f992bfab334b760d36a053fc0b439382dcfb51adDmitri Plotnikov insertEmail(rawContactId, email); 17394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 174082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, email, presenceStatus, "hacking"); 17414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov if (groupId != 0) { 17434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertGroupMembership(rawContactId, groupId); 17444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 17454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov return queryContactId(rawContactId); 17474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 17484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private void putDataValues(ContentValues values, long rawContactId) { 17504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 17514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 17524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 17534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 17544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 17554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA1, "one"); 17564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA2, "two"); 17574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA3, "three"); 17584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA4, "four"); 17594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA5, "five"); 17604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA6, "six"); 17614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA7, "seven"); 17624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA8, "eight"); 17634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA9, "nine"); 17644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA10, "ten"); 17654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA11, "eleven"); 17664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA12, "twelve"); 17674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA13, "thirteen"); 17684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA14, "fourteen"); 17694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA15, "fifteen"); 17704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC1, "sync1"); 17714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC2, "sync2"); 17724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC3, "sync3"); 17734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC4, "sync4"); 17744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 1775d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov} 1776d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 1777