ContactsProvider2Test.java revision 0992b9d4969ed0eee6e879db94292b635229e2b7
1d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/* 2d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 4d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * you may not use this file except in compliance with the License. 6d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * You may obtain a copy of the License at 7d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 8d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 10d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * See the License for the specific language governing permissions and 14d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * limitations under the License. 15d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 18d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 19d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport com.android.internal.util.ArrayUtils; 20dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.AggregationExceptionColumns; 21f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawaimport com.android.providers.contacts.ContactsDatabaseHelper.DataUsageStatColumns; 229ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.DbProperties; 23b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns; 24f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport com.android.providers.contacts.tests.R; 2524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport com.google.android.collect.Lists; 269ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onukiimport com.google.android.collect.Sets; 27d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wongimport android.accounts.Account; 29d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderOperation; 30d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderResult; 31d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentUris; 32d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentValues; 339261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.content.Entity; 3433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.content.EntityIterator; 3542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport android.content.res.AssetFileDescriptor; 36d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.database.Cursor; 37d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.net.Uri; 38c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoroimport android.os.AsyncTask; 39c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract; 40d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 41e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Callable; 42dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 43dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 44dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 45dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 46dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 47dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 48e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.SipAddress; 49dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 50dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 51ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikovimport android.provider.ContactsContract.ContactCounts; 52c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.Data; 5446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback; 55dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.Directory; 565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.DisplayNameSources; 57f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.DisplayPhoto; 587a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 593cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.PhoneLookup; 615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.PhoneticNameStyle; 6224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport android.provider.ContactsContract.Profile; 6309c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus; 6433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 6562318e1ea8306142a10526534b7d83560ecf5b3aFred Quintanaimport android.provider.ContactsContract.RawContactsEntity; 66916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikovimport android.provider.ContactsContract.SearchSnippetColumns; 6789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikovimport android.provider.ContactsContract.Settings; 6882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItemPhotos; 70f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.StreamItems; 71dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.OpenableColumns; 727d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekhimport android.test.MoreAsserts; 73d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 74f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.text.TextUtils; 75d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 7642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.FileInputStream; 7742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.IOException; 78ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringertimport java.io.InputStream; 79f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport java.io.OutputStream; 805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.text.Collator; 813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.ArrayList; 825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Arrays; 833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.List; 845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 859ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onukiimport java.util.Set; 865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 87d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/** 88d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}. 89d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 90d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Run the test like this: 91d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * <code> 9223ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki adb shell am instrument -e class com.android.providers.contacts.ContactsProvider2Test -w \ 9323ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 94d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * </code> 95d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 96d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov@LargeTest 97d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovpublic class ContactsProvider2Test extends BaseContactsProvider2Test { 98d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 9947fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_1 = new Account("account_name_1", "account_type_1"); 10047fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_2 = new Account("account_name_2", "account_type_2"); 10147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov 102dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsProjection() { 103dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_URI, new String[]{ 104dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 105dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 106dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 107dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 108dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 109dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 110dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 111dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 112dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 113dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 114dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 115dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 116dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 117f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1183d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1193d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 120dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 121dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 122dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 12324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 124dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 125dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 126dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 127dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 128dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 129dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 130dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 131dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 132dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 133dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 134dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 135dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 136dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsWithSnippetProjection() { 137dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_FILTER_URI.buildUpon().appendPath("nothing").build(), 138dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 139dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 140dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 141dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 142dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 143dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 144dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 145dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 146dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 147dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 148dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 149dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 150dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 151dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 152f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1533d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1543d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 155dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 156dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 157dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 15824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 159dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 160dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 161dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 162dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 163dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 164dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 165dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 166dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 167dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 168dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 16930cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov SearchSnippetColumns.SNIPPET, 170dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 171dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 172dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 173dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawContactsProjection() { 174dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContacts.CONTENT_URI, new String[]{ 175dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 176dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 177dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 178dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 17943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 18043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 181dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 182dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 18324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 184dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 185dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 186dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 187dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE, 188dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 189dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME, 190dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE, 191dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 192dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_PRIMARY, 193dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE, 194dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.TIMES_CONTACTED, 195dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.LAST_TIME_CONTACTED, 196dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CUSTOM_RINGTONE, 197dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL, 198dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 199dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.AGGREGATION_MODE, 200dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 201dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 202dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 203dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 204dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 205dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 206dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 207dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDataProjection() { 208dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Data.CONTENT_URI, new String[]{ 209dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 210dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RAW_CONTACT_ID, 211dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 212dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 213dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 214dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 215dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 216dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 217dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 218dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 219dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 220dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 221dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 222dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 223dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 224dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 225dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 226dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 227dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 228dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 229dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 230dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 231dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 232dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 233dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 234dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 235dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 236dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 237dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 238dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 239dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 240dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 241dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 242dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 243dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 244dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 24543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 24643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 247dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 248dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 249dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 250dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 25124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 252dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 253dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 254dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 255dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 256dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 257dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 258dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 259dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 260dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 261dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 262dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 263dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 264dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 265f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 2663d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 2673d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 268dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 269dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 270dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 271dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 272cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 273dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 274dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 275dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 276dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 277dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 278dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 279dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 280dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 281dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 282dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 283dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 284dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDistinctDataProjection() { 285dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Phone.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 286dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 287dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 288dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 289dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 290dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 291dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 292dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 293dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 294dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 295dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 296dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 297dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 298dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 299dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 300dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 301dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 302dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 303dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 304dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 305dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 306dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 307dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 308dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 309dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 310dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 311dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 312dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 313dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 314dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 315dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 316dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 317dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 318dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 319dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 32024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 321dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 322dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 323dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 324dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 325dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 326dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 327dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 328dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 329dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 330dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 331dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 332dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 333dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 334f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 3353d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 3363d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 337cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 338dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 339dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 340dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 341dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 342dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 343dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 344dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 345dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 346dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 347dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 348dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 349dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 350dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 351dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 352a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testEntityProjection() { 353a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertProjection( 354a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 0), 355a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.CONTENT_DIRECTORY), 356a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov new String[]{ 357a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity._ID, 358a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.DATA_ID, 359a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID, 360a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA_VERSION, 361a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_PRIMARY, 362a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_SUPER_PRIMARY, 363a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.RES_PACKAGE, 364a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.MIMETYPE, 365a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA1, 366a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA2, 367a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA3, 368a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA4, 369a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA5, 370a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA6, 371a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA7, 372a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA8, 373a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA9, 374a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA10, 375a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA11, 376a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA12, 377a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA13, 378a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA14, 379a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA15, 380a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC1, 381a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC2, 382a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC3, 383a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC4, 384a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CONTACT_ID, 385a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.PRESENCE, 386a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CHAT_CAPABILITY, 387a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS, 388a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_TIMESTAMP, 389a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_RES_PACKAGE, 390a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_LABEL, 391a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_ICON, 392a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_NAME, 393a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_TYPE, 39443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 39543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 396a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SOURCE_ID, 397a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.VERSION, 398a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DELETED, 399a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DIRTY, 400a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.NAME_VERIFIED, 401a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC1, 402a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC2, 403a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC3, 404a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC4, 405a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts._ID, 406a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 407a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 408a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 409a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME, 410a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 411a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 412a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 413a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 414a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.TIMES_CONTACTED, 415a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.STARRED, 416a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 417a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHOTO_ID, 418f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 4193d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 4203d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 421a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CUSTOM_RINGTONE, 422a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 42324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 424a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LOOKUP_KEY, 425a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 426cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 427a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_PRESENCE, 428a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 429a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS, 430a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 431a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 432a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 433a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 434a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 435a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov }); 436a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 437a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 438dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawEntityProjection() { 439dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContactsEntity.CONTENT_URI, new String[]{ 440dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.Entity.DATA_ID, 441dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 442dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 443dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 444dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 44543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 44643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 447dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 448dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 449dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 450dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 451dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 452dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 453dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 454dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 455dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 456dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 45724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 458dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 459dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 460dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 461dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 462dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 463dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 464dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 465dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 466dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 467dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 468dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 469dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 470dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 471dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 472dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 473dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 474dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 475dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 476dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 477dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 478dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 479dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 480dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 481dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 482dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 483dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 484dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 485dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 486dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testPhoneLookupProjection() { 487dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(PhoneLookup.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 488dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 489dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup._ID, 490dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LOOKUP_KEY, 491dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.DISPLAY_NAME, 492dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LAST_TIME_CONTACTED, 493dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TIMES_CONTACTED, 494dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.STARRED, 495dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.IN_VISIBLE_GROUP, 496dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.PHOTO_ID, 4973d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_URI, 4983d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_THUMBNAIL_URI, 499dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.CUSTOM_RINGTONE, 500dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.HAS_PHONE_NUMBER, 501dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.SEND_TO_VOICEMAIL, 502dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.NUMBER, 503dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TYPE, 504dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LABEL, 5052530512f639c4979fd7371c7dd25dd67e8118124Bai Tao PhoneLookup.NORMALIZED_NUMBER, 506dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 507dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 508dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 509dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsProjection() { 510dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_URI, new String[]{ 511dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 512dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 513dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 51443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 51543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 516dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 517dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 518dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 519dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 520dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 521dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 522dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 523dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 524dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 525dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 526dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 527dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 528dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 529c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 530dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 531dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 532dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 533dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 534dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 535dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 536dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 537dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsSummaryProjection() { 538dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_SUMMARY_URI, new String[]{ 539dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 540dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 541dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 54243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 54343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 544dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 545dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 546dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 547dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 548dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 549dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 550dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 551dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 552dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 553dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 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, 56418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 565dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 566dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 567dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 568dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testAggregateExceptionProjection() { 569dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(AggregationExceptions.CONTENT_URI, new String[]{ 570dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptionColumns._ID, 571dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.TYPE, 572dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1, 573dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2, 574dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 575dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 576dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 577dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testSettingsProjection() { 578dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Settings.CONTENT_URI, new String[]{ 579dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_NAME, 580dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_TYPE, 581f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Settings.DATA_SET, 582dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_VISIBLE, 583dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.SHOULD_SYNC, 584dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ANY_UNSYNCED, 585dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_COUNT, 586dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_WITH_PHONES, 587dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 588dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 589dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 590dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testStatusUpdatesProjection() { 591dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(StatusUpdates.CONTENT_URI, new String[]{ 592dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID, 593dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.DATA_ID, 594dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_ACCOUNT, 595dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_HANDLE, 596dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PROTOCOL, 597dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL, 598dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PRESENCE, 599dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CHAT_CAPABILITY, 600dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS, 601dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP, 602dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE, 603dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_ICON, 604dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_LABEL, 605dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 606dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 607dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 608dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDirectoryProjection() { 609dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Directory.CONTENT_URI, new String[]{ 610dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory._ID, 611dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.PACKAGE_NAME, 612dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.TYPE_RESOURCE_ID, 613dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DISPLAY_NAME, 614dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DIRECTORY_AUTHORITY, 615dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_TYPE, 616dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_NAME, 617dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.EXPORT_SUPPORT, 618778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.SHORTCUT_SUPPORT, 619778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.PHOTO_SUPPORT, 620dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 621dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 622dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 6233cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testRawContactsInsert() { 6243cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 6253cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6263cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_NAME, "a"); 6273cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_TYPE, "b"); 6289d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki values.put(RawContacts.DATA_SET, "ds"); 6293cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SOURCE_ID, "c"); 6303cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.VERSION, 42); 6313cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DIRTY, 1); 6323cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DELETED, 1); 6333cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED); 6343cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 6353cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 6363cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 6373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 6383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC1, "e"); 6393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC2, "f"); 6403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC3, "g"); 6413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC4, "h"); 6423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6433cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values); 6444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rowUri); 6453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 6474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(RawContacts.CONTENT_URI, values, RawContacts._ID, rawContactId); 64881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 6493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 6503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6512149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov public void testDataDirectoryWithLookupUri() { 6522149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov ContentValues values = new ContentValues(); 6532149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6542149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long rawContactId = createRawContactWithName(); 6552149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertPhoneNumber(rawContactId, "555-GOOG-411"); 6562149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertEmail(rawContactId, "google@android.com"); 6572149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6582149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long contactId = queryContactId(rawContactId); 6592149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 6602149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6612149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete and valid lookup URI 6622149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 6632149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 6642149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6652149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6662149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6672149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete but stale lookup URI 6682149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 6692149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 6702149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6712149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6722149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Incomplete lookup URI (lookup key only, no contact ID) 6732149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, 6742149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupKey), Contacts.Data.CONTENT_DIRECTORY); 6752149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6762149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 6772149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6782149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov private void assertDataRows(Uri dataUri, ContentValues values) { 6792149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Cursor cursor = mResolver.query(dataUri, new String[]{ Data.DATA1 }, null, null, Data._ID); 6802149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertEquals(3, cursor.getCount()); 6812149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToFirst(); 6822149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "John Doe"); 6832149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6842149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6852149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 6862149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "555-GOOG-411"); 6872149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6882149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6892149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 6902149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "google@android.com"); 6912149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6922149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6932149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.close(); 6942149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 6952149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 696a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithIdBasedUri() { 697a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 698a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 699a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 700a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 701a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 702a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 703a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 7045d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 705a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 706a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 707a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 708a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 709a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 710a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 711a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 712a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 713a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY); 714a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 715a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 716a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 717a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 718a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithLookupUri() { 719a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 720a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 721a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 722a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 723a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 724a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 725a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 7265d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 727a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 728a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 729a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 730a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 731a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 732a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 733a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 734a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 735a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First try with a matching contact ID 736a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 737a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 738a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 739a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 740a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try with a contact ID mismatch 741a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 742a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 743a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 744a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 745a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try without an ID altogether 746a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey); 747a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 748a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 749a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 750a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 751a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov private void assertEntityRows(Uri entityUri, long contactId, long rawContactId1, 752a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2) { 753a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 754a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 755a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Cursor cursor = mResolver.query(entityUri, null, null, null, 756a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID + "," + Contacts.Entity.DATA_ID); 757a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEquals(3, cursor.getCount()); 758a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 759a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First row - name 760a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToFirst(); 761a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 762a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 763a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 764a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "John Doe"); 765a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 766a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 767a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 768a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 769a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 770a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 771a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 772a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 773a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 774a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 775a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 776a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Second row - IM 777a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 778a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 779a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 780a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, Im.CONTENT_ITEM_TYPE); 781a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "gtalk"); 782a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 783a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 784a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 785a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 786a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 787a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 788a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 789a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 790a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.PRESENCE, StatusUpdates.IDLE); 791a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 792a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 793a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Third row - second raw contact, not data 794a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 795a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 796a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId2); 797a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.MIMETYPE); 798a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA_ID); 799a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA1); 800a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act2"); 801a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype2"); 802a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 803a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 804a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 805a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 806a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 807a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 808a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 809a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 810a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 811a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.close(); 812a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 813a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 8143cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testDataInsert() { 8154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("John", "Doe"); 8164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 8184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov putDataValues(values, rawContactId); 8194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 8204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 8214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 8234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 8244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(dataUri, values); 8254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Data.CONTENT_URI, values, Data._ID, dataId); 8274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under RawContacts 8294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 8304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactDataUri = 8314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri.withAppendedPath(rawContactUri, RawContacts.Data.CONTENT_DIRECTORY); 8324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(rawContactDataUri, values, Data._ID, dataId); 8334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under Contacts 8354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 8364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactDataUri = Uri.withAppendedPath(contactUri, Contacts.Data.CONTENT_DIRECTORY); 8374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(contactDataUri, values, Data._ID, dataId); 83881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 8394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 8403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 84189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactDataQuery() { 84289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 84389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 84489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 84589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri1 = insertStructuredName(rawContactId1, "John", "Doe"); 84689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 84789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri2 = insertStructuredName(rawContactId2, "Jane", "Doe"); 84889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 84989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(dataUri1, account1); 85089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(dataUri2, account2); 85189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Data._ID, ContentUris.parseId(dataUri1)) ; 85289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Data._ID, ContentUris.parseId(dataUri2)) ; 85389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 85489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 8554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesQuery() { 8567d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 8573cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 8584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 8594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 8604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 8614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 8624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 8634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 8654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 8664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 8684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertPhoneNumber(rawContactId, "18004664411"); 8694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long phoneId = ContentUris.parseId(uri); 8704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 8734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 8744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, phoneId); 8753cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 8764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 8774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 8784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 8794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 8804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 8814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 8824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 8834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 8844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 8854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 8864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 8874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 88848828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Phone.CONTENT_URI, phoneId), values); 8894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Phone.CONTENT_URI, values, Data._ID, phoneId); 8904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 8914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 892cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa public void testPhonesWithMergedContacts() { 893cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId1 = createRawContact(); 894cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId1, "123456789", true); 895cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 896cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId2 = createRawContact(); 897cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId2, "123456789", true); 898cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 8990992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 9000992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki rawContactId1, rawContactId2); 9010992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki assertNotAggregated(rawContactId1, rawContactId2); 9020992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki 903cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa ContentValues values1 = new ContentValues(); 904cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "123456789"); 905cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 906cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Phone.NUMBER, "123456789"); 907cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9080992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // There are two phone numbers, so we should get two rows. 909cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 910cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9110992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now set the dedupe flag. But still we should get two rows, because they're two 9120992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // different contacts. We only dedupe within each contact. 9138ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Phone.CONTENT_URI.buildUpon() 9148ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 9158ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 9168ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, new ContentValues[] {values1, values1}); 9178ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 9180992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now join them into a single contact. 919cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 920cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa rawContactId1, rawContactId2); 921cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 922cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertAggregated(rawContactId1, rawContactId2, "123456789"); 923cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9240992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Contact merge won't affect the default result of Phone Uri, where we don't dedupe. 9258ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 9268ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 9270992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now we dedupe them. 9288ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values1); 929cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa } 930cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 931904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann public void testPhonesNormalizedNumber() { 932904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final long rawContactId = createRawContact(); 933904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 934904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Write both a number and a normalized number. Those should be written as-is 935904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final ContentValues values = new ContentValues(); 936904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Data.RAW_CONTACT_ID, rawContactId); 937904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 938904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "1234"); 939904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "5678"); 940904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.TYPE, Phone.TYPE_HOME); 941904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 942904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 943904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 944904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Ensure both can be looked up 945904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 946904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1234"), null, null)); 947904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 948904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "5678"), null, null)); 949904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 950904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace both in an UPDATE 951904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 952904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "4321"); 953904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "8765"); 954904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 955904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 956904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1234"), null, null)); 957904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 958904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "4321"), null, null)); 959904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 960904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "5678"), null, null)); 961904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 962904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 963904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 964904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace only NUMBER ==> NORMALIZED_NUMBER will be inferred (we test that by making 965904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // sure the old manual value can not be found anymore) 966904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 967904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "1-800-466-5432"); 968904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 969904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals( 970904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1, 971904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1-800-466-5432"), null, 972904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann null)); 973904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 974904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 975904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 976904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace only NORMALIZED_NUMBER ==> call is ignored, things will be unchanged 977904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 978904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "8765"); 979904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 980904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals( 981904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1, 982904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1-800-466-5432"), null, 983904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann null)); 984904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 985904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 986904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann } 987904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 9884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesFilterQuery() { 989e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Phone.CONTENT_FILTER_URI); 990e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 991e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 992e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** 993e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * A convenient method for {@link #testPhonesFilterQuery()} and 994e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link #testCallablesFilterQuery()}. 995e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 996e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * This confirms if both URIs return identical results for phone-only contacts and 997e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * appropriately different results for contacts with sip addresses. 998e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 999e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * @param baseFilterUri Either {@link Phone#CONTENT_FILTER_URI} or 1000e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link Callable#CONTENT_FILTER_URI}. 1001e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa */ 1002e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa private void testPhonesFilterQueryInter(Uri baseFilterUri) { 1003e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertTrue("Unsupported Uri (" + baseFilterUri + ")", 1004e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa Phone.CONTENT_FILTER_URI.equals(baseFilterUri) 1005e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa || Callable.CONTENT_FILTER_URI.equals(baseFilterUri)); 1006e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1007e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 10085e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId1, "1-800-466-4411"); 10095e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1010e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("Chilled", "Guacamole", ACCOUNT_2); 10112a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1-800-466-5432"); 101258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "0@example.com", false, Phone.TYPE_PAGER); 101358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "1@example.com", false, Phone.TYPE_PAGER); 10145e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1015e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri1 = Uri.withAppendedPath(baseFilterUri, "tamale"); 10164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 10174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 10184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 10195e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Phone.NUMBER, "1-800-466-4411"); 10204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 10214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 10225e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 10234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1024e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri2 = Uri.withAppendedPath(baseFilterUri, "1-800-GOOG-411"); 10255e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri2, values); 10265e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1027e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri3 = Uri.withAppendedPath(baseFilterUri, "18004664"); 10285e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri3, values); 10295e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1030e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri4 = Uri.withAppendedPath(baseFilterUri, "encilada"); 10315e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 103245d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov 1033e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri5 = Uri.withAppendedPath(baseFilterUri, "*"); 103445d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 103558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 103658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values1 = new ContentValues(); 103758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 103858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 103958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.NUMBER, "1-800-466-5432"); 104058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 104158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.putNull(Phone.LABEL); 104258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 104358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values2 = new ContentValues(); 104458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 104558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 104658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.NUMBER, "0@example.com"); 104758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.TYPE, Phone.TYPE_PAGER); 104858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.putNull(Phone.LABEL); 104958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 105058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values3 = new ContentValues(); 105158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 105258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 105358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.NUMBER, "1@example.com"); 105458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.TYPE, Phone.TYPE_PAGER); 105558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.putNull(Phone.LABEL); 105658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 1057e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri6 = Uri.withAppendedPath(baseFilterUri, "Chilled"); 1058e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} ); 1059e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1060e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Insert a SIP address. From here, Phone URI and Callable URI may return different results 1061e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // than each other. 1062e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip_hot_tamale@example.com"); 1063e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip:sip_hot@example.com"); 1064e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1065e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri7 = Uri.withAppendedPath(baseFilterUri, "sip_hot"); 1066e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri8 = Uri.withAppendedPath(baseFilterUri, "sip_hot_tamale"); 1067e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa if (Callable.CONTENT_FILTER_URI.equals(baseFilterUri)) { 1068e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values4 = new ContentValues(); 1069e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1070e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1071e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(SipAddress.SIP_ADDRESS, "sip_hot_tamale@example.com"); 1072e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1073e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values5 = new ContentValues(); 1074e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1075e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1076e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(SipAddress.SIP_ADDRESS, "sip:sip_hot@example.com"); 1077e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri1, new ContentValues[] {values, values4, values5}); 1078e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1079e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri7, new ContentValues[] {values4, values5}); 1080e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri8, values4); 1081e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } else { 1082e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sip address should not affect Phone URI. 1083e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValuesWithProjection(filterUri1, values); 1084e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri7, null, null)); 1085e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1086e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1087e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sanity test. Run tests for "Chilled Guacamole" again and see nothing changes 1088e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // after the Sip address being inserted. 1089e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri2, values); 1090e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri3, values); 1091e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri4, null, null)); 1092e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri5, null, null)); 109358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} ); 10944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 10954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1096e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public void testPhoneLookup() { 1097e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov ContentValues values = new ContentValues(); 1098e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1099e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1100e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1101e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1102e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1103e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1104e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 11054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 11064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1107ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // We'll create two lookup records, 18004664411 and +18004664411, and the below lookup 1108ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // will match both. 1109ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki 11104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1111e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1112e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.clear(); 1113e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup._ID, queryContactId(rawContactId)); 1114e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 1115e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.NUMBER, "18004664411"); 1116e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.TYPE, Phone.TYPE_HOME); 1117e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.putNull(PhoneLookup.LABEL); 1118e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.CUSTOM_RINGTONE, "d"); 1119e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.SEND_TO_VOICEMAIL, 1); 1120ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertStoredValues(lookupUri1, null, null, new ContentValues[] {values, values}); 11214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1122892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // In the context that 8004664411 is a valid number, "4664411" as a 112334984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia // call id should match to both "8004664411" and "+18004664411". 1124e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "4664411"); 112534984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia assertEquals(2, getCount(lookupUri2, null, null)); 1126892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1127892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1128892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void testPhoneLookupUseCases() { 1129892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues values = new ContentValues(); 1130892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri rawContactUri; 1131892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactId; 1132892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri lookupUri2; 1133892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1134892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1135892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1136892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1137892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // International format in contacts 1138892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1139892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1140892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1141892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1142892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "+1-650-861-0000"); 1143892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1144892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1145892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1146892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1147892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0000"); 1148892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1149892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1150892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1151892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0000"); 1152892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1153892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1154892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // National format in contacts 1155892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1156892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1157892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1158892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1159892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1160892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1161892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot1", "Tamale"); 1162892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "650-861-0001"); 1163892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1164892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1165892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1166892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1167892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0001"); 1168892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1169892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1170892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1171892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0001"); 1172892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1173892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1174892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Local format in contacts 1175892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1176892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1177892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1178892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1179892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1180892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1181892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot2", "Tamale"); 1182892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "861-0002"); 1183892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1184892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1185892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1186892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1187892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0002"); 1188892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1189892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1190892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1191892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0002"); 1192892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 11934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 11944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 119556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testIntlPhoneLookupUseCases() { 119656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Checks the logic that relies on using the trailing 7-digits as a fallback for phone 119756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // number lookups. 119856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String fullNumber = "01197297427289"; 119956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 120056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 120156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 120256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 120356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 120456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 120556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, fullNumber); 120656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 120756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Full number should definitely match. 120856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 120956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, fullNumber), null, null)); 121056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 121156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Shorter (local) number with 0 prefix should also match. 121256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 121356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "097427289"), null, null)); 121456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 121556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Shorter (local) number with +0 prefix should also match. 121656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 121756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "+097427289"), null, null)); 121856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 121956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with dashes should match. 122056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 122156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09-742-7289"), null, null)); 122256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 122356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with spaces should match. 122456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 122556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09 742 7289"), null, null)); 122656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 122756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Some other number should not match. 122856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(0, getCount(Uri.withAppendedPath( 122956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "049102395"), null, null)); 123056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 123156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 123256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testPhoneLookupB5252190() { 123356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Test cases from b/5252190 123456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String storedNumber = "796010101"; 123556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 123656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 123756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 123856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 123956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 124056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 124156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, storedNumber); 124256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 124356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 124456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "0796010101"), null, null)); 124556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 124656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 124756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "+48796010101"), null, null)); 124856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 124956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 125056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "48796010101"), null, null)); 125156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 125256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 125356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4-879-601-0101"), null, null)); 125456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 125556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 125656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4 879 601 0101"), null, null)); 125756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 125856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 1259653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov public void testPhoneUpdate() { 1260653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov ContentValues values = new ContentValues(); 1261653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1262653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1263653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1264653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1265653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "18004664411"); 1266653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1267653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1268ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664422"); 1269ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri1, null, null)); 1270ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri2, null, null)); 1271653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1272653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1273653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1274653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1275653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1276ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1277ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 1278653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1279653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Setting number to null will remove the phone lookup record 1280653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1281653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.putNull(Phone.NUMBER); 1282653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1283653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1284ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1285653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov assertEquals(0, getCount(lookupUri2, null, null)); 1286653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1287653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Let's restore that phone lookup record 1288653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1289653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1290653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1291ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1292ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 129381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 1294653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov } 1295653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1296e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** Tests if {@link Callable#CONTENT_URI} returns both phones and sip addresses. */ 1297e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesQuery() { 1298e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId1 = createRawContactWithName("Meghan", "Knox"); 1299e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long phoneId1 = ContentUris.parseId(insertPhoneNumber(rawContactId1, "18004664411")); 1300e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId1 = queryContactId(rawContactId1); 1301e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1302e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId2 = createRawContactWithName("John", "Doe"); 1303e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long sipAddressId2 = ContentUris.parseId( 1304e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId2, "sip@example.com")); 1305e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId2 = queryContactId(rawContactId2); 1306e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1307e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values1 = new ContentValues(); 1308e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data._ID, phoneId1); 1309e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.RAW_CONTACT_ID, rawContactId1); 1310e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(RawContacts.CONTACT_ID, contactId1); 1311e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1312e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.NUMBER, "18004664411"); 1313e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 1314e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.putNull(Phone.LABEL); 1315e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 1316e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1317e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values2 = new ContentValues(); 1318e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data._ID, sipAddressId2); 1319e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.RAW_CONTACT_ID, rawContactId2); 1320e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(RawContacts.CONTACT_ID, contactId2); 1321e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1322e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(SipAddress.SIP_ADDRESS, "sip@example.com"); 1323e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "John Doe"); 1324e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1325e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(2, getCount(Callable.CONTENT_URI, null, null)); 1326e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(Callable.CONTENT_URI, new ContentValues[] { values1, values2 }); 1327e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1328e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1329e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesFilterQuery() { 1330e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Callable.CONTENT_FILTER_URI); 1331e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1332e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 13334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testEmailsQuery() { 13344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 13354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 13364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 13374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 13384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 13394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 13404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 13428ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long rawContactId = ContentUris.parseId(rawContactUri); 13434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 13458ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri = insertEmail(rawContactId, "meghan@acme.com"); 13468ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId = ContentUris.parseId(emailUri); 13474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13488ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 13494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 13504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, emailId); 13514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 13524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 13534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 13544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "meghan@acme.com"); 13554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 13564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 13574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 13584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 13594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 13604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 13614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 13624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 13634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13648ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, values); 136548828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 13664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Email.CONTENT_URI, values, Data._ID, emailId); 13678ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13688ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated email addresses. 13698ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri2 = insertEmail(rawContactId, "meghan@acme.com"); 13708ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId2 = ContentUris.parseId(emailUri2); 13718ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 13728ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, emailId2); 13738ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13748ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Email.CONTENT_URI.buildUpon() 13758ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 13768ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 13778ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13788ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 13798ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 13808ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId), values); 13818ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId2), values2); 13828ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId2), values2); 13838ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13848ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, new ContentValues[] {values, values2}); 13858ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13868ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 13878ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 13888ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 13898ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 13904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 13914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13925e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsLookupQuery() { 13934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Hot", "Tamale"); 13944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertEmail(rawContactId, "tamale@acme.com"); 13954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13965e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "tamale@acme.com"); 13974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 13984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 13994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 14004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 14014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 14024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 14034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(filterUri1, values); 14044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 140508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "Ta<TaMale@acme.com>"); 140608768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertStoredValues(filterUri2, values); 140708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 140808768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "encilada@acme.com"); 140908768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertEquals(0, getCount(filterUri3, null, null)); 14104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 14114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14125e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsFilterQuery() { 141347fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 14145e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 14155e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 14165e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 141747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("Hot", "Tamale", ACCOUNT_2); 14185e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId2, "tamale@acme.com"); 14195e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 14205e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tam"); 14215e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov ContentValues values = new ContentValues(); 14225e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 14235e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 14245e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 14255e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 14265e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.putNull(Email.LABEL); 14275e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 14285e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 14295e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot"); 14305e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri2, values); 14315e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1432155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot tamale"); 14335e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri3, values); 14345e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 14351e530df9f7e496dc47f77d4323c89bd413b79b64Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tamale@acme"); 14365e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri4, values); 14375e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 14385e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri5 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "encilada"); 14395e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 14405e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov } 14415e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 14427d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa /** 1443c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns addresses according to registration order. 1444c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1445c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterDefaultSortOrder() { 1446c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1447c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1448c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com"); 1449c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address3@email.com"); 1450c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1451c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1452c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1453c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1454c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1455c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1456c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1457c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1458c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v1, v2, v3 }); 1459c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1460c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1461c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 1462c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns primary addresses before the other addresses. 1463c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1464c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterPrimaryAddress() { 1465c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1466c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1467c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com", true); 1468c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1469c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1470c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1471c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1472c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1473c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1474c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v2, v1 }); 1475c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1476c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1477c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 14787d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * Tests if ContactsProvider2 has email address associated with a primary account before the 14797d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * other address. 14807d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa */ 14817d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa public void testEmailFilterPrimaryAccount() { 14827d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId1 = createRawContact(ACCOUNT_1); 14837d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId1, "account1@email.com"); 14847d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId2 = createRawContact(ACCOUNT_2); 14857d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId2, "account2@email.com"); 14867d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v1 = new ContentValues(); 14877d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v1.put(Email.ADDRESS, "account1@email.com"); 14887d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v2 = new ContentValues(); 14897d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v2.put(Email.ADDRESS, "account2@email.com"); 14907d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 14917d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri1 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 14927d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 14937d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_1.type) 14947d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 14957d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2 }); 14967d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 14977d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 14987d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 14997d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_2.type) 15007d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 15017d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v2, v1 }); 15027d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 15037d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa // Just with PRIMARY_ACCOUNT_NAME 15047d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 15057d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 15067d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 15077d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2 }); 15087d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 15097d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 15107d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 15117d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 15127d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v2, v1 }); 15137d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 15147d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 151546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** Tests {@link DataUsageFeedback} correctly promotes a data row instead of a raw contact. */ 151646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public void testEmailFilterSortOrderWithFeedback() { 151746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId1 = createRawContact(); 15184928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address1 = "address1@email.com"; 15194928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId1, address1); 152046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId2 = createRawContact(); 15214928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address2 = "address2@email.com"; 15224928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId2, address2); 15234928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address3 = "address3@email.com"; 15244928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa ContentUris.parseId(insertEmail(rawContactId2, address3)); 152546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 152646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v1 = new ContentValues(); 152746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 152846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v2 = new ContentValues(); 152946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 153046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v3 = new ContentValues(); 153146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 153246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 153346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 153446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 153546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 153646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_CALL) 153746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 153846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 153946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 154046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT) 154146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 154246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 154346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 154446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_SHORT_TEXT) 154546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 154646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2, v3 }); 154746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v1, v2, v3 }); 154846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2, v3 }); 154946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v1, v2, v3 }); 155046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 15514928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(address3, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, v3); 155246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 155346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa // account3@email.com should be the first. account2@email.com should also be promoted as 155446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa // it has same contact id. 155546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v3, v1, v2 }); 155646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v3, v1, v2 }); 155746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 155846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1559f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa /** 1560f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * Tests {@link DataUsageFeedback} correctly bucketize contacts using each 1561f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * {@link DataUsageStatColumns#LAST_TIME_USED} 1562f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa */ 1563f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa public void testEmailFilterSortOrderWithOldHistory() { 1564f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long rawContactId1 = createRawContact(); 1565f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId1 = ContentUris.parseId(insertEmail(rawContactId1, "address1@email.com")); 1566f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId2 = ContentUris.parseId(insertEmail(rawContactId1, "address2@email.com")); 1567f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId3 = ContentUris.parseId(insertEmail(rawContactId1, "address3@email.com")); 1568f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId4 = ContentUris.parseId(insertEmail(rawContactId1, "address4@email.com")); 1569f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1570f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1571f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1572f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1573f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1574f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1575f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1576f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1577f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1578f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v4 = new ContentValues(); 1579f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v4.put(Email.ADDRESS, "address4@email.com"); 1580f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1581f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa final ContactsProvider2 provider = (ContactsProvider2) getProvider(); 1582f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1583f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long nowInMillis = System.currentTimeMillis(); 1584f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000); 1585f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000); 1586f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000); 1587f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1588f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address4 is contacted just once yesterday. 1589f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId4), 1590f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, yesterdayInMillis); 1591f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1592f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address3 is contacted twice 1 week ago. 1593f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1594f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1595f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1596f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1597f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1598f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is contacted three times 1 year ago. 1599f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1600f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1601f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1602f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1603f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1604f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1605f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1606f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // auto-complete should prefer recently contacted methods 1607f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v4, v3, v2, v1 }); 1608f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1609f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address2 is contacted right now 1610f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1611f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1612f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1613f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Now address2 is the most recently used address 1614f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v4, v3, v1 }); 1615f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1616f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address1 is contacted right now 1617f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId1), 1618f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1619f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1620f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is preferred to address1 as address2 is used 4 times in total 1621f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v1, v4, v3 }); 1622f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa } 1623f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 16244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPostalsQuery() { 16254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Alice", "Nextore"); 16264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 16278ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId = ContentUris.parseId(dataUri); 16284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16298ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 16304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 16314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, dataId); 16324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 16334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 16344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 16354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(StructuredPostal.FORMATTED_ADDRESS, "1600 Amphiteatre Ave, Mountain View"); 16364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Alice Nextore"); 16374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16388ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, values); 163948828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 164048828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov values); 16414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(StructuredPostal.CONTENT_URI, values, Data._ID, dataId); 16428ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16438ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated addresses. 16448ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa Uri dataUri2 = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 16458ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId2 = ContentUris.parseId(dataUri2); 16468ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 16478ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, dataId2); 16488ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16498ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = StructuredPostal.CONTENT_URI.buildUpon() 16508ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 16518ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 16528ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16538ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 16548ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 16558ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values); 16568ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId), values); 16578ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId2), 16588ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2); 16598ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId2), values2); 16608ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16618ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, new ContentValues[] {values, values2}); 16628ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16638ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 16648ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 16658ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 16668ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 16674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testQueryContactData() { 16704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 16714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1672aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1673d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 16744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 16754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(contactUri, values); 16774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 16784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16800a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testQueryContactWithStatusUpdate() { 16814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 16824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1683aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1684aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 168582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1686aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori values.put(Contacts.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 1687ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 1688ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 1689ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelectionWithProjection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 16904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1692a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByName() { 16934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 169448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1695aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1696d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1697aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 169848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 169948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov ContentValues nameValues = new ContentValues(); 170048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.GIVEN_NAME, "Stu"); 170148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.FAMILY_NAME, "Goulash"); 17023b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "goo"); 17033b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "LASH"); 17047ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, nameValues); 170548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 170648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long contactId = queryContactId(rawContactId); 170782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 170848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1709ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goulash"); 1710ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 17114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 171248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov assertContactFilter(contactId, "goolash"); 17133b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov assertContactFilter(contactId, "lash"); 171448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1715a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 17163b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov 17173b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov // Phonetic name with given/family reversed should not match 1718a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("lashgoo"); 17197ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 17207ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.clear(); 17217ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "ga"); 17227ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "losh"); 17237ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 17247ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov mResolver.update(nameUri, nameValues, null, null); 17257ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 17267ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov assertContactFilter(contactId, "galosh"); 17277ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 1728a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1729a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1730a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1731a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByEmailAddress() { 1732a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1733a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1734a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1735a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1736a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1737a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1738a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1739a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1740a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1741a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1742a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1743a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goog411@acme.com"); 1744a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1745a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1746a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog"); 1747a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411"); 1748a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@"); 1749a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme"); 1750a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme.com"); 1751a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1752a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@acme.combo"); 1753a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@le.com"); 1754a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1755a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1756a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1757a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByPhoneNumber() { 1758a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1759a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1760a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1761a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1762a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1763a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1764a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1765a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1766a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1767a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1768a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1769a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "18004664411"); 1770a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1771a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1772a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "18004664411"); 1773a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "1800466"); 1774a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "+18004664411"); 1775a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "8004664411"); 1776a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1777a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("78004664411"); 1778a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("18004664412"); 1779a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("8884664411"); 17804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 17814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17822f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa /** 17832f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * Checks ContactsProvider2 works well with strequent Uris. The provider should return starred 17842f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * contacts and frequently used contacts. 17852f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa */ 1786ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactStrequent() { 17874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 17882f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String email1 = "a@acme.com"; 17892f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted1 = 0; 17904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Noah", "Tever", "18004664411", 17912f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa email1, StatusUpdates.OFFLINE, timesContacted1, 0, 0, 1792d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 17934928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final String phoneNumber2 = "18004664412"; 17944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 17954928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa createContact(values2, "Sam", "Times", phoneNumber2, 1796aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "b@acme.com", StatusUpdates.INVISIBLE, 3, 0, 0, 1797aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 17984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values3 = new ContentValues(); 17992f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String phoneNumber3 = "18004664413"; 18002f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted3 = 5; 18012f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa createContact(values3, "Lotta", "Calling", phoneNumber3, 18022f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, timesContacted3, 0, 0, 1803d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO); 18044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values4 = new ContentValues(); 18059dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa final long rawContactId4 = createRawContact(values4, "Fay", "Veritt", null, 1806aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 1807d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO | StatusUpdates.CAPABILITY_HAS_VOICE); 18084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 18092f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Starred contacts should be returned. TIMES_CONTACTED should be ignored and only data 18102f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // usage feedback should be used for "frequently contacted" listing. 18112f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(Contacts.CONTENT_STREQUENT_URI, values4); 18122f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 18132f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Send feedback for the 3rd phone number, pretending we called that person via phone. 18144928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 18152f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 18162f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 3rd contact should be shown after starred one. 18172f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 18182f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa new ContentValues[] { values4, values3 }); 18192f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 18204928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 18212f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Twice. 18224928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 18232f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 18242f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 1st and 3rd contacts should be shown after starred one. 18252f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 18264928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa new ContentValues[] { values4, values1, values3 }); 18272f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 18289dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // With phone-only parameter, 1st and 4th contacts shouldn't be returned because: 18299dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 1st: feedbacks are only about email, not about phone call. 18309dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 4th: it has no phone number though starred. 18312f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Uri phoneOnlyStrequentUri = Contacts.CONTENT_STREQUENT_URI.buildUpon() 18322f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true") 18332f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .build(); 18349dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values3 }); 18359dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 18369dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Now the 4th contact has a phone number. 18379dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId4, "18004664414"); 18389dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 18399dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Phone only strequent should return 4th contact. 18404928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 18414928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 18424928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // Send feedback for the 2rd phone number, pretending we send the person a SMS message. 18434928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber2, DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, values1); 18444928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 18454928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // SMS feedback shouldn't affect phone-only results. 18464928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 18474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1848ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, "fay"); 18492f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(filterUri, values4); 18504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 18514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 185245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa /** 185345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * Checks ContactsProvider2 works well with frequent Uri. The provider should return frequently 185445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * contacted person ordered by number of times contacted. 185545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa */ 185645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa public void testQueryContactFrequent() { 185745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values1 = new ContentValues(); 185845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email1 = "a@acme.com"; 185945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values1, "Noah", "Tever", "18004664411", 186045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email1, StatusUpdates.OFFLINE, 0, 0, 0, 0); 186145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values2 = new ContentValues(); 186245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email2 = "b@acme.com"; 186345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values2, "Sam", "Times", "18004664412", 186445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0); 186545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values3 = new ContentValues(); 186645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String phoneNumber3 = "18004664413"; 1867363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa final long contactId3 = createContact(values3, "Lotta", "Calling", phoneNumber3, 1868363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, 0, 1, 0, 0); 186945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values4 = new ContentValues(); 187045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values4, "Fay", "Veritt", "18004664414", 187145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 0); 187245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 187345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 187445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 187545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, values1); 187645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 187745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Pretend email was sent to the address twice. 187845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 187945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 188045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 188145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1}); 188245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 188345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Three times 188445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 188545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 188645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 188745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 188845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 188945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 1890363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 1891363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa // Test it works with selection/selectionArgs 1892363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1893363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 1894363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values2, values1}); 1895363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1896363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 1897363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3}); 1898363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 1899363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3.put(Contacts.STARRED, 0); 1900363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertEquals(1, 1901363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa mResolver.update(Uri.withAppendedPath(Contacts.CONTENT_URI, 1902363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa String.valueOf(contactId3)), 1903363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3, null, null)); 1904363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1905363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 1906363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 1907363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1908363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 1909363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {}); 191045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa } 191145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 1912ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactGroup() { 19134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long groupId = createGroup(null, "testGroup", "Test Group"); 19144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 19154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 19164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Best", "West", "18004664411", 1917aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "west@acme.com", StatusUpdates.OFFLINE, 0, 0, groupId, 1918aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 19194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 19204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 19214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values2, "Rest", "East", "18004664422", 1922aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "east@acme.com", StatusUpdates.AVAILABLE, 0, 0, 0, 1923aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 19244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1925ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 19264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Cursor c = mResolver.query(filterUri1, null, null, null, Contacts._ID); 19274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 19284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 19294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values1); 19304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 19314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1932ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 19334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri2, null, Contacts.DISPLAY_NAME + "=?", 19344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov new String[] { "Best West" }, Contacts._ID); 19354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 19364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 19374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1938ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Next Group"); 19394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri3, null, null, null, Contacts._ID); 19404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, c.getCount()); 19414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 19423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 19433cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 194436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro private void expectSecurityException(String failureMessage, Uri uri, String[] projection, 194536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String selection, String[] selectionArgs, String sortOrder) { 194624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 194724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 194836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro c = mResolver.query(uri, projection, selection, selectionArgs, sortOrder); 194936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail(failureMessage); 195024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 195136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // The security exception is expected to occur because we're missing a permission. 195224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 195324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 195424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 195524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 195624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 195736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 195836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 195936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testQueryProfileRequiresReadPermission() { 196036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 196136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 196236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro createBasicProfileContact(new ContentValues()); 196336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 196436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Case 1: Retrieving profile contact. 196536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 196636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile without READ_PROFILE access should fail.", 196736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI, null, null, null, Contacts._ID); 196824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 196924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieving profile data. 197036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 197136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile data without READ_PROFILE access should fail.", 197236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 197336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 197424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 197524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieving profile entities. 197636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 197736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile entities without READ_PROFILE access should fail.", 197836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon() 197936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entities").build(), null, null, null, Contacts._ID); 198024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 198124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 198224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByContactIdRequiresReadPermission() { 198324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 198424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 198524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 198624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 198724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 198824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // A query for the profile contact by ID should fail. 198936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 199036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile by contact ID without READ_PROFILE access should fail.", 199136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 199236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 199324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 199424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 199524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByRawContactIdRequiresReadPermission() { 199624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 199724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 199824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the raw contact. 199924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 200036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 200136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 200236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, 200336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro profileRawContactId), null, null, null, RawContacts._ID); 200424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 200524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 200624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileRawContactRequiresReadPermission() { 200724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 200824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 200924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the profile's raw contact data. 201024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 201124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 201224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 1: Retrieve the overall raw contact set for the profile. 201336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 201436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 201536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, null, null, null, null); 201624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 201724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieve the raw contact profile data for the inserted raw contact ID. 201836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 201936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile data without READ_PROFILE access should fail.", 202036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 202136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 202236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("data").build(), null, null, null, null); 202324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 202424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieve the raw contact profile entity for the inserted raw contact ID. 202536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 202636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile entities without READ_PROFILE access should fail.", 202736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 202836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 202936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entity").build(), null, null, null, null); 203024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 203124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 203224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataByDataIdRequiresReadPermission() { 203324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 203424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = mResolver.query(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 203524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro new String[]{Data._ID, Data.MIMETYPE}, null, null, null); 203624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(4, c.getCount()); // Photo, phone, email, name. 203724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.moveToFirst(); 203824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileDataId = c.getLong(0); 203924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 204024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 204124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the data 204224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 204336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 204436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 204536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, profileDataId), 204636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 204724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 204824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 204924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataRequiresReadPermission() { 205024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 205124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 205224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve all profile data. 205324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 205436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 205536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 205636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 205736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 205824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 205924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 206024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileRequiresWritePermission() { 206124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 206224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 206324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a non-profile contact should be fine. 206424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(new ContentValues()); 206524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 206624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a profile contact should throw an exception. 206724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 206824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 206924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Creating a profile contact should fail without WRITE_PROFILE access."); 207024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 207124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 207224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 207324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 207424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileDataRequiresWritePermission() { 207524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 207624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 207724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 207824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 207924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertEmail(profileRawContactId, "foo@bar.net", false); 208024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Inserting data into a profile contact should fail without WRITE_PROFILE access."); 208124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 208224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 208324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 208424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 20856ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro public void testUpdateDataDoesNotRequireProfilePermission() { 20866ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 20876ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 20886ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 20896ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Create a non-profile contact. 20906ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long rawContactId = createRawContactWithName("Domo", "Arigato"); 20916ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long dataId = getStoredLongValue(Data.CONTENT_URI, 20926ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", 20936ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(rawContactId), StructuredName.CONTENT_ITEM_TYPE}, 20946ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data._ID); 20956ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 20966ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Updates its name using a selection. 20976ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro ContentValues values = new ContentValues(); 20986ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.GIVEN_NAME, "Bob"); 20996ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.FAMILY_NAME, "Blob"); 21006ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 21016ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(dataId)}); 21026ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 21036ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Check that the update went through. 21046ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro assertStoredValues(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), values); 21056ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro } 21066ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 21075d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro public void testQueryContactThenProfile() { 210824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 210924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 211024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 211124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 211224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 211324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createBasicNonProfileContact(nonProfileValues); 211424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileContactId = queryContactId(nonProfileRawContactId); 211524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 21165d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Contacts.CONTENT_URI, nonProfileValues); 211724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertSelection(Contacts.CONTENT_URI, nonProfileValues, Contacts._ID, nonProfileContactId); 21185d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 21195d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 212024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 212124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 212224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryContactExcludeProfile() { 212324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a profile contact (it should not be returned by the general contact URI). 212424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 212524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 212624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a non-profile contact - this should be returned. 212724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 212824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(nonProfileValues); 212924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 213024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Contacts.CONTENT_URI, new ContentValues[] {nonProfileValues}); 213124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 213224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 213324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfile() { 213424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 213524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 213624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 213724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 213824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 213924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 214024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private ContentValues[] getExpectedProfileDataValues() { 214124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected photo data values (only field is the photo BLOB, which we can't check). 214224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues photoRow = new ContentValues(); 214324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro photoRow.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 214424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 214524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected phone data values. 214624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues phoneRow = new ContentValues(); 214724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 214824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Phone.NUMBER, "18005554411"); 214924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 215024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected email data values. 215124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues emailRow = new ContentValues(); 215224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 215324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Email.ADDRESS, "mia.prophyl@acme.com"); 215424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 215524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected name data values. 215624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nameRow = new ContentValues(); 215724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 215824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.DISPLAY_NAME, "Mia Prophyl"); 215924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.GIVEN_NAME, "Mia"); 216024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.FAMILY_NAME, "Prophyl"); 216124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 216224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return new ContentValues[]{photoRow, phoneRow, emailRow, nameRow}; 216324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 216424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 216524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileData() { 216624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 216724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 216824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 216924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 217024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 217124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 217224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileEntities() { 217324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 217424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 217524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("entities").build(), 217624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 217724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 217824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 217924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfile() { 218024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 218124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 218224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 218324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 218424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 218524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, profileValues); 218624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 218724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 218824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileById() { 218924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 219024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 219124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 219224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 219324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 219424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 219524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId), profileValues); 219624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 219724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 219824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileData() { 219924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 220024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 220124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 220224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 220324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("data").build(), getExpectedProfileDataValues()); 220424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 220524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 220624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileEntity() { 220724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 220824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 220924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 221024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 221124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("entity").build(), getExpectedProfileDataValues()); 221224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 221324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 221424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryDataForProfile() { 221524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 221624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 221724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 221824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 221924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 222024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 2221cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro public void testUpdateProfileRawContact() { 2222cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro createBasicProfileContact(new ContentValues()); 2223cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro ContentValues updatedValues = new ContentValues(); 2224cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.SEND_TO_VOICEMAIL, 0); 2225cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.CUSTOM_RINGTONE, "rachmaninoff3"); 2226cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.STARRED, 1); 2227cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro mResolver.update(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues, null, null); 2228cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2229cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues); 2230cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro } 2231cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2232a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro public void testInsertProfileWithDataSetTriggersAccountCreation() { 2233a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that we have no profile raw contacts. 2234a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, new ContentValues[]{}); 2235a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2236a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Insert a profile record with a new data set. 2237a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Account account = new Account("a", "b"); 2238a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro String dataSet = "c"; 2239a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Uri profileUri = maybeAddAccountQueryParameters(Profile.CONTENT_RAW_CONTACTS_URI, account) 2240a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro .buildUpon().appendQueryParameter(RawContacts.DATA_SET, dataSet).build(); 2241a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro ContentValues values = new ContentValues(); 2242a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(profileUri, values)); 2243a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro values.put(RawContacts._ID, rawContactId); 2244a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2245a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that querying for the profile gets the created raw contact. 2246a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, values); 2247a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro } 2248a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 224985077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfilePhoto() throws IOException { 225085077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 225185077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 225285077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro assertInputStreamContent( 225385077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.THUMBNAIL), 225485077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, false)); 225585077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 225685077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 225785077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfileDisplayPhoto() throws IOException { 225885077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 225985077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 226085077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro assertInputStreamContent( 226185077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 226285077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, true)); 226385077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 226485077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 22650a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testPhonesWithStatusUpdate() { 226619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 226719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov ContentValues values = new ContentValues(); 226819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 226919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 227019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 227119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 227219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 227319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 227419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664412"); 227519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog411@acme.com"); 227619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog412@acme.com"); 227719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 227882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 2279aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.INVISIBLE, "Bad", 2280aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 228182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog412@acme.com", 2282aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, "Good", 2283aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VOICE); 228419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long contactId = queryContactId(rawContactId); 228519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 228682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri uri = Data.CONTENT_URI; 228719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 2288a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov Cursor c = mResolver.query(uri, null, RawContacts.CONTACT_ID + "=" + contactId + " AND " 2289a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", null, Phone.NUMBER); 229019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertEquals(2, c.getCount()); 229119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 229219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToFirst(); 229319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 229419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 229582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 22960a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 229719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 229819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 229919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2300a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 230119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 230219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 230319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToNext(); 230419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 230519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 230682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 23070a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 230819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 230919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664412"); 231019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2311a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 231219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 231319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 231419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.close(); 231519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov } 231619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 231789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testGroupQuery() { 231889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 231989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 232089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId1 = createGroup(account1, "e", "f"); 232189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId2 = createGroup(account2, "g", "h"); 232289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account1); 232389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account2); 232489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 232589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 232689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Groups._ID + "=" + groupId1, null, Groups._ID, groupId1) ; 232789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Groups._ID + "=" + groupId2, null, Groups._ID, groupId2) ; 232889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 232989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 23303cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testGroupInsert() { 23313cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 23323cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 23333cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_NAME, "a"); 23343cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_TYPE, "b"); 23359d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki values.put(Groups.DATA_SET, "ds"); 23363cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SOURCE_ID, "c"); 23373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.VERSION, 42); 23383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.GROUP_VISIBLE, 1); 23393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE, "d"); 23403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE_RES, 1234); 23413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.NOTES, "e"); 23423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.RES_PACKAGE, "f"); 23433cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYSTEM_ID, "g"); 234494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana values.put(Groups.DELETED, 1); 23453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC1, "h"); 23463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC2, "i"); 23473cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC3, "j"); 23483cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC4, "k"); 23493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 23503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(Groups.CONTENT_URI, values); 23513cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 235273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.DIRTY, 1); 23533cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 23543cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 23553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 2356f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupCreationAfterMembershipInsert() { 2357f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2358f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2359f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2360f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId = assertSingleGroup(NO_LONG, mAccount, "gsid1", null); 2361f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2362f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId, "gsid1"); 2363f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2364f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2365f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupReuseAfterMembershipInsert() { 2366f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2367f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2368f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2369f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2370f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroup(groupId1, mAccount, "gsid1", "title1"); 2371f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2372f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId1, "gsid1"); 2373f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2374f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2375f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupInsertFailureOnGroupIdConflict() { 2376f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2377f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2378f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2379f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues values = new ContentValues(); 2380f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.RAW_CONTACT_ID, rawContactId1); 2381f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 2382f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_SOURCE_ID, "gsid1"); 2383f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_ROW_ID, groupId1); 2384f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa try { 2385f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa mResolver.insert(Data.CONTENT_URI, values); 2386f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa fail("the insert was expected to fail, but it succeeded"); 2387f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } catch (IllegalArgumentException e) { 2388f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // this was expected 2389f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2390f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2391f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 23925f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testGroupDelete_byAccountSelection() { 23935f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account1 = new Account("accountName1", "accountType1"); 23945f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account2 = new Account("accountName2", "accountType2"); 23955f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 23965f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId1 = createGroup(account1, "sourceId1", "title1"); 23975f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId2 = createGroup(account2, "sourceId2", "title2"); 23985f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId3 = createGroup(account2, "sourceId3", "title3"); 23995f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24005f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final int numDeleted = mResolver.delete(Groups.CONTENT_URI, 24015f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?", 24025f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[]{account2.name, account2.type}); 24035f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(2, numDeleted); 24045f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24055f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v1 = new ContentValues(); 24065f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups._ID, groupId1); 24075f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups.DELETED, 0); 24085f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24095f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v2 = new ContentValues(); 24105f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups._ID, groupId2); 24115f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups.DELETED, 1); 24125f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24135f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v3 = new ContentValues(); 24145f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups._ID, groupId3); 24155f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups.DELETED, 1); 24165f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24175f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 }); 24185f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 24195f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24205f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testGroupDelete_byAccountParam() { 24215f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account1 = new Account("accountName1", "accountType1"); 24225f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account2 = new Account("accountName2", "accountType2"); 24235f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24245f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId1 = createGroup(account1, "sourceId1", "title1"); 24255f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId2 = createGroup(account2, "sourceId2", "title2"); 24265f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId3 = createGroup(account2, "sourceId3", "title3"); 24275f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24285f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final int numDeleted = mResolver.delete( 24295f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Groups.CONTENT_URI.buildUpon() 24305f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .appendQueryParameter(Groups.ACCOUNT_NAME, account2.name) 24315f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .appendQueryParameter(Groups.ACCOUNT_TYPE, account2.type) 24325f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .build(), 24335f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki null, null); 24345f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(2, numDeleted); 24355f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24365f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v1 = new ContentValues(); 24375f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups._ID, groupId1); 24385f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups.DELETED, 0); 24395f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24405f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v2 = new ContentValues(); 24415f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups._ID, groupId2); 24425f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups.DELETED, 1); 24435f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24445f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v3 = new ContentValues(); 24455f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups._ID, groupId3); 24465f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups.DELETED, 1); 24475f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 24485f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 }); 24495f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 24505f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 2451f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupSummaryQuery() { 2452f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account1 = new Account("accountName1", "accountType1"); 2453f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account2 = new Account("accountName2", "accountType2"); 2454f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId1 = createGroup(account1, "sourceId1", "title1"); 2455f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId2 = createGroup(account2, "sourceId2", "title2"); 2456f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId3 = createGroup(account2, "sourceId3", "title3"); 2457f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2458f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Prepare raw contact id not used at all, to test group summary uri won't be confused 2459f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // with it. 2460f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId0 = createRawContactWithName("firstName0", "lastName0"); 2461f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2462f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("firstName1", "lastName1"); 2463f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 2464f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId1, groupId1); 2465f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2466f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("firstName2", "lastName2"); 2467f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId2, "address2@email.com"); 2468f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId2, "222-222-2222"); 2469f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId2, groupId1); 2470f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2471f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v1 = new ContentValues(); 2472f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups._ID, groupId1); 2473f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.TITLE, "title1"); 2474f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SOURCE_ID, "sourceId1"); 2475f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_NAME, account1.name); 2476f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_TYPE, account1.type); 2477f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_COUNT, 2); 2478f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, 1); 2479f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2480f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v2 = new ContentValues(); 2481f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups._ID, groupId2); 2482f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.TITLE, "title2"); 2483f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SOURCE_ID, "sourceId2"); 2484f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_NAME, account2.name); 2485f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_TYPE, account2.type); 2486f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, 0); 2487f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, 0); 2488f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2489f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v3 = new ContentValues(); 2490f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups._ID, groupId3); 2491f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.TITLE, "title3"); 2492f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SOURCE_ID, "sourceId3"); 2493f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_NAME, account2.name); 2494f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_TYPE, account2.type); 2495f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_COUNT, 0); 2496f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_WITH_PHONES, 0); 2497f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2498f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2499f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2500f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Now rawContactId1 has two phone numbers. 2501f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1111"); 2502f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1112"); 2503f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Result should reflect it correctly (don't count phone numbers but raw contacts) 2504f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, v1.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2505f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2506f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2507f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce new raw contact, pretending the user added another info. 2508f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId3 = createRawContactWithName("firstName3", "lastName3"); 2509f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId3, "address3@email.com"); 2510f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId3, "333-333-3333"); 2511f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId3, groupId2); 2512f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, v2.getAsInteger(Groups.SUMMARY_COUNT) + 1); 2513f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, v2.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2514f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2515f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2516f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 251718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki final Uri uri = Groups.CONTENT_SUMMARY_URI; 251818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki 251918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki // TODO Once SUMMARY_GROUP_COUNT_PER_ACCOUNT is supported remove all the if(false). 252018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 252118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1); 252218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 252318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 252418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 252518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 252618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 252718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 252818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2529f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3 }); 2530f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2531f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce another group in account1, testing SUMMARY_GROUP_COUNT_PER_ACCOUNT correctly 2532f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // reflects the change. 2533f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId4 = createGroup(account1, "sourceId4", "title4"); 253418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 253518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 253618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1); 253718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 253818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 253918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2540f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v4 = new ContentValues(); 2541f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups._ID, groupId4); 2542f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.TITLE, "title4"); 2543f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SOURCE_ID, "sourceId4"); 2544f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_NAME, account1.name); 2545f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_TYPE, account1.type); 2546f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_COUNT, 0); 2547f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_WITH_PHONES, 0); 254818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 254918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 255018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT)); 255118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 255218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 255318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2554f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3, v4 }); 255523ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki 255623ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // We change the tables dynamically according to the requested projection. 255723ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // Make sure the SUMMARY_COUNT column exists 255823ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.clear(); 255923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.put(Groups.SUMMARY_COUNT, 2); 256023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.clear(); 256123ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.put(Groups.SUMMARY_COUNT, 1); 256223ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.clear(); 256323ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.put(Groups.SUMMARY_COUNT, 0); 256423ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.clear(); 256523ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.put(Groups.SUMMARY_COUNT, 0); 256623ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki assertStoredValuesWithProjection(uri, new ContentValues[] { v1, v2, v3, v4 }); 2567f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2568f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 256989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testSettingsQuery() { 257089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 257189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 2572f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account3 = new AccountWithDataSet("e", "f", "plus"); 257389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account1, "0", "0"); 257489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account2, "1", "1"); 2575f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account3, "1", "0"); 257689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account1); 257789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account2); 2578f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Uri uri3 = Settings.CONTENT_URI.buildUpon() 2579f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_NAME, account3.getAccountName()) 2580f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_TYPE, account3.getAccountType()) 2581f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.DATA_SET, account3.getDataSet()) 2582f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .build(); 258389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 258489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 2585f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertEquals(1, getCount(uri3, null, null)); 258689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.SHOULD_SYNC, "0") ; 2587f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri1, Settings.UNGROUPED_VISIBLE, "0"); 258889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.SHOULD_SYNC, "1") ; 2589f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri2, Settings.UNGROUPED_VISIBLE, "1"); 2590f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.SHOULD_SYNC, "1"); 2591f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.UNGROUPED_VISIBLE, "0"); 2592f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro } 2593f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 2594f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro public void testSettingsInsertionPreventsDuplicates() { 2595f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Account account1 = new Account("a", "b"); 2596f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account2 = new AccountWithDataSet("c", "d", "plus"); 2597f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account1, "0", "0"); 2598f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account2, "1", "1"); 2599f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 26000e21a867a572679d64d79041eb574d13665178d4Dave Santoro // Now try creating the settings rows again. It should update the existing settings rows. 26010e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account1, "1", "0"); 26020e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 26030e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=?", 26040e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"a", "b"}, Settings.SHOULD_SYNC, "1"); 26050e21a867a572679d64d79041eb574d13665178d4Dave Santoro 26060e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account2, "0", "1"); 26070e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 26080e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=? AND " + 26090e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.DATA_SET + "=?", 26100e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"c", "d", "plus"}, Settings.SHOULD_SYNC, "0"); 261189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 261289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 26134097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsUnspecified() { 2614d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 26154097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 26164097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 26175ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 26184097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 261917a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 26204097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 26214097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 262267c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov public void testDisplayNameParsingWhenPartsAreNull() { 262367c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov long rawContactId = createRawContact(); 262467c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov ContentValues values = new ContentValues(); 262567c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 262667c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 262767c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 262867c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov insertStructuredName(rawContactId, values); 262917a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 263067c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov } 263167c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov 26324097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsSpecified() { 2633d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 26344097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 26354097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 26364097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Johnson"); 26375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 26384097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 26395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertStructuredName(rawContactId, null, null, null, "Johnson", null); 26404097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 26414097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 26425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithoutPhoneticName() { 26435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final long rawContactId = createRawContact(null); 26445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 26465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 26475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 26485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "K."); 26495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 26505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 26515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 26525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 26545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 265555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 265655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 26575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 26585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 26595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 26605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 26615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 26635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 26645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 26665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 266755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 266855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 26695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 26705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 26715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 26725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 26735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 26755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 26765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 26775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 26795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 26805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithChineseName() { 26835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // Only run this test when Chinese collation is supported 26855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.CHINA)) { 26865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 26875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 26905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 26925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "\u6BB5\u5C0F\u6D9B"); 26935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 26945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 26965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 26975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 26985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 26995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 27005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 27014cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 27024cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 27035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 27055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 27065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 27095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 27105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 27115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 27125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 27134cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 27144cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 27155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 27175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 27185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 27195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 27215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 27225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 27235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithJapaneseName() { 27255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 27265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 27285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "\u7A7A\u6D77"); 27295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PHONETIC_GIVEN_NAME, "\u304B\u3044\u304F\u3046"); 27305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 27315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 27345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 27355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 27365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 27375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 27385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 27395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 27405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 27425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 27435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 27465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 27475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 27485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 27495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 27505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 27515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 27525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 27545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 27555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 27565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 27585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 27595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 27605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 276125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov public void testDisplayNameUpdate() { 276225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId1 = createRawContact(); 276325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertEmail(rawContactId1, "potato@acme.com", true); 276425abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 276525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId2 = createRawContact(); 276625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertPhoneNumber(rawContactId2, "123456789", true); 276725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 27680c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 27690c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 277025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 277125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "123456789"); 277225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 277325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertStructuredName(rawContactId2, "Potato", "Head"); 277425abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 277525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Potato Head"); 277681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 277725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 277825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 277901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov public void testDisplayNameFromData() { 278001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long rawContactId = createRawContact(); 278101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2782a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka ContentValues values = new ContentValues(); 278301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 278401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 278501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 278601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 278701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "mike@monstersinc.com"); 278801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "mike@monstersinc.com"); 278901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 279001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "james@monstersinc.com", true); 279101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "james@monstersinc.com"); 279201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 279301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertPhoneNumber(rawContactId, "1-800-466-4411"); 279401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "1-800-466-4411"); 279501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 2796a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there are title and company, the company is display name. 2797a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 2798a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.COMPANY, "Monsters Inc"); 27995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 280001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Monsters Inc"); 280101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 2802a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is nickname, that is display name. 2803a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertNickname(rawContactId, "Sully"); 2804a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "Sully"); 2805a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 2806a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is structured name, that is display name. 2807a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 2808a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.GIVEN_NAME, "James"); 2809a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.MIDDLE_NAME, "P."); 2810a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.FAMILY_NAME, "Sullivan"); 2811a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertStructuredName(rawContactId, values); 28125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "James P. Sullivan"); 28135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 28145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithoutPhoneticName() { 28165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 28175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 28185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 28195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 28215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 28235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.TITLE, "Protagonist"); 28255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 28265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Protagonist"); 28275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there are title and company, the company is display name. 28295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "Monsters Inc"); 28315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mResolver.update(organizationUri, values, null, null); 28325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Monsters Inc"); 28355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 28365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 28375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "Monsters Inc"); 28385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Monsters Inc"); 28395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 28405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 28415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithJapanesePhoneticName() { 28435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 28445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 28455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 28465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 28485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 28505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "DoCoMo"); 28525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 28535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 28545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "DoCoMo"); 28575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 28585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 28595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u30C9\u30B3\u30E2"); 28605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u30C9\u30B3\u30E2"); 28615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 28625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 28635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithChineseName() { 28650b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov boolean hasChineseCollator = false; 28660b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov final Locale locale[] = Collator.getAvailableLocales(); 28670b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov for (int i = 0; i < locale.length; i++) { 28680b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (locale[i].equals(Locale.CHINA)) { 28690b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov hasChineseCollator = true; 28700b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov break; 28710b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 28720b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 28730b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 28740b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (!hasChineseCollator) { 28750b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov return; 28760b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 28770b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 28785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 28795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 28805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 28815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 28835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 28855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "\u4E2D\u56FD\u7535\u4FE1"); 28875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 28885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "\u4E2D\u56FD\u7535\u4FE1"); 28915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 28925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 28934cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 28944cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 28955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 289601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 289701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 289831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov public void testLookupByOrganization() { 289931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long rawContactId = createRawContact(); 290031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long contactId = queryContactId(rawContactId); 290131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov ContentValues values = new ContentValues(); 290231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 290331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 290431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 290531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "president"); 290631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 290731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 290831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 290931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 291031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 291131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 291231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.DEPARTMENT, "software"); 291331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 291431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 291531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 291631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 291731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 291831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 291931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "incredibles"); 292031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 292131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 292231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 292331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 292431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 292531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 292631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "director"); 292731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 292831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 292931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 293031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "director"); 293131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 293231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 293331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "monsters"); 293431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "scarer"); 293531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 293631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 293731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "monsters"); 293831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "scarer"); 293931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 294031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 294131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov private void assertContactFilter(long contactId, String filter) { 294231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(filter)); 294331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertStoredValue(filterUri, Contacts._ID, contactId); 294431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 294531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 2946a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private void assertContactFilterNoResult(String filter) { 2947a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, filter); 2948a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 2949a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 2950a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2951916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetOrganization() throws Exception { 2952916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 2953916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2954916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2955916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Some random data element 2956916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "inc@corp.com"); 2957916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2958916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2959916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2960916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 29619c6ef008d92017108e3d10dcd8e2146eded9e148Dmitri Plotnikov values.put(Organization.TITLE, "engineer"); 2962916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 2963916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2964916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another matching organization 2965916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmeinc"); 2966916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 2967916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2968916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another non-matching organization 2969916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "corpacme"); 2970916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 2971916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2972916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // And another data element 2973916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "emca@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 2974916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 29756f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 2976916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2977916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2978916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 29793716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "engineer, [acmecorp]"); 2980916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2981916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2982916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2983916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetEmail() throws Exception { 2984916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContact(); 2985916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2986916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2987916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 29883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "John", "Doe"); 2989916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertEmail(rawContactId, "acme@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 2990916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 29916f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 2992916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2993916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2994916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 29953716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[acme@corp.com]"); 2996916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2997916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2998916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2999fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood public void testCountPhoneNumberDigits() { 3000fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("86 (0) 5-55-12-34")); 3001fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("860 555-1234")); 3002fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(3, ContactsProvider2.countPhoneNumberDigits("860")); 3003fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("8605551234")); 3004fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860555")); 3005fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860 555")); 3006fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860-555")); 3007fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(12, ContactsProvider2.countPhoneNumberDigits("+441234098765")); 3008fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("44+1234098765")); 3009fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("+441234098foo")); 3010fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood } 3011fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood 30123716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetPhone() throws Exception { 30133716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 30143716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 30153716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues values = new ContentValues(); 30163716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30173716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 30183716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "(860) 555-1234"); 30193716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30203716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.clear(); 30213716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(Contacts._ID, contactId); 30223716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[(860) 555-1234]"); 30233716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30243716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 30253716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("86 (0) 5-55-12-34")), values); 30263716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 30273716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555-1234")), values); 30283716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 30293716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860")), values); 30303716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 30313716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("8605551234")), values); 30323716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 30333716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860555")), values); 30343716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 30353716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555")), values); 30363716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 30373716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860-555")), values); 30383716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 30393716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30406f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro private Uri buildFilterUri(String query, boolean deferredSnippeting) { 30416f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri.Builder builder = Contacts.CONTENT_FILTER_URI.buildUpon() 30426f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro .appendPath(Uri.encode(query)); 30436f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro if (deferredSnippeting) { 30446f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro builder.appendQueryParameter(ContactsContract.DEFERRED_SNIPPETING, "1"); 30456f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 30466f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro return builder.build(); 30476f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 30486f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro 3049916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetNickname() throws Exception { 3050916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 3051916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3052916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 3053916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3054916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertNickname(rawContactId, "Incredible"); 3055916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 30566f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("inc", true); 3057916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3058916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3059916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 306030cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov values.put(SearchSnippetColumns.SNIPPET, "[Incredible]"); 3061916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 3062916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 3063916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 30643716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNameInDisplayName() throws Exception { 30653716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 30663716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 30673716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 30683716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 30693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30703716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 30713716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 30723716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 30733716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 30743716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30756f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 30766f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("john", true), emptySnippet); 30773716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 30783716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30793716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNicknameInDisplayName() throws Exception { 30803716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 30813716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 30823716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNickname(rawContactId, "Caveman"); 30833716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 30843716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30853716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 30863716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 30873716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 30883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 30893716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30906f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 30913716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 30923716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30933716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForCompanyInDisplayName() throws Exception { 30943716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 30953716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 30963716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues company = new ContentValues(); 30973716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.clear(); 30983716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.COMPANY, "Aperture Science"); 30993716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.TITLE, "President"); 31003716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertOrganization(rawContactId, company); 31013716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "aperturepresident@aperturescience.com", true); 31023716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31033716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 31043716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 31053716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 31063716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 31073716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31086f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("aperture", true), emptySnippet); 31093716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 31103716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31113716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForPhoneInDisplayName() throws Exception { 31123716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 31133716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 31143716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "860-555-1234"); 31153716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "860@aperturescience.com", true); 31163716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31173716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 31183716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 31193716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 31203716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 31213716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31226f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("860", true), emptySnippet); 31233716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 31243716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31253716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForEmailInDisplayName() throws Exception { 31263716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 31273716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 31283716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 31293716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNote(rawContactId, "Cave Johnson is president of Aperture Science"); 31303716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31313716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 31323716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 31333716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 31343716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 31353716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 31366f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 31373716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 31383716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 3139dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov public void testDisplayNameUpdateFromStructuredNameUpdate() { 3140dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long rawContactId = createRawContact(); 3141dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, "Slinky", "Dog"); 3142dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3143dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3144dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3145dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3146dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky Dog"); 3147dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3148dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov ContentValues values = new ContentValues(); 3149dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 3150dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3151dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3152dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky"); 3153dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3154dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 3155dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3156dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3157dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 3158dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3159dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dog"); 3160dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3161dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3162dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Dog"); 3163dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov } 3164dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3165d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov public void testInsertDataWithContentProviderOperations() throws Exception { 3166d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 3167d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValues(new ContentValues()) 3168d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3169d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 3170d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 3171d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 3172d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 3173d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 3174d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3175d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderResult[] results = 3176d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(cpo1, cpo2)); 3177d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov long contactId = queryContactId(ContentUris.parseId(results[0].uri)); 3178d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3179d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "John Doe"); 3180d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov } 3181d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov 3182d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailDefault() { 3183c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3184d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3185d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3186d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 3187d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 3188d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 3189d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(0, sendToVoicemail); 3190d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 3191d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3192d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3193d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtone() { 3194c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3195d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3196d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3197d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId, true, "foo"); 3198d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, true, "foo"); 319981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 32008c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 32018c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov updateSendToVoicemailAndRingtoneWithSelection(contactId, false, "bar"); 32028c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, false, "bar"); 32038c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertNetworkNotified(false); 3204d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3205d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3206d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailAndRingtoneAfterAggregation() { 32073cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("a", "b"); 3208d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3209d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3210d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 32113cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("c", "d"); 3212d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3213d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, true, "bar"); 3214d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3215d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 32160c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 32170c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3218d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3219d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov // Both contacts had "send to VM", the contact now has the same value 3220d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId1, true, "foo,bar"); // Either foo or bar 3221d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3222d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3223d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testDoNotSendToVoicemailAfterAggregation() { 32243cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("e", "f"); 3225d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3226d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, null); 3227d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 32283cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("g", "h"); 3229d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3230d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, null); 3231d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3232d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 32330c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 32340c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3235d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3236d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Since one of the contacts had "don't send to VM" that setting wins for the aggregate 32370c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), false, null); 3238d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3239d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3240d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtonePreservedAfterJoinAndSplit() { 32413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("i", "j"); 3242d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3243d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3244d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 32453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("k", "l"); 3246d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3247d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, "bar"); 3248d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3249d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 32500c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 32510c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3252d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3253d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Split them 32540c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 32550c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3256d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 32573cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), true, "foo"); 3258d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId2), false, "bar"); 3259d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3260d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 326182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateInsert() { 32624dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov long rawContactId = createRawContact(); 32630a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 32640a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 32650a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32660a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 32670a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 32680a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 32690a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.putNull(StatusUpdates.CUSTOM_PROTOCOL); 32700a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 32710a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PRESENCE, StatusUpdates.INVISIBLE); 32720a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 32730a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 100); 32740a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "a.b.c"); 32750a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 1234); 32760a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 2345); 32770a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32780a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 32790a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32800a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 32810a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32820a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long contactId = queryContactId(rawContactId); 32830a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 32840a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32850a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 32860a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 32870a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Hiding"); 32880a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 32890a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "a.b.c"); 32900a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 1234); 32910a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 2345); 32920a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32930a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 32940a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32950a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 32960a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 32970a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Cloaked"); 32980a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 200); 32990a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "d.e.f"); 33000a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 4321); 33010a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 5432); 33020a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov mResolver.insert(StatusUpdates.CONTENT_URI, values); 33030a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 33040a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 33050a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 33060a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Cloaked"); 33070a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 200); 33080a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "d.e.f"); 33090a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 4321); 33100a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 5432); 33110a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 33120a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 33130a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 33140a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateInferAttribution() { 33150a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 33160a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 33170a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 33180a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 33190a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 33200a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 33210a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 33220a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 33230a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 33240a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 33250a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 33260a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 33270a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 33280a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 33290a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, com.android.internal.R.string.imProtocolAim); 33300a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 33310a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 33320a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 33330a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 33340a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 33350a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateMatchingImOrEmail() { 33360a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 33374dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 33384dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im"); 333982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertEmail(rawContactId, "m@acme.com"); 33404dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 33414dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (standard) 3342aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3343aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 33444dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 33454dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (custom) 3346aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im", StatusUpdates.IDLE, "Idle", 3347d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 33484dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 33494dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on Email 3350aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "m@acme.com", StatusUpdates.AWAY, "Away", 3351aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 33524dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 33534dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // No match 3354aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_ICQ, null, "12345", StatusUpdates.DO_NOT_DISTURB, "Go away", 3355aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 33564dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 335782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Cursor c = mResolver.query(StatusUpdates.CONTENT_URI, new String[] { 335882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID, StatusUpdates.PROTOCOL, StatusUpdates.CUSTOM_PROTOCOL, 33590a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.PRESENCE, StatusUpdates.STATUS}, 336082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null, StatusUpdates.DATA_ID); 33614dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 336282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_AIM, null, StatusUpdates.AVAILABLE, "Available"); 33634dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 336482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_CUSTOM, "my_im_proto", StatusUpdates.IDLE, "Idle"); 33654dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 336682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_GOOGLE_TALK, null, StatusUpdates.AWAY, "Away"); 33674dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertFalse(c.moveToNext()); 33684dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov c.close(); 3369bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3370bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 3371bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3372bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3373bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 337482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 33750a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3376bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3377bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov } 3378bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 337982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateUpdateAndDelete() { 3380bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long rawContactId = createRawContact(); 3381bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3382bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3383bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 3384bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3385bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3386bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 338782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 338882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_STATUS); 3389bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3390bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3391aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AWAY, "BUSY", 3392aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3393aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.DO_NOT_DISTURB, "GO AWAY", 3394aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 339582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri statusUri = 3396aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3397aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 339882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 3399bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 340082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 340182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3402bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3403bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 34049705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for 34059705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status 34069705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status_ts 34079705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence 34089705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori long updatedTs = 200; 34099705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String testUpdate = "test_update"; 34109705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String selection = StatusUpdates.DATA_ID + "=" + statusId; 34119705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 34129705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 34139705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 34149705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 34159705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 34169705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 34179705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 34189705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 34199705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in status_updates table ONLY 34209705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in presence table are to be updated. 34219705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori updatedTs = 300; 34229705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori testUpdate = "test_update_new"; 34239705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 34249705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 34259705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 34269705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 34279705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 34289705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 34299705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the presence column value is still the old value 34309705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 34319705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 34329705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 34339705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in presence table ONLY 34349705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in status_updates table are to be updated. 34359705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 34369705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 34379705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test_new"); 34389705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 34399705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 34409705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the status_updates table is not updated 34419705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 34429705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 34439705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 34449705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 34459705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // effect "delete status_updates" operation and expect the following 34469705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // data deleted from status_updates table 34479705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence set to null 344882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov mResolver.delete(StatusUpdates.CONTENT_URI, StatusUpdates.DATA_ID + "=" + statusId, null); 34499705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 345082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3451a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3452a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 3453a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3454093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov public void testStatusUpdateUpdateToNull() { 3455093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long rawContactId = createRawContact(); 3456093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3457093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3458093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long contactId = queryContactId(rawContactId); 3459093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3460093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3461093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov ContentValues values = new ContentValues(); 3462093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri statusUri = 3463093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3464093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 3465093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 3466093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3467093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 3468093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3469093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3470093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3471093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3472093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(StatusUpdates.PRESENCE); 3473093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov mResolver.update(StatusUpdates.CONTENT_URI, values, 3474093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.DATA_ID + "=" + statusId, null); 3475093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3476093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3477093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3478093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3479093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3480093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov } 3481093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 348282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateWithTimestamp() { 3483a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long rawContactId = createRawContact(); 3484a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3485a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 3486a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3487a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3488a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3489aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Offline", 80, 34905d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3491aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Available", 100, 34925d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3493aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", 0, "Busy", 90, 34945d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3495a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3496a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov // Should return the latest status 3497a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContentValues values = new ContentValues(); 349882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 349982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3500bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 35014dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 35024dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 350382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov private void assertStatusUpdate(Cursor c, int protocol, String customProtocol, int presence, 350482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String status) { 35054dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov ContentValues values = new ContentValues(); 350682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 350782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.CUSTOM_PROTOCOL, customProtocol); 3508a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(StatusUpdates.PRESENCE, presence); 350982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS, status); 35104dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertCursorValues(c, values); 35114dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 35124dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 35133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item query test cases. 35143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByRawContactId() { 35163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 35173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, mAccount); 35193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 35203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 35223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 35233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 35243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByContactId() { 35273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 35293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 35313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 35323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 35343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 35353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 35363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKey() { 35393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 35413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 35423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 35443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 35453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 35473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 35483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 35493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKeyAndContactId() { 35523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 35543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 35553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 35573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 35583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 35603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 35613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann contactId), 35623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 35633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 35643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItems() { 35673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 35703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, values); 35713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsWithSelection() { 35743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 35763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 35773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 35793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 35803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 35813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 35833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 35843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}, firstValues); 35853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 35873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 35883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Goodbye world"}, secondValues); 35893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemById() { 35923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 35943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 35953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 35963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 35983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 35993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 36003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 36013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 36033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 36043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstValues); 36053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 36073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 36083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues); 36093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion + query test cases. 36123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoWithSelection() { 36143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 36163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 36173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 36183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 36203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo1Values, null); 36216802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 36223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(2); 36233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo2Values, null); 36243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first photo. 36263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_PHOTO_URI, StreamItemPhotos.SORT_INDEX + "=?", 36273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"1"}, photo1Values); 36283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemId() { 36313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 36343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 36353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 36363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 36373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 36393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 36403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 36413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 36423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 36443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 36453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 36466802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 36473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 36493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 36506802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 36516802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 36523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 36536802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 36543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the photos from the second stream item. 36563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 36573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 36583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), photo2Values); 36593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemPhotoId() { 36623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 36653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 36663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 36673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 36683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 36703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 36713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 36723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 36733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 36753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 36763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 36773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstPhotoId = ContentUris.parseId(resultUri); 36786802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 36793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 36813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 36826802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 36836802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.galaxy, PhotoSize.ORIGINAL)); 36843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 36853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondPhotoId = ContentUris.parseId(resultUri); 36866802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 36873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the first photo. 36893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 36903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 36913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 36923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 36933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstPhotoId), 36943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo1Values); 36953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the second photo. 36973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 36983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 36993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 37003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 37013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondPhotoId), 37023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo2Values); 37033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item insertion test cases. 37063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemInProfileRequiresWriteProfileAccess() { 37083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long profileRawContactId = createBasicProfileContact(new ContentValues()); 37093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // With our (default) write profile permission, we should be able to insert a stream item. 37113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 37133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now take away write profile permission. 37153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mActor.removePermissions("android.permission.WRITE_PROFILE"); 37163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Try inserting another stream item. 37183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 37193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 37203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should require WRITE_PROFILE access to insert a stream item in the profile."); 37213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 37223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Trying to insert a stream item in the profile without WRITE_PROFILE permission 37233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // should fail. 37243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemWithContentValues() { 37283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 37313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.insert(StreamItems.CONTENT_URI, values); 37323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 37333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 37343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 37353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOverLimit() { 37383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 37413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann List<Long> streamItemIds = Lists.newArrayList(); 37433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX + 1 stream items. 37453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 37463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 6; i++) { 37473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 37483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 37493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.add(ContentUris.parseId(resultUri)); 37503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Long doomedStreamItemId = streamItemIds.get(0); 37523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // There should only be MAX items. The oldest one should have been cleaned up. 37543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query( 37553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 37563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 37573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 37583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItems._ID}, null, null, null); 37593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 37603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann while(c.moveToNext()) { 37613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = c.getLong(0); 37623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.remove(streamItemId); 37633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 37653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 37663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, streamItemIds.size()); 37693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(doomedStreamItemId, streamItemIds.get(0)); 37703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOlderThanOldestInLimit() { 37733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 37763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX stream items. 37783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 37793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 37803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 37813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 37823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertNotSame("Expected non-0 stream item ID to be inserted", 37833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 0L, ContentUris.parseId(resultUri)); 37843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now try to insert a stream item that's older. It should be deleted immediately 37873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // and return an ID of 0. 37883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime - 1); 37893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 37903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(0L, ContentUris.parseId(resultUri)); 37913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion test cases. 37943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemsAndPhotosInBatch() throws Exception { 37963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemValues = buildGenericStreamItemValues(); 37983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemPhotoValues = buildGenericStreamItemPhotoValues(0); 37993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ArrayList<ContentProviderOperation> ops = Lists.newArrayList(); 38013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert( 38023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 38033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 38043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY)) 38053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemValues).build()); 38063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 38073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoValues.put(StreamItemPhotos.SORT_INDEX, i); 38083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert(StreamItems.CONTENT_PHOTO_URI) 38093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemPhotoValues) 38103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValueBackReference(StreamItemPhotos.STREAM_ITEM_ID, 0) 38113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .build()); 38123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.applyBatch(ContactsContract.AUTHORITY, ops); 38143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that all five photos were inserted under the raw contact. 38163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_URI, new String[]{StreamItems._ID}, 38173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)}, 38183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 38193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = 0; 38203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 38213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, c.getCount()); 38223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.moveToFirst(); 38233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemId = c.getLong(0); 38243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 38253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 38263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c = mResolver.query(Uri.withAppendedPath( 38293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 38306802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 38316802030a777c0c3ba1dc029c534cca4784260632Dave Santoro new String[]{StreamItemPhotos._ID, StreamItemPhotos.PHOTO_URI}, 38323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null, null); 38333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 38343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(5, c.getCount()); 38356802030a777c0c3ba1dc029c534cca4784260632Dave Santoro byte[] expectedPhotoBytes = loadPhotoFromResource( 38366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO); 38376802030a777c0c3ba1dc029c534cca4784260632Dave Santoro while (c.moveToNext()) { 38386802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String photoUri = c.getString(1); 38396802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(expectedPhotoBytes, 38406802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 38416802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 38423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 38433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 38443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item update test cases. 38483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemById() { 38503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 38523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 38533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 38543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 38553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), values, 38563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 38573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 38583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 38593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 38603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemWithContentValues() { 38633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 38653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 38663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 38673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems._ID, streamItemId); 38683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 38693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(StreamItems.CONTENT_URI, values, null, null); 38703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 38713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 38723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 38733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo update test cases. 38763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38776802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoById() throws IOException { 38783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 38803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 38813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 38823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 38833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 38843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 38853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38866802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 38876802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 38883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 38893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 38903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 38913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 38923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 38933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId); 38943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 38956802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 38963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 38976802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 38986802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 38996802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 39006802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 39016802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 39023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39046802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoWithContentValues() throws IOException { 39053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 39073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 39083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 39093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 39103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 39113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 39123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photoValues.put(StreamItemPhotos._ID, streamItemPhotoId); 39146802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 39156802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 39163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 39173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 39183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 39193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 39203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 39216802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 39223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 39236802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 39246802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 39256802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 39266802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 39276802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 39283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item deletion test cases. 39313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemById() { 39333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 39353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 39363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 39373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 39393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 39403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 39413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item. 39433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 39443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 39453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 39473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 39483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 39493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 39503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemWithSelection() { 39533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 39553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 39563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 39583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 39593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 39603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item with a custom selection. 39623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 39633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}); 39643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 39663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 39673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 39683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 39693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo deletion test cases. 39723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoById() { 39743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 39763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 39773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId( 39783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 39793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete( 39803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 39813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 39823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 39833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 39843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId), null, null); 39853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_PHOTO_URI, 39873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItemPhotos._ID}, 39883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.STREAM_ITEM_ID + "=?", new String[]{String.valueOf(streamItemId)}, 39893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 39903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 39913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals("Expected photo to be deleted.", 0, c.getCount()); 39923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 39933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 39943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoWithSelection() { 39983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 40003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 40013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstPhotoValues = buildGenericStreamItemPhotoValues(0); 40023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondPhotoValues = buildGenericStreamItemPhotoValues(1); 40033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, firstPhotoValues, null); 40046802030a777c0c3ba1dc029c534cca4784260632Dave Santoro firstPhotoValues.remove(StreamItemPhotos.PHOTO); // Removed while processing. 40053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, secondPhotoValues, null); 40063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = Uri.withAppendedPath( 40073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 40083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 40093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(photoUri, StreamItemPhotos.SORT_INDEX + "=1", null); 40103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, firstPhotoValues); 40123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 401482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro public void testDeleteStreamItemsWhenRawContactDeleted() { 401582780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro long rawContactId = createRawContact(mAccount); 401682780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemUri = insertStreamItem(rawContactId, 401782780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemValues(), mAccount); 401882780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto(ContentUris.parseId(streamItemUri), 401982780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemPhotoValues(0), mAccount); 402082780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro mResolver.delete(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 402182780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro null, null); 402282780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 402382780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro ContentValues[] emptyValues = new ContentValues[0]; 402482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 402582780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro // The stream item and its photo should be gone. 402682780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemUri, emptyValues); 402782780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemPhotoUri, emptyValues); 402882780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro } 402982780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 40303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemLimit() { 40313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 40323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.MAX_ITEMS, 5); 40333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_LIMIT_URI, values); 40343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Tests for inserting or updating stream items as a side-effect of making status updates 40376802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // (forward-compatibility of status updates into the new social stream API). 40386802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40396802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemInsertedOnStatusUpdate() { 40406802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40416802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 40426802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 40436802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 40446802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 40456802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 40466802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 40476802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE); 40486802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40496802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 40506802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 40514747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "hacking"); 4052d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 4053d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(String.valueOf(rawContactId)) 4054d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 4055d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues); 4056d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda } 4057d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4058d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda public void testStreamItemInsertedOnStatusUpdate_HtmlQuoting() { 4059d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4060d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // This method of creating a raw contact automatically inserts a status update with 4061d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // the status message "hacking". 4062d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues values = new ContentValues(); 4063d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda long rawContactId = createRawContact(values, "18004664411", 4064d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 4065d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.CAPABILITY_HAS_VOICE); 4066d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4067d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // Insert a new status update for the raw contact. 4068d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 4069d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.INVISIBLE, "& <b> test '", StatusUpdates.CAPABILITY_HAS_VOICE); 4070d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4071d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues expectedValues = new ContentValues(); 4072d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 40734747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "& <b> test &#39;"); 40746802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 40756802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 40766802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 40776802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 40786802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 40796802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40806802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemUpdatedOnSecondStatusUpdate() { 40816802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40826802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 40836802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 40846802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 40856802030a777c0c3ba1dc029c534cca4784260632Dave Santoro int chatMode = StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 40866802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE; 40876802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 40886802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, chatMode); 40896802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40906802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Insert a new status update for the raw contact. 40916802030a777c0c3ba1dc029c534cca4784260632Dave Santoro insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 40926802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.INVISIBLE, "finished hacking", chatMode); 40936802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40946802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 40956802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 40964747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "finished hacking"); 40976802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 40986802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 40996802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 41006802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 41016802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 41026802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 410336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemReadRequiresReadSocialStreamPermission() { 410436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 410536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long contactId = queryContactId(rawContactId); 410636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String lookupKey = queryLookupKey(contactId); 410736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 410836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 410936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 411036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 411136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item in various ways. 411236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 411336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by contact ID requires social stream read permission", 411436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 411536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 411636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 411736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 411836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 411936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key requires social stream read permission", 412036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.CONTENT_LOOKUP_URI.buildUpon().appendPath(lookupKey) 412136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(Contacts.StreamItems.CONTENT_DIRECTORY).build(), 412236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 412336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 412436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 412536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key and ID requires social stream read permission", 412636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath(Contacts.getLookupUri(contactId, lookupKey), 412736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), 412836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 412936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 413036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 413136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID requires social stream read permission", 413236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 413336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 413436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 413536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 413636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 413736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID and stream item ID requires social " + 413836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "stream read permission", 413936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 414036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 414136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 414236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), 414336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro streamItemId), null, null, null, null); 414436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 414536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 414636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream items requires social stream read permission", 414736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI, null, null, null, null); 414836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 414936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 415036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream item by ID requires social stream read permission", 415136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 415236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 415336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 415436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 415536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoReadRequiresReadSocialStreamPermission() { 415636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 415736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 415836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 415936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 416036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 416136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 416236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 416336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item photo in various ways. 416436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 416536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 416636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 416736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY).build(), 416836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 416936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 417036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 417136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 417236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 417336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 417436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 417536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(), 417636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 417736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 417836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 417936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemModificationRequiresWriteSocialStreamPermission() { 418036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 418136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 418236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 418336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 418436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 418536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 418636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null); 418736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert to stream without write social stream permission"); 418836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 418936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 419036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 419136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 419236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 419336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItems.TEXT, "Goodbye world"); 419436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 419536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values, null, null); 419636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update stream without write social stream permission"); 419736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 419836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 419936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 420036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 420136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 420236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null); 420336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete from stream without write social stream permission"); 420436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 420536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 420636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 420736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 420836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoModificationRequiresWriteSocialStreamPermission() { 420936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 421036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 421136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 421236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 421336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 421436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 421536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 421636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri photoUri = StreamItems.CONTENT_URI.buildUpon() 421736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 421836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 421936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(); 422036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 422136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 422236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(1), null); 422336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert photos without write social stream permission"); 422436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 422536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 422636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 422736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 422836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 422936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource(R.drawable.galaxy, 423036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro PhotoSize.ORIGINAL)); 423136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(photoUri, values, null, null); 423236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update photos without write social stream permission"); 423336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 423436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 423536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 423636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 423736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(photoUri, null, null); 423836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete photos without write social stream permission"); 423936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 424036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 424136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 424236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 424336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStatusUpdateDoesNotRequireReadOrWriteSocialStreamPermission() { 424436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 424536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String handle1 = "test@gmail.com"; 424636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 424736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertImHandle(rawContactId, protocol1, null, handle1); 424836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 424936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 425036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 425136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 425236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA); 425336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 425436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.addPermissions("android.permission.READ_SOCIAL_STREAM"); 425536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 425636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues expectedValues = new ContentValues(); 425736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectedValues.put(StreamItems.TEXT, "Green"); 425836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro assertStoredValues(Uri.withAppendedPath( 425936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 426036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), expectedValues); 426136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 426236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 42633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemValues() { 42643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 42653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Hello world"); 42663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, System.currentTimeMillis()); 42673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.COMMENTS, "Reshared by 123 others"); 42683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 42693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemPhotoValues(int sortIndex) { 42723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 42733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItemPhotos.SORT_INDEX, sortIndex); 42746802030a777c0c3ba1dc029c534cca4784260632Dave Santoro values.put(StreamItemPhotos.PHOTO, 42756802030a777c0c3ba1dc029c534cca4784260632Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.ORIGINAL)); 42763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 42773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 427982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testSingleStatusUpdateRowPerContact() { 4280bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 4281bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar String handle1 = "test@gmail.com"; 4282bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4283d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 42844dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId1, protocol1, null, handle1); 4285bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4286aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 4287aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4288aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AWAY, "Yellow", 4289aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4290aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.INVISIBLE, "Red", 4291aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4292bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4293af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov Cursor c = queryContact(queryContactId(rawContactId1), 429482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov new String[] {Contacts.CONTACT_PRESENCE, Contacts.CONTACT_STATUS}); 42954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 4296bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4297bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar c.moveToFirst(); 429882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(StatusUpdates.INVISIBLE, c.getInt(0)); 429982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals("Red", c.getString(1)); 43000265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov c.close(); 4301bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 4302bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4303d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void updateSendToVoicemailAndRingtone(long contactId, boolean sendToVoicemail, 4304d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String ringtone) { 4305d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 4306d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 4307d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (ringtone != null) { 4308d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 4309d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4310d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4311d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4312d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov int count = mResolver.update(uri, values, null, null); 4313d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(1, count); 43148c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 43158c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 43168c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov private void updateSendToVoicemailAndRingtoneWithSelection(long contactId, 43178c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov boolean sendToVoicemail, String ringtone) { 43188c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov ContentValues values = new ContentValues(); 43198c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 43208c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov if (ringtone != null) { 43218c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 43228c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 43238c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 43248c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov int count = mResolver.update(Contacts.CONTENT_URI, values, Contacts._ID + "=" + contactId, 43258c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov null); 43268c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertEquals(1, count); 4327d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4328d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4329d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void assertSendToVoicemailAndRingtone(long contactId, boolean expectedSendToVoicemail, 4330d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String expectedRingtone) { 4331d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 4332d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 4333d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 4334d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(expectedSendToVoicemail ? 1 : 0, sendToVoicemail); 4335d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String ringtone = c.getString(c.getColumnIndex(Contacts.CUSTOM_RINGTONE)); 4336d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (expectedRingtone == null) { 4337d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertNull(ringtone); 4338d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } else { 4339d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(ArrayUtils.contains(expectedRingtone.split(","), ringtone)); 4340d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4341d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 4342d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 43439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 43440be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov public void testContactVisibilityUpdateOnMembershipChange() { 43450be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long rawContactId = createRawContact(mAccount); 43460be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 43470be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43480be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long visibleGroupId = createGroup(mAccount, "123", "Visible", 1); 43490be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long invisibleGroupId = createGroup(mAccount, "567", "Invisible", 0); 43500be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43510be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership1 = insertGroupMembership(rawContactId, visibleGroupId); 43520be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 43530be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43540be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership2 = insertGroupMembership(rawContactId, invisibleGroupId); 43550be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 43560be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43570be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.delete(membership1, null, null); 43580be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 43590be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43600be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov ContentValues values = new ContentValues(); 43610be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov values.put(GroupMembership.GROUP_ROW_ID, visibleGroupId); 43620be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43630be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.update(membership2, values, null, null); 43640be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 43650be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 43660be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43670be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov private void assertVisibility(long rawContactId, String expectedValue) { 43680be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, Contacts._ID + "=" + queryContactId(rawContactId), 43690be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov null, Contacts.IN_VISIBLE_GROUP, expectedValue); 43700be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 43710be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43720db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov public void testSupplyingBothValuesAndParameters() throws Exception { 43730db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Account account = new Account("account 1", "type%/:1"); 43740db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Uri uri = ContactsContract.Groups.CONTENT_URI.buildUpon() 43750db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME, account.name) 43760db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE, account.type) 43770db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") 43780db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .build(); 43790db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43800db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(uri); 43810db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type); 43820db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 43830db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some id"); 43840db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some name"); 43850db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 43860db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43870db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 43880db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43890db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder = ContentProviderOperation.newInsert(uri); 43900db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type + "diff"); 43910db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 43920db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some other id"); 43930db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some other name"); 43940db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 43950db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43960db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov try { 43970db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 43980db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov fail("Expected IllegalArgumentException"); 43990db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } catch (IllegalArgumentException ex) { 44000db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov // Expected 44010db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 44020db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 44030db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 4404a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContentEntityIterator() { 44059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana // create multiple contacts and check that the selected ones are returned 44069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id; 44079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 44099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId2 = createGroup(mAccount, "gsid2", "title2"); 44109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44113cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0"); 44123cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertGroupMembership(id, "gsid1"); 44133cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertEmail(id, "c0@email.com"); 44143cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertPhoneNumber(id, "5551212c0"); 44159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 4416226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c1 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c1"); 44179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_0 = insertGroupMembership(id, "gsid1"); 44189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_1 = insertGroupMembership(id, "gsid2"); 44199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_2 = insertEmail(id, "c1@email.com"); 44209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_3 = insertPhoneNumber(id, "5551212c1"); 44219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 4422226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c2 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c2"); 44239261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_0 = insertGroupMembership(id, "gsid1"); 44249261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_1 = insertEmail(id, "c2@email.com"); 44259261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_2 = insertPhoneNumber(id, "5551212c2"); 44269261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44273cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long c3 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c3"); 44289261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_0 = insertGroupMembership(id, groupId2); 44299261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_1 = insertEmail(id, "c3@email.com"); 44309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_2 = insertPhoneNumber(id, "5551212c3"); 44319261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 443262318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana EntityIterator iterator = RawContacts.newEntityIterator(mResolver.query( 443362318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana maybeAddAccountQueryParameters(RawContactsEntity.CONTENT_URI, mAccount), null, 443462318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana RawContacts.SOURCE_ID + " in ('c1', 'c2', 'c3')", null, null)); 44359261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Entity entity; 44369261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues[] subValues; 44379261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 44386cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c1, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 44399261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 44409261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(4, subValues.length); 44419261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 44429261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_0, 44439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 44449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 44459261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], GroupMembership.CONTENT_ITEM_TYPE, 44469261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_1, 44479261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 44489261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 44499261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Email.CONTENT_ITEM_TYPE, 44509261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_2, 44519261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c1@email.com"); 44529261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[3], Phone.CONTENT_ITEM_TYPE, 44539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_3, 44549261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c1"); 44559261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44569261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 44576cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c2, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 44589261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 44599261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 44609261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 44619261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_0, 44629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 44639261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 44649261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 44659261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_1, 44669261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c2@email.com"); 44679261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 44689261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_2, 44699261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c2"); 44709261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44719261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 44726cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c3, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 44739261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 44749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 44759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 44769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_0, 44779261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 44789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 44799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 44809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_1, 44819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c3@email.com"); 44829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 44839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_2, 44849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c3"); 44859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(iterator.hasNext()); 44873cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov iterator.close(); 44889261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 448920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 449020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov public void testDataCreateUpdateDeleteByMimeType() throws Exception { 4491d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 449220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 449320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov ContentValues values = new ContentValues(); 44945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 449520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 449620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 449720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 449820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 449920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "old1"); 450020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "old2"); 450120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "old3"); 450220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "old4"); 450320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "old5"); 450420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "old6"); 450520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "old7"); 450620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "old8"); 450720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "old9"); 450820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "old10"); 450920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "old11"); 451020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "old12"); 451120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "old13"); 451220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "old14"); 451320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "old15"); 451420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Uri uri = mResolver.insert(Data.CONTENT_URI, values); 451520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 451681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 451720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 451820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.clear(); 451920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "newpackage"); 452020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 0); 452120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 0); 452220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "new1"); 452320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "new2"); 452420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "new3"); 452520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "new4"); 452620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "new5"); 452720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "new6"); 452820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "new7"); 452920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "new8"); 453020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "new9"); 453120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "new10"); 453220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "new11"); 453320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "new12"); 453420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "new13"); 453520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "new14"); 453620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "new15"); 45375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mResolver.update(Data.CONTENT_URI, values, Data.RAW_CONTACT_ID + "=" + rawContactId + 453820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov " AND " + Data.MIMETYPE + "='testmimetype'", null); 453981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 454070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 454120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 454220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 45435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov int count = mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 454420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null); 454520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals(1, count); 45465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertEquals(0, getCount(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 454733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null)); 454881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 454933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 455020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 455189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactQuery() { 455289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 455389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 455489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 455589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 455689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 455789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account1); 455889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account2); 455989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 456089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 456189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, RawContacts._ID, rawContactId1) ; 456289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, RawContacts._ID, rawContactId2) ; 456389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 456489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri1 = ContentUris.withAppendedId(uri1, rawContactId1); 456589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri2 = ContentUris.withAppendedId(uri2, rawContactId2); 456689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri1, RawContacts._ID, rawContactId1) ; 456789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri2, RawContacts._ID, rawContactId2) ; 456889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 456989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 4570373f7d2adc36680c31ff33e9ee12be865af6b5fbDmitri Plotnikov public void testRawContactDeletion() { 4571e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId = createRawContact(mAccount); 45725ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 457333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 45744dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 457582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4576aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4577aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4578a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId); 4579a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 458033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 458133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 458282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 45834dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 458433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 458533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(uri, null, null); 458633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 45875870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 458881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 458933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 4590e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 459133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 459233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 459333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 459433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 459582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 45964dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 4597a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 459881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 4599a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov } 4600a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4601a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov public void testRawContactDeletionKeepingAggregateContact() { 4602e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId1 = createRawContactWithName(mAccount); 4603e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId2 = createRawContactWithName(mAccount); 460447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 460547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 4606a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4607a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 4608a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4609a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 4610e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 4611a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 4612a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 4613a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(1, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 461420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 46151fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 46165f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testRawContactDeletion_byAccountParam() { 4617e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong long rawContactId = createRawContact(mAccount); 4618e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 4619e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4620e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 462182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4622aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4623aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4624e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 4625e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong null, null)); 462682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 4627e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong + rawContactId, null)); 4628e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4629e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Do not delete if we are deleting with wrong account. 4630e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithWrongAccountUri = 4631e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4632e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountTwo.name) 4633e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccountTwo.type) 4634e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 46355f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki int numDeleted = mResolver.delete(deleteWithWrongAccountUri, null, null); 46365f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(0, numDeleted); 4637e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 46385870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "0"); 4639e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4640e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Delete if we are deleting with correct account. 4641e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithCorrectAccountUri = 4642e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4643e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name) 4644e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type) 4645e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 46465f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki numDeleted = mResolver.delete(deleteWithCorrectAccountUri, null, null); 46475f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(1, numDeleted); 46485f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 46495f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValue(uri, RawContacts.DELETED, "1"); 46505f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 46515f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 46525f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testRawContactDeletion_byAccountSelection() { 46535f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki long rawContactId = createRawContact(mAccount); 46545f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 46555f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 46565f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki // Do not delete if we are deleting with wrong account. 46575f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki int numDeleted = mResolver.delete(RawContacts.CONTENT_URI, 46585f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", 46595f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[] {mAccountTwo.name, mAccountTwo.type}); 46605f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(0, numDeleted); 46615f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 46625f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValue(uri, RawContacts.DELETED, "0"); 46635f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 46645f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki // Delete if we are deleting with correct account. 46655f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki numDeleted = mResolver.delete(RawContacts.CONTENT_URI, 46665f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", 46675f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[] {mAccount.name, mAccount.type}); 46685f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(1, numDeleted); 4669e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 46705870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 4671e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong } 4672e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 46739ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki /** 46749ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * Test for {@link ContactsProvider2#stringToAccounts} and 46759ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * {@link ContactsProvider2#accountsToString}. 46769ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki */ 46779ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki public void testAccountsToString() { 46789ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_0 = Sets.newHashSet(); 46799ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_1 = Sets.newHashSet(ACCOUNT_1); 46809ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_2 = Sets.newHashSet(ACCOUNT_2); 46819ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_1_2 = Sets.newHashSet(ACCOUNT_1, ACCOUNT_2); 46829ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 46839ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_0 = Sets.newHashSet(); 46849ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_1 = Sets.newHashSet(ACCOUNT_1); 46859ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_2 = Sets.newHashSet(ACCOUNT_2); 46869ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_1_2 = Sets.newHashSet(ACCOUNT_2, ACCOUNT_1); 46879ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 46889ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_0))); 46899ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_1))); 46909ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_2))); 46919ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_1_2))); 46929ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 46939ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_0))); 46949ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_1))); 46959ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_2))); 46969ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_1_2))); 46979ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 46989ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_0))); 46999ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_1))); 47009ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_2))); 47019ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_1_2))); 47029ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47039ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_0))); 47049ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_1))); 47059ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_2))); 47069ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_1_2))); 47079ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47089ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki try { 47099ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki ContactsProvider2.stringToAccounts("x"); 47109ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki fail("Didn't throw for malformed input"); 47119ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } catch (IllegalArgumentException expected) { 47129ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 47139ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 47149ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47159ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki private static final Set<Account> accountsToStringToAccounts(Set<Account> accounts) { 47169ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki return ContactsProvider2.stringToAccounts(ContactsProvider2.accountsToString(accounts)); 47179ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 47189ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47199ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki /** 47209ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * Test for {@link ContactsProvider2#haveAccountsChanged} and 47219ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * {@link ContactsProvider2#saveAccounts}. 47229ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki */ 47239ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki public void testHaveAccountsChanged() { 47249ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final ContactsProvider2 cp = (ContactsProvider2) getProvider(); 47259ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47269ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_0 = new Account[] {}; 47279ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_1 = new Account[] {ACCOUNT_1}; 47289ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_2 = new Account[] {ACCOUNT_2}; 47299ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_1_2 = new Account[] {ACCOUNT_1, ACCOUNT_2}; 47309ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_2_1 = new Account[] {ACCOUNT_2, ACCOUNT_1}; 47319ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47329ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Add ACCOUNT_1 47339ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47349ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1)); 47359ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_1); 47369ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_1)); 47379ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47389ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Add ACCOUNT_2 47399ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47409ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1_2)); 47419ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // (try with reverse order) 47429ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_2_1)); 47439ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_1_2); 47449ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_1_2)); 47459ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // (try with reverse order) 47469ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_2_1)); 47479ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47489ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Remove ACCOUNT_1 47499ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47509ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_2)); 47519ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_2); 47529ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_2)); 47539ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47549ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Remove ACCOUNT_2 47559ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47569ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_0)); 47579ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_0); 47589ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_0)); 47599ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47609ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Test with malformed DB property. 47619ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47629ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final ContactsDatabaseHelper dbHelper = cp.getThreadActiveDatabaseHelperForTest(); 47639ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki dbHelper.setProperty(DbProperties.KNOWN_ACCOUNTS, "x"); 47649ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 47659ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // With malformed property the method always return true. 47669ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_0)); 47679ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1)); 47689ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 47699ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 4770627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov public void testAccountsUpdated() { 477170d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // This is to ensure we do not delete contacts with null, null (account name, type) 477270d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // accidentally. 477370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId3 = createRawContactWithName("James", "Sullivan"); 477470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertPhoneNumber(rawContactId3, "5234567890"); 4775627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov Uri rawContact3 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId3); 4776743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 477770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 477870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4779bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount, mAccountTwo}); 4780743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount, mAccountTwo}); 4781743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 4782dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_NAME, null); 4783dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_TYPE, null); 478470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 4785743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 4786743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId1, "account1@email.com"); 4787743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId2 = createRawContact(mAccountTwo); 4788743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId2, "account2@email.com"); 4789743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertImHandle(rawContactId2, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 4790743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4791aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4792aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4793743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 4794bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount}); 4795743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount}); 4796627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov assertEquals(2, getCount(RawContacts.CONTENT_URI, null, null)); 479782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 479870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong + rawContactId2, null)); 479970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong } 480070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 480133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov public void testAccountDeletion() { 480233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Account readOnlyAccount = new Account("act", READ_ONLY_ACCOUNT_TYPE); 480333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4804bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount, mAccount}); 480533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount, mAccount}); 480633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 480733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", readOnlyAccount); 480833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri1 = insertPhoto(rawContactId1); 480933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId2 = createRawContactWithName("john", "doe", mAccount); 481033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri2 = insertPhoto(rawContactId2); 481133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov storeValue(photoUri2, Photo.IS_SUPER_PRIMARY, "1"); 481233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 481333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 481433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 481533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 481633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 481733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the writable account 481833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 481933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 482033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 482133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "john doe"); 482233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 482333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the one we marked as super-primary 482433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 482533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri2)); 482633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 4827bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount}); 482833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // Remove the writable account 482933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount}); 483033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 483133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the remaining account 483233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 483333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 483433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 483533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "John Doe"); 483633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 483733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the remaining one 483833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 483933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri1)); 484033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov } 484133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 4842c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro public void testStreamItemsCleanedUpOnAccountRemoval() { 4843c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account doomedAccount = new Account("doom", "doom"); 4844c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account safeAccount = mAccount; 4845c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4846c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{doomedAccount, safeAccount}); 4847c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{doomedAccount, safeAccount}); 4848c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4849c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a doomed raw contact, stream item, and photo. 4850c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedRawContactId = createRawContactWithName(doomedAccount); 4851c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemUri = 4852c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(doomedRawContactId, buildGenericStreamItemValues(), doomedAccount); 4853c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedStreamItemId = ContentUris.parseId(doomedStreamItemUri); 4854c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemPhotoUri = insertStreamItemPhoto( 4855c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro doomedStreamItemId, buildGenericStreamItemPhotoValues(0), doomedAccount); 4856c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4857c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a safe raw contact, stream item, and photo. 4858c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeRawContactId = createRawContactWithName(safeAccount); 4859c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemUri = 4860c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(safeRawContactId, buildGenericStreamItemValues(), safeAccount); 4861c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemId = ContentUris.parseId(safeStreamItemUri); 4862c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemPhotoUri = insertStreamItemPhoto( 4863c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeStreamItemId, buildGenericStreamItemPhotoValues(0), safeAccount); 4864c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemPhotoId = ContentUris.parseId(safeStreamItemPhotoUri); 4865c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4866c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Remove the doomed account. 4867c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{safeAccount}); 4868c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{safeAccount}); 4869c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4870c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the doomed stuff has all been nuked. 4871c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContentValues[] noValues = new ContentValues[0]; 4872c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(ContentUris.withAppendedId(RawContacts.CONTENT_URI, doomedRawContactId), 4873c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro noValues); 4874c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemUri, noValues); 4875c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemPhotoUri, noValues); 4876c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4877c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the safe stuff lives on. 4878c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(RawContacts.CONTENT_URI, safeRawContactId, RawContacts._ID, 4879c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeRawContactId); 4880c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemUri, StreamItems._ID, safeStreamItemId); 4881c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemPhotoUri, StreamItemPhotos._ID, safeStreamItemPhotoId); 4882c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro } 4883c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4884cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov public void testContactDeletion() { 488547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 488647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_2); 4887cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4888cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long contactId = queryContactId(rawContactId1); 4889cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4890cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov mResolver.delete(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), null, null); 4891cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4892cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1), 4893cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 4894cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2), 4895cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 4896cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov } 4897cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 489873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 489973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov long rawContactId = createRawContact(mAccount); 490073776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 490173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 490273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = insertStructuredName(rawContactId, "John", "Doe"); 490373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov clearDirty(rawContactUri); 4904e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri updateUri = setCallerIsSyncAdapter(uri, mAccount); 490573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 490673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 490773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dough"); 490873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 49095870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, StructuredName.FAMILY_NAME, "Dough"); 491073776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(rawContactUri, false); 491181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 49121fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 49131fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 491461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDirtyAndVersion() { 4915d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final long rawContactId = createRawContact(mAccount); 4916d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); 491773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 49181fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 49191fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 49201fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 49211fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.DIRTY, 0); 49221fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.SEND_TO_VOICEMAIL, 1); 492361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.AGGREGATION_MODE, 4924c100221f706afc08409e8317a27d6850b11c54d3Omari Stephens RawContacts.AGGREGATION_MODE_IMMEDIATE); 492561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.STARRED, 1); 49261fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(1, mResolver.update(uri, values, null, null)); 49271fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 49281fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 49291fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 493081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 49311fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 493261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "goo@woo.com"); 493361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 493481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 49351fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 49361fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 493761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 49381fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 493961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values = new ContentValues(); 494061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(Email.DATA, "goo@hoo.com"); 494161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.update(emailUri, values, null, null); 49421fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 494381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 49441fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 49451fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 494661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 49471fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 494861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(emailUri, null, null); 49491fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 495081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 49511fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 49521fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 495361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov } 49541fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 495561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactClearDirty() { 495661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 495761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 495861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 495961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov long version = getVersion(uri); 496061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov insertEmail(rawContactId, "goo@woo.com"); 49611fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 496261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 49631fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 49641fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 49651fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana clearDirty(uri); 49661fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 49671fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 49681fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 49691fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 497061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDeletionSetsDirty() { 497161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 49721fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 497361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 49741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 497561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 497661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, false); 497761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov 497861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(uri, null, null); 49795870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 498061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 498181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 498261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 498361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertEquals(version, getVersion(uri)); 49841fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 49854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 49869fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutName() { 49879fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 49889fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 49899fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 49909fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri phoneUri = insertPhoneNumber(rawContactId, "555-123-45678", true); 49919fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 49929fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 49939fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 49949fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 49959fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 49969fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 49979fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 49989fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 49999fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 50009fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutAnyData() { 50019fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 50029fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 50039fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 50049fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 50059fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 50069fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 50079fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 50089fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 50099fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 50109fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 50119fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 501260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testDeleteContactWithEscapedUri() { 501360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 501460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 501560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 501660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 501760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 501860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 501960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 502060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 502160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, mResolver.delete(lookupUri, null, null)); 502260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 502360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 502460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testQueryContactWithEscapedUri() { 502560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 502660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 502760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 502860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 502960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 503060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 503160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 503260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 503360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Cursor c = mResolver.query(lookupUri, null, null, null, ""); 503460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, c.getCount()); 503560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 503660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 503760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 5038074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov public void testGetPhotoUri() { 5039074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov ContentValues values = new ContentValues(); 5040074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 5041074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 5042074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 5043f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5044f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 5045f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId)}, Photo.PHOTO_FILE_ID); 5046f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId) 5047f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 5048074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 50493d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov assertStoredValue( 50503d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(rawContactId)), 5051f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI, photoUri); 5052074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov } 5053074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 5054bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro public void testGetPhotoViaLookupUri() throws IOException { 5055bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long rawContactId = createRawContact(); 5056bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long contactId = queryContactId(rawContactId); 5057bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5058bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 5059bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro String lookupKey = lookupUri.getPathSegments().get(2); 5060bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 5061bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro byte[] thumbnail = loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL); 5062bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5063bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Two forms of lookup key URIs should be valid - one with the contact ID, one without. 5064bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithId = Uri.withAppendedPath(lookupUri, "photo"); 5065bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithoutId = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5066bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro .appendPath(lookupKey).appendPath("photo").build(); 5067bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5068bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try retrieving as a data record. 5069bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro ContentValues values = new ContentValues(); 5070bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro values.put(Photo.PHOTO, thumbnail); 5071bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithId, values); 5072bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithoutId, values); 5073bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5074bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try opening as an input stream. 5075bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertInputStreamContent(thumbnail, mResolver.openInputStream(photoLookupUriWithId)); 5076bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertInputStreamContent(thumbnail, mResolver.openInputStream(photoLookupUriWithoutId)); 5077bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro } 5078bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5079ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert public void testInputStreamForPhoto() throws Exception { 5080e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov long rawContactId = createRawContact(); 5081f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5082f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5083f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId); 5084f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_URI)); 5085f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoThumbnailUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI)); 5086e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 5087f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadTestPhoto(PhotoSize.DISPLAY_PHOTO), 5088f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5089f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadTestPhoto(PhotoSize.THUMBNAIL), 5090f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoThumbnailUri)); 5091ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 5092ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert 5093ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert private static void assertInputStreamContent(byte[] expected, InputStream is) 5094ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert throws IOException { 5095ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert try { 5096ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert byte[] observed = new byte[expected.length]; 5097ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert int count = is.read(observed); 5098ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert assertEquals(expected.length, count); 5099ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert assertEquals(-1, is.read()); 5100ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert MoreAsserts.assertEquals(expected, observed); 5101ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } finally { 5102ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert is.close(); 5103ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 5104e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov } 5105e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 5106732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov public void testSuperPrimaryPhoto() { 5107732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId1 = createRawContact(new Account("a", "a")); 5108f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri1 = insertPhoto(rawContactId1, R.drawable.earth_normal); 5109732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId1 = ContentUris.parseId(photoUri1); 5110732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5111732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId2 = createRawContact(new Account("b", "b")); 5112f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri2 = insertPhoto(rawContactId2, R.drawable.earth_normal); 5113732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId2 = ContentUris.parseId(photoUri2); 5114732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5115732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 5116732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5117732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5118732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 5119732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 5120f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5121f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 5122f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(photoId1)}, Photo.PHOTO_FILE_ID); 5123f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId1) 5124f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 5125732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 5126f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValue(contactUri, Contacts.PHOTO_URI, photoUri); 5127732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5128732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 5129732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5130732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5131732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov ContentValues values = new ContentValues(); 5132732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 5133732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri2, values, null, null); 5134732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5135732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 5136732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5137732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 5138732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 5139732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId2); 5140732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5141732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri1, values, null, null); 5142732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 5143732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov } 5144732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 51458e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public void testUpdatePhoto() { 51468e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov ContentValues values = new ContentValues(); 51478e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 51488e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 51498e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 51508e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 51518e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri twigUri = Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 51528e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov queryContactId(rawContactId)), Contacts.Photo.CONTENT_DIRECTORY); 51538e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 51548e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 51558e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 51568e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 51578e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.putNull(Photo.PHOTO); 51588e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 51598e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long photoId = ContentUris.parseId(dataUri); 51608e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5161155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov assertEquals(0, getCount(twigUri, null, null)); 51628e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 51638e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 51648e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Photo.PHOTO, loadTestPhoto()); 51658e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov mResolver.update(dataUri, values, null, null); 516681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 51678e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5168f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long twigId = getStoredLongValue(twigUri, Data._ID); 51698e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov assertEquals(photoId, twigId); 51708e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov } 51718e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 51724e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactDataPhoto() { 51737d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a contact with a null photo 51747d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentValues values = new ContentValues(); 51757d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 51767d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh long rawContactId = ContentUris.parseId(rawContactUri); 51777d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 51787d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a photo 51797d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.RAW_CONTACT_ID, rawContactId); 51807d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 51817d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.putNull(Photo.PHOTO); 51827d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 51837d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // try to do an update before insert should return count == 0 51847d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri dataUri = Uri.withAppendedPath( 51857d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 51867d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh RawContacts.Data.CONTENT_DIRECTORY); 51877d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(0, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 51887d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 51897d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 51907d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh mResolver.insert(Data.CONTENT_URI, values); 51917d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 51927d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // save a photo to the db 51937d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.clear(); 51947d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 51957d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Photo.PHOTO, loadTestPhoto()); 51967d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(1, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 51977d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 51987d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 51997d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // verify the photo 52004e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Cursor storedPhoto = mResolver.query(dataUri, new String[] {Photo.PHOTO}, 52017d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Data.MIMETYPE + "=?", new String[] {Photo.CONTENT_ITEM_TYPE}, null); 52024e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov storedPhoto.moveToFirst(); 5203f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro MoreAsserts.assertEquals(loadTestPhoto(PhotoSize.THUMBNAIL), storedPhoto.getBlob(0)); 52040265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov storedPhoto.close(); 52057d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh } 52067d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 5207f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactId() throws IOException { 5208f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5209f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5210f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5211f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_URI.buildUpon() 5212f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5213f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 5214f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5215f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5216f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5217f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5218f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5219f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKey() throws IOException { 5220f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5221f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5222f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5223f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5224f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5225f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5226f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 5227f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5228f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5229f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5230f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5231f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5232f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKeyAndId() throws IOException { 5233f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5234f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5235f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5236f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5237f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5238f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5239f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5240f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 5241f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5242f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5243f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5244f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5245f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5246f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForRawContactId() throws IOException { 5247f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5248f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5249f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = RawContacts.CONTENT_URI.buildUpon() 5250f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5251f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5252f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5253f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5254f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5255f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5256f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5257f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoByPhotoUri() throws IOException { 5258f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5259f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5260f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5261f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5262f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Get the photo URI out and check the content. 5263f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5264f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5265f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5266f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5267f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5268f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5269f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5270f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5271f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForDisplayPhoto() { 5272f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5273f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5274f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5275f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is larger than a thumbnail, so it will be stored as a file. 5276f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5277f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoFileId = getStoredValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 5278f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5279f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5280f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5281f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5282f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5283f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI differs from the thumbnail. 5284f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5285f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5286f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5287f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(photoUri.equals(thumbnailUri)); 5288f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5289f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form display_photo/ID 5290f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath(DisplayPhoto.CONTENT_URI, photoFileId).toString(), 5291f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5292f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5293f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5294f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForThumbnailPhoto() throws IOException { 5295f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5296f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5297f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5298f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is a thumbnail, so it will only be stored in a BLOB. The photo URI 5299f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // will fall back to the thumbnail URI. 5300f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 5301f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5302f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5303f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5304f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5305f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI is equal to the thumbnail URI. 5306f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5307f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5308f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5309f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 5310f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5311f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form contacts/ID/photo 5312f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath( 5313f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5314f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.Photo.CONTENT_DIRECTORY).toString(), 5315f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5316f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5317f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Loading the photo URI content should get the thumbnail. 5318f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5319f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 5320f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5321f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5322f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5323c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteNewPhotoToAssetFile() throws Exception { 5324f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5325f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5326f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5327f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 5328c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final byte[] originalPhoto = loadPhotoFromResource( 5329c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL); 5330f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5331f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 5332c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 5333f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5334f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5335c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 5336f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5337f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo and thumbnail have been set. 5338c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro String photoUri = null; 5339c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro for (int i = 0; i < 10 && photoUri == null; i++) { 5340c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Wait a tick for the photo processing to occur. 5341c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(100); 5342c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro photoUri = getStoredValue( 5343c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5344c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Contacts.PHOTO_URI); 5345c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5346c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5347f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(photoUri)); 5348f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5349f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5350f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5351f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(thumbnailUri)); 5352c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro assertNotSame(photoUri, thumbnailUri); 5353f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5354f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 5355f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5356f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 5357f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5358f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5359f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 5360f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(thumbnailUri))); 5361f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5362f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5363c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteUpdatedPhotoToAssetFile() throws Exception { 5364f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5365f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5366f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5367f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a large photo first. 5368f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_large); 5369f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String largeEarthPhotoUri = getStoredValue( 5370f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 5371f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5372f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 5373f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro byte[] originalPhoto = loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL); 5374f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5375f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 5376f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 5377f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5378f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5379c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 5380c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5381c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Allow a second for processing to occur. 5382c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(1000); 5383f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5384f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo URI has been modified. 5385f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthPhotoUri = getStoredValue( 5386f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 5387f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(hugeEarthPhotoUri.equals(largeEarthPhotoUri)); 5388f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5389f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 5390f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthThumbnailUri = getStoredValue( 5391f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5392f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5393f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5394f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 5395f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthPhotoUri))); 5396f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5397f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 5398f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthThumbnailUri))); 5399f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5400f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5401f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5402c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro private void writePhotoAsync(final Uri uri, final byte[] photoBytes) throws Exception { 5403c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro AsyncTask<Object, Object, Object> task = new AsyncTask<Object, Object, Object>() { 5404c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro @Override 5405c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro protected Object doInBackground(Object... params) { 5406c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro OutputStream os; 5407c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro try { 5408c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os = mResolver.openOutputStream(uri, "rw"); 5409c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.write(photoBytes); 5410c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.close(); 5411c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro return null; 5412c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } catch (IOException ioe) { 5413c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro throw new RuntimeException(ioe); 5414c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5415c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5416c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro }; 5417c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Object[])null).get(); 5418c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5419c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5420f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoDimensionLimits() { 5421f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 5422f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.DISPLAY_MAX_DIM, 256); 5423f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.THUMBNAIL_MAX_DIM, 96); 5424f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValues(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI, values); 5425f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5426f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5427f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoStoreCleanup() throws IOException { 5428f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 5429c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro PhotoStore photoStore = provider.getPhotoStore(); 5430f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5431f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 5432f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 5433f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5434f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a couple of contacts with photos. 5435f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId1 = createRawContactWithName(); 5436f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId1 = queryContactId(rawContactId1); 5437f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId1 = ContentUris.parseId(insertPhoto(rawContactId1, R.drawable.earth_normal)); 5438f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = 5439f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId1), 5440f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5441f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5442f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId2 = createRawContactWithName(); 5443f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId2 = queryContactId(rawContactId2); 5444f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId2 = ContentUris.parseId(insertPhoto(rawContactId2, R.drawable.earth_normal)); 5445f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId2 = 5446f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 5447f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5448f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5449f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Update the second raw contact with a different photo. 5450f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 5451f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId2); 5452f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 5453f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL)); 5454f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(1, mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 5455f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId2)})); 5456f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long replacementPhotoFileId = 5457f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 5458f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5459f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5460f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a third raw contact that has a bogus photo file ID. 5461f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusFileId = 1234567; 5462f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId3 = createRawContactWithName(); 5463f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId3 = queryContactId(rawContactId3); 5464f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.clear(); 5465f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId3); 5466f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 5467f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_normal, 5468f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoSize.THUMBNAIL)); 5469f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO_FILE_ID, bogusFileId); 5470f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DataRowHandlerForPhoto.SKIP_PROCESSING_KEY, true); 5471f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.insert(Data.CONTENT_URI, values); 5472f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5473c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // Insert a fourth raw contact with a stream item that has a photo, then remove that photo 5474c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // from the photo store. 5475c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Account socialAccount = new Account("social", "social"); 5476c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long rawContactId4 = createRawContactWithName(socialAccount); 5477c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemUri = 5478c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro insertStreamItem(rawContactId4, buildGenericStreamItemValues(), socialAccount); 5479c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 5480c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 5481c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 5482c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 5483c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 5484c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro photoStore.remove(streamItemPhotoFileId); 5485c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 5486f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Also insert a bogus photo that nobody is using. 5487f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusPhotoId = photoStore.insert(new PhotoProcessor(loadPhotoFromResource( 5488f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL), 256, 96)); 5489f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5490f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Manually trigger another cleanup in the provider. 5491f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 5492f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5493f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // The following things should have happened. 5494f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5495f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 1. Raw contact 1 and its photo remain unaffected. 5496f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoFileId1, (long) getStoredLongValue( 5497f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1), 5498f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5499f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5500f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 2. Raw contact 2 retains its new photo. The old one is deleted from the photo store. 5501f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(replacementPhotoFileId, (long) getStoredLongValue( 5502f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2), 5503f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5504f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(photoFileId2)); 5505f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5506f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 3. Raw contact 3 should have its photo file reference cleared. 5507f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue( 5508f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId3), 5509f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5510f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5511f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 4. The bogus photo that nobody was using should be cleared from the photo store. 5512f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(bogusPhotoId)); 5513c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 5514c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // 5. The bogus stream item photo should be cleared from the stream item. 5515c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro assertStoredValues(Uri.withAppendedPath( 5516c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 5517c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 5518c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro new ContentValues[0]); 5519f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5520f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5521d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro public void testPhotoStoreCleanupForProfile() { 5522d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 5523d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro PhotoStore profilePhotoStore = provider.getProfilePhotoStore(); 5524d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5525d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 5526d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.switchToProfileMode(); 5527d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 5528d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5529d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Create the profile contact and add a photo. 5530d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Account socialAccount = new Account("social", "social"); 5531d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentValues values = new ContentValues(); 5532d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_NAME, socialAccount.name); 5533d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_TYPE, socialAccount.type); 5534d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileRawContactId = createBasicProfileContact(values); 5535d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileContactId = queryContactId(profileRawContactId); 5536d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long dataId = ContentUris.parseId( 5537d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertPhoto(profileRawContactId, R.drawable.earth_normal)); 5538d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profilePhotoFileId = 5539d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 5540d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Photo.PHOTO_FILE_ID); 5541d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5542d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Also add a stream item with a photo. 5543d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemUri = 5544d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertStreamItem(profileRawContactId, buildGenericStreamItemValues(), 5545d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro socialAccount); 5546d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 5547d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 5548d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 5549d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 5550d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 5551d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5552d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Remove the stream item photo and the profile photo. 5553d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(profilePhotoFileId); 5554d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(streamItemPhotoFileId); 5555d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5556d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Manually trigger another cleanup in the provider. 5557d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.switchToProfileMode(); 5558d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 5559d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5560d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The following things should have happened. 5561d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5562d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The stream item photo should have been removed. 5563d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertStoredValues(Uri.withAppendedPath( 5564d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 5565d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 5566d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro new ContentValues[0]); 5567d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5568d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The profile photo should have been cleared. 5569d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertNull(getStoredValue( 5570d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 5571d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Contacts.PHOTO_FILE_ID)); 5572d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5573d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro } 5574d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5575f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOverwritePhotoWithThumbnail() throws IOException { 5576f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5577f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5578f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5579f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5580f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write a regular-size photo. 5581f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5582f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Long photoFileId = getStoredLongValue(contactUri, Contacts.PHOTO_FILE_ID); 5583f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertTrue(photoFileId != null && photoFileId > 0); 5584f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5585f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Now overwrite the photo with a thumbnail-sized photo. 5586f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues update = new ContentValues(); 5587f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro update.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_small, PhotoSize.ORIGINAL)); 5588f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.update(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), update, null, null); 5589f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5590f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo file ID should have been nulled out, and the photo URI should be the same as the 5591f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // thumbnail URI. 5592f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue(contactUri, Contacts.PHOTO_FILE_ID)); 5593f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue(contactUri, Contacts.PHOTO_URI); 5594f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI); 5595f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 5596f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5597f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Retrieving the photo URI should get the thumbnail content. 5598f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 5599f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5600f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5601f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 56024e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactSetStarred() { 56034e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId1 = createRawContactWithName(); 56044e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 56054e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId2 = createRawContactWithName(); 56064e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 560747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 560847fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 56094e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56104e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 56114e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 56124e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 56134e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56144e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov ContentValues values = new ContentValues(); 56154e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "1"); 56164e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56174e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 56184e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56194e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 56204e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 56214e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 56224e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56234e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "0"); 56244e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 56254e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56264e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "0"); 56274e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 56284e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 56294e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56304e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(Contacts.STARRED, "1"); 56314e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(contactUri, values, null, null); 56324e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56334e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 56344e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "1"); 56354e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 56364e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov } 56374e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 56386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testSetAndClearSuperPrimaryEmail() { 56396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId1 = createRawContact(new Account("a", "a")); 56406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri11 = insertEmail(rawContactId1, "test1@domain1.com"); 56416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri12 = insertEmail(rawContactId1, "test2@domain1.com"); 56426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId2 = createRawContact(new Account("b", "b")); 56446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri21 = insertEmail(rawContactId2, "test1@domain2.com"); 56456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri22 = insertEmail(rawContactId2, "test2@domain2.com"); 56466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 56486dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 56496dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 56506dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 56516dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 56526dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 56536dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 0); 56546dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 56556dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56566dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Set super primary on the first pair, primary on the second 56576dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 56586dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 56596dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 56606dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 56616dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56626dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 56636dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 56646dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 56656dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 56666dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56676dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56686dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 1); 56696dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 1); 56706dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 56716dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 56726dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 56736dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 56746dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 56756dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 56766dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Clear primary on the first pair, make sure second is not affected and super_primary is 56786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // also cleared 56796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 56806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 56816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 56826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 56836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 56866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 56876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 56886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 56896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 56906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 56916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 56926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 56936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear super_primary, if we specify the correct data row 56956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 56966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 56976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 56986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 56996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 57026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 57036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 57046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 57056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear primary, if we specify the correct data row 57076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 57086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 57096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 57106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 57116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 57146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 57156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 57166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 57176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Now clear super-primary for real 57196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 57206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 57216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 57226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 57236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 57266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 57276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 57286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 57296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 57306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 57316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 57326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 57336dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57346dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57356dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann /** 57366dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * Common function for the testNewPrimaryIn* functions. Its four configurations 57376dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * are each called from its own test 57386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann */ 57396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testChangingPrimary(boolean inUpdate, boolean withSuperPrimary) { 57406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId = createRawContact(new Account("a", "a")); 57416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri1 = insertEmail(rawContactId, "test1@domain1.com", true); 57426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (withSuperPrimary) { 57446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 57456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 57466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri1, values, null, null); 57476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57486dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57496dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 57506dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 57516dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57526dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Insert another item 57536dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final Uri mailUri2; 57546dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (inUpdate) { 57556dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com"); 57566dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57576dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 57586dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 57596dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 0); 57606dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, 0); 57616dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57626dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 57636dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 1); 57646dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri2, values, null, null); 57656dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } else { 57666dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // directly add as default 57676dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com", true); 57686dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57696dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57706dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that primary has been unset on the first 57716dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // If withSuperPrimary is set, also ensure that is has been moved to the new item 57726dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 0); 57736dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, 0); 57746dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 1); 57756dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 57766dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsert() { 57796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, false); 57806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsertWithSuperPrimary() { 57836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, true); 57846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdate() { 57876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, false); 57886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 57906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdateWithSuperPrimary() { 57916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, true); 57926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 57936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 5794ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov public void testContactCounts() { 5795ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Uri uri = Contacts.CONTENT_URI.buildUpon() 5796ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build(); 5797ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5798ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContact(); 5799ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("James", "Sullivan"); 5800ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("The Abominable", "Snowman"); 5801ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mike", "Wazowski"); 5802ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("randall", "boggs"); 5803ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Boo", null); 5804ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mary", null); 5805ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Roz", null); 5806ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5807ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Cursor cursor = mResolver.query(uri, 5808ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 5809ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_PRIMARY + " COLLATE LOCALIZED"); 5810ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 581135997f3fdee2984b6d5373326110eda26929001aMakoto Onuki assertFirstLetterValues(cursor, "", "B", "J", "M", "R", "T"); 5812ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 1, 1, 2, 2, 1); 5813ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 5814ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5815ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor = mResolver.query(uri, 5816ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 5817ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_ALTERNATIVE + " COLLATE LOCALIZED DESC"); 5818ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 581935997f3fdee2984b6d5373326110eda26929001aMakoto Onuki assertFirstLetterValues(cursor, "W", "S", "R", "M", "B", ""); 5820ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 2, 1, 1, 2, 1); 5821ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 5822ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5823ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5824ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterValues(Cursor cursor, String... expected) { 5825ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov String[] actual = cursor.getExtras() 5826ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getStringArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_TITLES); 5827ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 5828ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5829ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5830ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterCounts(Cursor cursor, int... expected) { 5831ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov int[] actual = cursor.getExtras() 5832ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getIntArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS); 5833ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 5834ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5835ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5836f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testReadBooleanQueryParameter() { 5837f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", true, true); 5838f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", false, false); 5839f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=0", "bool", true, false); 5840f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1", "bool", false, true); 5841f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false", "bool", true, false); 5842f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=true", "bool", false, true); 5843f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=FaLsE", "bool", true, false); 5844f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false&some=some", "bool", true, false); 5845f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1&some=some", "bool", false, true); 5846f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?some=bool", "bool", true, true); 5847f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool", "bool", true, true); 5848f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5849f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5850f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertBooleanUriParameter(String uriString, String parameter, 5851f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov boolean defaultValue, boolean expectedValue) { 5852f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.readBooleanQueryParameter( 5853f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter, defaultValue)); 5854f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5855f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5856f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testGetQueryParameter() { 5857f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar", "param", null); 5858f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param", "param", null); 5859f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=", "param", ""); 5860f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val", "param", "val"); 5861f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val&some=some", "param", "val"); 5862f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val", "param", "val"); 5863f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val&else=else", "param", "val"); 5864f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=john%40doe.com", "param", "john@doe.com"); 58655fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val", "param", null); 58665fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2", "param", "val2"); 58675fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=", "param", ""); 58685fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m", "param", null); 58695fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1&another_param=val2¶m=val3", 58705fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val3"); 58715fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2&some_param=val3", 58725fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val2"); 58735fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?param=val1&some_param=val2", "param", "val1"); 58745fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?p=val1&pp=val2", "p", "val1"); 58755fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?pp=val1&p=val2", "p", "val2"); 58765fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val1&pp=val2&p=val3", "p", "val3"); 58775fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val&", "p", null); 5878f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5879f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5880e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testMissingAccountTypeParameter() { 5881e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try querying for RawContacts only using ACCOUNT_NAME 5882e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri queryUri = RawContacts.CONTENT_URI.buildUpon().appendQueryParameter( 5883e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey RawContacts.ACCOUNT_NAME, "lolwut").build(); 5884e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 5885e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Cursor cursor = mResolver.query(queryUri, null, null, null, null); 5886e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to query with incomplete account query parameters"); 5887e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 5888e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 5889e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5890e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5891e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5892e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testInsertInconsistentAccountType() { 5893e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try inserting RawContact with inconsistent Accounts 5894e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account red = new Account("red", "red"); 5895e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account blue = new Account("blue", "blue"); 5896e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5897e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final ContentValues values = new ContentValues(); 5898e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_NAME, red.name); 5899e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_TYPE, red.type); 5900e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5901e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri insertUri = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, blue); 5902e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 5903e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey mResolver.insert(insertUri, values); 5904e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to insert RawContact with inconsistent account details"); 5905e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 5906e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 5907e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5908e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5909e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 59103826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusNoContactsNoAccounts() throws Exception { 59113826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 59123826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 59133826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 59143826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusOnlyLocalContacts() throws Exception { 59153826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov long rawContactId = createRawContact(); 59163826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 59173826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov mResolver.delete( 59183826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null, null); 59193826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 59203826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 59213826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 59223826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusWithAccounts() throws Exception { 59233826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 5924bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{ACCOUNT_1}); 59253826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[]{ACCOUNT_1}); 59263826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 5927bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[0]); 59283826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[0]); 59293826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 59303826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 59313826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 59323826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov private void assertProviderStatus(int expectedProviderStatus) { 593309c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov Cursor cursor = mResolver.query(ProviderStatus.CONTENT_URI, 593409c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov new String[]{ProviderStatus.DATA1, ProviderStatus.STATUS}, null, null, null); 593509c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertTrue(cursor.moveToFirst()); 593609c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertEquals(0, cursor.getLong(0)); 59373826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertEquals(expectedProviderStatus, cursor.getInt(1)); 593809c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov cursor.close(); 593909c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov } 594009c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov 5941b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void testProperties() throws Exception { 5942743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ContactsProvider2 provider = (ContactsProvider2)getProvider(); 5943b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContactsDatabaseHelper helper = (ContactsDatabaseHelper)provider.getDatabaseHelper(); 5944b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertNull(helper.getProperty("non-existent", null)); 5945b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("non-existent", "default")); 5946b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 5947b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", "string1"); 5948b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent2", "string2"); 5949b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string1", helper.getProperty("existent1", "default")); 5950b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string2", helper.getProperty("existent2", "default")); 5951b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", null); 5952b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("existent1", "default")); 5953b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 5954b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 595542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private class VCardTestUriCreator { 595642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup1; 595742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup2; 595842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 595942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public VCardTestUriCreator(String lookup1, String lookup2) { 596042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann super(); 596142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup1 = lookup1; 596242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup2 = lookup2; 596342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 596442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 596542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri1() { 596642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup1); 596742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 596842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 596942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri2() { 597042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup2); 597142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 597242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 597342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getCombinedUri() { 597442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, 597542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(mLookup1 + ":" + mLookup2)); 597642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 597742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 597842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 597942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private VCardTestUriCreator createVCardTestContacts() { 598042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId1 = createRawContact(mAccount, RawContacts.SOURCE_ID, "4:12"); 598142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId1, "John", "Doe"); 598242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 598342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId2 = createRawContact(mAccount, RawContacts.SOURCE_ID, "3:4%121"); 598442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId2, "Jane", "Doh"); 598542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 598642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId1 = queryContactId(rawContactId1); 598742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId2 = queryContactId(rawContactId2); 598842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact1Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1); 598942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact2Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2); 599042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup1 = 599142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact1Uri).getPathSegments().get(2)); 599242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup2 = 599342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact2Uri).getPathSegments().get(2)); 599442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return new VCardTestUriCreator(lookup1, lookup2); 599542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 599642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 599742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryMultiVCard() { 599842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // No need to create any contacts here, because the query for multiple vcards 599942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // does not go into the database at all 600042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri uri = Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, Uri.encode("123:456")); 600142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(uri, null, null, null, null); 600242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 600342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 600442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 600542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 600642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 600742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // The resulting name contains date and time. Ensure that before and after are correct 600842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.startsWith("vcards_")); 600942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.endsWith(".vcf")); 601042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 601142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 601242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 601342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryFileSingleVCard() { 601442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 601542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 601642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 601742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri1(), null, null, null, null); 601842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 601942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 602042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 602142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 602242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("John Doe.vcf", filename); 602342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 602442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 602542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 602642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 602742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri2(), null, null, null, null); 602842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 602942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 603042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 603142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 603242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("Jane Doh.vcf", filename); 603342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 603442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 603542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 603642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 603724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryFileProfileVCard() { 603824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 603924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor cursor = mResolver.query(Profile.CONTENT_VCARD_URI, null, null, null, null); 604024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(1, cursor.getCount()); 604124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.moveToFirst()); 604224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 604324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 604424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals("Mia Prophyl.vcf", filename); 604524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro cursor.close(); 604624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 604742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 604842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileMultiVCard() throws IOException { 604942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 605042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 605142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 605242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getCombinedUri(), "r"); 605342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 605442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String data = readToEnd(inputStream); 605542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 605642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 605742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 605842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the resulting VCard has both contacts 605942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doe;John;;;")); 606042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 606142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 606242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 606342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileSingleVCard() throws IOException { 606442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 606542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 606642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the right VCard is being created in each case 606742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 606842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 606942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri1(), "r"); 607042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 607142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 607242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 607342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 607424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 607524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(data.contains("N:Doe;John;;;")); 607624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertFalse(data.contains("N:Doh;Jane;;;")); 607742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 607842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 607942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 608042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 608142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri2(), "r"); 608242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 608342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 608442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 608542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 608642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 608742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertFalse(data.contains("N:Doe;John;;;")); 608842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 608942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 609042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 609142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 6092dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testAutoGroupMembership() { 6093dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 6094dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6095dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false /* favorite */); 6096dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, false/* favorite */); 6097dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6098dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccountTwo); 6099dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(null); 6100dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6101dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6102dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6103dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6104dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6105dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6106dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6107dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6108dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6109dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6110dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6111dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 6112dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6113dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6114dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g3, c.getLong(0)); 6115dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r2, c.getLong(1)); 6116dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6117dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6118dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6119dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6120dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6121dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6122dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testNoAutoAddMembershipAfterGroupCreation() { 6123dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6124dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6125dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount); 6126dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo); 6127dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 6128dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null); 6129dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6130dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6131dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6132dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6133dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 6134dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6135dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false/* favorite */); 6136dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6137dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6138dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6139dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6140dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6141dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // create some starred and non-starred contacts, some associated with account, some not 6142dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group created 6143dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // the starred contacts should be added to group 6144dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group removed 6145dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // no change to starred status 6146dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesMembershipAfterGroupCreation() { 6147dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6148dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6149dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6150dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo, RawContacts.STARRED, "1"); 6151dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 6152dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null, RawContacts.STARRED, "1"); 6153dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r7 = createRawContact(null); 6154dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6155dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6156dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6157dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6158dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6159dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6160dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, false /* autoAdd */, false/* favorite */); 6161dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6162dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6163dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6164dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6165dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6166dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6167dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6168dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6169dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6170dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6171dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6172dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6173dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6174dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6175dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6176dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6177dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6178dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6179dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6180dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6181dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6182dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6183dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6184dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(RawContacts.CONTENT_URI, r6, 6185dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_NAME, mAccount.name, 6186dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_TYPE, mAccount.type); 6187dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6188dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6189dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6190dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6191dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6192dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6193dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6194dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6195dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6196dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6197dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6198dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r6, c.getLong(1)); 6199dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6200dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6201dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6202dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6203dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6204dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(ContentUris.withAppendedId(Groups.CONTENT_URI, g1), null, null); 6205dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6206dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6207dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6208dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6209dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6210dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6211dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6212dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6213dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6214dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6215dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6216dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6217dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6218dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesGroupMembershipChangeAfterStarChange() { 6219dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6220dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6221dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6222dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6223dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6224dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6225dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6226dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6227dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6228dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6229dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6230dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6231dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6232dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6233dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6234dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6235dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6236dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6237dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6238dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6239dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6240dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6241dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6242dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6243dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6244dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6245dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred 6246dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "1")); 6247dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6248dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6249dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6250dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6251dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6252dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6253dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6254dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6255dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6256dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6257dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6258dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6259dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6260dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6261dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6262dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6263dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6264dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6265dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6266dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6267e3e79030101447da07547647bad225686eb9b8dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(r1)); 6268dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNotNull(contactUri); 6269dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6270dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred via its contact lookup uri 6271dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(contactUri, Contacts.STARRED, "1")); 6272dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6273dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6274dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6275dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6276dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6277dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6278dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6279dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6280dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6281dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6282dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6283dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6284dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6285dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6286dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6287dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(contactUri, Contacts.STARRED, "0"); 6288dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6289dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6290dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6291dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6292dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6293dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testStarChangedAfterGroupMembershipChange() { 6294dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6295dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6296dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6297dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6298dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6299dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6300dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6301dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6302dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6303dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6304dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6305dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6306dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c; 6307dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6308dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r1 to one favorites group 6309dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should automatically be set 6310dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1 should automatically be added to the other favorites group 6311dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir1g1 = insertGroupMembership(r1, g1); 6312dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6313dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6314dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6315dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6316dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6317dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6318dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6319dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6320dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6321dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6322dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6323dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6324dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6325dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6326dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r1 from one favorites group 6327dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir1g1, null, null); 6328dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should no longer be set 6329dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6330dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6331dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6332dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // there should be no membership rows 6333dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6334dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6335dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6336dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r3 to the one favorites group for that account 6337dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be set 6338dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir3g4 = insertGroupMembership(r3, g4); 6339dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6340dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6341dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6342dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6343dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 6344dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6345dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6346dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g4, c.getLong(0)); 6347dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6348dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6349dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6350dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6351dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6352dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6353dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r3 from the favorites group 6354dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir3g4, null, null); 6355dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be cleared 6356dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6357dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6358dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6359dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6360dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6361dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6362dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 636397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyRawContact() { 636497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 636597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 636697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 636797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 636897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 636997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "second"); 637097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 637197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 637297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = rawContactUri.buildUpon() 637397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 637497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 637597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, RawContacts.CUSTOM_RINGTONE, "third"); 637697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "third"); 637797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 637897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 637997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyDataRow() { 638097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 638197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "email"); 638297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "555-1111"); 638397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 638497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Data.IS_READ_ONLY, "1"); 638597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Email.ADDRESS, "changed"); 638697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(phoneUri, Phone.NUMBER, "555-2222"); 638797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "email"); 638897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(phoneUri, Phone.NUMBER, "555-2222"); 638997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 639097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = emailUri.buildUpon() 639197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 639297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 639397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, Email.ADDRESS, "changed"); 639497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "changed"); 639597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 639697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 639797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testContactWithReadOnlyRawContact() { 639897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId1 = createRawContact(); 639997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 640097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "first"); 640197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 640297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId2 = createRawContact(); 640397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 640497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 640597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 640697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 640797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 640897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov rawContactId1, rawContactId2); 640997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 641097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long contactId = queryContactId(rawContactId1); 641197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 641297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 641397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 641497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 641597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "rt"); 641697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 641797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 641897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 64197a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameParsingQuery() { 64207a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 64217a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr.").build(); 64227a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 64237a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 64247a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr."); 642517a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr."); 64267a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 64277a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 64287a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 64297a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 64307a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 64317a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 64327a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 64337a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 64347a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 64357a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 64367a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameConcatenationQuery() { 64377a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 64387a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.PREFIX, "Mr") 64397a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.GIVEN_NAME, "John") 64407a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.MIDDLE_NAME, "Q.") 64417a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.FAMILY_NAME, "Doe") 64427a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.SUFFIX, "Jr.") 64437a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .build(); 64447a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 64457a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 644655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr John Q. Doe, Jr."); 64477a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 64487a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 64497a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 64507a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 64517a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 64527a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 64537a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 64547a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 64557a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 64567a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 64577a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 6458084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki public void testBuildSingleRowResult() { 6459084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 6460084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"b"}, 6461084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 6462084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 6463084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {2} 6464084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 6465084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6466084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 6467084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"b", "a", "b"}, 6468084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 6469084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 6470084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {2, 1, 2} 6471084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 6472084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6473084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 6474084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki null, // all columns 6475084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 6476084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 6477084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2} 6478084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 6479084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6480084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki try { 6481084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki // Access non-existent column 6482084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ContactsProvider2.buildSingleRowResult(new String[] {"a"}, new String[] {"b"}, 6483084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Object[] {1}); 6484084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki fail(); 6485084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } catch (IllegalArgumentException expected) { 6486084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6487084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6488084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6489084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki private void checkBuildSingleRowResult(String[] projection, String[] availableColumns, 6490084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki Object[] data, Integer[] expectedValues) { 6491084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki final Cursor c = ContactsProvider2.buildSingleRowResult(projection, availableColumns, data); 6492084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki try { 6493084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertTrue(c.moveToFirst()); 6494084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals(1, c.getCount()); 6495084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals(expectedValues.length, c.getColumnCount()); 6496084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6497084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki for (int i = 0; i < expectedValues.length; i++) { 6498084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals("column " + i, expectedValues[i], (Integer) c.getInt(i)); 6499084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6500084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } finally { 6501084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki c.close(); 6502084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6503084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6504084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6505dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana private Cursor queryGroupMemberships(Account account) { 6506dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = mResolver.query(maybeAddAccountQueryParameters(Data.CONTENT_URI, account), 6507dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana new String[]{GroupMembership.GROUP_ROW_ID, GroupMembership.RAW_CONTACT_ID}, 6508dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Data.MIMETYPE + "=?", new String[]{GroupMembership.CONTENT_ITEM_TYPE}, 6509dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana GroupMembership.GROUP_SOURCE_ID); 6510dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return c; 6511dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6512dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 651342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String readToEnd(FileInputStream inputStream) { 651442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann try { 6515bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("DECLARED INPUT STREAM LENGTH: " + inputStream.available()); 651642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann int ch; 651742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann StringBuilder stringBuilder = new StringBuilder(); 6518bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov int index = 0; 6519bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov while (true) { 6520bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov ch = inputStream.read(); 6521bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("READ CHARACTER: " + index + " " + ch); 6522bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov if (ch == -1) { 6523bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov break; 6524bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 652542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann stringBuilder.append((char)ch); 6526bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov index++; 6527bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 652842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return stringBuilder.toString(); 652942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } catch (IOException e) { 653042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return null; 653142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 653242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 653342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 6534f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertQueryParameter(String uriString, String parameter, String expectedValue) { 6535f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.getQueryParameter( 6536f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter)); 6537f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6538f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 65394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private long createContact(ContentValues values, String firstName, String givenName, 65404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 6541aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 654224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createContact(values, firstName, givenName, phoneNumber, email, presenceStatus, 654324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, false); 654424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 654524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 654624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createContact(ContentValues values, String firstName, String givenName, 654724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 654824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 654948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return queryContactId(createRawContact(values, firstName, givenName, phoneNumber, email, 655024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro presenceStatus, timesContacted, starred, groupId, chatMode, isUserProfile)); 655148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 655248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 655348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String firstName, String givenName, 655448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 6555aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 655648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 6557aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori timesContacted, starred, groupId, chatMode); 655848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov insertStructuredName(rawContactId, firstName, givenName); 655948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 656048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 656148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 656224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String firstName, String givenName, 656324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 656424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 656524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 656624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, isUserProfile); 656724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertStructuredName(rawContactId, firstName, givenName); 656824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return rawContactId; 656924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 657024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 657148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String phoneNumber, String email, 6572aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori int presenceStatus, int timesContacted, int starred, long groupId, int chatMode) { 657324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createRawContact(values, phoneNumber, email, presenceStatus, timesContacted, starred, 657424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro groupId, chatMode, false); 657524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 657624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 657724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String phoneNumber, String email, 657824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro int presenceStatus, int timesContacted, int starred, long groupId, int chatMode, 657924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro boolean isUserProfile) { 65804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, starred); 65814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 65824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "beethoven5"); 65834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, timesContacted); 658424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 658524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri insertionUri = isUserProfile 658624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ? Profile.CONTENT_RAW_CONTACTS_URI 658724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro : RawContacts.CONTENT_URI; 658824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri rawContactUri = mResolver.insert(insertionUri, values); 65894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 65904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 65914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 65924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.PHOTO_ID, photoId); 65939dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(phoneNumber)) { 65949dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId, phoneNumber); 65959dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 65969dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(email)) { 65979dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertEmail(rawContactId, email); 65989dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 65994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 6600aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, email, presenceStatus, "hacking", 66015d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro chatMode, isUserProfile); 66024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 66034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov if (groupId != 0) { 66044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertGroupMembership(rawContactId, groupId); 66054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 660624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 660748786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 66084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 66094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 661024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 661124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values under the user's profile. 661224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param profileValues Values to be used to create the entry (common values will be 661324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 661424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 661524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 661624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicProfileContact(ContentValues profileValues) { 661724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createRawContact(profileValues, "Mia", "Prophyl", 661824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18005554411", "mia.prophyl@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 661924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, true); 662024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.put(Contacts.DISPLAY_NAME, "Mia Prophyl"); 662124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return profileRawContactId; 662224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 662324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 662424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 662524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values that is not under the user's profile. 662624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param nonProfileValues Values to be used to create the entry (common values will be 662724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 662824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 662924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 663024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicNonProfileContact(ContentValues nonProfileValues) { 663124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createRawContact(nonProfileValues, "John", "Doe", 663224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 663324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 663424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nonProfileValues.put(Contacts.DISPLAY_NAME, "John Doe"); 663524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return nonProfileRawContactId; 663624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 663724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 66384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private void putDataValues(ContentValues values, long rawContactId) { 66394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 66404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 66414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 66424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 66434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 66444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA1, "one"); 66454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA2, "two"); 66464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA3, "three"); 66474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA4, "four"); 66484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA5, "five"); 66494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA6, "six"); 66504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA7, "seven"); 66514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA8, "eight"); 66524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA9, "nine"); 66534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA10, "ten"); 66544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA11, "eleven"); 66554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA12, "twelve"); 66564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA13, "thirteen"); 66574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA14, "fourteen"); 66584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA15, "fifteen"); 66594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC1, "sync1"); 66604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC2, "sync2"); 66614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC3, "sync3"); 66624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC4, "sync4"); 66634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 66644928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 66654928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa /** 66664928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param data1 email address or phone number 66674928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param usageType One of {@link DataUsageFeedback#USAGE_TYPE} 66684928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param values ContentValues for this feedback. Useful for incrementing 66694928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * {Contacts#TIMES_CONTACTED} in the ContentValue. Can be null. 66704928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa */ 66714928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa private void sendFeedback(String data1, String usageType, ContentValues values) { 66724928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final long dataId = getStoredLongValue(Data.CONTENT_URI, 66734928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa Data.DATA1 + "=?", new String[] { data1 }, Data._ID); 66744928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final Uri feedbackUri = DataUsageFeedback.FEEDBACK_URI.buildUpon() 66754928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .appendPath(String.valueOf(dataId)) 66764928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, usageType) 66774928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .build(); 66784928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertNotSame(0, mResolver.update(feedbackUri, new ContentValues(), null, null)); 66794928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa if (values != null && values.containsKey(Contacts.TIMES_CONTACTED)) { 66804928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa values.put(Contacts.TIMES_CONTACTED, values.getAsInteger(Contacts.TIMES_CONTACTED) + 1); 66814928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 66824928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 6683d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov} 6684