ContactsProvider2Test.java revision a09d7527b132ec82f98cde1564b0262fd85768c2
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 1945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawaimport com.android.common.contacts.DataUsageStatUpdater; 20d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport com.android.internal.util.ArrayUtils; 21dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.AggregationExceptionColumns; 22f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawaimport com.android.providers.contacts.ContactsDatabaseHelper.DataUsageStatColumns; 23b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns; 24f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport com.android.providers.contacts.tests.R; 2524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport com.google.android.collect.Lists; 26d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wongimport android.accounts.Account; 28d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderOperation; 29d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderResult; 30d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentUris; 31d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentValues; 329261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.content.Entity; 3333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.content.EntityIterator; 3442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport android.content.res.AssetFileDescriptor; 35d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.database.Cursor; 36d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.net.Uri; 37c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract; 38d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 39dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 40dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 41dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 42dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 43dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 44dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 45dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 46dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 47ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikovimport android.provider.ContactsContract.ContactCounts; 48c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 499261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.Data; 5046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback; 51dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.Directory; 525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.DisplayNameSources; 53f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.DisplayPhoto; 547a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.PhoneLookup; 575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.PhoneticNameStyle; 5824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport android.provider.ContactsContract.Profile; 5909c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus; 6033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 6162318e1ea8306142a10526534b7d83560ecf5b3aFred Quintanaimport android.provider.ContactsContract.RawContactsEntity; 62916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikovimport android.provider.ContactsContract.SearchSnippetColumns; 6389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikovimport android.provider.ContactsContract.Settings; 6482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItemPhotos; 66f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.StreamItems; 67dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.LiveFolders; 68dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.OpenableColumns; 697d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekhimport android.test.MoreAsserts; 70d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 71f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.text.TextUtils; 72d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 7342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.FileInputStream; 7442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.IOException; 75ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringertimport java.io.InputStream; 76f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport java.io.OutputStream; 775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.text.Collator; 783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.ArrayList; 795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Arrays; 803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.List; 815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 83d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/** 84d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}. 85d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 86d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Run the test like this: 87d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * <code> 888920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.ContactsProvider2Test -w \ 8928f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 90d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * </code> 91d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 92d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov@LargeTest 93d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovpublic class ContactsProvider2Test extends BaseContactsProvider2Test { 94d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 9547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_1 = new Account("account_name_1", "account_type_1"); 9647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_2 = new Account("account_name_2", "account_type_2"); 9747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov 98dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsProjection() { 99dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_URI, new String[]{ 100dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 101dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 102dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 103dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 104dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 105dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 106dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 107dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 108dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 109dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 110dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 111dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 112dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 113f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1143d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1153d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 116dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 117dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 118dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 11924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 120dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 121dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 122dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 123dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 124dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 125dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 126dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 127dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 128dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 129dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 130dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 131dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 132dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsWithSnippetProjection() { 133dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_FILTER_URI.buildUpon().appendPath("nothing").build(), 134dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 135dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 136dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 137dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 138dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 139dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 140dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 141dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 142dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 143dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 144dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 145dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 146dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 147dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 148f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1493d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1503d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 151dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 152dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 153dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 15424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 155dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 156dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 157dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 158dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 159dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 160dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 161dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 162dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 163dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 164dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 16530cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov SearchSnippetColumns.SNIPPET, 166dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 167dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 168dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 169dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawContactsProjection() { 170dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContacts.CONTENT_URI, new String[]{ 171dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 172dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 173dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 174dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 17543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 17643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 177dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 178dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 17924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 180dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 181dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 182dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 183dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE, 184dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 185dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME, 186dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE, 187dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 188dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_PRIMARY, 189dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE, 190dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.TIMES_CONTACTED, 191dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.LAST_TIME_CONTACTED, 192dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CUSTOM_RINGTONE, 193dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL, 194dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 195dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.AGGREGATION_MODE, 196dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 197dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 198dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 199dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 200dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 201dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 202dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 203dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDataProjection() { 204dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Data.CONTENT_URI, new String[]{ 205dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 206dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RAW_CONTACT_ID, 207dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 208dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 209dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 210dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 211dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 212dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 213dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 214dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 215dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 216dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 217dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 218dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 219dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 220dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 221dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 222dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 223dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 224dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 225dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 226dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 227dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 228dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 229dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 230dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 231dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 232dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 233dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 234dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 235dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 236dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 237dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 238dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 239dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 240dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 24143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 24243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 243dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 244dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 245dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 246dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 24724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 248dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 249dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 250dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 251dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 252dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 253dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 254dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 255dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 256dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 257dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 258dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 259dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 260dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 261f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 2623d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 2633d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 264dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 265dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 266dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 267dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 268cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 269dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 270dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 271dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 272dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 273dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 274dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 275dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 276dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 277dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 278dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 279dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 280dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDistinctDataProjection() { 281dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Phone.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 282dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 283dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 284dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 285dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 286dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 287dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 288dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 289dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 290dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 291dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 292dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 293dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 294dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 295dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 296dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 297dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 298dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 299dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 300dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 301dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 302dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 303dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 304dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 305dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 306dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 307dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 308dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 309dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 310dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 311dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 312dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 313dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 314dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 315dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 31624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 317dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 318dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 319dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 320dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 321dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 322dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 323dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 324dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 325dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 326dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 327dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 328dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 329dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 330f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 3313d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 3323d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 333cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 334dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 335dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 336dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 337dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 338dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 339dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 340dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 341dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 342dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 343dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 344dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 345dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 346dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 347dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 348a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testEntityProjection() { 349a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertProjection( 350a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 0), 351a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.CONTENT_DIRECTORY), 352a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov new String[]{ 353a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity._ID, 354a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.DATA_ID, 355a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID, 356a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA_VERSION, 357a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_PRIMARY, 358a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_SUPER_PRIMARY, 359a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.RES_PACKAGE, 360a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.MIMETYPE, 361a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA1, 362a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA2, 363a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA3, 364a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA4, 365a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA5, 366a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA6, 367a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA7, 368a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA8, 369a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA9, 370a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA10, 371a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA11, 372a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA12, 373a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA13, 374a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA14, 375a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA15, 376a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC1, 377a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC2, 378a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC3, 379a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC4, 380a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CONTACT_ID, 381a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.PRESENCE, 382a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CHAT_CAPABILITY, 383a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS, 384a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_TIMESTAMP, 385a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_RES_PACKAGE, 386a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_LABEL, 387a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_ICON, 388a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_NAME, 389a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_TYPE, 39043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 39143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 392a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SOURCE_ID, 393a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.VERSION, 394a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DELETED, 395a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DIRTY, 396a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.NAME_VERIFIED, 397a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC1, 398a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC2, 399a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC3, 400a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC4, 401a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts._ID, 402a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 403a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 404a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 405a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME, 406a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 407a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 408a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 409a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 410a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.TIMES_CONTACTED, 411a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.STARRED, 412a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 413a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHOTO_ID, 414f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 4153d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 4163d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 417a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CUSTOM_RINGTONE, 418a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 41924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 420a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LOOKUP_KEY, 421a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 422cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 423a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_PRESENCE, 424a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 425a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS, 426a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 427a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 428a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 429a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 430a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 431a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov }); 432a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 433a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 434dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawEntityProjection() { 435dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContactsEntity.CONTENT_URI, new String[]{ 436dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.Entity.DATA_ID, 437dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 438dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 439dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 440dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 44143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 44243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 443dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 444dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 445dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 446dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 447dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 448dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 449dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 450dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 451dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 452dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 45324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 454dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 455dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 456dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 457dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 458dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 459dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 460dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 461dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 462dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 463dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 464dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 465dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 466dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 467dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 468dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 469dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 470dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 471dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 472dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 473dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 474dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 475dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 476dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 477dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 478dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 479dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 480dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 481dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 482dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testPhoneLookupProjection() { 483dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(PhoneLookup.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 484dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 485dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup._ID, 486dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LOOKUP_KEY, 487dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.DISPLAY_NAME, 488dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LAST_TIME_CONTACTED, 489dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TIMES_CONTACTED, 490dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.STARRED, 491dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.IN_VISIBLE_GROUP, 492dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.PHOTO_ID, 4933d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_URI, 4943d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_THUMBNAIL_URI, 495dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.CUSTOM_RINGTONE, 496dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.HAS_PHONE_NUMBER, 497dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.SEND_TO_VOICEMAIL, 498dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.NUMBER, 499dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TYPE, 500dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LABEL, 5012530512f639c4979fd7371c7dd25dd67e8118124Bai Tao PhoneLookup.NORMALIZED_NUMBER, 502dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 503dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 504dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 505dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsProjection() { 506dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_URI, new String[]{ 507dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 508dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 509dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 51043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 51143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 512dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 513dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 514dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 515dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 516dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 517dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 518dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 519dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 520dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 521dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 52277c0766a8738feb39f1066a7f3106fef71dd295dDaniel Lehmann Groups.ACTION, 52377c0766a8738feb39f1066a7f3106fef71dd295dDaniel Lehmann Groups.ACTION_URI, 524dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 525dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 526dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 527c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 528dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 529dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 530dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 531dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 532dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 533dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 534dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 535dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsSummaryProjection() { 536dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_SUMMARY_URI, new String[]{ 537dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 538dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 539dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 54043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 54143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 542dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 543dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 544dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 545dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 546dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 547dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 548dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 549dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 550dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 551dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 55277c0766a8738feb39f1066a7f3106fef71dd295dDaniel Lehmann Groups.ACTION, 55377c0766a8738feb39f1066a7f3106fef71dd295dDaniel Lehmann Groups.ACTION_URI, 554dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 555dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 556dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 557c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 558dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 559dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 560dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 561dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 562dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_COUNT, 563dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_WITH_PHONES, 564dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 565dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 566dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 567dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testAggregateExceptionProjection() { 568dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(AggregationExceptions.CONTENT_URI, new String[]{ 569dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptionColumns._ID, 570dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.TYPE, 571dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1, 572dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2, 573dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 574dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 575dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 576dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testSettingsProjection() { 577dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Settings.CONTENT_URI, new String[]{ 578dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_NAME, 579dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_TYPE, 580dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_VISIBLE, 581dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.SHOULD_SYNC, 582dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ANY_UNSYNCED, 583dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_COUNT, 584dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_WITH_PHONES, 585dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 586dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 587dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 588dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testStatusUpdatesProjection() { 589dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(StatusUpdates.CONTENT_URI, new String[]{ 590dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID, 591dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.DATA_ID, 592dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_ACCOUNT, 593dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_HANDLE, 594dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PROTOCOL, 595dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL, 596dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PRESENCE, 597dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CHAT_CAPABILITY, 598dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS, 599dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP, 600dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE, 601dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_ICON, 602dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_LABEL, 603dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 604dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 605dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 606dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testLiveFoldersProjection() { 607dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection( 608dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, "live_folders/contacts"), 609dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 610dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov LiveFolders._ID, 611dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov LiveFolders.NAME, 612dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 613dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 614dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 615dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDirectoryProjection() { 616dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Directory.CONTENT_URI, new String[]{ 617dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory._ID, 618dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.PACKAGE_NAME, 619dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.TYPE_RESOURCE_ID, 620dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DISPLAY_NAME, 621dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DIRECTORY_AUTHORITY, 622dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_TYPE, 623dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_NAME, 624dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.EXPORT_SUPPORT, 625778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.SHORTCUT_SUPPORT, 626778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.PHOTO_SUPPORT, 627dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 628dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 629dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 6303cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testRawContactsInsert() { 6313cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 6323cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6333cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_NAME, "a"); 6343cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_TYPE, "b"); 6353cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SOURCE_ID, "c"); 6363cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.VERSION, 42); 6373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DIRTY, 1); 6383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DELETED, 1); 6393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED); 6403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 6413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 6423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 6433cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 6443cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC1, "e"); 6453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC2, "f"); 6463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC3, "g"); 6473cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC4, "h"); 6483cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values); 6504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rowUri); 6513cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6523cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 6534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(RawContacts.CONTENT_URI, values, RawContacts._ID, rawContactId); 65481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 6553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 6563cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6572149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov public void testDataDirectoryWithLookupUri() { 6582149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov ContentValues values = new ContentValues(); 6592149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6602149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long rawContactId = createRawContactWithName(); 6612149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertPhoneNumber(rawContactId, "555-GOOG-411"); 6622149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertEmail(rawContactId, "google@android.com"); 6632149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6642149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long contactId = queryContactId(rawContactId); 6652149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 6662149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6672149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete and valid lookup URI 6682149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 6692149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 6702149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6712149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6722149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6732149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete but stale lookup URI 6742149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 6752149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 6762149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6772149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6782149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Incomplete lookup URI (lookup key only, no contact ID) 6792149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, 6802149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupKey), Contacts.Data.CONTENT_DIRECTORY); 6812149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6822149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 6832149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6842149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov private void assertDataRows(Uri dataUri, ContentValues values) { 6852149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Cursor cursor = mResolver.query(dataUri, new String[]{ Data.DATA1 }, null, null, Data._ID); 6862149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertEquals(3, cursor.getCount()); 6872149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToFirst(); 6882149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "John Doe"); 6892149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6902149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6912149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 6922149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "555-GOOG-411"); 6932149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6942149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6952149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 6962149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "google@android.com"); 6972149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6982149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6992149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.close(); 7002149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 7012149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 702a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithIdBasedUri() { 703a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 704a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 705a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 706a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 707a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 708a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 709a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 710a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 711a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 712a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 713a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 714a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 715a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 716a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 717a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 718a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 719a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY); 720a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 721a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 722a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 723a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 724a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithLookupUri() { 725a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 726a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 727a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 728a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 729a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 730a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 731a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 732a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 733a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 734a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 735a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 736a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 737a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 738a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 739a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 740a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 741a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First try with a matching contact ID 742a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 743a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 744a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 745a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 746a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try with a contact ID mismatch 747a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 748a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 749a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 750a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 751a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try without an ID altogether 752a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey); 753a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 754a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 755a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 756a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 757a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov private void assertEntityRows(Uri entityUri, long contactId, long rawContactId1, 758a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2) { 759a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 760a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 761a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Cursor cursor = mResolver.query(entityUri, null, null, null, 762a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID + "," + Contacts.Entity.DATA_ID); 763a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEquals(3, cursor.getCount()); 764a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 765a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First row - name 766a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToFirst(); 767a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 768a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 769a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 770a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "John Doe"); 771a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 772a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 773a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 774a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 775a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 776a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 777a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 778a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 779a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 780a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 781a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 782a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Second row - IM 783a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 784a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 785a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 786a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, Im.CONTENT_ITEM_TYPE); 787a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "gtalk"); 788a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 789a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 790a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 791a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 792a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 793a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 794a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 795a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 796a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.PRESENCE, StatusUpdates.IDLE); 797a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 798a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 799a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Third row - second raw contact, not data 800a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 801a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 802a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId2); 803a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.MIMETYPE); 804a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA_ID); 805a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA1); 806a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act2"); 807a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype2"); 808a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 809a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 810a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 811a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 812a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 813a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 814a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 815a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 816a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 817a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.close(); 818a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 819a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 8203cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testDataInsert() { 8214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("John", "Doe"); 8224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 8244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov putDataValues(values, rawContactId); 8254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 8264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 8274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 8294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 8304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(dataUri, values); 8314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Data.CONTENT_URI, values, Data._ID, dataId); 8334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under RawContacts 8354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 8364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactDataUri = 8374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri.withAppendedPath(rawContactUri, RawContacts.Data.CONTENT_DIRECTORY); 8384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(rawContactDataUri, values, Data._ID, dataId); 8394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under Contacts 8414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 8424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactDataUri = Uri.withAppendedPath(contactUri, Contacts.Data.CONTENT_DIRECTORY); 8434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(contactDataUri, values, Data._ID, dataId); 84481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 8454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 8463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 84789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactDataQuery() { 84889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 84989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 85089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 85189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri1 = insertStructuredName(rawContactId1, "John", "Doe"); 85289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 85389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri2 = insertStructuredName(rawContactId2, "Jane", "Doe"); 85489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 85589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(dataUri1, account1); 85689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(dataUri2, account2); 85789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Data._ID, ContentUris.parseId(dataUri1)) ; 85889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Data._ID, ContentUris.parseId(dataUri2)) ; 85989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 86089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 8614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesQuery() { 8627d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 8633cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 8644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 8654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 8664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 8674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 8684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 8694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 8714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 8724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 8744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertPhoneNumber(rawContactId, "18004664411"); 8754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long phoneId = ContentUris.parseId(uri); 8764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 8794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 8804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, phoneId); 8813cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 8824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 8834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 8844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 8854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 8864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 8874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 8884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 8894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 8904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 8914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 8924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 8934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 89448828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Phone.CONTENT_URI, phoneId), values); 8954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Phone.CONTENT_URI, values, Data._ID, phoneId); 8964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 8974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesFilterQuery() { 89947fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 9005e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId1, "1-800-466-4411"); 9015e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 9022a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov long rawContactId2 = createRawContactWithName("Chilled", "Guacamole", ACCOUNT_2); 9032a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1-800-466-5432"); 9045e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 9054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "tamale"); 9064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 9074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 9084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 9095e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Phone.NUMBER, "1-800-466-4411"); 9104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 9114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 9125e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 9134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9145e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1-800-GOOG-411"); 9155e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri2, values); 9165e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 9175e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "18004664"); 9185e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri3, values); 9195e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 9205e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "encilada"); 9215e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 92245d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov 92345d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov Uri filterUri5 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "*"); 92445d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 9254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 9264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 927e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public void testPhoneLookup() { 928e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov ContentValues values = new ContentValues(); 929e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 930e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 931e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 932e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 933e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 934e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 935e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 9364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 9374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 939e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 940e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.clear(); 941e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup._ID, queryContactId(rawContactId)); 942e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 943e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.NUMBER, "18004664411"); 944e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.TYPE, Phone.TYPE_HOME); 945e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.putNull(PhoneLookup.LABEL); 946e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.CUSTOM_RINGTONE, "d"); 947e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.SEND_TO_VOICEMAIL, 1); 9484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(lookupUri1, values); 9494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 950892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // In the context that 8004664411 is a valid number, "4664411" as a 951892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // call id should not match to "8004664411" 952e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "4664411"); 953892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(0, getCount(lookupUri2, null, null)); 954892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 955892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 956892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void testPhoneLookupUseCases() { 957892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues values = new ContentValues(); 958892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri rawContactUri; 959892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactId; 960892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri lookupUri2; 961892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 962892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 963892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 964892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 965892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // International format in contacts 966892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 967892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 968892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 969892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 970892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "+1-650-861-0000"); 971892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 972892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 973892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 974892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 975892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0000"); 976892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 977892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 978892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 979892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0000"); 980892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 981892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 982892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // National format in contacts 983892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 984892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 985892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 986892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 987892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 988892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 989892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot1", "Tamale"); 990892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "650-861-0001"); 991892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 992892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 993892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 994892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 995892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0001"); 996892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 997892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 998892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 999892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0001"); 1000892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1001892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1002892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Local format in contacts 1003892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1004892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1005892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1006892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1007892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1008892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1009892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot2", "Tamale"); 1010892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "861-0002"); 1011892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1012892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1013892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1014892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1015892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0002"); 1016892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1017892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1018892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1019892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0002"); 1020892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 10214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 10224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1023653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov public void testPhoneUpdate() { 1024653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov ContentValues values = new ContentValues(); 1025653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1026653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1027653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1028653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1029653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "18004664411"); 1030653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1031653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 10325870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(lookupUri1, PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 1033653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1034653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1035653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1036653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1037653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1038653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664422"); 10395870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(lookupUri2, PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 1040653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1041653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Setting number to null will remove the phone lookup record 1042653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1043653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.putNull(Phone.NUMBER); 1044653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1045653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1046653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov assertEquals(0, getCount(lookupUri2, null, null)); 1047653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1048653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Let's restore that phone lookup record 1049653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1050653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1051653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 10525870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(lookupUri2, PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 105381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 1054653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov } 1055653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 10564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testEmailsQuery() { 10574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 10584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 10594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 10604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 10614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 10624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 10634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 10644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 10654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 10664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 10674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 10684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertEmail(rawContactId, "meghan@acme.com"); 10694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long emailId = ContentUris.parseId(uri); 10704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 10714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 10724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 10734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, emailId); 10744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 10754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 10764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 10774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "meghan@acme.com"); 10784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 10794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 10804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 10814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 10824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 10834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 10844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 10854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 10864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 108748828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 10884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Email.CONTENT_URI, values, Data._ID, emailId); 10894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 10904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 10915e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsLookupQuery() { 10924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Hot", "Tamale"); 10934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertEmail(rawContactId, "tamale@acme.com"); 10944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 10955e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "tamale@acme.com"); 10964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 10974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 10984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 10994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 11004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 11014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 11024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(filterUri1, values); 11034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 110408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "Ta<TaMale@acme.com>"); 110508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertStoredValues(filterUri2, values); 110608768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 110708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "encilada@acme.com"); 110808768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertEquals(0, getCount(filterUri3, null, null)); 11094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 11104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 11115e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsFilterQuery() { 111247fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 11135e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 11145e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 11155e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 111647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("Hot", "Tamale", ACCOUNT_2); 11175e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId2, "tamale@acme.com"); 11185e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 11195e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tam"); 11205e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov ContentValues values = new ContentValues(); 11215e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 11225e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 11235e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 11245e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 11255e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.putNull(Email.LABEL); 11265e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 11275e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 11285e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot"); 11295e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri2, values); 11305e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1131155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot tamale"); 11325e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri3, values); 11335e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 11341e530df9f7e496dc47f77d4323c89bd413b79b64Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tamale@acme"); 11355e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri4, values); 11365e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 11375e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri5 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "encilada"); 11385e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 11395e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov } 11405e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 11417d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa /** 1142c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns addresses according to registration order. 1143c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1144c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterDefaultSortOrder() { 1145c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1146c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1147c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com"); 1148c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address3@email.com"); 1149c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1150c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1151c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1152c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1153c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1154c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1155c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1156c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1157c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v1, v2, v3 }); 1158c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1159c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1160c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 1161c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns primary addresses before the other addresses. 1162c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1163c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterPrimaryAddress() { 1164c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1165c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1166c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com", true); 1167c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1168c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1169c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1170c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1171c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1172c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1173c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v2, v1 }); 1174c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1175c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1176c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 11777d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * Tests if ContactsProvider2 has email address associated with a primary account before the 11787d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * other address. 11797d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa */ 11807d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa public void testEmailFilterPrimaryAccount() { 11817d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId1 = createRawContact(ACCOUNT_1); 11827d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId1, "account1@email.com"); 11837d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId2 = createRawContact(ACCOUNT_2); 11847d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId2, "account2@email.com"); 11857d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v1 = new ContentValues(); 11867d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v1.put(Email.ADDRESS, "account1@email.com"); 11877d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v2 = new ContentValues(); 11887d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v2.put(Email.ADDRESS, "account2@email.com"); 11897d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 11907d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri1 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 11917d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 11927d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_1.type) 11937d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 11947d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2 }); 11957d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 11967d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 11977d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 11987d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_2.type) 11997d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 12007d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v2, v1 }); 12017d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 12027d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa // Just with PRIMARY_ACCOUNT_NAME 12037d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 12047d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 12057d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 12067d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2 }); 12077d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 12087d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 12097d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 12107d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 12117d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v2, v1 }); 12127d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 12137d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 121446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** Tests {@link DataUsageFeedback} correctly promotes a data row instead of a raw contact. */ 121546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public void testEmailFilterSortOrderWithFeedback() { 121646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId1 = createRawContact(); 12174928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address1 = "address1@email.com"; 12184928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId1, address1); 121946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId2 = createRawContact(); 12204928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address2 = "address2@email.com"; 12214928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId2, address2); 12224928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address3 = "address3@email.com"; 12234928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa ContentUris.parseId(insertEmail(rawContactId2, address3)); 122446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 122546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v1 = new ContentValues(); 122646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 122746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v2 = new ContentValues(); 122846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 122946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v3 = new ContentValues(); 123046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 123146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 123246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 123346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 123446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 123546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_CALL) 123646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 123746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 123846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 123946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT) 124046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 124146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 124246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 124346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_SHORT_TEXT) 124446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 124546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2, v3 }); 124646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v1, v2, v3 }); 124746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2, v3 }); 124846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v1, v2, v3 }); 124946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 12504928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(address3, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, v3); 125146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 125246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa // account3@email.com should be the first. account2@email.com should also be promoted as 125346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa // it has same contact id. 125446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v3, v1, v2 }); 125546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v3, v1, v2 }); 125646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 125746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1258f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa /** 1259f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * Tests {@link DataUsageFeedback} correctly bucketize contacts using each 1260f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * {@link DataUsageStatColumns#LAST_TIME_USED} 1261f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa */ 1262f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa public void testEmailFilterSortOrderWithOldHistory() { 1263f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long rawContactId1 = createRawContact(); 1264f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId1 = ContentUris.parseId(insertEmail(rawContactId1, "address1@email.com")); 1265f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId2 = ContentUris.parseId(insertEmail(rawContactId1, "address2@email.com")); 1266f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId3 = ContentUris.parseId(insertEmail(rawContactId1, "address3@email.com")); 1267f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId4 = ContentUris.parseId(insertEmail(rawContactId1, "address4@email.com")); 1268f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1269f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1270f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1271f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1272f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1273f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1274f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1275f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1276f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1277f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v4 = new ContentValues(); 1278f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v4.put(Email.ADDRESS, "address4@email.com"); 1279f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1280f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa final ContactsProvider2 provider = (ContactsProvider2) getProvider(); 1281f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1282f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long nowInMillis = System.currentTimeMillis(); 1283f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000); 1284f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000); 1285f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000); 1286f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1287f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address4 is contacted just once yesterday. 1288f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId4), 1289f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, yesterdayInMillis); 1290f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1291f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address3 is contacted twice 1 week ago. 1292f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1293f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1294f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1295f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1296f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1297f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is contacted three times 1 year ago. 1298f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1299f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1300f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1301f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1302f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1303f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1304f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1305f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // auto-complete should prefer recently contacted methods 1306f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v4, v3, v2, v1 }); 1307f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1308f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address2 is contacted right now 1309f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1310f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1311f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1312f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Now address2 is the most recently used address 1313f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v4, v3, v1 }); 1314f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1315f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address1 is contacted right now 1316f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId1), 1317f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1318f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1319f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is preferred to address1 as address2 is used 4 times in total 1320f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v1, v4, v3 }); 1321f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa } 1322f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 13234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPostalsQuery() { 13244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Alice", "Nextore"); 13254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 13264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 13274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 13294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 13304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, dataId); 13314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 13324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 13334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 13344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(StructuredPostal.FORMATTED_ADDRESS, "1600 Amphiteatre Ave, Mountain View"); 13354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Alice Nextore"); 13364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 133748828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 133848828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov values); 13394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(StructuredPostal.CONTENT_URI, values, Data._ID, dataId); 13404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 13414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testQueryContactData() { 13434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 13444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1345aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1346d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 13474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 13484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(contactUri, values); 13504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 13514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 13524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13530a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testQueryContactWithStatusUpdate() { 13544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 13554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1356aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1357aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 135882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1359aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori values.put(Contacts.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 1360ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 1361ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 1362ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelectionWithProjection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 13634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 13644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1365a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByName() { 13664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 136748786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1368aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1369d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1370aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 137148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 137248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov ContentValues nameValues = new ContentValues(); 137348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.GIVEN_NAME, "Stu"); 137448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.FAMILY_NAME, "Goulash"); 13753b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "goo"); 13763b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "LASH"); 13777ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, nameValues); 137848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 137948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long contactId = queryContactId(rawContactId); 138082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 138148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1382ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goulash"); 1383ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 13844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 138548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov assertContactFilter(contactId, "goolash"); 13863b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov assertContactFilter(contactId, "lash"); 138748786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1388a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 13893b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov 13903b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov // Phonetic name with given/family reversed should not match 1391a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("lashgoo"); 13927ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 13937ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.clear(); 13947ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "ga"); 13957ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "losh"); 13967ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 13977ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov mResolver.update(nameUri, nameValues, null, null); 13987ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 13997ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov assertContactFilter(contactId, "galosh"); 14007ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 1401a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1402a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1403a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1404a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByEmailAddress() { 1405a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1406a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1407a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1408a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1409a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1410a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1411a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1412a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1413a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1414a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1415a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1416a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goog411@acme.com"); 1417a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1418a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1419a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog"); 1420a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411"); 1421a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@"); 1422a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme"); 1423a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme.com"); 1424a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1425a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@acme.combo"); 1426a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@le.com"); 1427a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1428a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1429a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1430a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByPhoneNumber() { 1431a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1432a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1433a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1434a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1435a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1436a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1437a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1438a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1439a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1440a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1441a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1442a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "18004664411"); 1443a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1444a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1445a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "18004664411"); 1446a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "1800466"); 1447a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "+18004664411"); 1448a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "8004664411"); 1449a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1450a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("78004664411"); 1451a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("18004664412"); 1452a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("8884664411"); 14534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 14544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14552f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa /** 14562f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * Checks ContactsProvider2 works well with strequent Uris. The provider should return starred 14572f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * contacts and frequently used contacts. 14582f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa */ 1459ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactStrequent() { 14604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 14612f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String email1 = "a@acme.com"; 14622f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted1 = 0; 14634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Noah", "Tever", "18004664411", 14642f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa email1, StatusUpdates.OFFLINE, timesContacted1, 0, 0, 1465d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 14664928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final String phoneNumber2 = "18004664412"; 14674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 14684928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa createContact(values2, "Sam", "Times", phoneNumber2, 1469aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "b@acme.com", StatusUpdates.INVISIBLE, 3, 0, 0, 1470aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 14714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values3 = new ContentValues(); 14722f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String phoneNumber3 = "18004664413"; 14732f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted3 = 5; 14742f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa createContact(values3, "Lotta", "Calling", phoneNumber3, 14752f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, timesContacted3, 0, 0, 1476d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO); 14774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values4 = new ContentValues(); 14789dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa final long rawContactId4 = createRawContact(values4, "Fay", "Veritt", null, 1479aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 1480d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO | StatusUpdates.CAPABILITY_HAS_VOICE); 14814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14822f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Starred contacts should be returned. TIMES_CONTACTED should be ignored and only data 14832f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // usage feedback should be used for "frequently contacted" listing. 14842f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(Contacts.CONTENT_STREQUENT_URI, values4); 14852f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 14862f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Send feedback for the 3rd phone number, pretending we called that person via phone. 14874928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 14882f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 14892f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 3rd contact should be shown after starred one. 14902f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 14912f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa new ContentValues[] { values4, values3 }); 14922f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 14934928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 14942f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Twice. 14954928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 14962f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 14972f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 1st and 3rd contacts should be shown after starred one. 14982f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 14994928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa new ContentValues[] { values4, values1, values3 }); 15002f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 15019dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // With phone-only parameter, 1st and 4th contacts shouldn't be returned because: 15029dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 1st: feedbacks are only about email, not about phone call. 15039dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 4th: it has no phone number though starred. 15042f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Uri phoneOnlyStrequentUri = Contacts.CONTENT_STREQUENT_URI.buildUpon() 15052f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true") 15062f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .build(); 15079dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values3 }); 15089dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 15099dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Now the 4th contact has a phone number. 15109dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId4, "18004664414"); 15119dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 15129dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Phone only strequent should return 4th contact. 15134928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 15144928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 15154928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // Send feedback for the 2rd phone number, pretending we send the person a SMS message. 15164928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber2, DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, values1); 15174928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 15184928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // SMS feedback shouldn't affect phone-only results. 15194928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 15204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1521ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, "fay"); 15222f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(filterUri, values4); 15234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 15244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 152545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa /** 152645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * Checks ContactsProvider2 works well with frequent Uri. The provider should return frequently 152745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * contacted person ordered by number of times contacted. 152845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa */ 152945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa public void testQueryContactFrequent() { 153045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values1 = new ContentValues(); 153145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email1 = "a@acme.com"; 153245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values1, "Noah", "Tever", "18004664411", 153345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email1, StatusUpdates.OFFLINE, 0, 0, 0, 0); 153445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values2 = new ContentValues(); 153545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email2 = "b@acme.com"; 153645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values2, "Sam", "Times", "18004664412", 153745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0); 153845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values3 = new ContentValues(); 153945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String phoneNumber3 = "18004664413"; 1540363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa final long contactId3 = createContact(values3, "Lotta", "Calling", phoneNumber3, 1541363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, 0, 1, 0, 0); 154245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values4 = new ContentValues(); 154345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values4, "Fay", "Veritt", "18004664414", 154445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 0); 154545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 154645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 154745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 154845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, values1); 154945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 155045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Pretend email was sent to the address twice. 155145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 155245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 155345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 155445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1}); 155545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 155645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Three times 155745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 155845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 155945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 156045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 156145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 156245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 1563363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 1564363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa // Test it works with selection/selectionArgs 1565363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1566363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 1567363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values2, values1}); 1568363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1569363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 1570363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3}); 1571363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 1572363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3.put(Contacts.STARRED, 0); 1573363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertEquals(1, 1574363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa mResolver.update(Uri.withAppendedPath(Contacts.CONTENT_URI, 1575363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa String.valueOf(contactId3)), 1576363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3, null, null)); 1577363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1578363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 1579363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 1580363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1581363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 1582363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {}); 158345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa } 158445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 1585ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactGroup() { 15864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long groupId = createGroup(null, "testGroup", "Test Group"); 15874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 15894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Best", "West", "18004664411", 1590aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "west@acme.com", StatusUpdates.OFFLINE, 0, 0, groupId, 1591aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 15924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 15944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values2, "Rest", "East", "18004664422", 1595aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "east@acme.com", StatusUpdates.AVAILABLE, 0, 0, 0, 1596aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 15974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1598ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 15994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Cursor c = mResolver.query(filterUri1, null, null, null, Contacts._ID); 16004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 16014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 16024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values1); 16034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 16044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1605ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 16064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri2, null, Contacts.DISPLAY_NAME + "=?", 16074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov new String[] { "Best West" }, Contacts._ID); 16084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 16094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 16104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1611ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Next Group"); 16124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri3, null, null, null, Contacts._ID); 16134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, c.getCount()); 16144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 16153cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 16163cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 161724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileRequiresReadPermission() { 161824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 161924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 162024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 162124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 162224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Queries for the profile should fail. 162324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 162424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 162524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 1: Retrieving profile contact. 162624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 162724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(Profile.CONTENT_URI, null, null, null, Contacts._ID); 162824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the profile without READ_PROFILE access should fail."); 162924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 163024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 163124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 163224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 163324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 163424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 163524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 163624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieving profile data. 163724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 163824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 163924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro null, null, null, Contacts._ID); 164024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the profile data without READ_PROFILE access should fail."); 164124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 164224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 164324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 164424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 164524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 164624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 164724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 164824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieving profile entities. 164924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 165024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(Profile.CONTENT_URI.buildUpon() 165124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("entities").build(), null, null, null, Contacts._ID); 165224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the profile entities without READ_PROFILE access should fail."); 165324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 165424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 165524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 165624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 165724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 165824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 165924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 166024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 166124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByContactIdRequiresReadPermission() { 166224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 166324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 166424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 166524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 166624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 166724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // A query for the profile contact by ID should fail. 166824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 166924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 167024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 167124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro null, null, null, Contacts._ID); 167224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the profile by contact ID without READ_PROFILE access should fail."); 167324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 167424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 167524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 167624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 167724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 167824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 167924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 168024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 168124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByRawContactIdRequiresReadPermission() { 168224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 168324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 168424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the raw contact. 168524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 168624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 168724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 168824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(ContentUris.withAppendedId(RawContacts.CONTENT_URI, 168924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileRawContactId), null, null, null, RawContacts._ID); 169024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the raw contact profile without READ_PROFILE access should fail."); 169124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 169224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 169324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 169424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 169524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 169624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 169724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 169824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 169924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileRawContactRequiresReadPermission() { 170024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 170124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 170224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the profile's raw contact data. 170324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 170424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 170524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 170624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 1: Retrieve the overall raw contact set for the profile. 170724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 170824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(Profile.CONTENT_RAW_CONTACTS_URI, null, null, null, null); 170924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the raw contact profile without READ_PROFILE access should fail."); 171024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 171124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 171224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 171324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 171424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 171524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 171624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 171724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieve the raw contact profile data for the inserted raw contact ID. 171824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 171924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(ContentUris.withAppendedId( 172024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 172124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("data").build(), null, null, null, null); 172224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the raw profile data without READ_PROFILE access should fail."); 172324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 172424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 172524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 172624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 172724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 172824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 172924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 173024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieve the raw contact profile entity for the inserted raw contact ID. 173124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 173224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(ContentUris.withAppendedId( 173324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 173424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("entity").build(), null, null, null, null); 173524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the raw profile entities without READ_PROFILE access should fail."); 173624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 173724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 173824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 173924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 174024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 174124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 174224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 174324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 174424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataByDataIdRequiresReadPermission() { 174524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 174624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = mResolver.query(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 174724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro new String[]{Data._ID, Data.MIMETYPE}, null, null, null); 174824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(4, c.getCount()); // Photo, phone, email, name. 174924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.moveToFirst(); 175024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileDataId = c.getLong(0); 175124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 175224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 175324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the data 175424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 175524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 175624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(ContentUris.withAppendedId(Data.CONTENT_URI, profileDataId), 175724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro null, null, null, null); 175824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the data in the profile without READ_PROFILE access should fail."); 175924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 176024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 176124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 176224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 176324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 176424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 176524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 176624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 176724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataRequiresReadPermission() { 176824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 176924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 177024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve all profile data. 177124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 177224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 177324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 177424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c = mResolver.query(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 177524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro null, null, null, null); 177624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Querying for the data in the profile without READ_PROFILE access should fail."); 177724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 177824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 177924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 178024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 178124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 178224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 178324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 178424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 178524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileRequiresWritePermission() { 178624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 178724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 178824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a non-profile contact should be fine. 178924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(new ContentValues()); 179024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 179124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a profile contact should throw an exception. 179224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 179324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 179424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Creating a profile contact should fail without WRITE_PROFILE access."); 179524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 179624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 179724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 179824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 179924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileDataRequiresWritePermission() { 180024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 180124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 180224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 180324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 180424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertEmail(profileRawContactId, "foo@bar.net", false); 180524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Inserting data into a profile contact should fail without WRITE_PROFILE access."); 180624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 180724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 180824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 180924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 18106ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro public void testUpdateDataDoesNotRequireProfilePermission() { 18116ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 18126ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 18136ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 18146ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Create a non-profile contact. 18156ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long rawContactId = createRawContactWithName("Domo", "Arigato"); 18166ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long dataId = getStoredLongValue(Data.CONTENT_URI, 18176ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", 18186ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(rawContactId), StructuredName.CONTENT_ITEM_TYPE}, 18196ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data._ID); 18206ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 18216ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Updates its name using a selection. 18226ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro ContentValues values = new ContentValues(); 18236ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.GIVEN_NAME, "Bob"); 18246ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.FAMILY_NAME, "Blob"); 18256ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 18266ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(dataId)}); 18276ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 18286ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Check that the update went through. 18296ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro assertStoredValues(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), values); 18306ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro } 18316ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 183224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryContactIncludeProfile() { 183324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 183424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 183524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 183624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 183724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 183824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createBasicNonProfileContact(nonProfileValues); 183924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileContactId = queryContactId(nonProfileRawContactId); 184024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 184124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri contactWithProfilesUri = Contacts.CONTENT_URI.buildUpon() 1842377850d2dfd28eaf1b22273a50cfe066f6667ab9Dave Santoro .appendQueryParameter(ContactsContract.ALLOW_PROFILE, "1").build(); 184324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValuesOrderly(contactWithProfilesUri, 184424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro new ContentValues[]{profileValues, nonProfileValues}); 184524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertSelection(contactWithProfilesUri, profileValues, Contacts._ID, profileContactId); 184624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertSelection(Contacts.CONTENT_URI, nonProfileValues, Contacts._ID, nonProfileContactId); 184724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 184824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 184924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryContactExcludeProfile() { 185024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a profile contact (it should not be returned by the general contact URI). 185124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 185224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 185324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a non-profile contact - this should be returned. 185424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 185524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(nonProfileValues); 185624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 185724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Contacts.CONTENT_URI, new ContentValues[] {nonProfileValues}); 185824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 185924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 186024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfile() { 186124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 186224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 186324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 186424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 186524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 186624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 186724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private ContentValues[] getExpectedProfileDataValues() { 186824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected photo data values (only field is the photo BLOB, which we can't check). 186924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues photoRow = new ContentValues(); 187024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro photoRow.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 187124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 187224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected phone data values. 187324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues phoneRow = new ContentValues(); 187424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 187524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Phone.NUMBER, "18005554411"); 187624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 187724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected email data values. 187824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues emailRow = new ContentValues(); 187924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 188024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Email.ADDRESS, "mia.prophyl@acme.com"); 188124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 188224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected name data values. 188324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nameRow = new ContentValues(); 188424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 188524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.DISPLAY_NAME, "Mia Prophyl"); 188624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.GIVEN_NAME, "Mia"); 188724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.FAMILY_NAME, "Prophyl"); 188824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 188924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return new ContentValues[]{photoRow, phoneRow, emailRow, nameRow}; 189024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 189124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 189224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileData() { 189324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 189424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 189524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 189624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 189724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 189824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 189924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileEntities() { 190024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 190124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 190224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("entities").build(), 190324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 190424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 190524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 190624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfile() { 190724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 190824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 190924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 191024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 191124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 191224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, profileValues); 191324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 191424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 191524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileById() { 191624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 191724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 191824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 191924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 192024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 192124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 192224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId), profileValues); 192324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 192424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 192524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileData() { 192624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 192724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 192824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 192924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 193024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("data").build(), getExpectedProfileDataValues()); 193124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 193224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 193324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileEntity() { 193424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 193524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 193624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 193724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 193824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("entity").build(), getExpectedProfileDataValues()); 193924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 194024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 194124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryDataForProfile() { 194224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 194324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 194424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 194524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 194624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 194724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 1948a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro public void testInsertProfileWithDataSetTriggersAccountCreation() { 1949a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that we have no profile raw contacts. 1950a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, new ContentValues[]{}); 1951a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 1952a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Insert a profile record with a new data set. 1953a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Account account = new Account("a", "b"); 1954a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro String dataSet = "c"; 1955a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Uri profileUri = maybeAddAccountQueryParameters(Profile.CONTENT_RAW_CONTACTS_URI, account) 1956a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro .buildUpon().appendQueryParameter(RawContacts.DATA_SET, dataSet).build(); 1957a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro ContentValues values = new ContentValues(); 1958a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(profileUri, values)); 1959a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro values.put(RawContacts._ID, rawContactId); 1960a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 1961a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that querying for the profile gets the created raw contact. 1962a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, values); 1963a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro } 1964a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 19650a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testPhonesWithStatusUpdate() { 196619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 196719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov ContentValues values = new ContentValues(); 196819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 196919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 197019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 197119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 197219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 197319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 197419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664412"); 197519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog411@acme.com"); 197619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog412@acme.com"); 197719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 197882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 1979aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.INVISIBLE, "Bad", 1980aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 198182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog412@acme.com", 1982aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, "Good", 1983aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VOICE); 198419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long contactId = queryContactId(rawContactId); 198519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 198682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri uri = Data.CONTENT_URI; 198719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 1988a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov Cursor c = mResolver.query(uri, null, RawContacts.CONTACT_ID + "=" + contactId + " AND " 1989a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", null, Phone.NUMBER); 199019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertEquals(2, c.getCount()); 199119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 199219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToFirst(); 199319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 199419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 199582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 19960a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 199719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 199819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 199919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2000a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 200119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 200219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 200319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToNext(); 200419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 200519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 200682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 20070a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 200819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 200919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664412"); 201019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2011a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 201219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 201319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 201419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.close(); 201519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov } 201619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 201789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testGroupQuery() { 201889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 201989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 202089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId1 = createGroup(account1, "e", "f"); 202189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId2 = createGroup(account2, "g", "h"); 202289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account1); 202389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account2); 202489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 202589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 202689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Groups._ID + "=" + groupId1, null, Groups._ID, groupId1) ; 202789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Groups._ID + "=" + groupId2, null, Groups._ID, groupId2) ; 202889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 202989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 20303cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testGroupInsert() { 20313cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 20323cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 20333cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_NAME, "a"); 20343cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_TYPE, "b"); 20353cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SOURCE_ID, "c"); 20363cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.VERSION, 42); 20373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.GROUP_VISIBLE, 1); 20383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE, "d"); 20393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE_RES, 1234); 20403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.NOTES, "e"); 20413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.RES_PACKAGE, "f"); 20423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYSTEM_ID, "g"); 204394021b213e4db367f60b30fcbfe9019e28571784Fred Quintana values.put(Groups.DELETED, 1); 20443cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC1, "h"); 20453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC2, "i"); 20463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC3, "j"); 20473cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC4, "k"); 20483cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 20493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(Groups.CONTENT_URI, values); 20503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 205173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.DIRTY, 1); 20523cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 20533cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 20543cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 2055f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupCreationAfterMembershipInsert() { 2056f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2057f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2058f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2059f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId = assertSingleGroup(NO_LONG, mAccount, "gsid1", null); 2060f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2061f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId, "gsid1"); 2062f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2063f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2064f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupReuseAfterMembershipInsert() { 2065f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2066f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2067f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2068f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2069f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroup(groupId1, mAccount, "gsid1", "title1"); 2070f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2071f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId1, "gsid1"); 2072f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2073f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2074f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupInsertFailureOnGroupIdConflict() { 2075f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2076f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2077f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2078f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues values = new ContentValues(); 2079f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.RAW_CONTACT_ID, rawContactId1); 2080f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 2081f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_SOURCE_ID, "gsid1"); 2082f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_ROW_ID, groupId1); 2083f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa try { 2084f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa mResolver.insert(Data.CONTENT_URI, values); 2085f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa fail("the insert was expected to fail, but it succeeded"); 2086f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } catch (IllegalArgumentException e) { 2087f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // this was expected 2088f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2089f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2090f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2091f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupSummaryQuery() { 2092f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account1 = new Account("accountName1", "accountType1"); 2093f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account2 = new Account("accountName2", "accountType2"); 2094f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId1 = createGroup(account1, "sourceId1", "title1"); 2095f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId2 = createGroup(account2, "sourceId2", "title2"); 2096f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId3 = createGroup(account2, "sourceId3", "title3"); 2097f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2098f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Prepare raw contact id not used at all, to test group summary uri won't be confused 2099f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // with it. 2100f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId0 = createRawContactWithName("firstName0", "lastName0"); 2101f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2102f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("firstName1", "lastName1"); 2103f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 2104f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId1, groupId1); 2105f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2106f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("firstName2", "lastName2"); 2107f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId2, "address2@email.com"); 2108f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId2, "222-222-2222"); 2109f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId2, groupId1); 2110f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2111f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v1 = new ContentValues(); 2112f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups._ID, groupId1); 2113f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.TITLE, "title1"); 2114f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SOURCE_ID, "sourceId1"); 2115f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_NAME, account1.name); 2116f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_TYPE, account1.type); 2117f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_COUNT, 2); 2118f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, 1); 2119f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2120f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v2 = new ContentValues(); 2121f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups._ID, groupId2); 2122f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.TITLE, "title2"); 2123f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SOURCE_ID, "sourceId2"); 2124f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_NAME, account2.name); 2125f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_TYPE, account2.type); 2126f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, 0); 2127f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, 0); 2128f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2129f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v3 = new ContentValues(); 2130f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups._ID, groupId3); 2131f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.TITLE, "title3"); 2132f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SOURCE_ID, "sourceId3"); 2133f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_NAME, account2.name); 2134f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_TYPE, account2.type); 2135f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_COUNT, 0); 2136f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_WITH_PHONES, 0); 2137f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2138f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2139f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2140f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Now rawContactId1 has two phone numbers. 2141f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1111"); 2142f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1112"); 2143f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Result should reflect it correctly (don't count phone numbers but raw contacts) 2144f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, v1.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2145f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2146f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2147f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce new raw contact, pretending the user added another info. 2148f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId3 = createRawContactWithName("firstName3", "lastName3"); 2149f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId3, "address3@email.com"); 2150f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId3, "333-333-3333"); 2151f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId3, groupId2); 2152f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, v2.getAsInteger(Groups.SUMMARY_COUNT) + 1); 2153f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, v2.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2154f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2155f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2156f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2157f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Uri uri = Groups.CONTENT_SUMMARY_URI.buildUpon() 2158f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa .appendQueryParameter(Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT, "true") 2159f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa .build(); 2160f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1); 2161f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 2162f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 2163f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3 }); 2164f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2165f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce another group in account1, testing SUMMARY_GROUP_COUNT_PER_ACCOUNT correctly 2166f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // reflects the change. 2167f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId4 = createGroup(account1, "sourceId4", "title4"); 2168f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2169f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1); 2170f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v4 = new ContentValues(); 2171f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups._ID, groupId4); 2172f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.TITLE, "title4"); 2173f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SOURCE_ID, "sourceId4"); 2174f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_NAME, account1.name); 2175f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_TYPE, account1.type); 2176f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_COUNT, 0); 2177f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_WITH_PHONES, 0); 2178f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2179f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT)); 2180f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3, v4 }); 2181f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2182f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 218389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testSettingsQuery() { 218489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 218589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 218689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account1, "0", "0"); 218789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account2, "1", "1"); 218889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account1); 218989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account2); 219089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 219189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 219289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.SHOULD_SYNC, "0") ; 219389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.UNGROUPED_VISIBLE, "0") ; 219489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.SHOULD_SYNC, "1") ; 219589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.UNGROUPED_VISIBLE, "1") ; 219689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 219789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 21984097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsUnspecified() { 2199d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 22004097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 22014097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 22025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 22034097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 220417a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 22054097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 22064097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 220767c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov public void testDisplayNameParsingWhenPartsAreNull() { 220867c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov long rawContactId = createRawContact(); 220967c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov ContentValues values = new ContentValues(); 221067c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 221167c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 221267c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 221367c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov insertStructuredName(rawContactId, values); 221417a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 221567c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov } 221667c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov 22174097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsSpecified() { 2218d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 22194097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 22204097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 22214097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Johnson"); 22225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 22234097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 22245ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertStructuredName(rawContactId, null, null, null, "Johnson", null); 22254097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 22264097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 22275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithoutPhoneticName() { 22285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final long rawContactId = createRawContact(null); 22295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 22315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 22325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 22335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "K."); 22345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 22355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 22365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 22375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 22395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 224055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 224155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 22425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 22435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 22445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 22455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 22465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 22485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 22495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 22515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 225255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 225355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 22545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 22555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 22565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 22575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 22585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 22605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 22615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 22625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 22645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 22655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithChineseName() { 22685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // Only run this test when Chinese collation is supported 22705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.CHINA)) { 22715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 22725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 22755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 22775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "\u6BB5\u5C0F\u6D9B"); 22785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 22795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 22815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 22825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 22835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 22845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 22855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 22864cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 22874cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 22885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 22905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 22915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 22935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 22945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 22955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 22965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 22975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 22984cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 22994cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 23005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 23025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 23035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 23045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 23065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 23075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithJapaneseName() { 23105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 23115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 23135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "\u7A7A\u6D77"); 23145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PHONETIC_GIVEN_NAME, "\u304B\u3044\u304F\u3046"); 23155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 23165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 23185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 23195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 23205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 23215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 23225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 23235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 23245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 23255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 23275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 23285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 23305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 23315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 23325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 23335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 23345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 23355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 23365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 23375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 23395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 23405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 23415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 23435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 23445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 234625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov public void testDisplayNameUpdate() { 234725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId1 = createRawContact(); 234825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertEmail(rawContactId1, "potato@acme.com", true); 234925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 235025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId2 = createRawContact(); 235125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertPhoneNumber(rawContactId2, "123456789", true); 235225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 23530c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 23540c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 235525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 235625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "123456789"); 235725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 235825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertStructuredName(rawContactId2, "Potato", "Head"); 235925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 236025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Potato Head"); 236181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 236225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 236325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 236401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov public void testDisplayNameFromData() { 236501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long rawContactId = createRawContact(); 236601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2367a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka ContentValues values = new ContentValues(); 236801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 236901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 237001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 237101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 237201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "mike@monstersinc.com"); 237301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "mike@monstersinc.com"); 237401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 237501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "james@monstersinc.com", true); 237601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "james@monstersinc.com"); 237701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 237801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertPhoneNumber(rawContactId, "1-800-466-4411"); 237901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "1-800-466-4411"); 238001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 2381a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there are title and company, the company is display name. 2382a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 2383a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.COMPANY, "Monsters Inc"); 23845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 238501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Monsters Inc"); 238601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 2387a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is nickname, that is display name. 2388a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertNickname(rawContactId, "Sully"); 2389a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "Sully"); 2390a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 2391a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is structured name, that is display name. 2392a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 2393a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.GIVEN_NAME, "James"); 2394a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.MIDDLE_NAME, "P."); 2395a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.FAMILY_NAME, "Sullivan"); 2396a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertStructuredName(rawContactId, values); 23975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "James P. Sullivan"); 23985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithoutPhoneticName() { 24015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 24025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 24035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 24045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 24065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 24085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 24095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.TITLE, "Protagonist"); 24105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 24115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Protagonist"); 24125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there are title and company, the company is display name. 24145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 24155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "Monsters Inc"); 24165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mResolver.update(organizationUri, values, null, null); 24175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 24195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Monsters Inc"); 24205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 24215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 24225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "Monsters Inc"); 24235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Monsters Inc"); 24245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 24255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithJapanesePhoneticName() { 24285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 24295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 24305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 24315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 24335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 24355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 24365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "DoCoMo"); 24375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 24385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 24395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 24415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "DoCoMo"); 24425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 24435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 24445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u30C9\u30B3\u30E2"); 24455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u30C9\u30B3\u30E2"); 24465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 24475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithChineseName() { 24500b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov boolean hasChineseCollator = false; 24510b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov final Locale locale[] = Collator.getAvailableLocales(); 24520b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov for (int i = 0; i < locale.length; i++) { 24530b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (locale[i].equals(Locale.CHINA)) { 24540b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov hasChineseCollator = true; 24550b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov break; 24560b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 24570b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 24580b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 24590b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (!hasChineseCollator) { 24600b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov return; 24610b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 24620b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 24635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 24645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 24655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 24665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 24685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 24705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 24715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "\u4E2D\u56FD\u7535\u4FE1"); 24725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 24735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 24755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "\u4E2D\u56FD\u7535\u4FE1"); 24765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 24775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 24784cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 24794cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 24805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 248101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 248201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 248331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov public void testLookupByOrganization() { 248431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long rawContactId = createRawContact(); 248531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long contactId = queryContactId(rawContactId); 248631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov ContentValues values = new ContentValues(); 248731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 248831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 248931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 249031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "president"); 249131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 249231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 249331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 249431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 249531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 249631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 249731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.DEPARTMENT, "software"); 249831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 249931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 250031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 250131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 250231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 250331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 250431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "incredibles"); 250531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 250631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 250731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 250831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 250931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 251031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 251131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "director"); 251231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 251331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 251431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 251531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "director"); 251631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 251731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 251831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "monsters"); 251931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "scarer"); 252031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 252131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 252231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "monsters"); 252331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "scarer"); 252431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 252531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 252631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov private void assertContactFilter(long contactId, String filter) { 252731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(filter)); 252831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertStoredValue(filterUri, Contacts._ID, contactId); 252931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 253031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 2531a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private void assertContactFilterNoResult(String filter) { 2532a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, filter); 2533a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 2534a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 2535a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2536916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetOrganization() throws Exception { 2537916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 2538916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2539916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2540916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Some random data element 2541916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "inc@corp.com"); 2542916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2543916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2544916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2545916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 25469c6ef008d92017108e3d10dcd8e2146eded9e148Dmitri Plotnikov values.put(Organization.TITLE, "engineer"); 2547916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 2548916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2549916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another matching organization 2550916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmeinc"); 2551916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 2552916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2553916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another non-matching organization 2554916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "corpacme"); 2555916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 2556916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2557916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // And another data element 2558916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "emca@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 2559916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2560916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("acme")); 2561916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2562916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2563916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 25643716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "engineer, [acmecorp]"); 2565916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2566916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2567916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2568916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetEmail() throws Exception { 2569916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContact(); 2570916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2571916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2572916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 25733716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "John", "Doe"); 2574916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertEmail(rawContactId, "acme@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 2575916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2576916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("acme")); 2577916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2578916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2579916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 25803716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[acme@corp.com]"); 2581916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2582916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2583916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 25843716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetPhone() throws Exception { 25853716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 25863716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 25873716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues values = new ContentValues(); 25883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 25893716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 25903716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "(860) 555-1234"); 25913716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 25923716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.clear(); 25933716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(Contacts._ID, contactId); 25943716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[(860) 555-1234]"); 25953716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 25963716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 25973716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("86 (0) 5-55-12-34")), values); 25983716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 25993716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555-1234")), values); 26003716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 26013716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860")), values); 26023716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 26033716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("8605551234")), values); 26043716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 26053716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860555")), values); 26063716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 26073716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555")), values); 26083716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 26093716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860-555")), values); 26103716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 26113716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 2612916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetNickname() throws Exception { 2613916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 2614916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2615916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2616916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2617916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertNickname(rawContactId, "Incredible"); 2618916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2619916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("inc")); 2620916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2621916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2622916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 262330cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov values.put(SearchSnippetColumns.SNIPPET, "[Incredible]"); 2624916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2625916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2626916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 26273716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNameInDisplayName() throws Exception { 26283716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 26293716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 26303716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 26313716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 26323716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26333716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 26343716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 26353716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 26363716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 26373716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26383716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("cave")), 26393716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet); 26403716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("john")), 26413716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet); 26423716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 26433716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26443716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNicknameInDisplayName() throws Exception { 26453716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 26463716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 26473716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNickname(rawContactId, "Caveman"); 26483716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 26493716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26503716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 26513716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 26523716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 26533716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 26543716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26553716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("cave")), 26563716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet); 26573716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 26583716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26593716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForCompanyInDisplayName() throws Exception { 26603716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 26613716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 26623716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues company = new ContentValues(); 26633716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.clear(); 26643716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.COMPANY, "Aperture Science"); 26653716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.TITLE, "President"); 26663716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertOrganization(rawContactId, company); 26673716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "aperturepresident@aperturescience.com", true); 26683716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 26703716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 26713716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 26723716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 26733716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26743716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 26753716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("aperture")), emptySnippet); 26763716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 26773716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26783716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForPhoneInDisplayName() throws Exception { 26793716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 26803716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 26813716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "860-555-1234"); 26823716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "860@aperturescience.com", true); 26833716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26843716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 26853716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 26863716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 26873716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 26883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26893716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("860")), 26903716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet); 26913716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 26923716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26933716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForEmailInDisplayName() throws Exception { 26943716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 26953716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 26963716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 26973716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNote(rawContactId, "Cave Johnson is president of Aperture Science"); 26983716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 26993716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 27003716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 27013716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 27023716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 27033716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 27043716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode("cave")), 27053716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet); 27063716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 27073716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 2708dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov public void testDisplayNameUpdateFromStructuredNameUpdate() { 2709dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long rawContactId = createRawContact(); 2710dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, "Slinky", "Dog"); 2711dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2712dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2713dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2714dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 2715dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky Dog"); 2716dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2717dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov ContentValues values = new ContentValues(); 2718dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 2719dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2720dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 2721dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky"); 2722dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2723dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 2724dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2725dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 2726dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 2727dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2728dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dog"); 2729dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 2730dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2731dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Dog"); 2732dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov } 2733dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 2734d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov public void testInsertDataWithContentProviderOperations() throws Exception { 2735d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 2736d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValues(new ContentValues()) 2737d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 2738d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 2739d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 2740d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 2741d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 2742d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 2743d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 2744d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderResult[] results = 2745d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(cpo1, cpo2)); 2746d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov long contactId = queryContactId(ContentUris.parseId(results[0].uri)); 2747d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 2748d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "John Doe"); 2749d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov } 2750d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov 2751d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailDefault() { 2752c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 2753d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2754d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2755d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 2756d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 2757d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 2758d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(0, sendToVoicemail); 2759d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 2760d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 2761d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2762d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtone() { 2763c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 2764d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2765d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2766d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId, true, "foo"); 2767d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, true, "foo"); 276881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 27698c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 27708c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov updateSendToVoicemailAndRingtoneWithSelection(contactId, false, "bar"); 27718c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, false, "bar"); 27728c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertNetworkNotified(false); 2773d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 2774d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2775d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailAndRingtoneAfterAggregation() { 27763cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("a", "b"); 2777d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 2778d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 2779d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 27803cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("c", "d"); 2781d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 2782d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, true, "bar"); 2783d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2784d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 27850c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 27860c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 2787d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2788d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov // Both contacts had "send to VM", the contact now has the same value 2789d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId1, true, "foo,bar"); // Either foo or bar 2790d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 2791d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2792d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testDoNotSendToVoicemailAfterAggregation() { 27933cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("e", "f"); 2794d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 2795d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, null); 2796d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 27973cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("g", "h"); 2798d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 2799d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, null); 2800d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2801d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 28020c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 28030c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 2804d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2805d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Since one of the contacts had "don't send to VM" that setting wins for the aggregate 28060c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), false, null); 2807d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 2808d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2809d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtonePreservedAfterJoinAndSplit() { 28103cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("i", "j"); 2811d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 2812d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 2813d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 28143cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("k", "l"); 2815d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 2816d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, "bar"); 2817d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2818d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 28190c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 28200c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 2821d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2822d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Split them 28230c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 28240c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 2825d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 28263cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), true, "foo"); 2827d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId2), false, "bar"); 2828d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 2829d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 283082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateInsert() { 28314dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov long rawContactId = createRawContact(); 28320a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 28330a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 28340a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28350a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 28360a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 28370a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 28380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.putNull(StatusUpdates.CUSTOM_PROTOCOL); 28390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 28400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PRESENCE, StatusUpdates.INVISIBLE); 28410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 28420a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 100); 28430a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "a.b.c"); 28440a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 1234); 28450a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 2345); 28460a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28470a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 28480a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28490a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 28500a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28510a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long contactId = queryContactId(rawContactId); 28520a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 28530a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28540a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 28550a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 28560a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Hiding"); 28570a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 28580a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "a.b.c"); 28590a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 1234); 28600a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 2345); 28610a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28620a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 28630a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28640a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 28650a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 28660a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Cloaked"); 28670a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 200); 28680a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "d.e.f"); 28690a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 4321); 28700a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 5432); 28710a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov mResolver.insert(StatusUpdates.CONTENT_URI, values); 28720a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28730a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 28740a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 28750a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Cloaked"); 28760a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 200); 28770a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "d.e.f"); 28780a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 4321); 28790a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 5432); 28800a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 28810a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 28820a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28830a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateInferAttribution() { 28840a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 28850a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 28860a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 28870a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28880a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 28890a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 28900a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 28910a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 28920a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 28930a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28940a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 28950a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 28960a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 28970a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 28980a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, com.android.internal.R.string.imProtocolAim); 28990a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 29000a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 29010a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 29020a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 29030a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 29040a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateMatchingImOrEmail() { 29050a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 29064dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 29074dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im"); 290882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertEmail(rawContactId, "m@acme.com"); 29094dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 29104dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (standard) 2911aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 2912aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 29134dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 29144dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (custom) 2915aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im", StatusUpdates.IDLE, "Idle", 2916d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 29174dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 29184dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on Email 2919aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "m@acme.com", StatusUpdates.AWAY, "Away", 2920aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 29214dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 29224dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // No match 2923aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_ICQ, null, "12345", StatusUpdates.DO_NOT_DISTURB, "Go away", 2924aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 29254dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 292682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Cursor c = mResolver.query(StatusUpdates.CONTENT_URI, new String[] { 292782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID, StatusUpdates.PROTOCOL, StatusUpdates.CUSTOM_PROTOCOL, 29280a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.PRESENCE, StatusUpdates.STATUS}, 292982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null, StatusUpdates.DATA_ID); 29304dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 293182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_AIM, null, StatusUpdates.AVAILABLE, "Available"); 29324dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 293382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_CUSTOM, "my_im_proto", StatusUpdates.IDLE, "Idle"); 29344dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 293582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_GOOGLE_TALK, null, StatusUpdates.AWAY, "Away"); 29364dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertFalse(c.moveToNext()); 29374dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov c.close(); 2938bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 2939bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 2940bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 2941bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 2942bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 294382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 29440a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 2945bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 2946bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov } 2947bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 294882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateUpdateAndDelete() { 2949bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long rawContactId = createRawContact(); 2950bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 2951bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 2952bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 2953bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 2954bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 2955bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 295682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 295782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_STATUS); 2958bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 2959bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 2960aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AWAY, "BUSY", 2961aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 2962aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.DO_NOT_DISTURB, "GO AWAY", 2963aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 296482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri statusUri = 2965aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 2966aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 296782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 2968bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 296982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 297082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 2971bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 2972bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 29739705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for 29749705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status 29759705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status_ts 29769705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence 29779705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori long updatedTs = 200; 29789705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String testUpdate = "test_update"; 29799705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String selection = StatusUpdates.DATA_ID + "=" + statusId; 29809705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 29819705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 29829705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 29839705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 29849705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 29859705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 29869705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 29879705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 29889705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in status_updates table ONLY 29899705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in presence table are to be updated. 29909705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori updatedTs = 300; 29919705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori testUpdate = "test_update_new"; 29929705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 29939705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 29949705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 29959705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 29969705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 29979705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 29989705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the presence column value is still the old value 29999705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 30009705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 30019705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 30029705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in presence table ONLY 30039705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in status_updates table are to be updated. 30049705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 30059705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 30069705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test_new"); 30079705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 30089705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 30099705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the status_updates table is not updated 30109705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 30119705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 30129705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 30139705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 30149705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // effect "delete status_updates" operation and expect the following 30159705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // data deleted from status_updates table 30169705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence set to null 301782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov mResolver.delete(StatusUpdates.CONTENT_URI, StatusUpdates.DATA_ID + "=" + statusId, null); 30189705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 301982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3020a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3021a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 3022a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3023093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov public void testStatusUpdateUpdateToNull() { 3024093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long rawContactId = createRawContact(); 3025093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3026093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3027093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long contactId = queryContactId(rawContactId); 3028093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3029093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3030093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov ContentValues values = new ContentValues(); 3031093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri statusUri = 3032093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3033093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 3034093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 3035093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3036093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 3037093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3038093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3039093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3040093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3041093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(StatusUpdates.PRESENCE); 3042093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov mResolver.update(StatusUpdates.CONTENT_URI, values, 3043093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.DATA_ID + "=" + statusId, null); 3044093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3045093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3046093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3047093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3048093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3049093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov } 3050093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 305182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateWithTimestamp() { 3052a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long rawContactId = createRawContact(); 3053a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3054a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 3055a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3056a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3057a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3058aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Offline", 80, 3059aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3060aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Available", 100, 3061aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3062aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", 0, "Busy", 90, 3063aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3064a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3065a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov // Should return the latest status 3066a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContentValues values = new ContentValues(); 306782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 306882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3069bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 30704dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 30714dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 307282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov private void assertStatusUpdate(Cursor c, int protocol, String customProtocol, int presence, 307382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String status) { 30744dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov ContentValues values = new ContentValues(); 307582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 307682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.CUSTOM_PROTOCOL, customProtocol); 3077a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(StatusUpdates.PRESENCE, presence); 307882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS, status); 30794dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertCursorValues(c, values); 30804dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 30814dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 30823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item query test cases. 30833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 30843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByRawContactId() { 30853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 30863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 30873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, mAccount); 30883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 30893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 30903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 30913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 30923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 30933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 30943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 30953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByContactId() { 30963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 30973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 30983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 30993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 31003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 31013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 31023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 31033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 31043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 31053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKey() { 31083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 31093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 31103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 31113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 31123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 31133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 31143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 31153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 31163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 31173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 31183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKeyAndContactId() { 31213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 31223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 31233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 31243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 31253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 31263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 31273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 31283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 31293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 31303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann contactId), 31313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 31323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 31333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItems() { 31363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 31373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 31383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 31393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, values); 31403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsWithSelection() { 31433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 31443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 31453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 31463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 31483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 31493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 31503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 31523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 31533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}, firstValues); 31543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 31563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 31573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Goodbye world"}, secondValues); 31583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemById() { 31613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 31623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 31633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 31643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 31653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 31673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 31683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 31693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 31703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 31723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 31733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstValues); 31743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 31763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 31773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues); 31783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion + query test cases. 31813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoWithSelection() { 31833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 31843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 31853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 31863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 31873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 31893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo1Values, null); 31906802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 31913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(2); 31923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo2Values, null); 31933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first photo. 31953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_PHOTO_URI, StreamItemPhotos.SORT_INDEX + "=?", 31963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"1"}, photo1Values); 31973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemId() { 32003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 32013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 32033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 32043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 32053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 32063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 32083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 32093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 32103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 32113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 32133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 32143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 32156802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 32163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 32183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 32196802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 32206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 32213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 32226802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 32233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the photos from the second stream item. 32253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 32263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 32273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), photo2Values); 32283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 32293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemPhotoId() { 32313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 32323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 32343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 32353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 32363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 32373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 32393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 32403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 32413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 32423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 32443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 32453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 32463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstPhotoId = ContentUris.parseId(resultUri); 32476802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 32483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 32503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 32516802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 32526802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.galaxy, PhotoSize.ORIGINAL)); 32533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 32543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondPhotoId = ContentUris.parseId(resultUri); 32556802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 32563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the first photo. 32583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 32593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 32603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 32613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 32623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstPhotoId), 32633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo1Values); 32643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the second photo. 32663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 32673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 32683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 32693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 32703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondPhotoId), 32713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo2Values); 32723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 32733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item insertion test cases. 32753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemIntoOtherAccount() { 32773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 32783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 32793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 32803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, mAccountTwo); 32813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Stream insertion was allowed in another account's raw contact."); 32823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 32833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Trying to insert stream items into account one's raw contact is forbidden. 32843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 32853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 32863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemInProfileRequiresWriteProfileAccess() { 32883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long profileRawContactId = createBasicProfileContact(new ContentValues()); 32893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // With our (default) write profile permission, we should be able to insert a stream item. 32913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 32923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 32933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now take away write profile permission. 32953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mActor.removePermissions("android.permission.WRITE_PROFILE"); 32963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 32973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Try inserting another stream item. 32983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 32993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 33003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should require WRITE_PROFILE access to insert a stream item in the profile."); 33013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 33023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Trying to insert a stream item in the profile without WRITE_PROFILE permission 33033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // should fail. 33043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemWithContentValues() { 33083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 33093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 33103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 33113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.insert(StreamItems.CONTENT_URI, values); 33123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 33133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 33143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 33153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOverLimit() { 33183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 33193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 33203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 33213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann List<Long> streamItemIds = Lists.newArrayList(); 33233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX + 1 stream items. 33253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 33263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 6; i++) { 33273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 33283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 33293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.add(ContentUris.parseId(resultUri)); 33303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Long doomedStreamItemId = streamItemIds.get(0); 33323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // There should only be MAX items. The oldest one should have been cleaned up. 33343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query( 33353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 33363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 33373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 33383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItems._ID}, null, null, null); 33393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 33403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann while(c.moveToNext()) { 33413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = c.getLong(0); 33423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.remove(streamItemId); 33433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 33453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 33463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, streamItemIds.size()); 33493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(doomedStreamItemId, streamItemIds.get(0)); 33503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOlderThanOldestInLimit() { 33533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 33543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 33553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 33563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX stream items. 33583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 33593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 33603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 33613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 33623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertNotSame("Expected non-0 stream item ID to be inserted", 33633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 0L, ContentUris.parseId(resultUri)); 33643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now try to insert a stream item that's older. It should be deleted immediately 33673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // and return an ID of 0. 33683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime - 1); 33693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 33703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(0L, ContentUris.parseId(resultUri)); 33713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion test cases. 33743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemsAndPhotosInBatch() throws Exception { 33763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 33773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemValues = buildGenericStreamItemValues(); 33783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemPhotoValues = buildGenericStreamItemPhotoValues(0); 33793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ArrayList<ContentProviderOperation> ops = Lists.newArrayList(); 33813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert( 33823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 33833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 33843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY)) 33853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemValues).build()); 33863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 33873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoValues.put(StreamItemPhotos.SORT_INDEX, i); 33883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert(StreamItems.CONTENT_PHOTO_URI) 33893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemPhotoValues) 33903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValueBackReference(StreamItemPhotos.STREAM_ITEM_ID, 0) 33913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .build()); 33923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.applyBatch(ContactsContract.AUTHORITY, ops); 33943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that all five photos were inserted under the raw contact. 33963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_URI, new String[]{StreamItems._ID}, 33973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)}, 33983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 33993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = 0; 34003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 34013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, c.getCount()); 34023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.moveToFirst(); 34033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemId = c.getLong(0); 34043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 34053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 34063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c = mResolver.query(Uri.withAppendedPath( 34093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 34106802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 34116802030a777c0c3ba1dc029c534cca4784260632Dave Santoro new String[]{StreamItemPhotos._ID, StreamItemPhotos.PHOTO_URI}, 34123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null, null); 34133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 34143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(5, c.getCount()); 34156802030a777c0c3ba1dc029c534cca4784260632Dave Santoro byte[] expectedPhotoBytes = loadPhotoFromResource( 34166802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO); 34176802030a777c0c3ba1dc029c534cca4784260632Dave Santoro while (c.moveToNext()) { 34186802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String photoUri = c.getString(1); 34196802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(expectedPhotoBytes, 34206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 34216802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 34223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 34233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 34243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item update test cases. 34283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemById() { 34303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 34333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 34343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 34353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), values, 34363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 34373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 34383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 34393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 34403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemWithContentValues() { 34433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 34463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 34473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems._ID, streamItemId); 34483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 34493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(StreamItems.CONTENT_URI, values, null, null); 34503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 34513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 34523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 34533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemFromOtherAccount() { 34563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 34573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, mAccount); 34593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 34603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems._ID, streamItemId); 34613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 34623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 34633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(maybeAddAccountQueryParameters(StreamItems.CONTENT_URI, mAccountTwo), 34643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values, null, null); 34653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to update stream items inserted by another account"); 34663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 34673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't update the stream items from another account. 34683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo update test cases. 34723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34736802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoById() throws IOException { 34743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 34773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 34783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 34793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 34803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 34813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34826802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 34836802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 34843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 34853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 34863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 34873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 34883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 34893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId); 34903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 34916802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 34923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 34936802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 34946802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 34956802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 34966802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 34976802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 34983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35006802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoWithContentValues() throws IOException { 35013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 35043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 35053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 35063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 35073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 35083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photoValues.put(StreamItemPhotos._ID, streamItemPhotoId); 35106802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 35116802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 35123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 35133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 35153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 35163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 35176802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 35183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 35196802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 35206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 35216802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 35226802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 35236802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 35243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemPhotoFromOtherAccount() { 35273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 35283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, mAccount); 35303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 35313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 35323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, mAccount); 35333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 35343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photoValues.put(StreamItemPhotos._ID, streamItemPhotoId); 35366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 35376802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.galaxy, PhotoSize.ORIGINAL)); 35383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 35393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann maybeAddAccountQueryParameters( 35403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 35423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 35433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mAccountTwo); 35443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 35453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 35463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to update stream item photos inserted by another account"); 35473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 35483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't update a stream item photo inserted by another account. 35493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item deletion test cases. 35533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemById() { 35553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 35573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 35583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 35593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 35613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 35623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 35633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item. 35653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 35663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 35673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 35693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 35703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 35713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 35723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemWithSelection() { 35753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 35773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 35783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 35803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 35813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 35823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item with a custom selection. 35843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 35853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}); 35863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 35883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 35893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 35903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 35913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemFromOtherAccount() { 35943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 35953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 35963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), mAccount)); 35973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 35983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete( 35993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann maybeAddAccountQueryParameters( 36003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 36013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mAccountTwo), null, null); 36023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to delete stream item inserted by another account"); 36033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 36043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't delete a stream item from another account. 36053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo deletion test cases. 36093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoById() { 36113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 36133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 36143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId( 36153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 36163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete( 36173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 36183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 36193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 36203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 36213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId), null, null); 36223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_PHOTO_URI, 36243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItemPhotos._ID}, 36253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.STREAM_ITEM_ID + "=?", new String[]{String.valueOf(streamItemId)}, 36263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 36273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 36283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals("Expected photo to be deleted.", 0, c.getCount()); 36293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 36303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 36313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoWithSelection() { 36353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 36373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 36383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstPhotoValues = buildGenericStreamItemPhotoValues(0); 36393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondPhotoValues = buildGenericStreamItemPhotoValues(1); 36403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, firstPhotoValues, null); 36416802030a777c0c3ba1dc029c534cca4784260632Dave Santoro firstPhotoValues.remove(StreamItemPhotos.PHOTO); // Removed while processing. 36423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, secondPhotoValues, null); 36433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = Uri.withAppendedPath( 36443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 36453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 36463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(photoUri, StreamItemPhotos.SORT_INDEX + "=1", null); 36473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, firstPhotoValues); 36493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoFromOtherAccount() { 36523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 36533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 36543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), mAccount)); 36553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), mAccount); 36563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 36573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(maybeAddAccountQueryParameters( 36583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 36593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 36603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 36613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mAccountTwo), null, null); 36623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to delete stream item photo inserted by another account"); 36633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 36643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't delete a stream item photo from another account. 36653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemLimit() { 36693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 36703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.MAX_ITEMS, 5); 36713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_LIMIT_URI, values); 36723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36746802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Tests for inserting or updating stream items as a side-effect of making status updates 36756802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // (forward-compatibility of status updates into the new social stream API). 36766802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 36776802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemInsertedOnStatusUpdate() { 36786802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 36796802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 36806802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 36816802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 36826802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 36836802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 36846802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 36856802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE); 36866802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 36876802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 36886802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 36896802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.TEXT, "hacking"); 36906802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 36916802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 36926802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 36936802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 36946802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 36956802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 36966802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemUpdatedOnSecondStatusUpdate() { 36976802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 36986802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 36996802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 37006802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 37016802030a777c0c3ba1dc029c534cca4784260632Dave Santoro int chatMode = StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 37026802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE; 37036802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 37046802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, chatMode); 37056802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 37066802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Insert a new status update for the raw contact. 37076802030a777c0c3ba1dc029c534cca4784260632Dave Santoro insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 37086802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.INVISIBLE, "finished hacking", chatMode); 37096802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 37106802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 37116802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 37126802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.TEXT, "finished hacking"); 37136802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 37146802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 37156802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 37166802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 37176802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 37186802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 37193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemValues() { 37203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 37213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Hello world"); 37223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, System.currentTimeMillis()); 37233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.COMMENTS, "Reshared by 123 others"); 37243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 37253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemPhotoValues(int sortIndex) { 37283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 37293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItemPhotos.SORT_INDEX, sortIndex); 37306802030a777c0c3ba1dc029c534cca4784260632Dave Santoro values.put(StreamItemPhotos.PHOTO, 37316802030a777c0c3ba1dc029c534cca4784260632Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.ORIGINAL)); 37323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 37333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 373582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testSingleStatusUpdateRowPerContact() { 3736bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 3737bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar String handle1 = "test@gmail.com"; 3738bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 3739d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 37404dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId1, protocol1, null, handle1); 3741bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 3742aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 3743aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3744aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AWAY, "Yellow", 3745aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3746aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.INVISIBLE, "Red", 3747aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3748bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 3749af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov Cursor c = queryContact(queryContactId(rawContactId1), 375082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov new String[] {Contacts.CONTACT_PRESENCE, Contacts.CONTACT_STATUS}); 37514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 3752bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 3753bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar c.moveToFirst(); 375482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(StatusUpdates.INVISIBLE, c.getInt(0)); 375582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals("Red", c.getString(1)); 37560265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov c.close(); 3757bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 3758bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 3759d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void updateSendToVoicemailAndRingtone(long contactId, boolean sendToVoicemail, 3760d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String ringtone) { 3761d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 3762d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 3763d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (ringtone != null) { 3764d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 3765d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3766d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3767d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3768d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov int count = mResolver.update(uri, values, null, null); 3769d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(1, count); 37708c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 37718c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 37728c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov private void updateSendToVoicemailAndRingtoneWithSelection(long contactId, 37738c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov boolean sendToVoicemail, String ringtone) { 37748c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov ContentValues values = new ContentValues(); 37758c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 37768c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov if (ringtone != null) { 37778c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 37788c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 37798c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 37808c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov int count = mResolver.update(Contacts.CONTENT_URI, values, Contacts._ID + "=" + contactId, 37818c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov null); 37828c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertEquals(1, count); 3783d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3784d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3785d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void assertSendToVoicemailAndRingtone(long contactId, boolean expectedSendToVoicemail, 3786d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String expectedRingtone) { 3787d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 3788d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 3789d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 3790d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(expectedSendToVoicemail ? 1 : 0, sendToVoicemail); 3791d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String ringtone = c.getString(c.getColumnIndex(Contacts.CUSTOM_RINGTONE)); 3792d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (expectedRingtone == null) { 3793d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertNull(ringtone); 3794d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } else { 3795d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(ArrayUtils.contains(expectedRingtone.split(","), ringtone)); 3796d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3797d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 3798d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 37999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 38000be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov public void testContactVisibilityUpdateOnMembershipChange() { 38010be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long rawContactId = createRawContact(mAccount); 38020be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 38030be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38040be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long visibleGroupId = createGroup(mAccount, "123", "Visible", 1); 38050be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long invisibleGroupId = createGroup(mAccount, "567", "Invisible", 0); 38060be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38070be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership1 = insertGroupMembership(rawContactId, visibleGroupId); 38080be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 38090be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38100be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership2 = insertGroupMembership(rawContactId, invisibleGroupId); 38110be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 38120be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38130be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.delete(membership1, null, null); 38140be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 38150be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38160be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov ContentValues values = new ContentValues(); 38170be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov values.put(GroupMembership.GROUP_ROW_ID, visibleGroupId); 38180be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38190be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.update(membership2, values, null, null); 38200be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 38210be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 38220be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38230be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov private void assertVisibility(long rawContactId, String expectedValue) { 38240be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, Contacts._ID + "=" + queryContactId(rawContactId), 38250be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov null, Contacts.IN_VISIBLE_GROUP, expectedValue); 38260be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 38270be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 38280db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov public void testSupplyingBothValuesAndParameters() throws Exception { 38290db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Account account = new Account("account 1", "type%/:1"); 38300db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Uri uri = ContactsContract.Groups.CONTENT_URI.buildUpon() 38310db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME, account.name) 38320db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE, account.type) 38330db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") 38340db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .build(); 38350db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 38360db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(uri); 38370db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type); 38380db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 38390db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some id"); 38400db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some name"); 38410db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 38420db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 38430db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 38440db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 38450db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder = ContentProviderOperation.newInsert(uri); 38460db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type + "diff"); 38470db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 38480db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some other id"); 38490db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some other name"); 38500db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 38510db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 38520db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov try { 38530db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 38540db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov fail("Expected IllegalArgumentException"); 38550db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } catch (IllegalArgumentException ex) { 38560db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov // Expected 38570db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 38580db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 38590db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 3860a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContentEntityIterator() { 38619261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana // create multiple contacts and check that the selected ones are returned 38629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id; 38639261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 38649261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 38659261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId2 = createGroup(mAccount, "gsid2", "title2"); 38669261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 38673cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0"); 38683cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertGroupMembership(id, "gsid1"); 38693cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertEmail(id, "c0@email.com"); 38703cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertPhoneNumber(id, "5551212c0"); 38719261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 3872226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c1 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c1"); 38739261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_0 = insertGroupMembership(id, "gsid1"); 38749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_1 = insertGroupMembership(id, "gsid2"); 38759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_2 = insertEmail(id, "c1@email.com"); 38769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_3 = insertPhoneNumber(id, "5551212c1"); 38779261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 3878226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c2 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c2"); 38799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_0 = insertGroupMembership(id, "gsid1"); 38809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_1 = insertEmail(id, "c2@email.com"); 38819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_2 = insertPhoneNumber(id, "5551212c2"); 38829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 38833cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long c3 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c3"); 38849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_0 = insertGroupMembership(id, groupId2); 38859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_1 = insertEmail(id, "c3@email.com"); 38869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_2 = insertPhoneNumber(id, "5551212c3"); 38879261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 388862318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana EntityIterator iterator = RawContacts.newEntityIterator(mResolver.query( 388962318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana maybeAddAccountQueryParameters(RawContactsEntity.CONTENT_URI, mAccount), null, 389062318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana RawContacts.SOURCE_ID + " in ('c1', 'c2', 'c3')", null, null)); 38919261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Entity entity; 38929261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues[] subValues; 38939261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 38946cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c1, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 38959261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 38969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(4, subValues.length); 38979261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 38989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_0, 38999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 39009261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 39019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], GroupMembership.CONTENT_ITEM_TYPE, 39029261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_1, 39039261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 39049261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 39059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Email.CONTENT_ITEM_TYPE, 39069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_2, 39079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c1@email.com"); 39089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[3], Phone.CONTENT_ITEM_TYPE, 39099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_3, 39109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c1"); 39119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 39129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 39136cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c2, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 39149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 39159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 39169261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 39179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_0, 39189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 39199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 39209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 39219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_1, 39229261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c2@email.com"); 39239261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 39249261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_2, 39259261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c2"); 39269261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 39279261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 39286cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c3, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 39299261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 39309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 39319261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 39329261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_0, 39339261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 39349261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 39359261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 39369261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_1, 39379261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c3@email.com"); 39389261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 39399261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_2, 39409261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c3"); 39419261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 39429261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(iterator.hasNext()); 39433cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov iterator.close(); 39449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 394520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 394620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov public void testDataCreateUpdateDeleteByMimeType() throws Exception { 3947d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 394820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 394920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov ContentValues values = new ContentValues(); 39505ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 395120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 395220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 395320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 395420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 395520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "old1"); 395620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "old2"); 395720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "old3"); 395820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "old4"); 395920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "old5"); 396020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "old6"); 396120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "old7"); 396220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "old8"); 396320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "old9"); 396420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "old10"); 396520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "old11"); 396620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "old12"); 396720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "old13"); 396820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "old14"); 396920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "old15"); 397020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Uri uri = mResolver.insert(Data.CONTENT_URI, values); 397120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 397281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 397320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 397420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.clear(); 397520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "newpackage"); 397620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 0); 397720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 0); 397820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "new1"); 397920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "new2"); 398020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "new3"); 398120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "new4"); 398220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "new5"); 398320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "new6"); 398420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "new7"); 398520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "new8"); 398620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "new9"); 398720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "new10"); 398820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "new11"); 398920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "new12"); 399020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "new13"); 399120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "new14"); 399220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "new15"); 39935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mResolver.update(Data.CONTENT_URI, values, Data.RAW_CONTACT_ID + "=" + rawContactId + 399420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov " AND " + Data.MIMETYPE + "='testmimetype'", null); 399581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 399670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 399720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 399820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 39995ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov int count = mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 400020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null); 400120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals(1, count); 40025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertEquals(0, getCount(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 400333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null)); 400481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 400533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 400620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 400789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactQuery() { 400889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 400989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 401089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 401189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 401289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 401389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account1); 401489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account2); 401589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 401689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 401789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, RawContacts._ID, rawContactId1) ; 401889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, RawContacts._ID, rawContactId2) ; 401989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 402089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri1 = ContentUris.withAppendedId(uri1, rawContactId1); 402189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri2 = ContentUris.withAppendedId(uri2, rawContactId2); 402289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri1, RawContacts._ID, rawContactId1) ; 402389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri2, RawContacts._ID, rawContactId2) ; 402489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 402589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 4026373f7d2adc36680c31ff33e9ee12be865af6b5fbDmitri Plotnikov public void testRawContactDeletion() { 4027e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId = createRawContact(mAccount); 40285ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 402933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 40304dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 403182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4032aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4033aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4034a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId); 4035a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 403633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 403733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 403882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 40394dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 404033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 404133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(uri, null, null); 404233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 40435870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 404481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 404533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 4046e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 404733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 404833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 404933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 405033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 405182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 40524dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 4053a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 405481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 4055a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov } 4056a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4057a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov public void testRawContactDeletionKeepingAggregateContact() { 4058e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId1 = createRawContactWithName(mAccount); 4059e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId2 = createRawContactWithName(mAccount); 406047fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 406147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 4062a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4063a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 4064a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4065a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 4066e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 4067a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 4068a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 4069a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(1, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 407020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 40711fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 4072e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong public void testRawContactDeletionWithAccounts() { 4073e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong long rawContactId = createRawContact(mAccount); 4074e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 4075e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4076e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 407782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4078aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4079aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4080e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 4081e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong null, null)); 408282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 4083e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong + rawContactId, null)); 4084e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4085e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Do not delete if we are deleting with wrong account. 4086e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithWrongAccountUri = 4087e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4088e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountTwo.name) 4089e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccountTwo.type) 4090e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 4091e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong mResolver.delete(deleteWithWrongAccountUri, null, null); 4092e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 40935870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "0"); 4094e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4095e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Delete if we are deleting with correct account. 4096e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithCorrectAccountUri = 4097e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4098e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name) 4099e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type) 4100e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 4101e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong mResolver.delete(deleteWithCorrectAccountUri, null, null); 4102e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 41035870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 4104e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong } 4105e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4106627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov public void testAccountsUpdated() { 410770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // This is to ensure we do not delete contacts with null, null (account name, type) 410870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // accidentally. 410970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId3 = createRawContactWithName("James", "Sullivan"); 411070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertPhoneNumber(rawContactId3, "5234567890"); 4111627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov Uri rawContact3 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId3); 4112743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 411370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 411470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4115bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount, mAccountTwo}); 4116743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount, mAccountTwo}); 4117743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 4118dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_NAME, null); 4119dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_TYPE, null); 412070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 4121743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 4122743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId1, "account1@email.com"); 4123743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId2 = createRawContact(mAccountTwo); 4124743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId2, "account2@email.com"); 4125743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertImHandle(rawContactId2, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 4126743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4127aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4128aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4129743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 4130bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount}); 4131743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount}); 4132627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov assertEquals(2, getCount(RawContacts.CONTENT_URI, null, null)); 413382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 413470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong + rawContactId2, null)); 413570d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong } 413670d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 413733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov public void testAccountDeletion() { 413833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Account readOnlyAccount = new Account("act", READ_ONLY_ACCOUNT_TYPE); 413933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4140bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount, mAccount}); 414133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount, mAccount}); 414233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 414333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", readOnlyAccount); 414433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri1 = insertPhoto(rawContactId1); 414533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId2 = createRawContactWithName("john", "doe", mAccount); 414633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri2 = insertPhoto(rawContactId2); 414733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov storeValue(photoUri2, Photo.IS_SUPER_PRIMARY, "1"); 414833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 414933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 415033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 415133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 415233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 415333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the writable account 415433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 415533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 415633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 415733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "john doe"); 415833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 415933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the one we marked as super-primary 416033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 416133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri2)); 416233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 4163bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount}); 416433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // Remove the writable account 416533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount}); 416633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 416733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the remaining account 416833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 416933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 417033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 417133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "John Doe"); 417233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 417333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the remaining one 417433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 417533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri1)); 417633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov } 417733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 4178cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov public void testContactDeletion() { 417947fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 418047fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_2); 4181cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4182cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long contactId = queryContactId(rawContactId1); 4183cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4184cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov mResolver.delete(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), null, null); 4185cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4186cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1), 4187cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 4188cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2), 4189cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 4190cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov } 4191cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 419273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 419373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov long rawContactId = createRawContact(mAccount); 419473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 419573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 419673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = insertStructuredName(rawContactId, "John", "Doe"); 419773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov clearDirty(rawContactUri); 4198e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri updateUri = setCallerIsSyncAdapter(uri, mAccount); 419973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 420073776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 420173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dough"); 420273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 42035870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, StructuredName.FAMILY_NAME, "Dough"); 420473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(rawContactUri, false); 420581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 42061fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 42071fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 420861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDirtyAndVersion() { 4209d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final long rawContactId = createRawContact(mAccount); 4210d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); 421173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 42121fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 42131fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 42141fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 42151fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.DIRTY, 0); 42161fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.SEND_TO_VOICEMAIL, 1); 421761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.AGGREGATION_MODE, 4218c100221f706afc08409e8317a27d6850b11c54d3Omari Stephens RawContacts.AGGREGATION_MODE_IMMEDIATE); 421961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.STARRED, 1); 42201fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(1, mResolver.update(uri, values, null, null)); 42211fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 42221fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 42231fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 422481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 42251fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 422661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "goo@woo.com"); 422761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 422881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 42291fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 42301fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 423161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 42321fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 423361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values = new ContentValues(); 423461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(Email.DATA, "goo@hoo.com"); 423561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.update(emailUri, values, null, null); 42361fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 423781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 42381fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 42391fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 424061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 42411fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 424261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(emailUri, null, null); 42431fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 424481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 42451fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 42461fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 424761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov } 42481fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 424961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactClearDirty() { 425061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 425161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 425261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 425361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov long version = getVersion(uri); 425461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov insertEmail(rawContactId, "goo@woo.com"); 42551fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 425661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 42571fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 42581fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 42591fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana clearDirty(uri); 42601fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 42611fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 42621fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 42631fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 426461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDeletionSetsDirty() { 426561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 42661fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 426761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 42681fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 426961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 427061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, false); 427161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov 427261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(uri, null, null); 42735870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 427461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 427581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 427661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 427761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertEquals(version, getVersion(uri)); 42781fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 42794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 42809fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutName() { 42819fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 42829fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 42839fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 42849fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri phoneUri = insertPhoneNumber(rawContactId, "555-123-45678", true); 42859fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 42869fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 42879fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 42889fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 42899fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 42909fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 42919fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 42929fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 42939fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 42949fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutAnyData() { 42959fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 42969fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 42979fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 42989fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 42999fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 43009fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 43019fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 43029fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 43039fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 43049fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 43059fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 430660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testDeleteContactWithEscapedUri() { 430760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 430860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 430960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 431060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 431160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 431260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 431360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 431460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 431560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, mResolver.delete(lookupUri, null, null)); 431660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 431760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 431860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testQueryContactWithEscapedUri() { 431960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 432060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 432160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 432260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 432360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 432460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 432560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 432660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 432760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Cursor c = mResolver.query(lookupUri, null, null, null, ""); 432860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, c.getCount()); 432960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 433060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 433160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 4332074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov public void testGetPhotoUri() { 4333074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov ContentValues values = new ContentValues(); 4334074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 4335074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 4336074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 4337f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 4338f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 4339f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId)}, Photo.PHOTO_FILE_ID); 4340f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId) 4341f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 4342074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 43433d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov assertStoredValue( 43443d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(rawContactId)), 4345f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI, photoUri); 4346074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov } 4347074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 4348ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert public void testInputStreamForPhoto() throws Exception { 4349e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov long rawContactId = createRawContact(); 4350f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4351f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4352f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId); 4353f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_URI)); 4354f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoThumbnailUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI)); 4355e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 4356f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadTestPhoto(PhotoSize.DISPLAY_PHOTO), 4357f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 4358f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadTestPhoto(PhotoSize.THUMBNAIL), 4359f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoThumbnailUri)); 4360ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 4361ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert 4362ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert private static void assertInputStreamContent(byte[] expected, InputStream is) 4363ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert throws IOException { 4364ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert try { 4365ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert byte[] observed = new byte[expected.length]; 4366ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert int count = is.read(observed); 4367ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert assertEquals(expected.length, count); 4368ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert assertEquals(-1, is.read()); 4369ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert MoreAsserts.assertEquals(expected, observed); 4370ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } finally { 4371ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert is.close(); 4372ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 4373e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov } 4374e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 4375732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov public void testSuperPrimaryPhoto() { 4376732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId1 = createRawContact(new Account("a", "a")); 4377f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri1 = insertPhoto(rawContactId1, R.drawable.earth_normal); 4378732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId1 = ContentUris.parseId(photoUri1); 4379732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4380732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId2 = createRawContact(new Account("b", "b")); 4381f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri2 = insertPhoto(rawContactId2, R.drawable.earth_normal); 4382732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId2 = ContentUris.parseId(photoUri2); 4383732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4384732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 4385732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 4386732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4387732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 4388732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 4389f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4390f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 4391f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(photoId1)}, Photo.PHOTO_FILE_ID); 4392f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId1) 4393f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 4394732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 4395f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValue(contactUri, Contacts.PHOTO_URI, photoUri); 4396732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4397732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 4398732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 4399732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4400732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov ContentValues values = new ContentValues(); 4401732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 4402732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri2, values, null, null); 4403732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4404732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 4405732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 4406732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 4407732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 4408732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId2); 4409732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4410732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri1, values, null, null); 4411732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 4412732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov } 4413732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 44148e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public void testUpdatePhoto() { 44158e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov ContentValues values = new ContentValues(); 44168e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 44178e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 44188e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 44198e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 44208e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri twigUri = Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 44218e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov queryContactId(rawContactId)), Contacts.Photo.CONTENT_DIRECTORY); 44228e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 44238e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 44248e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 44258e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 44268e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.putNull(Photo.PHOTO); 44278e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 44288e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long photoId = ContentUris.parseId(dataUri); 44298e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 4430155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov assertEquals(0, getCount(twigUri, null, null)); 44318e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 44328e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 44338e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Photo.PHOTO, loadTestPhoto()); 44348e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov mResolver.update(dataUri, values, null, null); 443581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 44368e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 4437f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long twigId = getStoredLongValue(twigUri, Data._ID); 44388e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov assertEquals(photoId, twigId); 44398e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov } 44408e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 44414e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactDataPhoto() { 44427d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a contact with a null photo 44437d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentValues values = new ContentValues(); 44447d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 44457d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh long rawContactId = ContentUris.parseId(rawContactUri); 44467d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 44477d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a photo 44487d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.RAW_CONTACT_ID, rawContactId); 44497d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 44507d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.putNull(Photo.PHOTO); 44517d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 44527d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // try to do an update before insert should return count == 0 44537d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri dataUri = Uri.withAppendedPath( 44547d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 44557d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh RawContacts.Data.CONTENT_DIRECTORY); 44567d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(0, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 44577d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 44587d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 44597d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh mResolver.insert(Data.CONTENT_URI, values); 44607d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 44617d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // save a photo to the db 44627d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.clear(); 44637d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 44647d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Photo.PHOTO, loadTestPhoto()); 44657d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(1, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 44667d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 44677d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 44687d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // verify the photo 44694e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Cursor storedPhoto = mResolver.query(dataUri, new String[] {Photo.PHOTO}, 44707d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Data.MIMETYPE + "=?", new String[] {Photo.CONTENT_ITEM_TYPE}, null); 44714e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov storedPhoto.moveToFirst(); 4472f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro MoreAsserts.assertEquals(loadTestPhoto(PhotoSize.THUMBNAIL), storedPhoto.getBlob(0)); 44730265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov storedPhoto.close(); 44747d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh } 44757d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 4476f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactId() throws IOException { 4477f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4478f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4479f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 4480f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_URI.buildUpon() 4481f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 4482f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 4483f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4484f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 4485f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 4486f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4487f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4488f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKey() throws IOException { 4489f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4490f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4491f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 4492f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 4493f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 4494f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 4495f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 4496f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4497f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 4498f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 4499f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4500f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4501f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKeyAndId() throws IOException { 4502f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4503f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4504f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 4505f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 4506f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 4507f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 4508f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 4509f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 4510f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4511f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 4512f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 4513f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4514f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4515f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForRawContactId() throws IOException { 4516f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4517f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 4518f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = RawContacts.CONTENT_URI.buildUpon() 4519f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 4520f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 4521f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4522f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 4523f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 4524f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4525f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4526f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoByPhotoUri() throws IOException { 4527f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4528f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4529f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 4530f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4531f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Get the photo URI out and check the content. 4532f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 4533f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4534f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 4535f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4536f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 4537f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 4538f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4539f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4540f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForDisplayPhoto() { 4541f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4542f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4543f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4544f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is larger than a thumbnail, so it will be stored as a file. 4545f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 4546f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoFileId = getStoredValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 4547f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 4548f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 4549f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4550f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 4551f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4552f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI differs from the thumbnail. 4553f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 4554f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4555f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 4556f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(photoUri.equals(thumbnailUri)); 4557f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4558f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form display_photo/ID 4559f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath(DisplayPhoto.CONTENT_URI, photoFileId).toString(), 4560f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 4561f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4562f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4563f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForThumbnailPhoto() throws IOException { 4564f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4565f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4566f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4567f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is a thumbnail, so it will only be stored in a BLOB. The photo URI 4568f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // will fall back to the thumbnail URI. 4569f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 4570f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 4571f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4572f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 4573f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4574f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI is equal to the thumbnail URI. 4575f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 4576f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4577f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 4578f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 4579f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4580f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form contacts/ID/photo 4581f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath( 4582f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4583f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.Photo.CONTENT_DIRECTORY).toString(), 4584f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 4585f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4586f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Loading the photo URI content should get the thumbnail. 4587f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4588f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 4589f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 4590f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4591f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4592f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testWriteNewPhotoToAssetFile() throws IOException { 4593f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4594f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4595f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4596f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 4597f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro byte[] originalPhoto = loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL); 4598f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4599f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 4600f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 4601f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 4602f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 4603f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro OutputStream os = mResolver.openOutputStream(writeablePhotoUri, "rw"); 4604f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro try { 4605f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro os.write(originalPhoto); 4606f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } finally { 4607f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro os.close(); 4608f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4609f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4610f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo and thumbnail have been set. 4611f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 4612f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 4613f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(photoUri)); 4614f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 4615f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4616f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 4617f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(thumbnailUri)); 4618f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(photoUri.equals(thumbnailUri)); 4619f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4620f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 4621f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4622f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 4623f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 4624f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4625f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 4626f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(thumbnailUri))); 4627f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4628f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4629f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testWriteUpdatedPhotoToAssetFile() throws IOException { 4630f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4631f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4632f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4633f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a large photo first. 4634f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_large); 4635f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String largeEarthPhotoUri = getStoredValue( 4636f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 4637f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4638f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 4639f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro byte[] originalPhoto = loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL); 4640f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4641f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 4642f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 4643f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 4644f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 4645f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro OutputStream os = mResolver.openOutputStream(writeablePhotoUri, "rw"); 4646f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro try { 4647f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro os.write(originalPhoto); 4648f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } finally { 4649f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro os.close(); 4650f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4651f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4652f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo URI has been modified. 4653f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthPhotoUri = getStoredValue( 4654f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 4655f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(hugeEarthPhotoUri.equals(largeEarthPhotoUri)); 4656f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4657f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 4658f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthThumbnailUri = getStoredValue( 4659f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 4660f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 4661f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4662f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 4663f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthPhotoUri))); 4664f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 4665f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 4666f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthThumbnailUri))); 4667f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4668f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4669f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4670f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoDimensionLimits() { 4671f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 4672f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.DISPLAY_MAX_DIM, 256); 4673f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.THUMBNAIL_MAX_DIM, 96); 4674f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValues(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI, values); 4675f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4676f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4677f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoStoreCleanup() throws IOException { 4678f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 4679f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4680f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 4681f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 4682f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4683f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a couple of contacts with photos. 4684f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId1 = createRawContactWithName(); 4685f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId1 = queryContactId(rawContactId1); 4686f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId1 = ContentUris.parseId(insertPhoto(rawContactId1, R.drawable.earth_normal)); 4687f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = 4688f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId1), 4689f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 4690f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4691f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId2 = createRawContactWithName(); 4692f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId2 = queryContactId(rawContactId2); 4693f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId2 = ContentUris.parseId(insertPhoto(rawContactId2, R.drawable.earth_normal)); 4694f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId2 = 4695f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 4696f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 4697f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4698f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Update the second raw contact with a different photo. 4699f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 4700f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId2); 4701f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 4702f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL)); 4703f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(1, mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 4704f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId2)})); 4705f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long replacementPhotoFileId = 4706f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 4707f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 4708f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4709f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a third raw contact that has a bogus photo file ID. 4710f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusFileId = 1234567; 4711f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId3 = createRawContactWithName(); 4712f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId3 = queryContactId(rawContactId3); 4713f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.clear(); 4714f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId3); 4715f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 4716f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_normal, 4717f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoSize.THUMBNAIL)); 4718f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO_FILE_ID, bogusFileId); 4719f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DataRowHandlerForPhoto.SKIP_PROCESSING_KEY, true); 4720f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.insert(Data.CONTENT_URI, values); 4721f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4722f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Also insert a bogus photo that nobody is using. 4723f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoStore photoStore = provider.getPhotoStore(); 4724f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusPhotoId = photoStore.insert(new PhotoProcessor(loadPhotoFromResource( 4725f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL), 256, 96)); 4726f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4727f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Manually trigger another cleanup in the provider. 4728f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 4729f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4730f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // The following things should have happened. 4731f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4732f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 1. Raw contact 1 and its photo remain unaffected. 4733f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoFileId1, (long) getStoredLongValue( 4734f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1), 4735f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 4736f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4737f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 2. Raw contact 2 retains its new photo. The old one is deleted from the photo store. 4738f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(replacementPhotoFileId, (long) getStoredLongValue( 4739f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2), 4740f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 4741f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(photoFileId2)); 4742f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4743f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 3. Raw contact 3 should have its photo file reference cleared. 4744f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue( 4745f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId3), 4746f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 4747f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4748f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 4. The bogus photo that nobody was using should be cleared from the photo store. 4749f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(bogusPhotoId)); 4750f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4751f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4752f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOverwritePhotoWithThumbnail() throws IOException { 4753f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 4754f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4755f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4756f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4757f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write a regular-size photo. 4758f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 4759f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Long photoFileId = getStoredLongValue(contactUri, Contacts.PHOTO_FILE_ID); 4760f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertTrue(photoFileId != null && photoFileId > 0); 4761f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4762f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Now overwrite the photo with a thumbnail-sized photo. 4763f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues update = new ContentValues(); 4764f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro update.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_small, PhotoSize.ORIGINAL)); 4765f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.update(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), update, null, null); 4766f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4767f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo file ID should have been nulled out, and the photo URI should be the same as the 4768f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // thumbnail URI. 4769f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue(contactUri, Contacts.PHOTO_FILE_ID)); 4770f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue(contactUri, Contacts.PHOTO_URI); 4771f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI); 4772f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 4773f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4774f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Retrieving the photo URI should get the thumbnail content. 4775f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 4776f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 4777f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 4778f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 47794e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactSetStarred() { 47804e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId1 = createRawContactWithName(); 47814e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 47824e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId2 = createRawContactWithName(); 47834e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 478447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 478547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 47864e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 47874e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 47884e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 47894e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 47904e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 47914e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov ContentValues values = new ContentValues(); 47924e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "1"); 47934e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 47944e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 47954e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 47964e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 47974e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 47984e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 47994e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 48004e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "0"); 48014e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 48024e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 48034e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "0"); 48044e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 48054e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 48064e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 48074e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(Contacts.STARRED, "1"); 48084e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(contactUri, values, null, null); 48094e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 48104e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 48114e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "1"); 48124e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 48134e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov } 48144e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 48156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testSetAndClearSuperPrimaryEmail() { 48166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId1 = createRawContact(new Account("a", "a")); 48176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri11 = insertEmail(rawContactId1, "test1@domain1.com"); 48186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri12 = insertEmail(rawContactId1, "test2@domain1.com"); 48196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId2 = createRawContact(new Account("b", "b")); 48216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri21 = insertEmail(rawContactId2, "test1@domain2.com"); 48226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri22 = insertEmail(rawContactId2, "test2@domain2.com"); 48236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 48256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 48266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 48276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 48286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 48296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 48306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 0); 48316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 48326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48336dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Set super primary on the first pair, primary on the second 48346dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 48356dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 48366dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 48376dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 48386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 48396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 48406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 48416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 48426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 48436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 48446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 1); 48466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 1); 48476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 48486dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 48496dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 48506dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 48516dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 48526dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 48536dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48546dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Clear primary on the first pair, make sure second is not affected and super_primary is 48556dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // also cleared 48566dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 48576dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 48586dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 48596dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 48606dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 48616dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48626dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 48636dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 48646dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 48656dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 48666dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 48676dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 48686dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 48696dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 48706dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48716dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear super_primary, if we specify the correct data row 48726dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 48736dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 48746dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 48756dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 48766dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 48776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 48796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 48806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 48816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 48826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear primary, if we specify the correct data row 48846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 48856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 48866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 48876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 48886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 48896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 48916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 48926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 48936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 48946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 48956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Now clear super-primary for real 48966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 48976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 48986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 48996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 49006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 49036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 49046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 49056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 49066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 49076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 49086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 49096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 49106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann /** 49136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * Common function for the testNewPrimaryIn* functions. Its four configurations 49146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * are each called from its own test 49156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann */ 49166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testChangingPrimary(boolean inUpdate, boolean withSuperPrimary) { 49176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId = createRawContact(new Account("a", "a")); 49186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri1 = insertEmail(rawContactId, "test1@domain1.com", true); 49196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (withSuperPrimary) { 49216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 49226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 49236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri1, values, null, null); 49246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 49276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 49286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Insert another item 49306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final Uri mailUri2; 49316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (inUpdate) { 49326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com"); 49336dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49346dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 49356dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 49366dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 0); 49376dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, 0); 49386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 49406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 1); 49416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri2, values, null, null); 49426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } else { 49436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // directly add as default 49446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com", true); 49456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that primary has been unset on the first 49486dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // If withSuperPrimary is set, also ensure that is has been moved to the new item 49496dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 0); 49506dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, 0); 49516dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 1); 49526dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 49536dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49546dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49556dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsert() { 49566dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, false); 49576dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49586dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49596dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsertWithSuperPrimary() { 49606dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, true); 49616dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49626dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49636dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdate() { 49646dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, false); 49656dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49666dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49676dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdateWithSuperPrimary() { 49686dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, true); 49696dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 49706dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 49711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov public void testLiveFolders() { 49721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long rawContactId1 = createRawContactWithName("James", "Sullivan"); 49731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov insertPhoneNumber(rawContactId1, "5234567890"); 49741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 49751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 49761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long rawContactId2 = createRawContactWithName("Mike", "Wazowski"); 49771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 49781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov storeValue(Contacts.CONTENT_URI, contactId2, Contacts.STARRED, "1"); 49791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 49801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long rawContactId3 = createRawContactWithName("Randall", "Boggs"); 49811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long contactId3 = queryContactId(rawContactId3); 49821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov long groupId = createGroup(NO_ACCOUNT, "src1", "VIP"); 49831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov insertGroupMembership(rawContactId3, groupId); 49841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 49851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 49861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 49871b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/contacts"), 49881b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId1, "James Sullivan", 49891b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId2, "Mike Wazowski", 49901b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId3, "Randall Boggs"); 49911b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 49921b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 49931b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 49941b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/contacts_with_phones"), 49951b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId1, "James Sullivan"); 49961b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 49971b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 49981b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 49991b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/favorites"), 50001b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId2, "Mike Wazowski"); 50011b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 50021b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertLiveFolderContents( 50031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.withAppendedPath(Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, 50041b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov "live_folders/contacts"), Uri.encode("VIP")), 50051b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov contactId3, "Randall Boggs"); 50061b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } 50071b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 50081b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private void assertLiveFolderContents(Uri uri, Object... expected) { 50091b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Cursor c = mResolver.query(uri, new String[]{LiveFolders._ID, LiveFolders.NAME}, 50101b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov null, null, LiveFolders._ID); 50111b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertEquals(expected.length/2, c.getCount()); 50121b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov for (int i = 0; i < expected.length/2; i++) { 50131b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertTrue(c.moveToNext()); 50141b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertEquals(((Long)expected[i * 2]).longValue(), c.getLong(0)); 50151b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov assertEquals(expected[i * 2 + 1], c.getString(1)); 50161b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } 50171b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov c.close(); 50181b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } 50191b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 5020ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov public void testContactCounts() { 5021ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Uri uri = Contacts.CONTENT_URI.buildUpon() 5022ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build(); 5023ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5024ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContact(); 5025ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("James", "Sullivan"); 5026ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("The Abominable", "Snowman"); 5027ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mike", "Wazowski"); 5028ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("randall", "boggs"); 5029ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Boo", null); 5030ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mary", null); 5031ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Roz", null); 5032ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5033ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Cursor cursor = mResolver.query(uri, 5034ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 5035ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_PRIMARY + " COLLATE LOCALIZED"); 5036ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5037ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterValues(cursor, null, "B", "J", "M", "R", "T"); 5038ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 1, 1, 2, 2, 1); 5039ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 5040ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5041ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor = mResolver.query(uri, 5042ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 5043ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_ALTERNATIVE + " COLLATE LOCALIZED DESC"); 5044ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5045ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterValues(cursor, "W", "S", "R", "M", "B", null); 5046ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 2, 1, 1, 2, 1); 5047ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 5048ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5049ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5050ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterValues(Cursor cursor, String... expected) { 5051ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov String[] actual = cursor.getExtras() 5052ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getStringArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_TITLES); 5053ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 5054ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5055ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5056ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterCounts(Cursor cursor, int... expected) { 5057ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov int[] actual = cursor.getExtras() 5058ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getIntArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS); 5059ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 5060ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5061ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5062f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testReadBooleanQueryParameter() { 5063f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", true, true); 5064f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", false, false); 5065f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=0", "bool", true, false); 5066f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1", "bool", false, true); 5067f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false", "bool", true, false); 5068f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=true", "bool", false, true); 5069f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=FaLsE", "bool", true, false); 5070f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false&some=some", "bool", true, false); 5071f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1&some=some", "bool", false, true); 5072f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?some=bool", "bool", true, true); 5073f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool", "bool", true, true); 5074f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5075f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5076f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertBooleanUriParameter(String uriString, String parameter, 5077f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov boolean defaultValue, boolean expectedValue) { 5078f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.readBooleanQueryParameter( 5079f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter, defaultValue)); 5080f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5081f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5082f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testGetQueryParameter() { 5083f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar", "param", null); 5084f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param", "param", null); 5085f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=", "param", ""); 5086f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val", "param", "val"); 5087f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val&some=some", "param", "val"); 5088f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val", "param", "val"); 5089f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val&else=else", "param", "val"); 5090f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=john%40doe.com", "param", "john@doe.com"); 50915fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val", "param", null); 50925fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2", "param", "val2"); 50935fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=", "param", ""); 50945fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m", "param", null); 50955fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1&another_param=val2¶m=val3", 50965fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val3"); 50975fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2&some_param=val3", 50985fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val2"); 50995fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?param=val1&some_param=val2", "param", "val1"); 51005fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?p=val1&pp=val2", "p", "val1"); 51015fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?pp=val1&p=val2", "p", "val2"); 51025fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val1&pp=val2&p=val3", "p", "val3"); 51035fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val&", "p", null); 5104f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5105f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5106e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testMissingAccountTypeParameter() { 5107e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try querying for RawContacts only using ACCOUNT_NAME 5108e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri queryUri = RawContacts.CONTENT_URI.buildUpon().appendQueryParameter( 5109e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey RawContacts.ACCOUNT_NAME, "lolwut").build(); 5110e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 5111e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Cursor cursor = mResolver.query(queryUri, null, null, null, null); 5112e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to query with incomplete account query parameters"); 5113e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 5114e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 5115e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5116e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5117e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5118e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testInsertInconsistentAccountType() { 5119e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try inserting RawContact with inconsistent Accounts 5120e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account red = new Account("red", "red"); 5121e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account blue = new Account("blue", "blue"); 5122e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5123e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final ContentValues values = new ContentValues(); 5124e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_NAME, red.name); 5125e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_TYPE, red.type); 5126e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5127e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri insertUri = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, blue); 5128e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 5129e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey mResolver.insert(insertUri, values); 5130e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to insert RawContact with inconsistent account details"); 5131e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 5132e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 5133e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5134e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5135e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 51363826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusNoContactsNoAccounts() throws Exception { 51373826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 51383826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 51393826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 51403826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusOnlyLocalContacts() throws Exception { 51413826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov long rawContactId = createRawContact(); 51423826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 51433826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov mResolver.delete( 51443826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null, null); 51453826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 51463826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 51473826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 51483826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusWithAccounts() throws Exception { 51493826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 5150bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{ACCOUNT_1}); 51513826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[]{ACCOUNT_1}); 51523826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 5153bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[0]); 51543826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[0]); 51553826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 51563826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 51573826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 51583826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov private void assertProviderStatus(int expectedProviderStatus) { 515909c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov Cursor cursor = mResolver.query(ProviderStatus.CONTENT_URI, 516009c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov new String[]{ProviderStatus.DATA1, ProviderStatus.STATUS}, null, null, null); 516109c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertTrue(cursor.moveToFirst()); 516209c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertEquals(0, cursor.getLong(0)); 51633826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertEquals(expectedProviderStatus, cursor.getInt(1)); 516409c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov cursor.close(); 516509c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov } 516609c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov 5167b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void testProperties() throws Exception { 5168743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ContactsProvider2 provider = (ContactsProvider2)getProvider(); 5169b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContactsDatabaseHelper helper = (ContactsDatabaseHelper)provider.getDatabaseHelper(); 5170b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertNull(helper.getProperty("non-existent", null)); 5171b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("non-existent", "default")); 5172b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 5173b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", "string1"); 5174b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent2", "string2"); 5175b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string1", helper.getProperty("existent1", "default")); 5176b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string2", helper.getProperty("existent2", "default")); 5177b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", null); 5178b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("existent1", "default")); 5179b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 5180b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 518142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private class VCardTestUriCreator { 518242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup1; 518342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup2; 518442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 518542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public VCardTestUriCreator(String lookup1, String lookup2) { 518642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann super(); 518742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup1 = lookup1; 518842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup2 = lookup2; 518942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 519042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 519142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri1() { 519242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup1); 519342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 519442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 519542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri2() { 519642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup2); 519742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 519842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 519942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getCombinedUri() { 520042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, 520142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(mLookup1 + ":" + mLookup2)); 520242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 520342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 520442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 520542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private VCardTestUriCreator createVCardTestContacts() { 520642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId1 = createRawContact(mAccount, RawContacts.SOURCE_ID, "4:12"); 520742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId1, "John", "Doe"); 520842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 520942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId2 = createRawContact(mAccount, RawContacts.SOURCE_ID, "3:4%121"); 521042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId2, "Jane", "Doh"); 521142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 521242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId1 = queryContactId(rawContactId1); 521342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId2 = queryContactId(rawContactId2); 521442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact1Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1); 521542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact2Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2); 521642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup1 = 521742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact1Uri).getPathSegments().get(2)); 521842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup2 = 521942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact2Uri).getPathSegments().get(2)); 522042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return new VCardTestUriCreator(lookup1, lookup2); 522142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 522242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 522342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryMultiVCard() { 522442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // No need to create any contacts here, because the query for multiple vcards 522542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // does not go into the database at all 522642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri uri = Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, Uri.encode("123:456")); 522742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(uri, null, null, null, null); 522842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 522942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 523042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 523142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 523242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 523342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // The resulting name contains date and time. Ensure that before and after are correct 523442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.startsWith("vcards_")); 523542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.endsWith(".vcf")); 523642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 523742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 523842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 523942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryFileSingleVCard() { 524042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 524142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 524242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 524342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri1(), null, null, null, null); 524442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 524542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 524642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 524742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 524842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("John Doe.vcf", filename); 524942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 525042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 525142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 525242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 525342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri2(), null, null, null, null); 525442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 525542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 525642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 525742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 525842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("Jane Doh.vcf", filename); 525942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 526042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 526142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 526242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 526324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryFileProfileVCard() { 526424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 526524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor cursor = mResolver.query(Profile.CONTENT_VCARD_URI, null, null, null, null); 526624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(1, cursor.getCount()); 526724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.moveToFirst()); 526824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 526924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 527024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals("Mia Prophyl.vcf", filename); 527124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro cursor.close(); 527224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 527342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 527442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileMultiVCard() throws IOException { 527542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 527642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 527742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 527842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getCombinedUri(), "r"); 527942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 528042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String data = readToEnd(inputStream); 528142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 528242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 528342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 528442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the resulting VCard has both contacts 528542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doe;John;;;")); 528642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 528742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 528842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 528942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileSingleVCard() throws IOException { 529042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 529142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 529242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the right VCard is being created in each case 529342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 529442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 529542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri1(), "r"); 529642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 529742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 529842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 529942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 530024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 530124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(data.contains("N:Doe;John;;;")); 530224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertFalse(data.contains("N:Doh;Jane;;;")); 530342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 530442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 530542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 530642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 530742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri2(), "r"); 530842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 530942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 531042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 531142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 531242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 531342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertFalse(data.contains("N:Doe;John;;;")); 531442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 531542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 531642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 531742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 5318dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testAutoGroupMembership() { 5319dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 5320dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 5321dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false /* favorite */); 5322dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, false/* favorite */); 5323dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 5324dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccountTwo); 5325dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(null); 5326dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5327dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 5328dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5329dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5330dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5331dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5332dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5333dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5334dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5335dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5336dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5337dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 5338dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5339dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5340dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g3, c.getLong(0)); 5341dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r2, c.getLong(1)); 5342dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5343dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5344dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5345dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5346dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5347dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5348dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testNoAutoAddMembershipAfterGroupCreation() { 5349dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 5350dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 5351dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount); 5352dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo); 5353dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 5354dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null); 5355dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5356dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5357dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5358dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5359dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 5360dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 5361dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false/* favorite */); 5362dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5363dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5364dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5365dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5366dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5367dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // create some starred and non-starred contacts, some associated with account, some not 5368dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group created 5369dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // the starred contacts should be added to group 5370dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group removed 5371dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // no change to starred status 5372dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesMembershipAfterGroupCreation() { 5373dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 5374dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 5375dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount, RawContacts.STARRED, "1"); 5376dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo, RawContacts.STARRED, "1"); 5377dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 5378dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null, RawContacts.STARRED, "1"); 5379dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r7 = createRawContact(null); 5380dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5381dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5382dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5383dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5384dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 5385dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 5386dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, false /* autoAdd */, false/* favorite */); 5387dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5388dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 5389dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 5390dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 5391dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 5392dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 5393dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 5394dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 5395dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5396dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5397dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 5398dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5399dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5400dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5401dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5402dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5403dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5404dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 5405dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5406dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5407dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5408dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5409dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5410dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(RawContacts.CONTENT_URI, r6, 5411dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_NAME, mAccount.name, 5412dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_TYPE, mAccount.type); 5413dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5414dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 5415dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5416dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5417dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5418dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5419dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5420dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5421dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 5422dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5423dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5424dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r6, c.getLong(1)); 5425dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5426dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5427dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5428dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5429dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5430dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(ContentUris.withAppendedId(Groups.CONTENT_URI, g1), null, null); 5431dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5432dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5433dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5434dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5435dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 5436dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 5437dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 5438dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 5439dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 5440dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 5441dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 5442dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5443dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5444dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesGroupMembershipChangeAfterStarChange() { 5445dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 5446dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 5447dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 5448dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 5449dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 5450dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 5451dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 5452dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5453dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5454dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 5455dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5456dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5457dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5458dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5459dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5460dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5461dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5462dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5463dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5464dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 5465dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 5466dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5467dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 5468dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5469dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5470dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5471dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred 5472dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "1")); 5473dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 5474dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 5475dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 5476dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5477dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 5478dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5479dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5480dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5481dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5482dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5483dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5484dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5485dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5486dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5487dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 5488dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 5489dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 5490dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5491dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5492dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5493e3e79030101447da07547647bad225686eb9b8dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(r1)); 5494dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNotNull(contactUri); 5495dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5496dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred via its contact lookup uri 5497dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(contactUri, Contacts.STARRED, "1")); 5498dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 5499dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 5500dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 5501dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5502dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 5503dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5504dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5505dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5506dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5507dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5508dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5509dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5510dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5511dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5512dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 5513dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(contactUri, Contacts.STARRED, "0"); 5514dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 5515dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5516dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5517dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5518dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5519dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testStarChangedAfterGroupMembershipChange() { 5520dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 5521dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 5522dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 5523dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 5524dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 5525dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 5526dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 5527dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5528dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 5529dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 5530dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 5531dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5532dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c; 5533dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5534dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r1 to one favorites group 5535dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should automatically be set 5536dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1 should automatically be added to the other favorites group 5537dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir1g1 = insertGroupMembership(r1, g1); 5538dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 5539dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 5540dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 5541dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5542dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 5543dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5544dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5545dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5546dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5547dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5548dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5549dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5550dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5551dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5552dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r1 from one favorites group 5553dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir1g1, null, null); 5554dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should no longer be set 5555dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 5556dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 5557dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 5558dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // there should be no membership rows 5559dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5560dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5561dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5562dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r3 to the one favorites group for that account 5563dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be set 5564dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir3g4 = insertGroupMembership(r3, g4); 5565dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 5566dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 5567dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 5568dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5569dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 5570dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5571dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5572dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g4, c.getLong(0)); 5573dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 5574dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5575dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5576dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5577dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5578dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5579dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r3 from the favorites group 5580dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir3g4, null, null); 5581dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be cleared 5582dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 5583dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 5584dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 5585dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5586dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5587dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5588dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 558997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyRawContact() { 559097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 559197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 559297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 559397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 559497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 559597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "second"); 559697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 559797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 559897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = rawContactUri.buildUpon() 559997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 560097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 560197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, RawContacts.CUSTOM_RINGTONE, "third"); 560297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "third"); 560397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 560497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 560597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyDataRow() { 560697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 560797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "email"); 560897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "555-1111"); 560997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 561097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Data.IS_READ_ONLY, "1"); 561197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Email.ADDRESS, "changed"); 561297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(phoneUri, Phone.NUMBER, "555-2222"); 561397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "email"); 561497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(phoneUri, Phone.NUMBER, "555-2222"); 561597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 561697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = emailUri.buildUpon() 561797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 561897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 561997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, Email.ADDRESS, "changed"); 562097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "changed"); 562197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 562297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 562397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testContactWithReadOnlyRawContact() { 562497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId1 = createRawContact(); 562597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 562697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "first"); 562797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 562897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId2 = createRawContact(); 562997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 563097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 563197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 563297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 563397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 563497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov rawContactId1, rawContactId2); 563597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 563697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long contactId = queryContactId(rawContactId1); 563797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 563897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 563997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 564097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 564197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "rt"); 564297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 564397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 564497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 56457a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameParsingQuery() { 56467a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 56477a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr.").build(); 56487a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 56497a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 56507a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr."); 565117a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr."); 56527a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 56537a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 56547a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 56557a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 56567a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 56577a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 56587a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 56597a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 56607a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 56617a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 56627a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameConcatenationQuery() { 56637a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 56647a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.PREFIX, "Mr") 56657a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.GIVEN_NAME, "John") 56667a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.MIDDLE_NAME, "Q.") 56677a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.FAMILY_NAME, "Doe") 56687a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.SUFFIX, "Jr.") 56697a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .build(); 56707a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 56717a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 567255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr John Q. Doe, Jr."); 56737a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 56747a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 56757a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 56767a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 56777a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 56787a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 56797a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 56807a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 56817a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 56827a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 56837a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 5684dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana private Cursor queryGroupMemberships(Account account) { 5685dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = mResolver.query(maybeAddAccountQueryParameters(Data.CONTENT_URI, account), 5686dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana new String[]{GroupMembership.GROUP_ROW_ID, GroupMembership.RAW_CONTACT_ID}, 5687dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Data.MIMETYPE + "=?", new String[]{GroupMembership.CONTENT_ITEM_TYPE}, 5688dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana GroupMembership.GROUP_SOURCE_ID); 5689dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return c; 5690dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5691dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 569242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String readToEnd(FileInputStream inputStream) { 569342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann try { 5694bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("DECLARED INPUT STREAM LENGTH: " + inputStream.available()); 569542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann int ch; 569642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann StringBuilder stringBuilder = new StringBuilder(); 5697bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov int index = 0; 5698bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov while (true) { 5699bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov ch = inputStream.read(); 5700bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("READ CHARACTER: " + index + " " + ch); 5701bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov if (ch == -1) { 5702bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov break; 5703bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 570442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann stringBuilder.append((char)ch); 5705bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov index++; 5706bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 570742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return stringBuilder.toString(); 570842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } catch (IOException e) { 570942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return null; 571042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 571142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 571242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 5713f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertQueryParameter(String uriString, String parameter, String expectedValue) { 5714f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.getQueryParameter( 5715f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter)); 5716f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5717f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 57184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private long createContact(ContentValues values, String firstName, String givenName, 57194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 5720aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 572124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createContact(values, firstName, givenName, phoneNumber, email, presenceStatus, 572224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, false); 572324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 572424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 572524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createContact(ContentValues values, String firstName, String givenName, 572624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 572724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 572848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return queryContactId(createRawContact(values, firstName, givenName, phoneNumber, email, 572924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro presenceStatus, timesContacted, starred, groupId, chatMode, isUserProfile)); 573048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 573148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 573248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String firstName, String givenName, 573348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 5734aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 573548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 5736aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori timesContacted, starred, groupId, chatMode); 573748786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov insertStructuredName(rawContactId, firstName, givenName); 573848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 573948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 574048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 574124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String firstName, String givenName, 574224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 574324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 574424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 574524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, isUserProfile); 574624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertStructuredName(rawContactId, firstName, givenName); 574724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return rawContactId; 574824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 574924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 575048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String phoneNumber, String email, 5751aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori int presenceStatus, int timesContacted, int starred, long groupId, int chatMode) { 575224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createRawContact(values, phoneNumber, email, presenceStatus, timesContacted, starred, 575324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro groupId, chatMode, false); 575424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 575524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 575624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String phoneNumber, String email, 575724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro int presenceStatus, int timesContacted, int starred, long groupId, int chatMode, 575824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro boolean isUserProfile) { 57594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, starred); 57604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 57614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "beethoven5"); 57624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, timesContacted); 576324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 576424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri insertionUri = isUserProfile 576524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ? Profile.CONTENT_RAW_CONTACTS_URI 576624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro : RawContacts.CONTENT_URI; 576724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri rawContactUri = mResolver.insert(insertionUri, values); 57684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 57694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 57704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 57714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.PHOTO_ID, photoId); 57729dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(phoneNumber)) { 57739dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId, phoneNumber); 57749dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 57759dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(email)) { 57769dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertEmail(rawContactId, email); 57779dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 57784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 5779aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, email, presenceStatus, "hacking", 5780aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori chatMode); 57814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 57824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov if (groupId != 0) { 57834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertGroupMembership(rawContactId, groupId); 57844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 578524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 578648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 57874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 57884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 578924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 579024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values under the user's profile. 579124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param profileValues Values to be used to create the entry (common values will be 579224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 579324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 579424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 579524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicProfileContact(ContentValues profileValues) { 579624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createRawContact(profileValues, "Mia", "Prophyl", 579724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18005554411", "mia.prophyl@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 579824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, true); 579924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.put(Contacts.DISPLAY_NAME, "Mia Prophyl"); 580024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return profileRawContactId; 580124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 580224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 580324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 580424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values that is not under the user's profile. 580524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param nonProfileValues Values to be used to create the entry (common values will be 580624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 580724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 580824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 580924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicNonProfileContact(ContentValues nonProfileValues) { 581024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createRawContact(nonProfileValues, "John", "Doe", 581124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 581224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 581324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nonProfileValues.put(Contacts.DISPLAY_NAME, "John Doe"); 581424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return nonProfileRawContactId; 581524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 581624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 58174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private void putDataValues(ContentValues values, long rawContactId) { 58184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 58194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 58204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 58214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 58224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 58234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA1, "one"); 58244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA2, "two"); 58254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA3, "three"); 58264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA4, "four"); 58274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA5, "five"); 58284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA6, "six"); 58294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA7, "seven"); 58304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA8, "eight"); 58314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA9, "nine"); 58324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA10, "ten"); 58334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA11, "eleven"); 58344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA12, "twelve"); 58354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA13, "thirteen"); 58364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA14, "fourteen"); 58374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA15, "fifteen"); 58384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC1, "sync1"); 58394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC2, "sync2"); 58404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC3, "sync3"); 58414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC4, "sync4"); 58424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 58434928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 58444928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa /** 58454928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param data1 email address or phone number 58464928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param usageType One of {@link DataUsageFeedback#USAGE_TYPE} 58474928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param values ContentValues for this feedback. Useful for incrementing 58484928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * {Contacts#TIMES_CONTACTED} in the ContentValue. Can be null. 58494928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa */ 58504928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa private void sendFeedback(String data1, String usageType, ContentValues values) { 58514928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final long dataId = getStoredLongValue(Data.CONTENT_URI, 58524928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa Data.DATA1 + "=?", new String[] { data1 }, Data._ID); 58534928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final Uri feedbackUri = DataUsageFeedback.FEEDBACK_URI.buildUpon() 58544928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .appendPath(String.valueOf(dataId)) 58554928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, usageType) 58564928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .build(); 58574928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertNotSame(0, mResolver.update(feedbackUri, new ContentValues(), null, null)); 58584928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa if (values != null && values.containsKey(Contacts.TIMES_CONTACTED)) { 58594928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa values.put(Contacts.TIMES_CONTACTED, values.getAsInteger(Contacts.TIMES_CONTACTED) + 1); 58604928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 58614928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 5862d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov} 5863d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 5864