ContactsProvider2Test.java revision ae32283e7fc5b749df96523d8bb343b9068b65ba
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 19dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onukiimport static com.android.providers.contacts.TestUtils.cv; 20dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 21d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport com.android.internal.util.ArrayUtils; 22dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.AggregationExceptionColumns; 23f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawaimport com.android.providers.contacts.ContactsDatabaseHelper.DataUsageStatColumns; 249ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.DbProperties; 25b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns; 26dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.Tables; 27f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport com.android.providers.contacts.tests.R; 2824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport com.google.android.collect.Lists; 299ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onukiimport com.google.android.collect.Sets; 30d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3170d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wongimport android.accounts.Account; 32d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderOperation; 33d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderResult; 34d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentUris; 35d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentValues; 369261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.content.Entity; 3733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.content.EntityIterator; 3842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport android.content.res.AssetFileDescriptor; 39d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.database.Cursor; 40d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.net.Uri; 41c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoroimport android.os.AsyncTask; 42c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract; 43d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 44e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Callable; 45dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 46dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 47dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 48dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 49dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 50dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 51e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.SipAddress; 52dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 53dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 54ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikovimport android.provider.ContactsContract.ContactCounts; 55c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 569261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.Data; 5746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback; 58dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.Directory; 595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.DisplayNameSources; 60f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.DisplayPhoto; 617a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 623cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.PhoneLookup; 645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.PhoneticNameStyle; 6524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport android.provider.ContactsContract.Profile; 6609c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus; 6733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 6862318e1ea8306142a10526534b7d83560ecf5b3aFred Quintanaimport android.provider.ContactsContract.RawContactsEntity; 69916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikovimport android.provider.ContactsContract.SearchSnippetColumns; 7089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikovimport android.provider.ContactsContract.Settings; 7182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItemPhotos; 73f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.StreamItems; 74dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.OpenableColumns; 757d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekhimport android.test.MoreAsserts; 76d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 77f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.text.TextUtils; 78ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onukiimport android.util.Log; 79d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 8042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.FileInputStream; 8142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.IOException; 82f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport java.io.OutputStream; 835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.text.Collator; 843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.ArrayList; 855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Arrays; 863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.List; 875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 889ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onukiimport java.util.Set; 895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 90d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/** 91d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}. 92d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 93d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Run the test like this: 94d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * <code> 9523ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki adb shell am instrument -e class com.android.providers.contacts.ContactsProvider2Test -w \ 9623ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 97d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * </code> 98d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 99d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov@LargeTest 100d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovpublic class ContactsProvider2Test extends BaseContactsProvider2Test { 101d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 10247fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_1 = new Account("account_name_1", "account_type_1"); 10347fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_2 = new Account("account_name_2", "account_type_2"); 10447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov 105dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsProjection() { 106dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_URI, new String[]{ 107dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 108dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 109dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 110dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 111dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 112dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 113dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 114dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 115dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 116dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 117dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 118dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 119dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 120f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1213d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1223d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 123dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 124dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 125dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 12624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 127dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 128dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 129dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 130dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 131dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 132dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 133dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 134dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 135dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 136dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 137dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 138dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 13963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki public void testContactsStrequentProjection() { 14063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertProjection(Contacts.CONTENT_STREQUENT_URI, new String[]{ 14163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts._ID, 14263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_PRIMARY, 14363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_ALTERNATIVE, 14463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_SOURCE, 14563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME, 14663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME_STYLE, 14763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_PRIMARY, 14863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_ALTERNATIVE, 14963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LAST_TIME_CONTACTED, 15063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.TIMES_CONTACTED, 15163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.STARRED, 15263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IN_VISIBLE_GROUP, 15363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_ID, 15463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_FILE_ID, 15563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_URI, 15663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_THUMBNAIL_URI, 15763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CUSTOM_RINGTONE, 15863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.HAS_PHONE_NUMBER, 15963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SEND_TO_VOICEMAIL, 16063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IS_USER_PROFILE, 16163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LOOKUP_KEY, 16263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.NAME_RAW_CONTACT_ID, 16363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_PRESENCE, 16463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_CHAT_CAPABILITY, 16563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS, 16663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_TIMESTAMP, 16763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_RES_PACKAGE, 16863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_LABEL, 16963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_ICON, 17063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.TIMES_USED, 17163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, 17263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki }); 17363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 17463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 17563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki public void testContactsStrequentPhoneOnlyProjection() { 17663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertProjection(Contacts.CONTENT_STREQUENT_URI.buildUpon() 17763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true").build(), 17863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki new String[] { 17963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts._ID, 18063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_PRIMARY, 18163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_ALTERNATIVE, 18263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_SOURCE, 18363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME, 18463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME_STYLE, 18563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_PRIMARY, 18663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_ALTERNATIVE, 18763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LAST_TIME_CONTACTED, 18863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.TIMES_CONTACTED, 18963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.STARRED, 19063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IN_VISIBLE_GROUP, 19163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_ID, 19263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_FILE_ID, 19363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_URI, 19463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_THUMBNAIL_URI, 19563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CUSTOM_RINGTONE, 19663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.HAS_PHONE_NUMBER, 19763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SEND_TO_VOICEMAIL, 19863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IS_USER_PROFILE, 19963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LOOKUP_KEY, 20063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.NAME_RAW_CONTACT_ID, 20163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_PRESENCE, 20263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_CHAT_CAPABILITY, 20363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS, 20463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_TIMESTAMP, 20563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_RES_PACKAGE, 20663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_LABEL, 20763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_ICON, 20863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.TIMES_USED, 20963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, 21063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Phone.NUMBER, 21163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Phone.TYPE, 21263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Phone.LABEL, 21363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki }); 21463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 21563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 216dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsWithSnippetProjection() { 217dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_FILTER_URI.buildUpon().appendPath("nothing").build(), 218dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 219dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 220dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 221dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 222dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 223dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 224dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 225dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 226dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 227dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 228dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 229dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 230dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 231dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 232f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 2333d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 2343d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 235dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 236dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 237dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 23824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 239dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 240dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 241dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 242dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 243dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 244dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 245dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 246dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 247dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 248dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 24930cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov SearchSnippetColumns.SNIPPET, 250dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 251dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 252dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 253dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawContactsProjection() { 254dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContacts.CONTENT_URI, new String[]{ 255dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 256dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 257dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 258dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 25943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 26043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 261dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 262dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 26324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 264dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 265dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 266dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 267dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE, 268dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 269dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME, 270dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE, 271dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 272dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_PRIMARY, 273dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE, 274dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.TIMES_CONTACTED, 275dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.LAST_TIME_CONTACTED, 276dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CUSTOM_RINGTONE, 277dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL, 278dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 279dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.AGGREGATION_MODE, 280dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 281dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 282dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 283dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 284dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 285dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 286dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 287dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDataProjection() { 288dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Data.CONTENT_URI, new String[]{ 289dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 290dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RAW_CONTACT_ID, 291dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 292dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 293dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 294dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 295dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 296dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 297dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 298dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 299dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 300dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 301dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 302dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 303dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 304dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 305dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 306dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 307dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 308dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 309dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 310dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 311dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 312dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 313dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 314dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 315dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 316dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 317dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 318dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 319dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 320dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 321dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 322dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 323dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 324dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 32543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 32643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 327dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 328dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 329dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 330dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 33124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 332dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 333dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 334dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 335dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 336dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 337dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 338dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 339dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 340dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 341dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 342dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 343dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 344dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 345f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 3463d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 3473d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 348dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 349dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 350dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 351dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 352cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 353dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 354dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 355dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 356dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 357dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 358dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 359dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 360dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 361dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 362dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 363dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 364dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDistinctDataProjection() { 365dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Phone.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 366dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 367dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 368dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 369dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 370dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 371dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 372dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 373dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 374dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 375dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 376dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 377dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 378dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 379dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 380dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 381dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 382dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 383dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 384dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 385dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 386dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 387dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 388dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 389dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 390dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 391dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 392dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 393dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 394dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 395dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 396dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 397dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 398dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 399dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 40024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 401dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 402dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 403dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 404dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 405dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 406dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 407dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 408dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 409dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 410dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 411dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 412dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 413dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 414f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 4153d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 4163d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 417cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 418dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 419dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 420dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 421dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 422dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 423dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 424dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 425dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 426dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 427dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 428dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 429dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 430dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 431dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 432a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testEntityProjection() { 433a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertProjection( 434a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 0), 435a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.CONTENT_DIRECTORY), 436a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov new String[]{ 437a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity._ID, 438a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.DATA_ID, 439a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID, 440a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA_VERSION, 441a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_PRIMARY, 442a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_SUPER_PRIMARY, 443a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.RES_PACKAGE, 444a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.MIMETYPE, 445a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA1, 446a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA2, 447a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA3, 448a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA4, 449a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA5, 450a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA6, 451a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA7, 452a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA8, 453a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA9, 454a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA10, 455a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA11, 456a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA12, 457a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA13, 458a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA14, 459a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA15, 460a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC1, 461a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC2, 462a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC3, 463a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC4, 464a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CONTACT_ID, 465a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.PRESENCE, 466a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CHAT_CAPABILITY, 467a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS, 468a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_TIMESTAMP, 469a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_RES_PACKAGE, 470a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_LABEL, 471a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_ICON, 472a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_NAME, 473a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_TYPE, 47443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 47543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 476a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SOURCE_ID, 477a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.VERSION, 478a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DELETED, 479a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DIRTY, 480a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.NAME_VERIFIED, 481a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC1, 482a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC2, 483a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC3, 484a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC4, 485a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts._ID, 486a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 487a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 488a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 489a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME, 490a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 491a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 492a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 493a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 494a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.TIMES_CONTACTED, 495a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.STARRED, 496a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 497a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHOTO_ID, 498f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 4993d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 5003d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 501a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CUSTOM_RINGTONE, 502a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 50324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 504a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LOOKUP_KEY, 505a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 506cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 507a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_PRESENCE, 508a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 509a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS, 510a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 511a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 512a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 513a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 514a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 515a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov }); 516a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 517a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 518dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawEntityProjection() { 519dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContactsEntity.CONTENT_URI, new String[]{ 520dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.Entity.DATA_ID, 521dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 522dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 523dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 524dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 52543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 52643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 527dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 528dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 529dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 530dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 531dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 532dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 533dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 534dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 535dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 536dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 53724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 538dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 539dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 540dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 541dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 542dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 543dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 544dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 545dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 546dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 547dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 548dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 549dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 550dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 551dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 552dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 553dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 554dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 555dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 556dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 557dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 558dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 559dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 560dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 561dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 562dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 563dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 564dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 565dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 566dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testPhoneLookupProjection() { 567dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(PhoneLookup.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 568dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 569dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup._ID, 570dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LOOKUP_KEY, 571dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.DISPLAY_NAME, 572dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LAST_TIME_CONTACTED, 573dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TIMES_CONTACTED, 574dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.STARRED, 575dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.IN_VISIBLE_GROUP, 576dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.PHOTO_ID, 5773d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_URI, 5783d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_THUMBNAIL_URI, 579dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.CUSTOM_RINGTONE, 580dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.HAS_PHONE_NUMBER, 581dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.SEND_TO_VOICEMAIL, 582dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.NUMBER, 583dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TYPE, 584dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LABEL, 5852530512f639c4979fd7371c7dd25dd67e8118124Bai Tao PhoneLookup.NORMALIZED_NUMBER, 586dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 587dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 588dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 589dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsProjection() { 590dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_URI, new String[]{ 591dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 592dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 593dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 59443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 59543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 596dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 597dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 598dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 599dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 600dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 601dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 602dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 603dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 604dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 605dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 606dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 607dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 608dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 609c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 610dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 611dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 612dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 613dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 614dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 615dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 616dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 617dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsSummaryProjection() { 618dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_SUMMARY_URI, new String[]{ 619dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 620dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 621dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 62243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 62343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 624dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 625dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 626dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 627dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 628dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 629dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 630dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 631dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 632dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 633dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 634dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 635dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 636dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 637c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 638dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 639dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 640dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 641dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 642dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_COUNT, 643dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_WITH_PHONES, 64418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 645dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 646dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 647dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 648dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testAggregateExceptionProjection() { 649dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(AggregationExceptions.CONTENT_URI, new String[]{ 650dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptionColumns._ID, 651dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.TYPE, 652dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1, 653dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2, 654dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 655dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 656dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 657dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testSettingsProjection() { 658dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Settings.CONTENT_URI, new String[]{ 659dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_NAME, 660dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_TYPE, 661f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Settings.DATA_SET, 662dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_VISIBLE, 663dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.SHOULD_SYNC, 664dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ANY_UNSYNCED, 665dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_COUNT, 666dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_WITH_PHONES, 667dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 668dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 669dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 670dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testStatusUpdatesProjection() { 671dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(StatusUpdates.CONTENT_URI, new String[]{ 672dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID, 673dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.DATA_ID, 674dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_ACCOUNT, 675dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_HANDLE, 676dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PROTOCOL, 677dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL, 678dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PRESENCE, 679dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CHAT_CAPABILITY, 680dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS, 681dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP, 682dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE, 683dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_ICON, 684dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_LABEL, 685dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 686dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 687dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 688dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDirectoryProjection() { 689dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Directory.CONTENT_URI, new String[]{ 690dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory._ID, 691dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.PACKAGE_NAME, 692dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.TYPE_RESOURCE_ID, 693dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DISPLAY_NAME, 694dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DIRECTORY_AUTHORITY, 695dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_TYPE, 696dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_NAME, 697dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.EXPORT_SUPPORT, 698778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.SHORTCUT_SUPPORT, 699778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.PHOTO_SUPPORT, 700dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 701dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 702dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 7033cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testRawContactsInsert() { 7043cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 7053cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7063cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_NAME, "a"); 7073cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_TYPE, "b"); 7089d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki values.put(RawContacts.DATA_SET, "ds"); 7093cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SOURCE_ID, "c"); 7103cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.VERSION, 42); 7113cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DIRTY, 1); 7123cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DELETED, 1); 7133cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED); 7143cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 7153cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 7163cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 7173cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 7183cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC1, "e"); 7193cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC2, "f"); 7203cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC3, "g"); 7213cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC4, "h"); 7223cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7233cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values); 7244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rowUri); 7253cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7263cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 7274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(RawContacts.CONTENT_URI, values, RawContacts._ID, rawContactId); 72881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 7293cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 7303cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7312149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov public void testDataDirectoryWithLookupUri() { 7322149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov ContentValues values = new ContentValues(); 7332149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7342149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long rawContactId = createRawContactWithName(); 7352149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertPhoneNumber(rawContactId, "555-GOOG-411"); 7362149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertEmail(rawContactId, "google@android.com"); 7372149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7382149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long contactId = queryContactId(rawContactId); 7392149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 7402149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7412149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete and valid lookup URI 7422149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 7432149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 7442149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7452149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 7462149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7472149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete but stale lookup URI 7482149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 7492149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 7502149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 7512149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7522149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Incomplete lookup URI (lookup key only, no contact ID) 7532149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, 7542149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupKey), Contacts.Data.CONTENT_DIRECTORY); 7552149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 7562149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 7572149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7582149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov private void assertDataRows(Uri dataUri, ContentValues values) { 7592149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Cursor cursor = mResolver.query(dataUri, new String[]{ Data.DATA1 }, null, null, Data._ID); 7602149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertEquals(3, cursor.getCount()); 7612149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToFirst(); 7622149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "John Doe"); 7632149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 7642149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7652149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 7662149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "555-GOOG-411"); 7672149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 7682149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7692149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 7702149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "google@android.com"); 7712149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 7722149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7732149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.close(); 7742149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 7752149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 776a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithIdBasedUri() { 777a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 778a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 779a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 780a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 781a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 782a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 783a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 7845d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 785a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 786a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 787a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 788a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 789a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 790a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 791a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 792a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 793a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY); 794a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 795a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 796a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 797a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 798a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithLookupUri() { 799a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 800a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 801a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 802a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 803a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 804a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 805a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 8065d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 807a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 808a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 809a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 810a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 811a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 812a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 813a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 814a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 815a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First try with a matching contact ID 816a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 817a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 818a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 819a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 820a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try with a contact ID mismatch 821a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 822a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 823a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 824a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 825a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try without an ID altogether 826a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey); 827a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 828a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 829a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 830a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 831a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov private void assertEntityRows(Uri entityUri, long contactId, long rawContactId1, 832a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2) { 833a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 834a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 835a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Cursor cursor = mResolver.query(entityUri, null, null, null, 836a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID + "," + Contacts.Entity.DATA_ID); 837a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEquals(3, cursor.getCount()); 838a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 839a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First row - name 840a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToFirst(); 841a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 842a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 843a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 844a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "John Doe"); 845a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 846a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 847a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 848a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 849a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 850a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 851a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 852a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 853a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 854a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 855a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 856a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Second row - IM 857a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 858a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 859a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 860a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, Im.CONTENT_ITEM_TYPE); 861a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "gtalk"); 862a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 863a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 864a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 865a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 866a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 867a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 868a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 869a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 870a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.PRESENCE, StatusUpdates.IDLE); 871a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 872a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 873a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Third row - second raw contact, not data 874a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 875a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 876a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId2); 877a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.MIMETYPE); 878a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA_ID); 879a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA1); 880a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act2"); 881a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype2"); 882a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 883a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 884a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 885a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 886a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 887a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 888a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 889a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 890a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 891a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.close(); 892a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 893a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 8943cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testDataInsert() { 8954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("John", "Doe"); 8964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 8984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov putDataValues(values, rawContactId); 8994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 9004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 9014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 9034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 9044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(dataUri, values); 9054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Data.CONTENT_URI, values, Data._ID, dataId); 9074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under RawContacts 9094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 9104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactDataUri = 9114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri.withAppendedPath(rawContactUri, RawContacts.Data.CONTENT_DIRECTORY); 9124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(rawContactDataUri, values, Data._ID, dataId); 9134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under Contacts 9154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 9164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactDataUri = Uri.withAppendedPath(contactUri, Contacts.Data.CONTENT_DIRECTORY); 9174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(contactDataUri, values, Data._ID, dataId); 91881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 9194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 9203cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 92189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactDataQuery() { 92289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 92389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 92489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 92589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri1 = insertStructuredName(rawContactId1, "John", "Doe"); 92689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 92789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri2 = insertStructuredName(rawContactId2, "Jane", "Doe"); 92889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 92989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(dataUri1, account1); 93089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(dataUri2, account2); 93189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Data._ID, ContentUris.parseId(dataUri1)) ; 93289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Data._ID, ContentUris.parseId(dataUri2)) ; 93389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 93489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 9354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesQuery() { 9367d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 9373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 9384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 9394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 9404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 9414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 9424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 9434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 9454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 9464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 9484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertPhoneNumber(rawContactId, "18004664411"); 9494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long phoneId = ContentUris.parseId(uri); 9504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 9534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 9544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, phoneId); 9553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 9564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 9574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 9584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 9594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 9604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 9614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 9624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 9634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 9644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 9654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 9664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 9674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 96848828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Phone.CONTENT_URI, phoneId), values); 9694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Phone.CONTENT_URI, values, Data._ID, phoneId); 9704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 9714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 972cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa public void testPhonesWithMergedContacts() { 973cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId1 = createRawContact(); 974cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId1, "123456789", true); 975cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 976cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId2 = createRawContact(); 977cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId2, "123456789", true); 978cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9790992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 9800992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki rawContactId1, rawContactId2); 9810992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki assertNotAggregated(rawContactId1, rawContactId2); 9820992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki 983cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa ContentValues values1 = new ContentValues(); 984cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "123456789"); 985cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 986cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Phone.NUMBER, "123456789"); 987cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9880992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // There are two phone numbers, so we should get two rows. 989cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 990cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9910992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now set the dedupe flag. But still we should get two rows, because they're two 9920992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // different contacts. We only dedupe within each contact. 9938ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Phone.CONTENT_URI.buildUpon() 9948ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 9958ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 9968ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, new ContentValues[] {values1, values1}); 9978ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 9980992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now join them into a single contact. 999cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 1000cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa rawContactId1, rawContactId2); 1001cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 1002cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertAggregated(rawContactId1, rawContactId2, "123456789"); 1003cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 10040992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Contact merge won't affect the default result of Phone Uri, where we don't dedupe. 10058ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 10068ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 10070992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now we dedupe them. 10088ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values1); 1009cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa } 1010cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 1011904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann public void testPhonesNormalizedNumber() { 1012904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final long rawContactId = createRawContact(); 1013904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1014904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Write both a number and a normalized number. Those should be written as-is 1015904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final ContentValues values = new ContentValues(); 1016904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Data.RAW_CONTACT_ID, rawContactId); 1017904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1018904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "1234"); 1019904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "5678"); 1020904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.TYPE, Phone.TYPE_HOME); 1021904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1022904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 1023904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1024904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Ensure both can be looked up 1025904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1026904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1234"), null, null)); 1027904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1028904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "5678"), null, null)); 1029904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1030904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace both in an UPDATE 1031904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 1032904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "4321"); 1033904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "8765"); 1034904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 1035904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1036904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1234"), null, null)); 1037904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1038904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "4321"), null, null)); 1039904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1040904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "5678"), null, null)); 1041904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1042904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 1043904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1044904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace only NUMBER ==> NORMALIZED_NUMBER will be inferred (we test that by making 1045904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // sure the old manual value can not be found anymore) 1046904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 1047904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "1-800-466-5432"); 1048904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 1049904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals( 1050904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1, 1051904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1-800-466-5432"), null, 1052904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann null)); 1053904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1054904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 1055904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1056904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace only NORMALIZED_NUMBER ==> call is ignored, things will be unchanged 1057904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 1058904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "8765"); 1059904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 1060904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals( 1061904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1, 1062904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1-800-466-5432"), null, 1063904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann null)); 1064904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1065904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 1066904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann } 1067904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 10684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesFilterQuery() { 1069e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Phone.CONTENT_FILTER_URI); 1070e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1071e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1072e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** 1073e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * A convenient method for {@link #testPhonesFilterQuery()} and 1074e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link #testCallablesFilterQuery()}. 1075e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 1076e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * This confirms if both URIs return identical results for phone-only contacts and 1077e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * appropriately different results for contacts with sip addresses. 1078e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 1079e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * @param baseFilterUri Either {@link Phone#CONTENT_FILTER_URI} or 1080e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link Callable#CONTENT_FILTER_URI}. 1081e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa */ 1082e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa private void testPhonesFilterQueryInter(Uri baseFilterUri) { 1083e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertTrue("Unsupported Uri (" + baseFilterUri + ")", 1084e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa Phone.CONTENT_FILTER_URI.equals(baseFilterUri) 1085e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa || Callable.CONTENT_FILTER_URI.equals(baseFilterUri)); 1086e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1087e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 10885e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId1, "1-800-466-4411"); 10895e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1090e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("Chilled", "Guacamole", ACCOUNT_2); 10912a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1-800-466-5432"); 109258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "0@example.com", false, Phone.TYPE_PAGER); 109358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "1@example.com", false, Phone.TYPE_PAGER); 10945e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1095e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri1 = Uri.withAppendedPath(baseFilterUri, "tamale"); 10964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 10974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 10984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 10995e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Phone.NUMBER, "1-800-466-4411"); 11004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 11014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 11025e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 11034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1104e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri2 = Uri.withAppendedPath(baseFilterUri, "1-800-GOOG-411"); 11055e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri2, values); 11065e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1107e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri3 = Uri.withAppendedPath(baseFilterUri, "18004664"); 11085e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri3, values); 11095e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1110e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri4 = Uri.withAppendedPath(baseFilterUri, "encilada"); 11115e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 111245d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov 1113e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri5 = Uri.withAppendedPath(baseFilterUri, "*"); 111445d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 111558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 111658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values1 = new ContentValues(); 111758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 111858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 111958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.NUMBER, "1-800-466-5432"); 112058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 112158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.putNull(Phone.LABEL); 112258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 112358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values2 = new ContentValues(); 112458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 112558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 112658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.NUMBER, "0@example.com"); 112758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.TYPE, Phone.TYPE_PAGER); 112858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.putNull(Phone.LABEL); 112958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 113058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values3 = new ContentValues(); 113158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 113258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 113358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.NUMBER, "1@example.com"); 113458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.TYPE, Phone.TYPE_PAGER); 113558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.putNull(Phone.LABEL); 113658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 1137e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri6 = Uri.withAppendedPath(baseFilterUri, "Chilled"); 1138e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} ); 1139e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1140e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Insert a SIP address. From here, Phone URI and Callable URI may return different results 1141e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // than each other. 1142e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip_hot_tamale@example.com"); 1143e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip:sip_hot@example.com"); 1144e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1145e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri7 = Uri.withAppendedPath(baseFilterUri, "sip_hot"); 1146e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri8 = Uri.withAppendedPath(baseFilterUri, "sip_hot_tamale"); 1147e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa if (Callable.CONTENT_FILTER_URI.equals(baseFilterUri)) { 1148e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values4 = new ContentValues(); 1149e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1150e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1151e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(SipAddress.SIP_ADDRESS, "sip_hot_tamale@example.com"); 1152e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1153e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values5 = new ContentValues(); 1154e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1155e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1156e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(SipAddress.SIP_ADDRESS, "sip:sip_hot@example.com"); 1157e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri1, new ContentValues[] {values, values4, values5}); 1158e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1159e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri7, new ContentValues[] {values4, values5}); 1160e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri8, values4); 1161e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } else { 1162e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sip address should not affect Phone URI. 1163e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValuesWithProjection(filterUri1, values); 1164e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri7, null, null)); 1165e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1166e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1167e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sanity test. Run tests for "Chilled Guacamole" again and see nothing changes 1168e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // after the Sip address being inserted. 1169e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri2, values); 1170e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri3, values); 1171e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri4, null, null)); 1172e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri5, null, null)); 117358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} ); 11744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 11754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 11764c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki public void testPhonesFilterSearchParams() { 11774c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki final long rid1 = createRawContactWithName("Dad", null); 11784c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki insertPhoneNumber(rid1, "123-456-7890"); 11794c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 11804c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki final long rid2 = createRawContactWithName("Mam", null); 11814c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki insertPhoneNumber(rid2, "323-123-4567"); 11824c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 11834c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki // By default, "dad" will match both the display name and the phone number. 11844c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki // Because "dad" is "323" after the dialpad conversion, it'll match "Mam" too. 11854c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 11864c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad").build(), 11874c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890"), 11884c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567") 11894c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki ); 11904c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 11914c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad") 11924c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0") 11934c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .build(), 11944c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890") 11954c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki ); 11964c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 11974c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 11984c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad") 11994c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0") 12004c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .build(), 12014c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567") 12024c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki ); 12034c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 12044c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad") 12054c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0") 12064c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0") 12074c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .build() 12084c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki ); 12094c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki } 12104c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 1211e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public void testPhoneLookup() { 1212e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov ContentValues values = new ContentValues(); 1213e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1214e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1215e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1216e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1217e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1218e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1219e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 12204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 12214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1222ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // We'll create two lookup records, 18004664411 and +18004664411, and the below lookup 1223ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // will match both. 1224ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki 12254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1226e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1227e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.clear(); 1228e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup._ID, queryContactId(rawContactId)); 1229e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 1230e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.NUMBER, "18004664411"); 1231e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.TYPE, Phone.TYPE_HOME); 1232e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.putNull(PhoneLookup.LABEL); 1233e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.CUSTOM_RINGTONE, "d"); 1234e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.SEND_TO_VOICEMAIL, 1); 1235ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertStoredValues(lookupUri1, null, null, new ContentValues[] {values, values}); 12364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1237892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // In the context that 8004664411 is a valid number, "4664411" as a 123834984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia // call id should match to both "8004664411" and "+18004664411". 1239e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "4664411"); 124034984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia assertEquals(2, getCount(lookupUri2, null, null)); 1241892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1242892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1243892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void testPhoneLookupUseCases() { 1244892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues values = new ContentValues(); 1245892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri rawContactUri; 1246892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactId; 1247892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri lookupUri2; 1248892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1249892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1250892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1251892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1252892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // International format in contacts 1253892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1254892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1255892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1256892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1257892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "+1-650-861-0000"); 1258892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1259892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1260892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1261892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1262892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0000"); 1263892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1264892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1265892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1266892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0000"); 1267892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1268892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1269892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // National format in contacts 1270892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1271892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1272892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1273892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1274892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1275892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1276892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot1", "Tamale"); 1277892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "650-861-0001"); 1278892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1279892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1280892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1281892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1282892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0001"); 1283892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1284892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1285892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1286892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0001"); 1287892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1288892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1289892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Local format in contacts 1290892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1291892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1292892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1293892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1294892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1295892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1296892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot2", "Tamale"); 1297892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "861-0002"); 1298892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1299892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1300892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1301892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1302892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0002"); 1303892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1304892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1305892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1306892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0002"); 1307892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 13084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 13094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 131056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testIntlPhoneLookupUseCases() { 131156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Checks the logic that relies on using the trailing 7-digits as a fallback for phone 131256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // number lookups. 131356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String fullNumber = "01197297427289"; 131456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 131556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 131656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 131756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 131856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 131956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 132056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, fullNumber); 132156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 132256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Full number should definitely match. 132356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 132456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, fullNumber), null, null)); 132556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 132656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Shorter (local) number with 0 prefix should also match. 132756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 132856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "097427289"), null, null)); 132956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 133056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Shorter (local) number with +0 prefix should also match. 133156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 133256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "+097427289"), null, null)); 133356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 133456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with dashes should match. 133556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 133656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09-742-7289"), null, null)); 133756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 133856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with spaces should match. 133956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 134056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09 742 7289"), null, null)); 134156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 134256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Some other number should not match. 134356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(0, getCount(Uri.withAppendedPath( 134456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "049102395"), null, null)); 134556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 134656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 134756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testPhoneLookupB5252190() { 134856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Test cases from b/5252190 134956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String storedNumber = "796010101"; 135056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 135156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 135256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 135356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 135456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 135556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 135656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, storedNumber); 135756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 135856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 135956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "0796010101"), null, null)); 136056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 136156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 136256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "+48796010101"), null, null)); 136356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 136456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 136556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "48796010101"), null, null)); 136656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 136756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 136856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4-879-601-0101"), null, null)); 136956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 137056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 137156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4 879 601 0101"), null, null)); 137256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 137356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 1374653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov public void testPhoneUpdate() { 1375653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov ContentValues values = new ContentValues(); 1376653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1377653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1378653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1379653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1380653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "18004664411"); 1381653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1382653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1383ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664422"); 1384ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri1, null, null)); 1385ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri2, null, null)); 1386653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1387653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1388653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1389653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1390653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1391ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1392ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 1393653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1394653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Setting number to null will remove the phone lookup record 1395653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1396653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.putNull(Phone.NUMBER); 1397653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1398653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1399ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1400653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov assertEquals(0, getCount(lookupUri2, null, null)); 1401653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1402653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Let's restore that phone lookup record 1403653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1404653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1405653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1406ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1407ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 140881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 1409653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov } 1410653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1411e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** Tests if {@link Callable#CONTENT_URI} returns both phones and sip addresses. */ 1412e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesQuery() { 1413e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId1 = createRawContactWithName("Meghan", "Knox"); 1414e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long phoneId1 = ContentUris.parseId(insertPhoneNumber(rawContactId1, "18004664411")); 1415e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId1 = queryContactId(rawContactId1); 1416e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1417e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId2 = createRawContactWithName("John", "Doe"); 1418e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long sipAddressId2 = ContentUris.parseId( 1419e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId2, "sip@example.com")); 1420e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId2 = queryContactId(rawContactId2); 1421e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1422e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values1 = new ContentValues(); 1423e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data._ID, phoneId1); 1424e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.RAW_CONTACT_ID, rawContactId1); 1425e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(RawContacts.CONTACT_ID, contactId1); 1426e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1427e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.NUMBER, "18004664411"); 1428e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 1429e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.putNull(Phone.LABEL); 1430e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 1431e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1432e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values2 = new ContentValues(); 1433e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data._ID, sipAddressId2); 1434e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.RAW_CONTACT_ID, rawContactId2); 1435e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(RawContacts.CONTACT_ID, contactId2); 1436e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1437e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(SipAddress.SIP_ADDRESS, "sip@example.com"); 1438e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "John Doe"); 1439e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1440e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(2, getCount(Callable.CONTENT_URI, null, null)); 1441e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(Callable.CONTENT_URI, new ContentValues[] { values1, values2 }); 1442e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1443e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1444e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesFilterQuery() { 1445e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Callable.CONTENT_FILTER_URI); 1446e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1447e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 14484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testEmailsQuery() { 14494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 14504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 14514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 14524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 14534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 14544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 14554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 14578ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long rawContactId = ContentUris.parseId(rawContactUri); 14584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 14608ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri = insertEmail(rawContactId, "meghan@acme.com"); 14618ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId = ContentUris.parseId(emailUri); 14624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14638ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 14644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 14654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, emailId); 14664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 14674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 14684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 14694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "meghan@acme.com"); 14704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 14714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 14724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 14734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 14744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 14754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 14764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 14774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 14784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14798ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, values); 148048828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 14814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Email.CONTENT_URI, values, Data._ID, emailId); 14828ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 14838ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated email addresses. 14848ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri2 = insertEmail(rawContactId, "meghan@acme.com"); 14858ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId2 = ContentUris.parseId(emailUri2); 14868ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 14878ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, emailId2); 14888ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 14898ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Email.CONTENT_URI.buildUpon() 14908ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 14918ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 14928ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 14938ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 14948ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 14958ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId), values); 14968ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId2), values2); 14978ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId2), values2); 14988ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 14998ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, new ContentValues[] {values, values2}); 15008ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 15018ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 15028ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 15038ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 15048ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 15054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 15064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15075e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsLookupQuery() { 15084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Hot", "Tamale"); 15094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertEmail(rawContactId, "tamale@acme.com"); 15104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15115e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "tamale@acme.com"); 15124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 15134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 15144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 15154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 15164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 15174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 15184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(filterUri1, values); 15194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 152008768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "Ta<TaMale@acme.com>"); 152108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertStoredValues(filterUri2, values); 152208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 152308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "encilada@acme.com"); 152408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertEquals(0, getCount(filterUri3, null, null)); 15254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 15264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15275e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsFilterQuery() { 152847fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 15295e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 15305e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 15315e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 153247fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("Hot", "Tamale", ACCOUNT_2); 15335e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId2, "tamale@acme.com"); 15345e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 15355e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tam"); 15365e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov ContentValues values = new ContentValues(); 15375e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 15385e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 15395e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 15405e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 15415e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.putNull(Email.LABEL); 15425e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 15435e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 15445e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot"); 15455e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri2, values); 15465e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1547155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot tamale"); 15485e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri3, values); 15495e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 15501e530df9f7e496dc47f77d4323c89bd413b79b64Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tamale@acme"); 15515e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri4, values); 15525e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 15535e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri5 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "encilada"); 15545e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 15555e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov } 15565e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 15577d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa /** 1558c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns addresses according to registration order. 1559c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1560c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterDefaultSortOrder() { 1561c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1562c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1563c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com"); 1564c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address3@email.com"); 1565c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1566c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1567c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1568c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1569c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1570c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1571c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1572c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1573c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v1, v2, v3 }); 1574c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1575c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1576c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 1577c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns primary addresses before the other addresses. 1578c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1579c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterPrimaryAddress() { 1580c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1581c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1582c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com", true); 1583c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1584c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1585c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1586c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1587c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1588c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1589c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v2, v1 }); 1590c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1591c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1592c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 15937d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * Tests if ContactsProvider2 has email address associated with a primary account before the 15947d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * other address. 15957d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa */ 15967d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa public void testEmailFilterPrimaryAccount() { 15977d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId1 = createRawContact(ACCOUNT_1); 15987d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId1, "account1@email.com"); 15997d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId2 = createRawContact(ACCOUNT_2); 16007d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId2, "account2@email.com"); 16017d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v1 = new ContentValues(); 16027d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v1.put(Email.ADDRESS, "account1@email.com"); 16037d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v2 = new ContentValues(); 16047d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v2.put(Email.ADDRESS, "account2@email.com"); 16057d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 16067d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri1 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 16077d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 16087d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_1.type) 16097d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 16107d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2 }); 16117d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 16127d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 16137d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 16147d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_2.type) 16157d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 16167d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v2, v1 }); 16177d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 16187d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa // Just with PRIMARY_ACCOUNT_NAME 16197d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 16207d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 16217d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 16227d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2 }); 16237d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 16247d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 16257d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 16267d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 16277d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v2, v1 }); 16287d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 16297d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 163046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** Tests {@link DataUsageFeedback} correctly promotes a data row instead of a raw contact. */ 163146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public void testEmailFilterSortOrderWithFeedback() { 163246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId1 = createRawContact(); 16334928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address1 = "address1@email.com"; 16344928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId1, address1); 1635dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 163646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId2 = createRawContact(); 16374928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address2 = "address2@email.com"; 16384928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId2, address2); 16394928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address3 = "address3@email.com"; 16404928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa ContentUris.parseId(insertEmail(rawContactId2, address3)); 164146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 164246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v1 = new ContentValues(); 164346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 164446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v2 = new ContentValues(); 164546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 164646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v3 = new ContentValues(); 164746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 164846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 164946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 165046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 165146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 165246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_CALL) 165346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 165446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 165546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 165646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT) 165746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 165846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 165946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 166046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_SHORT_TEXT) 166146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 166246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2, v3 }); 166346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v1, v2, v3 }); 166446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2, v3 }); 166546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v1, v2, v3 }); 166646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 16674928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(address3, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, v3); 166846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1669dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesWithProjection(RawContacts.CONTENT_URI, 1670dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rawContactId1, 1671dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 0 1672dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 1673dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rawContactId2, 1674dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 1 1675dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 1676dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 1677dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 1678dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // account3@email.com should be the first. 167946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v3, v1, v2 }); 168046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v3, v1, v2 }); 168146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 168246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1683f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa /** 1684f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * Tests {@link DataUsageFeedback} correctly bucketize contacts using each 1685f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * {@link DataUsageStatColumns#LAST_TIME_USED} 1686f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa */ 1687f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa public void testEmailFilterSortOrderWithOldHistory() { 1688f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long rawContactId1 = createRawContact(); 1689f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId1 = ContentUris.parseId(insertEmail(rawContactId1, "address1@email.com")); 1690f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId2 = ContentUris.parseId(insertEmail(rawContactId1, "address2@email.com")); 1691f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId3 = ContentUris.parseId(insertEmail(rawContactId1, "address3@email.com")); 1692f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId4 = ContentUris.parseId(insertEmail(rawContactId1, "address4@email.com")); 1693f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1694f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1695f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1696f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1697f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1698f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1699f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1700f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1701f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1702f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v4 = new ContentValues(); 1703f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v4.put(Email.ADDRESS, "address4@email.com"); 1704f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1705f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa final ContactsProvider2 provider = (ContactsProvider2) getProvider(); 1706f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1707f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long nowInMillis = System.currentTimeMillis(); 1708f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000); 1709f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000); 1710f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000); 1711f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1712f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address4 is contacted just once yesterday. 1713f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId4), 1714f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, yesterdayInMillis); 1715f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1716f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address3 is contacted twice 1 week ago. 1717f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1718f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1719f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1720f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1721f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1722f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is contacted three times 1 year ago. 1723f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1724f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1725f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1726f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1727f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1728f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1729f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1730f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // auto-complete should prefer recently contacted methods 1731f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v4, v3, v2, v1 }); 1732f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1733f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address2 is contacted right now 1734f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1735f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1736f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1737f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Now address2 is the most recently used address 1738f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v4, v3, v1 }); 1739f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1740f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address1 is contacted right now 1741f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId1), 1742f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1743f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1744f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is preferred to address1 as address2 is used 4 times in total 1745f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v1, v4, v3 }); 1746f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa } 1747f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 17484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPostalsQuery() { 17494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Alice", "Nextore"); 17504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 17518ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId = ContentUris.parseId(dataUri); 17524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17538ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 17544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 17554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, dataId); 17564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 17574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 17584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 17594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(StructuredPostal.FORMATTED_ADDRESS, "1600 Amphiteatre Ave, Mountain View"); 17604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Alice Nextore"); 17614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17628ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, values); 176348828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 176448828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov values); 17654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(StructuredPostal.CONTENT_URI, values, Data._ID, dataId); 17668ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 17678ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated addresses. 17688ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa Uri dataUri2 = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 17698ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId2 = ContentUris.parseId(dataUri2); 17708ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 17718ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, dataId2); 17728ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 17738ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = StructuredPostal.CONTENT_URI.buildUpon() 17748ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 17758ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 17768ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 17778ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 17788ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 17798ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values); 17808ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId), values); 17818ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId2), 17828ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2); 17838ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId2), values2); 17848ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 17858ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, new ContentValues[] {values, values2}); 17868ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 17878ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 17888ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 17898ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 17908ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 17914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 17924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testQueryContactData() { 17944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 17954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1796aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1797d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 17984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 17994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 18004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(contactUri, values); 18014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 18024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 18034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 18040a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testQueryContactWithStatusUpdate() { 18054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 18064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1807aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1808aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 180982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1810aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori values.put(Contacts.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 1811ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 1812ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 1813ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelectionWithProjection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 18144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 18154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1816a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByName() { 18174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 181848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1819aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1820d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1821aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 182248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 182348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov ContentValues nameValues = new ContentValues(); 182448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.GIVEN_NAME, "Stu"); 182548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.FAMILY_NAME, "Goulash"); 18263b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "goo"); 18273b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "LASH"); 18287ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, nameValues); 182948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 183048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long contactId = queryContactId(rawContactId); 183182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 183248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1833ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goulash"); 1834ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 18354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 183648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov assertContactFilter(contactId, "goolash"); 18373b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov assertContactFilter(contactId, "lash"); 183848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1839a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 18403b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov 18413b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov // Phonetic name with given/family reversed should not match 1842a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("lashgoo"); 18437ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 18447ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.clear(); 18457ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "ga"); 18467ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "losh"); 18477ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 18487ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov mResolver.update(nameUri, nameValues, null, null); 18497ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 18507ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov assertContactFilter(contactId, "galosh"); 18517ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 1852a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1853a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1854a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1855a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByEmailAddress() { 1856a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1857a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1858a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1859a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1860a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1861a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1862a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1863a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1864a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1865a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1866a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1867a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goog411@acme.com"); 1868a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1869a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1870a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog"); 1871a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411"); 1872a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@"); 1873a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme"); 1874a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme.com"); 1875a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1876a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@acme.combo"); 1877a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@le.com"); 1878a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1879a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1880a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1881a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByPhoneNumber() { 1882a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1883a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1884a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1885a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1886a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1887a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1888a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1889a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1890a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1891a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1892a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1893a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "18004664411"); 1894a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1895a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1896a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "18004664411"); 1897a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "1800466"); 1898a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "+18004664411"); 1899a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "8004664411"); 1900a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1901a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("78004664411"); 1902a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("18004664412"); 1903a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("8884664411"); 19044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 19054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 19062f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa /** 19072f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * Checks ContactsProvider2 works well with strequent Uris. The provider should return starred 19082f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * contacts and frequently used contacts. 19092f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa */ 1910ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactStrequent() { 19114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 19122f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String email1 = "a@acme.com"; 19132f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted1 = 0; 19144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Noah", "Tever", "18004664411", 19152f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa email1, StatusUpdates.OFFLINE, timesContacted1, 0, 0, 1916d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 19174928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final String phoneNumber2 = "18004664412"; 19184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 19194928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa createContact(values2, "Sam", "Times", phoneNumber2, 1920aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "b@acme.com", StatusUpdates.INVISIBLE, 3, 0, 0, 1921aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 19224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values3 = new ContentValues(); 19232f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String phoneNumber3 = "18004664413"; 19242f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted3 = 5; 19252f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa createContact(values3, "Lotta", "Calling", phoneNumber3, 19262f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, timesContacted3, 0, 0, 1927d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO); 19284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values4 = new ContentValues(); 19299dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa final long rawContactId4 = createRawContact(values4, "Fay", "Veritt", null, 1930aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 1931d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO | StatusUpdates.CAPABILITY_HAS_VOICE); 19324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 19332f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Starred contacts should be returned. TIMES_CONTACTED should be ignored and only data 19342f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // usage feedback should be used for "frequently contacted" listing. 19352f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(Contacts.CONTENT_STREQUENT_URI, values4); 19362f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 19372f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Send feedback for the 3rd phone number, pretending we called that person via phone. 19384928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 19392f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 19402f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 3rd contact should be shown after starred one. 19412f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 19422f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa new ContentValues[] { values4, values3 }); 19432f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 19444928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 19452f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Twice. 19464928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 19472f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 19482f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 1st and 3rd contacts should be shown after starred one. 19492f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 19504928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa new ContentValues[] { values4, values1, values3 }); 19512f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 19529dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // With phone-only parameter, 1st and 4th contacts shouldn't be returned because: 19539dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 1st: feedbacks are only about email, not about phone call. 19549dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 4th: it has no phone number though starred. 19552f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Uri phoneOnlyStrequentUri = Contacts.CONTENT_STREQUENT_URI.buildUpon() 19562f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true") 19572f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .build(); 19589dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values3 }); 19599dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 19609dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Now the 4th contact has a phone number. 19619dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId4, "18004664414"); 19629dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 19639dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Phone only strequent should return 4th contact. 19644928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 19654928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 19664928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // Send feedback for the 2rd phone number, pretending we send the person a SMS message. 19674928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber2, DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, values1); 19684928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 19694928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // SMS feedback shouldn't affect phone-only results. 19704928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 19714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1972ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, "fay"); 19732f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(filterUri, values4); 19744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 19754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 197663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki public void testQueryContactStrequentFrequentOrder() { 197763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Prepare test data 197863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid1 = createRawContact(); 197963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did1 = ContentUris.parseId(insertPhoneNumber(rid1, "1")); 198063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did1e = ContentUris.parseId(insertEmail(rid1, "1@email.com")); 198163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 198263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid2 = createRawContact(); 198363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did2 = ContentUris.parseId(insertPhoneNumber(rid2, "2")); 198463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 198563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid3 = createRawContact(); 198663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did3 = ContentUris.parseId(insertPhoneNumber(rid3, "3")); 198763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 198863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid4 = createRawContact(); 198963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did4 = ContentUris.parseId(insertPhoneNumber(rid4, "4")); 199063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 199163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid5 = createRawContact(); 199263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did5 = ContentUris.parseId(insertPhoneNumber(rid5, "5")); 199363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 199463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid6 = createRawContact(); 199563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did6 = ContentUris.parseId(insertPhoneNumber(rid6, "6")); 199663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 199763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid1 = queryContactId(rid1); 199863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid2 = queryContactId(rid2); 199963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid3 = queryContactId(rid3); 200063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid4 = queryContactId(rid4); 200163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid5 = queryContactId(rid5); 200263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid6 = queryContactId(rid6); 200363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 200463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Make sure they aren't aggregated. 200563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki EvenMoreAsserts.assertUnique(cid1, cid2, cid3, cid4, cid5, cid6); 200663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 200763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Prepare the clock 200863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.install(); 200963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 201063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // We check the timestamp in SQL, which doesn't know about the MockClock. So we need to 201163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // use the actual (roughly) time. 201263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 201363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long nowInMillis = System.currentTimeMillis(); 201463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000); 201563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000); 201663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000); 201763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 201863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // A year ago... 201963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.setCurrentTimeMillis(oneYearAgoInMillis); 202063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 202163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did1, did2); 202263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did1); 202363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 202463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // 7 days ago... 202563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.setCurrentTimeMillis(sevenDaysAgoInMillis); 202663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 202763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did3, did4); 202863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did3); 202963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 203063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Yesterday... 203163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.setCurrentTimeMillis(yesterdayInMillis); 203263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 203363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did5, did6); 203463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did5); 203563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 203663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Contact cid1 again, but it's an email, not a phone call. 203763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1e); 203863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 203963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Check the order -- The regular frequent, which is contact based. 204063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Note because we contacted cid1 yesterday, it's been contacted 3 times, so it comes 204163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // first. 204263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 204363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid1), 204463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid5), 204563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid6), 204663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid3), 204763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid4), 204863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid2)); 204963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 205063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Check the order -- phone only frequent, which is data based. 205163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Note this is based on data, and only looks at phone numbers, so the order is different 205263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // now. 205363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI.buildUpon() 205463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "1").build(), 205563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did5), 205663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did6), 205763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did3), 205863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did4), 205963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did1), 206063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did2)); 206163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 206263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 206345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa /** 206445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * Checks ContactsProvider2 works well with frequent Uri. The provider should return frequently 206545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * contacted person ordered by number of times contacted. 206645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa */ 206745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa public void testQueryContactFrequent() { 206845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values1 = new ContentValues(); 206945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email1 = "a@acme.com"; 207045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values1, "Noah", "Tever", "18004664411", 207145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email1, StatusUpdates.OFFLINE, 0, 0, 0, 0); 207245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values2 = new ContentValues(); 207345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email2 = "b@acme.com"; 207445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values2, "Sam", "Times", "18004664412", 207545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0); 207645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values3 = new ContentValues(); 207745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String phoneNumber3 = "18004664413"; 2078363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa final long contactId3 = createContact(values3, "Lotta", "Calling", phoneNumber3, 2079363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, 0, 1, 0, 0); 208045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values4 = new ContentValues(); 208145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values4, "Fay", "Veritt", "18004664414", 208245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 0); 208345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 208445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 208545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 208645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, values1); 208745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 208845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Pretend email was sent to the address twice. 208945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 209045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 209145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 209245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1}); 209345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 209445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Three times 209545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 209645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 209745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 209845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 209945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 210045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 2101363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 2102363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa // Test it works with selection/selectionArgs 2103363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2104363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 2105363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values2, values1}); 2106363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2107363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 2108363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3}); 2109363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 2110363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3.put(Contacts.STARRED, 0); 2111363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertEquals(1, 2112363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa mResolver.update(Uri.withAppendedPath(Contacts.CONTENT_URI, 2113363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa String.valueOf(contactId3)), 2114363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3, null, null)); 2115363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2116363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 2117363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 2118363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2119363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 2120363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {}); 212145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa } 212245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 212380628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki public void testQueryContactFrequentExcludingInvisible() { 212480628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki ContentValues values1 = new ContentValues(); 212580628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final String email1 = "a@acme.com"; 212680628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final long cid1 = createContact(values1, "Noah", "Tever", "18004664411", 212780628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki email1, StatusUpdates.OFFLINE, 0, 0, 0, 0); 212880628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki ContentValues values2 = new ContentValues(); 212980628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final String email2 = "b@acme.com"; 213080628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final long cid2 = createContact(values2, "Sam", "Times", "18004664412", 213180628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0); 213280628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 213380628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 213480628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 213580628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 213680628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki // First, we have two contacts in frequent. 213780628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1}); 213880628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 213980628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki // Contact 2 goes invisible. 214080628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki markInvisible(cid2); 214180628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 214280628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki // Now we have only 1 frequent. 214380628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values1}); 214480628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki } 214580628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 2146ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactGroup() { 21474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long groupId = createGroup(null, "testGroup", "Test Group"); 21484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 21494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 21504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Best", "West", "18004664411", 2151aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "west@acme.com", StatusUpdates.OFFLINE, 0, 0, groupId, 2152aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 21534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 21544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 21554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values2, "Rest", "East", "18004664422", 2156aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "east@acme.com", StatusUpdates.AVAILABLE, 0, 0, 0, 2157aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 21584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2159ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 21604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Cursor c = mResolver.query(filterUri1, null, null, null, Contacts._ID); 21614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 21624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 21634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values1); 21644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 21654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2166ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 21674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri2, null, Contacts.DISPLAY_NAME + "=?", 21684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov new String[] { "Best West" }, Contacts._ID); 21694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 21704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 21714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2172ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Next Group"); 21734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri3, null, null, null, Contacts._ID); 21744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, c.getCount()); 21754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 21763cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 21773cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 217836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro private void expectSecurityException(String failureMessage, Uri uri, String[] projection, 217936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String selection, String[] selectionArgs, String sortOrder) { 218024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 218124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 218236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro c = mResolver.query(uri, projection, selection, selectionArgs, sortOrder); 218336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail(failureMessage); 218424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 218536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // The security exception is expected to occur because we're missing a permission. 218624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 218724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 218824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 218924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 219024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 219136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 219236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 219336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testQueryProfileRequiresReadPermission() { 219436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 219536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 219636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro createBasicProfileContact(new ContentValues()); 219736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 219836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Case 1: Retrieving profile contact. 219936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 220036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile without READ_PROFILE access should fail.", 220136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI, null, null, null, Contacts._ID); 220224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 220324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieving profile data. 220436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 220536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile data without READ_PROFILE access should fail.", 220636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 220736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 220824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 220924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieving profile entities. 221036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 221136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile entities without READ_PROFILE access should fail.", 221236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon() 221336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entities").build(), null, null, null, Contacts._ID); 221424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 221524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 221624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByContactIdRequiresReadPermission() { 221724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 221824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 221924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 222024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 222124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 222224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // A query for the profile contact by ID should fail. 222336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 222436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile by contact ID without READ_PROFILE access should fail.", 222536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 222636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 222724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 222824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 222924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByRawContactIdRequiresReadPermission() { 223024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 223124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 223224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the raw contact. 223324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 223436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 223536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 223636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, 223736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro profileRawContactId), null, null, null, RawContacts._ID); 223824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 223924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 224024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileRawContactRequiresReadPermission() { 224124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 224224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 224324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the profile's raw contact data. 224424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 224524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 224624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 1: Retrieve the overall raw contact set for the profile. 224736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 224836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 224936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, null, null, null, null); 225024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 225124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieve the raw contact profile data for the inserted raw contact ID. 225236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 225336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile data without READ_PROFILE access should fail.", 225436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 225536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 225636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("data").build(), null, null, null, null); 225724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 225824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieve the raw contact profile entity for the inserted raw contact ID. 225936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 226036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile entities without READ_PROFILE access should fail.", 226136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 226236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 226336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entity").build(), null, null, null, null); 226424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 226524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 226624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataByDataIdRequiresReadPermission() { 226724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 226824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = mResolver.query(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 226924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro new String[]{Data._ID, Data.MIMETYPE}, null, null, null); 227024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(4, c.getCount()); // Photo, phone, email, name. 227124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.moveToFirst(); 227224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileDataId = c.getLong(0); 227324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 227424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 227524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the data 227624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 227736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 227836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 227936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, profileDataId), 228036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 228124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 228224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 228324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataRequiresReadPermission() { 228424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 228524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 228624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve all profile data. 228724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 228836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 228936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 229036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 229136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 229224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 229324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 229424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileRequiresWritePermission() { 229524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 229624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 229724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a non-profile contact should be fine. 229824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(new ContentValues()); 229924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 230024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a profile contact should throw an exception. 230124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 230224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 230324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Creating a profile contact should fail without WRITE_PROFILE access."); 230424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 230524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 230624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 230724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 230824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileDataRequiresWritePermission() { 230924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 231024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 231124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 231224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 231324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertEmail(profileRawContactId, "foo@bar.net", false); 231424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Inserting data into a profile contact should fail without WRITE_PROFILE access."); 231524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 231624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 231724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 231824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 23196ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro public void testUpdateDataDoesNotRequireProfilePermission() { 23206ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 23216ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 23226ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 23236ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Create a non-profile contact. 23246ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long rawContactId = createRawContactWithName("Domo", "Arigato"); 23256ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long dataId = getStoredLongValue(Data.CONTENT_URI, 23266ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", 23276ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(rawContactId), StructuredName.CONTENT_ITEM_TYPE}, 23286ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data._ID); 23296ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 23306ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Updates its name using a selection. 23316ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro ContentValues values = new ContentValues(); 23326ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.GIVEN_NAME, "Bob"); 23336ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.FAMILY_NAME, "Blob"); 23346ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 23356ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(dataId)}); 23366ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 23376ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Check that the update went through. 23386ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro assertStoredValues(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), values); 23396ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro } 23406ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 23415d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro public void testQueryContactThenProfile() { 234224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 234324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 234424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 234524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 234624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 234724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createBasicNonProfileContact(nonProfileValues); 234824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileContactId = queryContactId(nonProfileRawContactId); 234924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 23505d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Contacts.CONTENT_URI, nonProfileValues); 235124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertSelection(Contacts.CONTENT_URI, nonProfileValues, Contacts._ID, nonProfileContactId); 23525d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 23535d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 235424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 235524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 235624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryContactExcludeProfile() { 235724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a profile contact (it should not be returned by the general contact URI). 235824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 235924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 236024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a non-profile contact - this should be returned. 236124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 236224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(nonProfileValues); 236324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 236424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Contacts.CONTENT_URI, new ContentValues[] {nonProfileValues}); 236524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 236624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 236724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfile() { 236824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 236924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 237024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 237124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 237224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 237324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 237424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private ContentValues[] getExpectedProfileDataValues() { 237524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected photo data values (only field is the photo BLOB, which we can't check). 237624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues photoRow = new ContentValues(); 237724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro photoRow.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 237824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 237924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected phone data values. 238024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues phoneRow = new ContentValues(); 238124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 238224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Phone.NUMBER, "18005554411"); 238324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 238424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected email data values. 238524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues emailRow = new ContentValues(); 238624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 238724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Email.ADDRESS, "mia.prophyl@acme.com"); 238824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 238924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected name data values. 239024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nameRow = new ContentValues(); 239124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 239224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.DISPLAY_NAME, "Mia Prophyl"); 239324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.GIVEN_NAME, "Mia"); 239424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.FAMILY_NAME, "Prophyl"); 239524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 239624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return new ContentValues[]{photoRow, phoneRow, emailRow, nameRow}; 239724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 239824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 239924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileData() { 240024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 240124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 240224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 240324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 240424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 240524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 240624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileEntities() { 240724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 240824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 240924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("entities").build(), 241024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 241124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 241224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 241324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfile() { 241424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 241524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 241624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 241724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 241824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 241924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, profileValues); 242024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 242124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 242224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileById() { 242324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 242424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 242524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 242624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 242724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 242824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 242924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId), profileValues); 243024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 243124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 243224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileData() { 243324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 243424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 243524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 243624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 243724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("data").build(), getExpectedProfileDataValues()); 243824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 243924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 244024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileEntity() { 244124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 244224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 244324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 244424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 244524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("entity").build(), getExpectedProfileDataValues()); 244624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 244724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 244824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryDataForProfile() { 244924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 245024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 245124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 245224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 245324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 245424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 2455cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro public void testUpdateProfileRawContact() { 2456cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro createBasicProfileContact(new ContentValues()); 2457cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro ContentValues updatedValues = new ContentValues(); 2458cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.SEND_TO_VOICEMAIL, 0); 2459cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.CUSTOM_RINGTONE, "rachmaninoff3"); 2460cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.STARRED, 1); 2461cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro mResolver.update(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues, null, null); 2462cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2463cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues); 2464cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro } 2465cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2466a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro public void testInsertProfileWithDataSetTriggersAccountCreation() { 2467a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that we have no profile raw contacts. 2468a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, new ContentValues[]{}); 2469a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2470a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Insert a profile record with a new data set. 2471a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Account account = new Account("a", "b"); 2472a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro String dataSet = "c"; 2473a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Uri profileUri = maybeAddAccountQueryParameters(Profile.CONTENT_RAW_CONTACTS_URI, account) 2474a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro .buildUpon().appendQueryParameter(RawContacts.DATA_SET, dataSet).build(); 2475a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro ContentValues values = new ContentValues(); 2476a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(profileUri, values)); 2477a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro values.put(RawContacts._ID, rawContactId); 2478a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2479a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that querying for the profile gets the created raw contact. 2480a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, values); 2481a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro } 2482a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 248385077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfilePhoto() throws IOException { 248485077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 248585077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 248687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 248785077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.THUMBNAIL), 248885077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, false)); 248985077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 249085077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 249185077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfileDisplayPhoto() throws IOException { 249285077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 249385077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 249487426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 249585077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 249685077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, true)); 249785077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 249885077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 24990a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testPhonesWithStatusUpdate() { 250019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 250119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov ContentValues values = new ContentValues(); 250219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 250319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 250419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 250519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 250619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 250719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 250819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664412"); 250919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog411@acme.com"); 251019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog412@acme.com"); 251119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 251282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 2513aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.INVISIBLE, "Bad", 2514aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 251582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog412@acme.com", 2516aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, "Good", 2517aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VOICE); 251819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long contactId = queryContactId(rawContactId); 251919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 252082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri uri = Data.CONTENT_URI; 252119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 2522a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov Cursor c = mResolver.query(uri, null, RawContacts.CONTACT_ID + "=" + contactId + " AND " 2523a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", null, Phone.NUMBER); 252419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertEquals(2, c.getCount()); 252519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 252619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToFirst(); 252719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 252819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 252982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 25300a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 253119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 253219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 253319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2534a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 253519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 253619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 253719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToNext(); 253819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 253919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 254082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 25410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 254219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 254319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664412"); 254419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2545a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 254619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 254719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 254819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.close(); 254919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov } 255019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 255189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testGroupQuery() { 255289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 255389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 255489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId1 = createGroup(account1, "e", "f"); 255589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId2 = createGroup(account2, "g", "h"); 255689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account1); 255789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account2); 255889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 255989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 256089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Groups._ID + "=" + groupId1, null, Groups._ID, groupId1) ; 256189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Groups._ID + "=" + groupId2, null, Groups._ID, groupId2) ; 256289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 256389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 25643cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testGroupInsert() { 25653cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 25663cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 25673cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_NAME, "a"); 25683cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_TYPE, "b"); 25699d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki values.put(Groups.DATA_SET, "ds"); 25703cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SOURCE_ID, "c"); 25713cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.VERSION, 42); 25723cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.GROUP_VISIBLE, 1); 25733cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE, "d"); 25743cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE_RES, 1234); 25753cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.NOTES, "e"); 25763cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.RES_PACKAGE, "f"); 25773cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYSTEM_ID, "g"); 257894021b213e4db367f60b30fcbfe9019e28571784Fred Quintana values.put(Groups.DELETED, 1); 25793cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC1, "h"); 25803cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC2, "i"); 25813cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC3, "j"); 25823cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC4, "k"); 25833cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 25843cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(Groups.CONTENT_URI, values); 25853cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 258673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.DIRTY, 1); 25873cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 25883cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 25893cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 2590f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupCreationAfterMembershipInsert() { 2591f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2592f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2593f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2594f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId = assertSingleGroup(NO_LONG, mAccount, "gsid1", null); 2595f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2596f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId, "gsid1"); 2597f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2598f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2599f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupReuseAfterMembershipInsert() { 2600f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2601f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2602f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2603f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2604f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroup(groupId1, mAccount, "gsid1", "title1"); 2605f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2606f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId1, "gsid1"); 2607f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2608f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2609f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupInsertFailureOnGroupIdConflict() { 2610f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2611f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2612f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2613f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues values = new ContentValues(); 2614f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.RAW_CONTACT_ID, rawContactId1); 2615f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 2616f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_SOURCE_ID, "gsid1"); 2617f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_ROW_ID, groupId1); 2618f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa try { 2619f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa mResolver.insert(Data.CONTENT_URI, values); 2620f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa fail("the insert was expected to fail, but it succeeded"); 2621f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } catch (IllegalArgumentException e) { 2622f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // this was expected 2623f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2624f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2625f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 26265f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testGroupDelete_byAccountSelection() { 26275f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account1 = new Account("accountName1", "accountType1"); 26285f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account2 = new Account("accountName2", "accountType2"); 26295f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26305f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId1 = createGroup(account1, "sourceId1", "title1"); 26315f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId2 = createGroup(account2, "sourceId2", "title2"); 26325f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId3 = createGroup(account2, "sourceId3", "title3"); 26335f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26345f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final int numDeleted = mResolver.delete(Groups.CONTENT_URI, 26355f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?", 26365f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[]{account2.name, account2.type}); 26375f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(2, numDeleted); 26385f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26395f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v1 = new ContentValues(); 26405f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups._ID, groupId1); 26415f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups.DELETED, 0); 26425f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26435f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v2 = new ContentValues(); 26445f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups._ID, groupId2); 26455f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups.DELETED, 1); 26465f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26475f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v3 = new ContentValues(); 26485f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups._ID, groupId3); 26495f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups.DELETED, 1); 26505f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26515f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 }); 26525f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 26535f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26545f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testGroupDelete_byAccountParam() { 26555f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account1 = new Account("accountName1", "accountType1"); 26565f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account2 = new Account("accountName2", "accountType2"); 26575f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26585f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId1 = createGroup(account1, "sourceId1", "title1"); 26595f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId2 = createGroup(account2, "sourceId2", "title2"); 26605f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId3 = createGroup(account2, "sourceId3", "title3"); 26615f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26625f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final int numDeleted = mResolver.delete( 26635f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Groups.CONTENT_URI.buildUpon() 26645f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .appendQueryParameter(Groups.ACCOUNT_NAME, account2.name) 26655f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .appendQueryParameter(Groups.ACCOUNT_TYPE, account2.type) 26665f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .build(), 26675f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki null, null); 26685f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(2, numDeleted); 26695f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26705f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v1 = new ContentValues(); 26715f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups._ID, groupId1); 26725f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups.DELETED, 0); 26735f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26745f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v2 = new ContentValues(); 26755f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups._ID, groupId2); 26765f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups.DELETED, 1); 26775f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26785f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v3 = new ContentValues(); 26795f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups._ID, groupId3); 26805f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups.DELETED, 1); 26815f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 26825f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 }); 26835f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 26845f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 2685f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupSummaryQuery() { 2686f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account1 = new Account("accountName1", "accountType1"); 2687f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account2 = new Account("accountName2", "accountType2"); 2688f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId1 = createGroup(account1, "sourceId1", "title1"); 2689f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId2 = createGroup(account2, "sourceId2", "title2"); 2690f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId3 = createGroup(account2, "sourceId3", "title3"); 2691f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2692f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Prepare raw contact id not used at all, to test group summary uri won't be confused 2693f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // with it. 2694f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId0 = createRawContactWithName("firstName0", "lastName0"); 2695f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2696f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("firstName1", "lastName1"); 2697f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 2698f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId1, groupId1); 2699f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2700f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("firstName2", "lastName2"); 2701f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId2, "address2@email.com"); 2702f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId2, "222-222-2222"); 2703f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId2, groupId1); 2704f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2705f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v1 = new ContentValues(); 2706f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups._ID, groupId1); 2707f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.TITLE, "title1"); 2708f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SOURCE_ID, "sourceId1"); 2709f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_NAME, account1.name); 2710f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_TYPE, account1.type); 2711f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_COUNT, 2); 2712f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, 1); 2713f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2714f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v2 = new ContentValues(); 2715f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups._ID, groupId2); 2716f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.TITLE, "title2"); 2717f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SOURCE_ID, "sourceId2"); 2718f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_NAME, account2.name); 2719f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_TYPE, account2.type); 2720f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, 0); 2721f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, 0); 2722f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2723f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v3 = new ContentValues(); 2724f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups._ID, groupId3); 2725f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.TITLE, "title3"); 2726f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SOURCE_ID, "sourceId3"); 2727f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_NAME, account2.name); 2728f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_TYPE, account2.type); 2729f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_COUNT, 0); 2730f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_WITH_PHONES, 0); 2731f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2732f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2733f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2734f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Now rawContactId1 has two phone numbers. 2735f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1111"); 2736f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1112"); 2737f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Result should reflect it correctly (don't count phone numbers but raw contacts) 2738f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, v1.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2739f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2740f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2741f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce new raw contact, pretending the user added another info. 2742f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId3 = createRawContactWithName("firstName3", "lastName3"); 2743f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId3, "address3@email.com"); 2744f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId3, "333-333-3333"); 2745f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId3, groupId2); 2746f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, v2.getAsInteger(Groups.SUMMARY_COUNT) + 1); 2747f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, v2.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2748f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2749f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2750f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 275118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki final Uri uri = Groups.CONTENT_SUMMARY_URI; 275218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki 275318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki // TODO Once SUMMARY_GROUP_COUNT_PER_ACCOUNT is supported remove all the if(false). 275418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 275518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1); 275618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 275718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 275818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 275918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 276018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 276118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 276218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2763f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3 }); 2764f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2765f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce another group in account1, testing SUMMARY_GROUP_COUNT_PER_ACCOUNT correctly 2766f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // reflects the change. 2767f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId4 = createGroup(account1, "sourceId4", "title4"); 276818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 276918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 277018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1); 277118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 277218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 277318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2774f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v4 = new ContentValues(); 2775f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups._ID, groupId4); 2776f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.TITLE, "title4"); 2777f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SOURCE_ID, "sourceId4"); 2778f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_NAME, account1.name); 2779f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_TYPE, account1.type); 2780f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_COUNT, 0); 2781f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_WITH_PHONES, 0); 278218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 278318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 278418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT)); 278518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 278618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 278718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2788f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3, v4 }); 278923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki 279023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // We change the tables dynamically according to the requested projection. 279123ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // Make sure the SUMMARY_COUNT column exists 279223ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.clear(); 279323ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.put(Groups.SUMMARY_COUNT, 2); 279423ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.clear(); 279523ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.put(Groups.SUMMARY_COUNT, 1); 279623ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.clear(); 279723ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.put(Groups.SUMMARY_COUNT, 0); 279823ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.clear(); 279923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.put(Groups.SUMMARY_COUNT, 0); 280023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki assertStoredValuesWithProjection(uri, new ContentValues[] { v1, v2, v3, v4 }); 2801f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2802f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 280389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testSettingsQuery() { 280489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 280589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 2806f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account3 = new AccountWithDataSet("e", "f", "plus"); 280789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account1, "0", "0"); 280889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account2, "1", "1"); 2809f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account3, "1", "0"); 281089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account1); 281189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account2); 2812f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Uri uri3 = Settings.CONTENT_URI.buildUpon() 2813f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_NAME, account3.getAccountName()) 2814f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_TYPE, account3.getAccountType()) 2815f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.DATA_SET, account3.getDataSet()) 2816f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .build(); 281789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 281889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 2819f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertEquals(1, getCount(uri3, null, null)); 282089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.SHOULD_SYNC, "0") ; 2821f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri1, Settings.UNGROUPED_VISIBLE, "0"); 282289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.SHOULD_SYNC, "1") ; 2823f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri2, Settings.UNGROUPED_VISIBLE, "1"); 2824f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.SHOULD_SYNC, "1"); 2825f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.UNGROUPED_VISIBLE, "0"); 2826f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro } 2827f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 2828f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro public void testSettingsInsertionPreventsDuplicates() { 2829f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Account account1 = new Account("a", "b"); 2830f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account2 = new AccountWithDataSet("c", "d", "plus"); 2831f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account1, "0", "0"); 2832f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account2, "1", "1"); 2833f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 28340e21a867a572679d64d79041eb574d13665178d4Dave Santoro // Now try creating the settings rows again. It should update the existing settings rows. 28350e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account1, "1", "0"); 28360e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 28370e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=?", 28380e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"a", "b"}, Settings.SHOULD_SYNC, "1"); 28390e21a867a572679d64d79041eb574d13665178d4Dave Santoro 28400e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account2, "0", "1"); 28410e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 28420e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=? AND " + 28430e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.DATA_SET + "=?", 28440e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"c", "d", "plus"}, Settings.SHOULD_SYNC, "0"); 284589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 284689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 28474097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsUnspecified() { 2848d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 28494097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 28504097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 28515ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 28524097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 285317a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 28544097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 28554097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 285667c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov public void testDisplayNameParsingWhenPartsAreNull() { 285767c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov long rawContactId = createRawContact(); 285867c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov ContentValues values = new ContentValues(); 285967c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 286067c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 286167c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 286267c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov insertStructuredName(rawContactId, values); 286317a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 286467c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov } 286567c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov 28664097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsSpecified() { 2867d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 28684097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 28694097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 28704097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Johnson"); 28715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 28724097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 28735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertStructuredName(rawContactId, null, null, null, "Johnson", null); 28744097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 28754097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 28765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithoutPhoneticName() { 28775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final long rawContactId = createRawContact(null); 28785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 28805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 28815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 28825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "K."); 28835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 28845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 28855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 28865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 28885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 288955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 289055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 28915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 28925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 28935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 28945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 28955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 28975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 28985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 28995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 29005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 290155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 290255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 29035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 29045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 29055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 29065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 29075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 29095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 29105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 29115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 29135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 29145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 29155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithChineseName() { 29175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // Only run this test when Chinese collation is supported 29195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.CHINA)) { 29205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 29215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 29225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 29245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 29265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "\u6BB5\u5C0F\u6D9B"); 29275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 29285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 29305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 29315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 29325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 29335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 29345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 29354cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 29364cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 29375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 29395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 29405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 29425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 29435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 29445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 29455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 29465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 29474cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 29484cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 29495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 29515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 29525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 29535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 29555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 29565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 29575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithJapaneseName() { 29595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 29605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 29625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "\u7A7A\u6D77"); 29635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PHONETIC_GIVEN_NAME, "\u304B\u3044\u304F\u3046"); 29645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 29655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 29675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 29685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 29695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 29705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 29715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 29725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 29735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 29745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 29765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 29775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 29795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 29805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 29815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 29825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 29835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 29845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 29855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 29865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 29885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 29895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 29905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 29915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 29925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 29935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 29945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 299525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov public void testDisplayNameUpdate() { 299625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId1 = createRawContact(); 299725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertEmail(rawContactId1, "potato@acme.com", true); 299825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 299925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId2 = createRawContact(); 300025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertPhoneNumber(rawContactId2, "123456789", true); 300125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 30020c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 30030c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 300425abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 300525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "123456789"); 300625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 300725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertStructuredName(rawContactId2, "Potato", "Head"); 300825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 300925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Potato Head"); 301081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 301125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 301225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 301301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov public void testDisplayNameFromData() { 301401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long rawContactId = createRawContact(); 301501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3016a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka ContentValues values = new ContentValues(); 301701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 301801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 301901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 302001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 302101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "mike@monstersinc.com"); 302201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "mike@monstersinc.com"); 302301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 302401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "james@monstersinc.com", true); 302501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "james@monstersinc.com"); 302601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 302701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertPhoneNumber(rawContactId, "1-800-466-4411"); 302801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "1-800-466-4411"); 302901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 3030a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there are title and company, the company is display name. 3031a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 3032a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.COMPANY, "Monsters Inc"); 30335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 303401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Monsters Inc"); 303501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 3036a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is nickname, that is display name. 3037a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertNickname(rawContactId, "Sully"); 3038a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "Sully"); 3039a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 3040a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is structured name, that is display name. 3041a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 3042a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.GIVEN_NAME, "James"); 3043a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.MIDDLE_NAME, "P."); 3044a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.FAMILY_NAME, "Sullivan"); 3045a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertStructuredName(rawContactId, values); 30465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "James P. Sullivan"); 30475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 30485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithoutPhoneticName() { 30505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 30515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 30525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 30535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 30555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 30575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 30585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.TITLE, "Protagonist"); 30595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 30605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Protagonist"); 30615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there are title and company, the company is display name. 30635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 30645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "Monsters Inc"); 30655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mResolver.update(organizationUri, values, null, null); 30665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 30685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Monsters Inc"); 30695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 30705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 30715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "Monsters Inc"); 30725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Monsters Inc"); 30735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 30745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 30755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithJapanesePhoneticName() { 30775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 30785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 30795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 30805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 30825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 30845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 30855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "DoCoMo"); 30865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 30875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 30885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 30905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "DoCoMo"); 30915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 30925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 30935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u30C9\u30B3\u30E2"); 30945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u30C9\u30B3\u30E2"); 30955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 30965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 30975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 30985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithChineseName() { 30990b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov boolean hasChineseCollator = false; 31000b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov final Locale locale[] = Collator.getAvailableLocales(); 31010b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov for (int i = 0; i < locale.length; i++) { 31020b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (locale[i].equals(Locale.CHINA)) { 31030b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov hasChineseCollator = true; 31040b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov break; 31050b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 31060b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 31070b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 31080b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (!hasChineseCollator) { 31090b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov return; 31100b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 31110b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 31125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 31135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 31145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 31155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 31165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 31175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 31185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 31195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 31205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "\u4E2D\u56FD\u7535\u4FE1"); 31215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 31225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 31235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 31245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "\u4E2D\u56FD\u7535\u4FE1"); 31255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 31265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 31274cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 31284cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 31295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 313001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 313101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 313231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov public void testLookupByOrganization() { 313331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long rawContactId = createRawContact(); 313431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long contactId = queryContactId(rawContactId); 313531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov ContentValues values = new ContentValues(); 313631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 313731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 313831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 313931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "president"); 314031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 314131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 314231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 314331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 314431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 314531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 314631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.DEPARTMENT, "software"); 314731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 314831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 314931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 315031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 315131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 315231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 315331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "incredibles"); 315431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 315531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 315631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 315731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 315831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 315931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 316031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "director"); 316131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 316231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 316331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 316431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "director"); 316531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 316631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 316731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "monsters"); 316831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "scarer"); 316931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 317031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 317131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "monsters"); 317231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "scarer"); 317331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 317431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 317531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov private void assertContactFilter(long contactId, String filter) { 317631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(filter)); 317731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertStoredValue(filterUri, Contacts._ID, contactId); 317831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 317931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 3180a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private void assertContactFilterNoResult(String filter) { 3181a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, filter); 3182a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 3183a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 3184a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 3185916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetOrganization() throws Exception { 3186916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 3187916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3188916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3189916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Some random data element 3190916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "inc@corp.com"); 3191916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3192916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 3193916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3194916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 31959c6ef008d92017108e3d10dcd8e2146eded9e148Dmitri Plotnikov values.put(Organization.TITLE, "engineer"); 3196916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 3197916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3198916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another matching organization 3199916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmeinc"); 3200916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 3201916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3202916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another non-matching organization 3203916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "corpacme"); 3204916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 3205916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3206916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // And another data element 3207916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "emca@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 3208916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 32096f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 3210916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3211916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3212916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 32133716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "engineer, [acmecorp]"); 3214916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 3215916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 3216916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3217916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetEmail() throws Exception { 3218916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContact(); 3219916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3220916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 3221916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 32223716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "John", "Doe"); 3223916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertEmail(rawContactId, "acme@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 3224916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 32256f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 3226916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3227916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3228916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 32293716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[acme@corp.com]"); 3230916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 3231916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 3232916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3233fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood public void testCountPhoneNumberDigits() { 3234fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("86 (0) 5-55-12-34")); 3235fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("860 555-1234")); 3236fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(3, ContactsProvider2.countPhoneNumberDigits("860")); 3237fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("8605551234")); 3238fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860555")); 3239fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860 555")); 3240fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860-555")); 3241fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(12, ContactsProvider2.countPhoneNumberDigits("+441234098765")); 3242fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("44+1234098765")); 3243fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("+441234098foo")); 3244fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood } 3245fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood 32463716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetPhone() throws Exception { 32473716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 32483716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 32493716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues values = new ContentValues(); 32503716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 32513716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 32523716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "(860) 555-1234"); 32533716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 32543716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.clear(); 32553716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(Contacts._ID, contactId); 32563716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[(860) 555-1234]"); 32573716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 32583716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 32593716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("86 (0) 5-55-12-34")), values); 32603716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 32613716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555-1234")), values); 32623716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 32633716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860")), values); 32643716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 32653716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("8605551234")), values); 32663716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 32673716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860555")), values); 32683716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 32693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555")), values); 32703716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 32713716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860-555")), values); 32723716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 32733716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 32746f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro private Uri buildFilterUri(String query, boolean deferredSnippeting) { 32756f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri.Builder builder = Contacts.CONTENT_FILTER_URI.buildUpon() 32766f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro .appendPath(Uri.encode(query)); 32776f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro if (deferredSnippeting) { 32786f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro builder.appendQueryParameter(ContactsContract.DEFERRED_SNIPPETING, "1"); 32796f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 32806f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro return builder.build(); 32816f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 32826f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro 3283916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetNickname() throws Exception { 3284916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 3285916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3286916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 3287916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3288916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertNickname(rawContactId, "Incredible"); 3289916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 32906f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("inc", true); 3291916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3292916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3293916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 329430cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov values.put(SearchSnippetColumns.SNIPPET, "[Incredible]"); 3295916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 3296916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 3297916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 32983716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNameInDisplayName() throws Exception { 32993716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 33003716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 33013716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 33023716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 33033716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33043716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 33053716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 33063716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 33073716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 33083716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33096f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 33106f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("john", true), emptySnippet); 33113716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 33123716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33133716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNicknameInDisplayName() throws Exception { 33143716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 33153716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 33163716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNickname(rawContactId, "Caveman"); 33173716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 33183716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33193716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 33203716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 33213716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 33223716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 33233716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33246f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 33253716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 33263716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33273716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForCompanyInDisplayName() throws Exception { 33283716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 33293716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 33303716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues company = new ContentValues(); 33313716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.clear(); 33323716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.COMPANY, "Aperture Science"); 33333716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.TITLE, "President"); 33343716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertOrganization(rawContactId, company); 33353716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "aperturepresident@aperturescience.com", true); 33363716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33373716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 33383716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 33393716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 33403716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 33413716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33426f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("aperture", true), emptySnippet); 33433716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 33443716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33453716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForPhoneInDisplayName() throws Exception { 33463716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 33473716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 33483716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "860-555-1234"); 33493716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "860@aperturescience.com", true); 33503716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33513716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 33523716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 33533716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 33543716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 33553716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33566f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("860", true), emptySnippet); 33573716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 33583716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33593716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForEmailInDisplayName() throws Exception { 33603716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 33613716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 33623716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 33633716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNote(rawContactId, "Cave Johnson is president of Aperture Science"); 33643716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33653716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 33663716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 33673716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 33683716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 33693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 33706f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 33713716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 33723716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 3373dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov public void testDisplayNameUpdateFromStructuredNameUpdate() { 3374dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long rawContactId = createRawContact(); 3375dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, "Slinky", "Dog"); 3376dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3377dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3378dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3379dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3380dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky Dog"); 3381dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3382dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov ContentValues values = new ContentValues(); 3383dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 3384dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3385dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3386dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky"); 3387dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3388dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 3389dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3390dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3391dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 3392dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3393dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dog"); 3394dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3395dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3396dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Dog"); 3397dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov } 3398dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3399d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov public void testInsertDataWithContentProviderOperations() throws Exception { 3400d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 3401d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValues(new ContentValues()) 3402d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3403d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 3404d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 3405d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 3406d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 3407d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 3408d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3409d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderResult[] results = 3410d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(cpo1, cpo2)); 3411d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov long contactId = queryContactId(ContentUris.parseId(results[0].uri)); 3412d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3413d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "John Doe"); 3414d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov } 3415d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov 3416d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailDefault() { 3417c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3418d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3419d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3420d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 3421d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 3422d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 3423d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(0, sendToVoicemail); 3424d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 3425d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3426d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3427d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtone() { 3428c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3429d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3430d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3431d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId, true, "foo"); 3432d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, true, "foo"); 343381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 34348c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 34358c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov updateSendToVoicemailAndRingtoneWithSelection(contactId, false, "bar"); 34368c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, false, "bar"); 34378c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertNetworkNotified(false); 3438d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3439d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3440d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailAndRingtoneAfterAggregation() { 34413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("a", "b"); 3442d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3443d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3444d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 34453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("c", "d"); 3446d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3447d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, true, "bar"); 3448d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3449d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 34500c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 34510c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3452d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3453d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov // Both contacts had "send to VM", the contact now has the same value 3454d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId1, true, "foo,bar"); // Either foo or bar 3455d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3456d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3457d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testDoNotSendToVoicemailAfterAggregation() { 34583cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("e", "f"); 3459d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3460d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, null); 3461d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 34623cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("g", "h"); 3463d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3464d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, null); 3465d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3466d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 34670c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 34680c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3469d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3470d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Since one of the contacts had "don't send to VM" that setting wins for the aggregate 34710c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), false, null); 3472d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3473d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3474d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtonePreservedAfterJoinAndSplit() { 34753cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("i", "j"); 3476d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3477d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3478d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 34793cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("k", "l"); 3480d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3481d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, "bar"); 3482d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3483d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 34840c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 34850c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3486d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3487d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Split them 34880c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 34890c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3490d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 34913cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), true, "foo"); 3492d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId2), false, "bar"); 3493d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3494d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 349582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateInsert() { 34964dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov long rawContactId = createRawContact(); 34970a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 34980a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 34990a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35000a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 35010a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 35020a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 35030a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.putNull(StatusUpdates.CUSTOM_PROTOCOL); 35040a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 35050a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PRESENCE, StatusUpdates.INVISIBLE); 35060a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 35070a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 100); 35080a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "a.b.c"); 35090a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 1234); 35100a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 2345); 35110a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35120a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 35130a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35140a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 35150a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35160a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long contactId = queryContactId(rawContactId); 35170a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 35180a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35190a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 35200a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 35210a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Hiding"); 35220a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 35230a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "a.b.c"); 35240a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 1234); 35250a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 2345); 35260a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35270a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 35280a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35290a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 35300a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 35310a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Cloaked"); 35320a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 200); 35330a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "d.e.f"); 35340a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 4321); 35350a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 5432); 35360a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov mResolver.insert(StatusUpdates.CONTENT_URI, values); 35370a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 35390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 35400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Cloaked"); 35410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 200); 35420a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "d.e.f"); 35430a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 4321); 35440a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 5432); 35450a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 35460a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 35470a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35480a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateInferAttribution() { 35490a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 35500a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 35510a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 35520a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35530a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 35540a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 35550a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 35560a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 35570a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 35580a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35590a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 35600a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35610a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 35620a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 35630a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, com.android.internal.R.string.imProtocolAim); 35640a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 35650a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35660a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 35670a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 35680a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 35690a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateMatchingImOrEmail() { 35700a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 35714dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 35724dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im"); 357382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertEmail(rawContactId, "m@acme.com"); 35744dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 35754dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (standard) 3576aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3577aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 35784dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 35794dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (custom) 3580aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im", StatusUpdates.IDLE, "Idle", 3581d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 35824dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 35834dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on Email 3584aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "m@acme.com", StatusUpdates.AWAY, "Away", 3585aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 35864dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 35874dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // No match 3588aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_ICQ, null, "12345", StatusUpdates.DO_NOT_DISTURB, "Go away", 3589aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 35904dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 359182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Cursor c = mResolver.query(StatusUpdates.CONTENT_URI, new String[] { 359282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID, StatusUpdates.PROTOCOL, StatusUpdates.CUSTOM_PROTOCOL, 35930a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.PRESENCE, StatusUpdates.STATUS}, 359482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null, StatusUpdates.DATA_ID); 35954dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 359682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_AIM, null, StatusUpdates.AVAILABLE, "Available"); 35974dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 359882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_CUSTOM, "my_im_proto", StatusUpdates.IDLE, "Idle"); 35994dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 360082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_GOOGLE_TALK, null, StatusUpdates.AWAY, "Away"); 36014dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertFalse(c.moveToNext()); 36024dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov c.close(); 3603bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3604bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 3605bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3606bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3607bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 360882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 36090a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3610bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3611bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov } 3612bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 361382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateUpdateAndDelete() { 3614bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long rawContactId = createRawContact(); 3615bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3616bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3617bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 3618bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3619bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3620bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 362182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 362282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_STATUS); 3623bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3624bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3625aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AWAY, "BUSY", 3626aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3627aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.DO_NOT_DISTURB, "GO AWAY", 3628aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 362982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri statusUri = 3630aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3631aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 363282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 3633bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 363482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 363582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3636bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3637bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 36389705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for 36399705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status 36409705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status_ts 36419705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence 36429705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori long updatedTs = 200; 36439705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String testUpdate = "test_update"; 36449705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String selection = StatusUpdates.DATA_ID + "=" + statusId; 36459705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 36469705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 36479705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 36489705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 36499705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 36509705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 36519705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 36529705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 36539705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in status_updates table ONLY 36549705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in presence table are to be updated. 36559705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori updatedTs = 300; 36569705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori testUpdate = "test_update_new"; 36579705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 36589705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 36599705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 36609705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 36619705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 36629705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 36639705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the presence column value is still the old value 36649705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 36659705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 36669705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 36679705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in presence table ONLY 36689705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in status_updates table are to be updated. 36699705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 36709705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 36719705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test_new"); 36729705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 36739705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 36749705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the status_updates table is not updated 36759705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 36769705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 36779705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 36789705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 36799705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // effect "delete status_updates" operation and expect the following 36809705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // data deleted from status_updates table 36819705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence set to null 368282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov mResolver.delete(StatusUpdates.CONTENT_URI, StatusUpdates.DATA_ID + "=" + statusId, null); 36839705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 368482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3685a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3686a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 3687a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3688093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov public void testStatusUpdateUpdateToNull() { 3689093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long rawContactId = createRawContact(); 3690093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3691093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3692093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long contactId = queryContactId(rawContactId); 3693093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3694093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3695093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov ContentValues values = new ContentValues(); 3696093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri statusUri = 3697093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3698093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 3699093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 3700093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3701093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 3702093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3703093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3704093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3705093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3706093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(StatusUpdates.PRESENCE); 3707093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov mResolver.update(StatusUpdates.CONTENT_URI, values, 3708093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.DATA_ID + "=" + statusId, null); 3709093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3710093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3711093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3712093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3713093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3714093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov } 3715093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 371682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateWithTimestamp() { 3717a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long rawContactId = createRawContact(); 3718a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3719a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 3720a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3721a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3722a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3723aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Offline", 80, 37245d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3725aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Available", 100, 37265d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3727aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", 0, "Busy", 90, 37285d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3729a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3730a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov // Should return the latest status 3731a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContentValues values = new ContentValues(); 373282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 373382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3734bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 37354dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 37364dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 373782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov private void assertStatusUpdate(Cursor c, int protocol, String customProtocol, int presence, 373882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String status) { 37394dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov ContentValues values = new ContentValues(); 374082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 374182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.CUSTOM_PROTOCOL, customProtocol); 3742a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(StatusUpdates.PRESENCE, presence); 374382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS, status); 37444dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertCursorValues(c, values); 37454dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 37464dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 37473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item query test cases. 37483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByRawContactId() { 37503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 37513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, mAccount); 37533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 37543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 37553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 37563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 37573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 37583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByContactId() { 37613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 37633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 37653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 37663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 37673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 37683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 37693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 37703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKey() { 37733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 37753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 37763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 37783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 37793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 37803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 37813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 37823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 37833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKeyAndContactId() { 37863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 37883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 37893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 37913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 37923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 37933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 37943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 37953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann contactId), 37963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 37973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 37983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItems() { 38013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 38033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 38043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, values); 38053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsWithSelection() { 38083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 38103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 38113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 38133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 38143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 38153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 38173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 38183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}, firstValues); 38193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 38213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 38223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Goodbye world"}, secondValues); 38233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemById() { 38263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 38283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 38293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 38303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 38323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 38333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 38343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 38353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 38373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 38383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstValues); 38393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 38413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 38423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues); 38433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion + query test cases. 38463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoWithSelection() { 38483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 38503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 38513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 38523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 38543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo1Values, null); 38556802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 38563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(2); 38573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo2Values, null); 38583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first photo. 38603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_PHOTO_URI, StreamItemPhotos.SORT_INDEX + "=?", 38613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"1"}, photo1Values); 38623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemId() { 38653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 38683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 38693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 38703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 38713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 38733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 38743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 38753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 38763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 38783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 38793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 38806802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 38813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 38833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 38846802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 38856802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 38863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 38876802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 38883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the photos from the second stream item. 38903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 38913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 38923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), photo2Values); 38933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemPhotoId() { 38963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 38993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 39003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 39013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 39023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 39043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 39053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 39063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 39073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 39093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 39103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 39113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstPhotoId = ContentUris.parseId(resultUri); 39126802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 39133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 39153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 39166802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 39176802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.galaxy, PhotoSize.ORIGINAL)); 39183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 39193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondPhotoId = ContentUris.parseId(resultUri); 39206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 39213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the first photo. 39233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 39243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 39253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 39263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 39273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstPhotoId), 39283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo1Values); 39293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the second photo. 39313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 39323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 39333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 39343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 39353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondPhotoId), 39363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo2Values); 39373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item insertion test cases. 39403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemInProfileRequiresWriteProfileAccess() { 39423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long profileRawContactId = createBasicProfileContact(new ContentValues()); 39433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // With our (default) write profile permission, we should be able to insert a stream item. 39453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 39463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 39473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now take away write profile permission. 39493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mActor.removePermissions("android.permission.WRITE_PROFILE"); 39503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Try inserting another stream item. 39523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 39533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 39543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should require WRITE_PROFILE access to insert a stream item in the profile."); 39553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 39563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Trying to insert a stream item in the profile without WRITE_PROFILE permission 39573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // should fail. 39583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemWithContentValues() { 39623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 39643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 39653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.insert(StreamItems.CONTENT_URI, values); 39663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 39673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 39683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 39693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOverLimit() { 39723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 39743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 39753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann List<Long> streamItemIds = Lists.newArrayList(); 39773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX + 1 stream items. 39793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 39803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 6; i++) { 39813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 39823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 39833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.add(ContentUris.parseId(resultUri)); 39843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Long doomedStreamItemId = streamItemIds.get(0); 39863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // There should only be MAX items. The oldest one should have been cleaned up. 39883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query( 39893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 39903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 39913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 39923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItems._ID}, null, null, null); 39933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 39943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann while(c.moveToNext()) { 39953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = c.getLong(0); 39963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.remove(streamItemId); 39973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 39993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 40003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, streamItemIds.size()); 40033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(doomedStreamItemId, streamItemIds.get(0)); 40043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOlderThanOldestInLimit() { 40073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 40083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 40093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 40103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX stream items. 40123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 40133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 40143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 40153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 40163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertNotSame("Expected non-0 stream item ID to be inserted", 40173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 0L, ContentUris.parseId(resultUri)); 40183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now try to insert a stream item that's older. It should be deleted immediately 40213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // and return an ID of 0. 40223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime - 1); 40233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 40243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(0L, ContentUris.parseId(resultUri)); 40253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion test cases. 40283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemsAndPhotosInBatch() throws Exception { 40303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 40313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemValues = buildGenericStreamItemValues(); 40323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemPhotoValues = buildGenericStreamItemPhotoValues(0); 40333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ArrayList<ContentProviderOperation> ops = Lists.newArrayList(); 40353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert( 40363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 40373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 40383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY)) 40393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemValues).build()); 40403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 40413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoValues.put(StreamItemPhotos.SORT_INDEX, i); 40423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert(StreamItems.CONTENT_PHOTO_URI) 40433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemPhotoValues) 40443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValueBackReference(StreamItemPhotos.STREAM_ITEM_ID, 0) 40453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .build()); 40463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.applyBatch(ContactsContract.AUTHORITY, ops); 40483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that all five photos were inserted under the raw contact. 40503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_URI, new String[]{StreamItems._ID}, 40513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)}, 40523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 40533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = 0; 40543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 40553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, c.getCount()); 40563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.moveToFirst(); 40573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemId = c.getLong(0); 40583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 40593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 40603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c = mResolver.query(Uri.withAppendedPath( 40633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 40646802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 40656802030a777c0c3ba1dc029c534cca4784260632Dave Santoro new String[]{StreamItemPhotos._ID, StreamItemPhotos.PHOTO_URI}, 40663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null, null); 40673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 40683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(5, c.getCount()); 40696802030a777c0c3ba1dc029c534cca4784260632Dave Santoro byte[] expectedPhotoBytes = loadPhotoFromResource( 40706802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO); 40716802030a777c0c3ba1dc029c534cca4784260632Dave Santoro while (c.moveToNext()) { 40726802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String photoUri = c.getString(1); 407387426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 4074c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki expectedPhotoBytes, mResolver.openInputStream(Uri.parse(photoUri))); 40756802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 40763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 40773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 40783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item update test cases. 40823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemById() { 40843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 40853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 40863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 40873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 40883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 40893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), values, 40903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 40913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 40923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 40933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 40943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 40953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 40963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemWithContentValues() { 40973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 40983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 40993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 41003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 41013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems._ID, streamItemId); 41023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 41033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(StreamItems.CONTENT_URI, values, null, null); 41043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 41053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 41063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 41073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 41083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo update test cases. 41103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41116802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoById() throws IOException { 41123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 41133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 41143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 41153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 41163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 41173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 41183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 41193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 41216802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 41223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 41233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 41243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 41253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 41263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 41273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId); 41283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 41296802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 41303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 41316802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 41326802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 41336802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 413487426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 4135c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 41366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 41373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 41383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41396802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoWithContentValues() throws IOException { 41403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 41413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 41423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 41433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 41443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 41453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 41463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 41473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photoValues.put(StreamItemPhotos._ID, streamItemPhotoId); 41496802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 41506802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 41513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 41523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 41533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 41543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 41553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 41566802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 41573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 41586802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 41596802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 41606802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 416187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 4162c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 41636802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 41643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 41653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item deletion test cases. 41673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemById() { 41693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 41703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 41713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 41723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 41733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 41753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 41763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 41773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item. 41793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 41803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 41813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 41833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 41843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 41853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 41863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 41873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemWithSelection() { 41893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 41903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 41913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 41923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 41943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 41953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 41963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item with a custom selection. 41983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 41993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}); 42003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 42023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 42033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 42043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 42053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo deletion test cases. 42083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoById() { 42103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 42123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 42133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId( 42143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 42153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete( 42163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 42173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 42183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 42193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 42203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId), null, null); 42213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_PHOTO_URI, 42233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItemPhotos._ID}, 42243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.STREAM_ITEM_ID + "=?", new String[]{String.valueOf(streamItemId)}, 42253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 42263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 42273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals("Expected photo to be deleted.", 0, c.getCount()); 42283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 42293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 42303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoWithSelection() { 42343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 42363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 42373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstPhotoValues = buildGenericStreamItemPhotoValues(0); 42383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondPhotoValues = buildGenericStreamItemPhotoValues(1); 42393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, firstPhotoValues, null); 42406802030a777c0c3ba1dc029c534cca4784260632Dave Santoro firstPhotoValues.remove(StreamItemPhotos.PHOTO); // Removed while processing. 42413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, secondPhotoValues, null); 42423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = Uri.withAppendedPath( 42433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 42443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 42453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(photoUri, StreamItemPhotos.SORT_INDEX + "=1", null); 42463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, firstPhotoValues); 42483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 425082780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro public void testDeleteStreamItemsWhenRawContactDeleted() { 425182780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro long rawContactId = createRawContact(mAccount); 425282780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemUri = insertStreamItem(rawContactId, 425382780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemValues(), mAccount); 425482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto(ContentUris.parseId(streamItemUri), 425582780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemPhotoValues(0), mAccount); 425682780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro mResolver.delete(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 425782780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro null, null); 425882780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 425982780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro ContentValues[] emptyValues = new ContentValues[0]; 426082780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 426182780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro // The stream item and its photo should be gone. 426282780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemUri, emptyValues); 426382780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemPhotoUri, emptyValues); 426482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro } 426582780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 42663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemLimit() { 42673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 42683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.MAX_ITEMS, 5); 42693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_LIMIT_URI, values); 42703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42726802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Tests for inserting or updating stream items as a side-effect of making status updates 42736802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // (forward-compatibility of status updates into the new social stream API). 42746802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 42756802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemInsertedOnStatusUpdate() { 42766802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 42776802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 42786802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 42796802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 42806802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 42816802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 42826802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 42836802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE); 42846802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 42856802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 42866802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 42874747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "hacking"); 4288d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 4289d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(String.valueOf(rawContactId)) 4290d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 4291d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues); 4292d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda } 4293d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4294d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda public void testStreamItemInsertedOnStatusUpdate_HtmlQuoting() { 4295d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4296d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // This method of creating a raw contact automatically inserts a status update with 4297d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // the status message "hacking". 4298d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues values = new ContentValues(); 4299d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda long rawContactId = createRawContact(values, "18004664411", 4300d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 4301d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.CAPABILITY_HAS_VOICE); 4302d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4303d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // Insert a new status update for the raw contact. 4304d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 4305d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.INVISIBLE, "& <b> test '", StatusUpdates.CAPABILITY_HAS_VOICE); 4306d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4307d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues expectedValues = new ContentValues(); 4308d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 43094747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "& <b> test &#39;"); 43106802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 43116802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 43126802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 43136802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 43146802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 43156802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 43166802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemUpdatedOnSecondStatusUpdate() { 43176802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 43186802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 43196802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 43206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 43216802030a777c0c3ba1dc029c534cca4784260632Dave Santoro int chatMode = StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 43226802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE; 43236802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 43246802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, chatMode); 43256802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 43266802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Insert a new status update for the raw contact. 43276802030a777c0c3ba1dc029c534cca4784260632Dave Santoro insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 43286802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.INVISIBLE, "finished hacking", chatMode); 43296802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 43306802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 43316802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 43324747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "finished hacking"); 43336802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 43346802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 43356802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 43366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 43376802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 43386802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 433936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemReadRequiresReadSocialStreamPermission() { 434036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 434136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long contactId = queryContactId(rawContactId); 434236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String lookupKey = queryLookupKey(contactId); 434336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 434436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 434536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 434636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 434736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item in various ways. 434836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 434936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by contact ID requires social stream read permission", 435036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 435136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 435236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 435336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 435436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 435536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key requires social stream read permission", 435636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.CONTENT_LOOKUP_URI.buildUpon().appendPath(lookupKey) 435736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(Contacts.StreamItems.CONTENT_DIRECTORY).build(), 435836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 435936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 436036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 436136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key and ID requires social stream read permission", 436236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath(Contacts.getLookupUri(contactId, lookupKey), 436336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), 436436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 436536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 436636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 436736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID requires social stream read permission", 436836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 436936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 437036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 437136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 437236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 437336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID and stream item ID requires social " + 437436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "stream read permission", 437536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 437636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 437736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 437836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), 437936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro streamItemId), null, null, null, null); 438036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 438136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 438236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream items requires social stream read permission", 438336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI, null, null, null, null); 438436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 438536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 438636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream item by ID requires social stream read permission", 438736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 438836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 438936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 439036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 439136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoReadRequiresReadSocialStreamPermission() { 439236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 439336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 439436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 439536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 439636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 439736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 439836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 439936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item photo in various ways. 440036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 440136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 440236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 440336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY).build(), 440436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 440536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 440636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 440736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 440836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 440936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 441036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 441136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(), 441236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 441336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 441436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 441536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemModificationRequiresWriteSocialStreamPermission() { 441636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 441736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 441836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 441936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 442036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 442136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 442236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null); 442336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert to stream without write social stream permission"); 442436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 442536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 442636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 442736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 442836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 442936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItems.TEXT, "Goodbye world"); 443036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 443136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values, null, null); 443236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update stream without write social stream permission"); 443336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 443436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 443536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 443636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 443736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 443836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null); 443936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete from stream without write social stream permission"); 444036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 444136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 444236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 444336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 444436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoModificationRequiresWriteSocialStreamPermission() { 444536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 444636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 444736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 444836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 444936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 445036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 445136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 445236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri photoUri = StreamItems.CONTENT_URI.buildUpon() 445336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 445436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 445536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(); 445636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 445736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 445836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(1), null); 445936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert photos without write social stream permission"); 446036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 446136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 446236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 446336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 446436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 446536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource(R.drawable.galaxy, 446636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro PhotoSize.ORIGINAL)); 446736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(photoUri, values, null, null); 446836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update photos without write social stream permission"); 446936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 447036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 447136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 447236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 447336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(photoUri, null, null); 447436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete photos without write social stream permission"); 447536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 447636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 447736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 447836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 447936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStatusUpdateDoesNotRequireReadOrWriteSocialStreamPermission() { 448036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 448136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String handle1 = "test@gmail.com"; 448236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 448336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertImHandle(rawContactId, protocol1, null, handle1); 448436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 448536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 448636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 448736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 448836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA); 448936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 449036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.addPermissions("android.permission.READ_SOCIAL_STREAM"); 449136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 449236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues expectedValues = new ContentValues(); 449336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectedValues.put(StreamItems.TEXT, "Green"); 449436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro assertStoredValues(Uri.withAppendedPath( 449536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 449636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), expectedValues); 449736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 449836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 44993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemValues() { 45003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 45013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Hello world"); 45023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, System.currentTimeMillis()); 45033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.COMMENTS, "Reshared by 123 others"); 45043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 45053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 45063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemPhotoValues(int sortIndex) { 45083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 45093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItemPhotos.SORT_INDEX, sortIndex); 45106802030a777c0c3ba1dc029c534cca4784260632Dave Santoro values.put(StreamItemPhotos.PHOTO, 45116802030a777c0c3ba1dc029c534cca4784260632Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.ORIGINAL)); 45123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 45133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 45143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 451582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testSingleStatusUpdateRowPerContact() { 4516bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 4517bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar String handle1 = "test@gmail.com"; 4518bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4519d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 45204dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId1, protocol1, null, handle1); 4521bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4522aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 4523aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4524aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AWAY, "Yellow", 4525aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4526aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.INVISIBLE, "Red", 4527aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4528bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4529af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov Cursor c = queryContact(queryContactId(rawContactId1), 453082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov new String[] {Contacts.CONTACT_PRESENCE, Contacts.CONTACT_STATUS}); 45314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 4532bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4533bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar c.moveToFirst(); 453482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(StatusUpdates.INVISIBLE, c.getInt(0)); 453582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals("Red", c.getString(1)); 45360265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov c.close(); 4537bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 4538bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4539d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void updateSendToVoicemailAndRingtone(long contactId, boolean sendToVoicemail, 4540d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String ringtone) { 4541d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 4542d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 4543d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (ringtone != null) { 4544d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 4545d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4546d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4547d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4548d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov int count = mResolver.update(uri, values, null, null); 4549d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(1, count); 45508c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 45518c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 45528c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov private void updateSendToVoicemailAndRingtoneWithSelection(long contactId, 45538c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov boolean sendToVoicemail, String ringtone) { 45548c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov ContentValues values = new ContentValues(); 45558c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 45568c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov if (ringtone != null) { 45578c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 45588c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 45598c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 45608c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov int count = mResolver.update(Contacts.CONTENT_URI, values, Contacts._ID + "=" + contactId, 45618c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov null); 45628c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertEquals(1, count); 4563d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4564d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4565d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void assertSendToVoicemailAndRingtone(long contactId, boolean expectedSendToVoicemail, 4566d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String expectedRingtone) { 4567d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 4568d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 4569d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 4570d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(expectedSendToVoicemail ? 1 : 0, sendToVoicemail); 4571d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String ringtone = c.getString(c.getColumnIndex(Contacts.CUSTOM_RINGTONE)); 4572d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (expectedRingtone == null) { 4573d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertNull(ringtone); 4574d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } else { 4575d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(ArrayUtils.contains(expectedRingtone.split(","), ringtone)); 4576d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4577d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 4578d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 45799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 45800be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov public void testContactVisibilityUpdateOnMembershipChange() { 45810be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long rawContactId = createRawContact(mAccount); 45820be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 45830be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 45840be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long visibleGroupId = createGroup(mAccount, "123", "Visible", 1); 45850be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long invisibleGroupId = createGroup(mAccount, "567", "Invisible", 0); 45860be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 45870be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership1 = insertGroupMembership(rawContactId, visibleGroupId); 45880be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 45890be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 45900be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership2 = insertGroupMembership(rawContactId, invisibleGroupId); 45910be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 45920be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 45930be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.delete(membership1, null, null); 45940be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 45950be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 45960be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov ContentValues values = new ContentValues(); 45970be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov values.put(GroupMembership.GROUP_ROW_ID, visibleGroupId); 45980be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 45990be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.update(membership2, values, null, null); 46000be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 46010be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 46020be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 46030be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov private void assertVisibility(long rawContactId, String expectedValue) { 46040be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, Contacts._ID + "=" + queryContactId(rawContactId), 46050be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov null, Contacts.IN_VISIBLE_GROUP, expectedValue); 46060be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 46070be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 46080db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov public void testSupplyingBothValuesAndParameters() throws Exception { 46090db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Account account = new Account("account 1", "type%/:1"); 46100db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Uri uri = ContactsContract.Groups.CONTENT_URI.buildUpon() 46110db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME, account.name) 46120db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE, account.type) 46130db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") 46140db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .build(); 46150db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 46160db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(uri); 46170db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type); 46180db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 46190db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some id"); 46200db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some name"); 46210db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 46220db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 46230db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 46240db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 46250db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder = ContentProviderOperation.newInsert(uri); 46260db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type + "diff"); 46270db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 46280db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some other id"); 46290db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some other name"); 46300db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 46310db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 46320db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov try { 46330db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 46340db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov fail("Expected IllegalArgumentException"); 46350db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } catch (IllegalArgumentException ex) { 46360db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov // Expected 46370db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 46380db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 46390db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 4640a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContentEntityIterator() { 46419261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana // create multiple contacts and check that the selected ones are returned 46429261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id; 46439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 46449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 46459261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId2 = createGroup(mAccount, "gsid2", "title2"); 46469261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 46473cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0"); 46483cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertGroupMembership(id, "gsid1"); 46493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertEmail(id, "c0@email.com"); 46503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertPhoneNumber(id, "5551212c0"); 46519261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 4652226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c1 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c1"); 46539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_0 = insertGroupMembership(id, "gsid1"); 46549261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_1 = insertGroupMembership(id, "gsid2"); 46559261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_2 = insertEmail(id, "c1@email.com"); 46569261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_3 = insertPhoneNumber(id, "5551212c1"); 46579261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 4658226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c2 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c2"); 46599261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_0 = insertGroupMembership(id, "gsid1"); 46609261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_1 = insertEmail(id, "c2@email.com"); 46619261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_2 = insertPhoneNumber(id, "5551212c2"); 46629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 46633cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long c3 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c3"); 46649261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_0 = insertGroupMembership(id, groupId2); 46659261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_1 = insertEmail(id, "c3@email.com"); 46669261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_2 = insertPhoneNumber(id, "5551212c3"); 46679261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 466862318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana EntityIterator iterator = RawContacts.newEntityIterator(mResolver.query( 466962318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana maybeAddAccountQueryParameters(RawContactsEntity.CONTENT_URI, mAccount), null, 467062318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana RawContacts.SOURCE_ID + " in ('c1', 'c2', 'c3')", null, null)); 46719261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Entity entity; 46729261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues[] subValues; 46739261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 46746cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c1, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 46759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 46769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(4, subValues.length); 46779261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 46789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_0, 46799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 46809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 46819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], GroupMembership.CONTENT_ITEM_TYPE, 46829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_1, 46839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 46849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 46859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Email.CONTENT_ITEM_TYPE, 46869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_2, 46879261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c1@email.com"); 46889261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[3], Phone.CONTENT_ITEM_TYPE, 46899261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_3, 46909261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c1"); 46919261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 46929261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 46936cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c2, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 46949261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 46959261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 46969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 46979261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_0, 46989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 46999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 47009261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 47019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_1, 47029261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c2@email.com"); 47039261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 47049261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_2, 47059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c2"); 47069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 47079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 47086cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c3, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 47099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 47109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 47119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 47129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_0, 47139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 47149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 47159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 47169261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_1, 47179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c3@email.com"); 47189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 47199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_2, 47209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c3"); 47219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 47229261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(iterator.hasNext()); 47233cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov iterator.close(); 47249261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 472520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 472620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov public void testDataCreateUpdateDeleteByMimeType() throws Exception { 4727d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 472820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 472920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov ContentValues values = new ContentValues(); 47305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 473120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 473220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 473320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 473420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 473520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "old1"); 473620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "old2"); 473720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "old3"); 473820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "old4"); 473920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "old5"); 474020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "old6"); 474120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "old7"); 474220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "old8"); 474320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "old9"); 474420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "old10"); 474520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "old11"); 474620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "old12"); 474720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "old13"); 474820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "old14"); 474920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "old15"); 475020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Uri uri = mResolver.insert(Data.CONTENT_URI, values); 475120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 475281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 475320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 475420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.clear(); 475520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "newpackage"); 475620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 0); 475720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 0); 475820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "new1"); 475920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "new2"); 476020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "new3"); 476120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "new4"); 476220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "new5"); 476320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "new6"); 476420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "new7"); 476520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "new8"); 476620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "new9"); 476720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "new10"); 476820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "new11"); 476920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "new12"); 477020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "new13"); 477120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "new14"); 477220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "new15"); 47735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mResolver.update(Data.CONTENT_URI, values, Data.RAW_CONTACT_ID + "=" + rawContactId + 477420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov " AND " + Data.MIMETYPE + "='testmimetype'", null); 477581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 477670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 477720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 477820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 47795ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov int count = mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 478020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null); 478120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals(1, count); 47825ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertEquals(0, getCount(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 478333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null)); 478481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 478533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 478620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 478789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactQuery() { 478889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 478989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 479089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 479189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 479289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 479389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account1); 479489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account2); 479589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 479689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 479789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, RawContacts._ID, rawContactId1) ; 479889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, RawContacts._ID, rawContactId2) ; 479989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 480089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri1 = ContentUris.withAppendedId(uri1, rawContactId1); 480189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri2 = ContentUris.withAppendedId(uri2, rawContactId2); 480289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri1, RawContacts._ID, rawContactId1) ; 480389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri2, RawContacts._ID, rawContactId2) ; 480489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 480589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 4806373f7d2adc36680c31ff33e9ee12be865af6b5fbDmitri Plotnikov public void testRawContactDeletion() { 4807e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId = createRawContact(mAccount); 48085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 480933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 48104dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 481182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4812aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4813aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4814a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId); 4815a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 481633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 481733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 481882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 48194dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 482033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 482133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(uri, null, null); 482233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 48235870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 482481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 482533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 4826e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 482733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 482833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 482933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 483033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 483182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 48324dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 4833a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 483481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 4835a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov } 4836a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4837a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov public void testRawContactDeletionKeepingAggregateContact() { 4838e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId1 = createRawContactWithName(mAccount); 4839e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId2 = createRawContactWithName(mAccount); 484047fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 484147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 4842a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4843a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 4844a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4845a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 4846e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 4847a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 4848a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 4849a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(1, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 485020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 48511fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 48525f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testRawContactDeletion_byAccountParam() { 4853e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong long rawContactId = createRawContact(mAccount); 4854e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 4855e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4856e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 485782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4858aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4859aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4860e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 4861e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong null, null)); 486282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 4863e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong + rawContactId, null)); 4864e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4865e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Do not delete if we are deleting with wrong account. 4866e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithWrongAccountUri = 4867e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4868e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountTwo.name) 4869e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccountTwo.type) 4870e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 48715f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki int numDeleted = mResolver.delete(deleteWithWrongAccountUri, null, null); 48725f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(0, numDeleted); 4873e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 48745870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "0"); 4875e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4876e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Delete if we are deleting with correct account. 4877e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithCorrectAccountUri = 4878e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4879e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name) 4880e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type) 4881e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 48825f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki numDeleted = mResolver.delete(deleteWithCorrectAccountUri, null, null); 48835f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(1, numDeleted); 48845f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 48855f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValue(uri, RawContacts.DELETED, "1"); 48865f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 48875f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 48885f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testRawContactDeletion_byAccountSelection() { 48895f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki long rawContactId = createRawContact(mAccount); 48905f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 48915f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 48925f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki // Do not delete if we are deleting with wrong account. 48935f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki int numDeleted = mResolver.delete(RawContacts.CONTENT_URI, 48945f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", 48955f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[] {mAccountTwo.name, mAccountTwo.type}); 48965f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(0, numDeleted); 48975f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 48985f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValue(uri, RawContacts.DELETED, "0"); 48995f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 49005f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki // Delete if we are deleting with correct account. 49015f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki numDeleted = mResolver.delete(RawContacts.CONTENT_URI, 49025f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", 49035f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[] {mAccount.name, mAccount.type}); 49045f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(1, numDeleted); 4905e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 49065870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 4907e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong } 4908e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 49099ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki /** 49109ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * Test for {@link ContactsProvider2#stringToAccounts} and 49119ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * {@link ContactsProvider2#accountsToString}. 49129ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki */ 49139ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki public void testAccountsToString() { 49149ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_0 = Sets.newHashSet(); 49159ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_1 = Sets.newHashSet(ACCOUNT_1); 49169ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_2 = Sets.newHashSet(ACCOUNT_2); 49179ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_1_2 = Sets.newHashSet(ACCOUNT_1, ACCOUNT_2); 49189ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49199ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_0 = Sets.newHashSet(); 49209ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_1 = Sets.newHashSet(ACCOUNT_1); 49219ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_2 = Sets.newHashSet(ACCOUNT_2); 49229ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_1_2 = Sets.newHashSet(ACCOUNT_2, ACCOUNT_1); 49239ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49249ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_0))); 49259ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_1))); 49269ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_2))); 49279ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_1_2))); 49289ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49299ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_0))); 49309ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_1))); 49319ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_2))); 49329ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_1_2))); 49339ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49349ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_0))); 49359ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_1))); 49369ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_2))); 49379ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_1_2))); 49389ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49399ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_0))); 49409ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_1))); 49419ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_2))); 49429ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_1_2))); 49439ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49449ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki try { 49459ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki ContactsProvider2.stringToAccounts("x"); 49469ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki fail("Didn't throw for malformed input"); 49479ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } catch (IllegalArgumentException expected) { 49489ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 49499ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 49509ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49519ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki private static final Set<Account> accountsToStringToAccounts(Set<Account> accounts) { 49529ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki return ContactsProvider2.stringToAccounts(ContactsProvider2.accountsToString(accounts)); 49539ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 49549ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49559ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki /** 49569ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * Test for {@link ContactsProvider2#haveAccountsChanged} and 49579ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * {@link ContactsProvider2#saveAccounts}. 49589ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki */ 49599ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki public void testHaveAccountsChanged() { 49609ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final ContactsProvider2 cp = (ContactsProvider2) getProvider(); 49619ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49629ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_0 = new Account[] {}; 49639ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_1 = new Account[] {ACCOUNT_1}; 49649ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_2 = new Account[] {ACCOUNT_2}; 49659ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_1_2 = new Account[] {ACCOUNT_1, ACCOUNT_2}; 49669ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_2_1 = new Account[] {ACCOUNT_2, ACCOUNT_1}; 49679ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49689ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Add ACCOUNT_1 49699ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49709ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1)); 49719ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_1); 49729ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_1)); 49739ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49749ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Add ACCOUNT_2 49759ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49769ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1_2)); 49779ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // (try with reverse order) 49789ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_2_1)); 49799ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_1_2); 49809ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_1_2)); 49819ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // (try with reverse order) 49829ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_2_1)); 49839ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49849ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Remove ACCOUNT_1 49859ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49869ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_2)); 49879ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_2); 49889ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_2)); 49899ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49909ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Remove ACCOUNT_2 49919ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49929ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_0)); 49939ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_0); 49949ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_0)); 49959ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49969ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Test with malformed DB property. 49979ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 49989ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final ContactsDatabaseHelper dbHelper = cp.getThreadActiveDatabaseHelperForTest(); 49999ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki dbHelper.setProperty(DbProperties.KNOWN_ACCOUNTS, "x"); 50009ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 50019ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // With malformed property the method always return true. 50029ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_0)); 50039ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1)); 50049ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 50059ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 5006627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov public void testAccountsUpdated() { 500770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // This is to ensure we do not delete contacts with null, null (account name, type) 500870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // accidentally. 500970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId3 = createRawContactWithName("James", "Sullivan"); 501070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertPhoneNumber(rawContactId3, "5234567890"); 5011627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov Uri rawContact3 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId3); 5012743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 501370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 501470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong ContactsProvider2 cp = (ContactsProvider2) getProvider(); 5015bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount, mAccountTwo}); 5016743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount, mAccountTwo}); 5017743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 5018dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_NAME, null); 5019dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_TYPE, null); 502070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 5021743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 5022743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId1, "account1@email.com"); 5023743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId2 = createRawContact(mAccountTwo); 5024743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId2, "account2@email.com"); 5025743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertImHandle(rawContactId2, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 5026743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 5027aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 5028aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 5029743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 5030bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount}); 5031743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount}); 5032627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov assertEquals(2, getCount(RawContacts.CONTENT_URI, null, null)); 503382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 503470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong + rawContactId2, null)); 503570d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong } 503670d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 503733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov public void testAccountDeletion() { 503833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Account readOnlyAccount = new Account("act", READ_ONLY_ACCOUNT_TYPE); 503933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContactsProvider2 cp = (ContactsProvider2) getProvider(); 5040bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount, mAccount}); 504133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount, mAccount}); 504233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 504333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", readOnlyAccount); 504433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri1 = insertPhoto(rawContactId1); 504533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId2 = createRawContactWithName("john", "doe", mAccount); 504633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri2 = insertPhoto(rawContactId2); 504733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov storeValue(photoUri2, Photo.IS_SUPER_PRIMARY, "1"); 504833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 504933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 505033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 505133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 505233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 505333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the writable account 505433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 505533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 505633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 505733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "john doe"); 505833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 505933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the one we marked as super-primary 506033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 506133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri2)); 506233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 5063bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount}); 506433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // Remove the writable account 506533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount}); 506633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 506733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the remaining account 506833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 506933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 507033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 507133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "John Doe"); 507233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 507333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the remaining one 507433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 507533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri1)); 507633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov } 507733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 5078c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro public void testStreamItemsCleanedUpOnAccountRemoval() { 5079c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account doomedAccount = new Account("doom", "doom"); 5080c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account safeAccount = mAccount; 5081c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContactsProvider2 cp = (ContactsProvider2) getProvider(); 5082c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{doomedAccount, safeAccount}); 5083c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{doomedAccount, safeAccount}); 5084c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5085c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a doomed raw contact, stream item, and photo. 5086c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedRawContactId = createRawContactWithName(doomedAccount); 5087c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemUri = 5088c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(doomedRawContactId, buildGenericStreamItemValues(), doomedAccount); 5089c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedStreamItemId = ContentUris.parseId(doomedStreamItemUri); 5090c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemPhotoUri = insertStreamItemPhoto( 5091c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro doomedStreamItemId, buildGenericStreamItemPhotoValues(0), doomedAccount); 5092c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5093c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a safe raw contact, stream item, and photo. 5094c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeRawContactId = createRawContactWithName(safeAccount); 5095c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemUri = 5096c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(safeRawContactId, buildGenericStreamItemValues(), safeAccount); 5097c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemId = ContentUris.parseId(safeStreamItemUri); 5098c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemPhotoUri = insertStreamItemPhoto( 5099c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeStreamItemId, buildGenericStreamItemPhotoValues(0), safeAccount); 5100c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemPhotoId = ContentUris.parseId(safeStreamItemPhotoUri); 5101c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5102c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Remove the doomed account. 5103c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{safeAccount}); 5104c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{safeAccount}); 5105c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5106c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the doomed stuff has all been nuked. 5107c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContentValues[] noValues = new ContentValues[0]; 5108c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(ContentUris.withAppendedId(RawContacts.CONTENT_URI, doomedRawContactId), 5109c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro noValues); 5110c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemUri, noValues); 5111c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemPhotoUri, noValues); 5112c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5113c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the safe stuff lives on. 5114c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(RawContacts.CONTENT_URI, safeRawContactId, RawContacts._ID, 5115c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeRawContactId); 5116c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemUri, StreamItems._ID, safeStreamItemId); 5117c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemPhotoUri, StreamItemPhotos._ID, safeStreamItemPhotoId); 5118c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro } 5119c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5120cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov public void testContactDeletion() { 512147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 512247fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_2); 5123cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 5124cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long contactId = queryContactId(rawContactId1); 5125cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 5126cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov mResolver.delete(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), null, null); 5127cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 5128cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1), 5129cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 5130cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2), 5131cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 5132cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov } 5133cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 513473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 513573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov long rawContactId = createRawContact(mAccount); 513673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 513773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 513873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = insertStructuredName(rawContactId, "John", "Doe"); 513973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov clearDirty(rawContactUri); 5140e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri updateUri = setCallerIsSyncAdapter(uri, mAccount); 514173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 514273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 514373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dough"); 514473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 51455870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, StructuredName.FAMILY_NAME, "Dough"); 514673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(rawContactUri, false); 514781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 51481fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 51491fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 515061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDirtyAndVersion() { 5151d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final long rawContactId = createRawContact(mAccount); 5152d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); 515373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 51541fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 51551fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 51561fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 51571fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.DIRTY, 0); 51581fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.SEND_TO_VOICEMAIL, 1); 515961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.AGGREGATION_MODE, 5160c100221f706afc08409e8317a27d6850b11c54d3Omari Stephens RawContacts.AGGREGATION_MODE_IMMEDIATE); 516161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.STARRED, 1); 51621fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(1, mResolver.update(uri, values, null, null)); 51631fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 51641fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 51651fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 516681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 51671fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 516861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "goo@woo.com"); 516961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 517081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 51711fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 51721fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 517361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 51741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 517561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values = new ContentValues(); 517661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(Email.DATA, "goo@hoo.com"); 517761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.update(emailUri, values, null, null); 51781fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 517981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 51801fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 51811fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 518261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 51831fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 518461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(emailUri, null, null); 51851fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 518681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 51871fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 51881fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 518961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov } 51901fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 519161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactClearDirty() { 519261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 519361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 519461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 519561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov long version = getVersion(uri); 519661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov insertEmail(rawContactId, "goo@woo.com"); 51971fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 519861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 51991fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 52001fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 52011fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana clearDirty(uri); 52021fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 52031fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 52041fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 52051fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 520661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDeletionSetsDirty() { 520761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 52081fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 520961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 52101fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 521161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 521261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, false); 521361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov 521461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(uri, null, null); 52155870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 521661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 521781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 521861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 521961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertEquals(version, getVersion(uri)); 52201fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 52214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 52229fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutName() { 52239fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 52249fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 52259fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 52269fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri phoneUri = insertPhoneNumber(rawContactId, "555-123-45678", true); 52279fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 52289fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 52299fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 52309fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 52319fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 52329fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 52339fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 52349fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 52359fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 52369fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutAnyData() { 52379fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 52389fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 52399fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 52409fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 52419fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 52429fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 52439fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 52449fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 52459fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 52469fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 52479fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 524860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testDeleteContactWithEscapedUri() { 524960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 525060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 525160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 525260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 525360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 525460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 525560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 525660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 525760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, mResolver.delete(lookupUri, null, null)); 525860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 525960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 526060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testQueryContactWithEscapedUri() { 526160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 526260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 526360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 526460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 526560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 526660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 526760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 526860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 526960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Cursor c = mResolver.query(lookupUri, null, null, null, ""); 527060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, c.getCount()); 527160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 527260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 527360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 5274074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov public void testGetPhotoUri() { 5275074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov ContentValues values = new ContentValues(); 5276074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 5277074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 5278074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 5279f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5280f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 5281f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId)}, Photo.PHOTO_FILE_ID); 5282f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId) 5283f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 5284074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 52853d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov assertStoredValue( 52863d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(rawContactId)), 5287f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI, photoUri); 5288074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov } 5289074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 5290bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro public void testGetPhotoViaLookupUri() throws IOException { 5291bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long rawContactId = createRawContact(); 5292bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long contactId = queryContactId(rawContactId); 5293bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5294bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 5295bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro String lookupKey = lookupUri.getPathSegments().get(2); 5296bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 5297bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro byte[] thumbnail = loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL); 5298bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5299bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Two forms of lookup key URIs should be valid - one with the contact ID, one without. 5300bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithId = Uri.withAppendedPath(lookupUri, "photo"); 5301bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithoutId = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5302bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro .appendPath(lookupKey).appendPath("photo").build(); 5303bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5304bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try retrieving as a data record. 5305bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro ContentValues values = new ContentValues(); 5306bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro values.put(Photo.PHOTO, thumbnail); 5307bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithId, values); 5308bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithoutId, values); 5309bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5310bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try opening as an input stream. 531187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5312c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki thumbnail, mResolver.openInputStream(photoLookupUriWithId)); 531387426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5314c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki thumbnail, mResolver.openInputStream(photoLookupUriWithoutId)); 5315bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro } 5316bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5317ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert public void testInputStreamForPhoto() throws Exception { 5318e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov long rawContactId = createRawContact(); 5319f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5320f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5321f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId); 5322f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_URI)); 5323f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoThumbnailUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI)); 5324e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 532587426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // Check the thumbnail. 532687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), loadTestPhoto(PhotoSize.THUMBNAIL), 5327f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoThumbnailUri)); 532887426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki 532987426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // Then check the display photo. Note because we only inserted a small photo, but not a 533087426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // display photo, this returns the thumbnail image itself, which was compressed at 533187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // the thumnail compression rate, which is why we compare to 533287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // loadTestPhoto(PhotoSize.THUMBNAIL) rather than loadTestPhoto(PhotoSize.DISPLAY_PHOTO) 533387426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // here. 533487426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // (In other words, loadTestPhoto(PhotoSize.DISPLAY_PHOTO) returns the same photo as 533587426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // loadTestPhoto(PhotoSize.THUMBNAIL), except it's compressed at a lower compression rate.) 533687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), loadTestPhoto(PhotoSize.THUMBNAIL), 533787426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki mResolver.openInputStream(photoUri)); 5338ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 5339ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert 5340732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov public void testSuperPrimaryPhoto() { 5341732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId1 = createRawContact(new Account("a", "a")); 5342f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri1 = insertPhoto(rawContactId1, R.drawable.earth_normal); 5343732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId1 = ContentUris.parseId(photoUri1); 5344732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5345732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId2 = createRawContact(new Account("b", "b")); 5346f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri2 = insertPhoto(rawContactId2, R.drawable.earth_normal); 5347732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId2 = ContentUris.parseId(photoUri2); 5348732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5349732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 5350732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5351732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5352732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 5353732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 5354f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5355f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 5356f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(photoId1)}, Photo.PHOTO_FILE_ID); 5357f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId1) 5358f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 5359732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 5360f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValue(contactUri, Contacts.PHOTO_URI, photoUri); 5361732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5362732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 5363732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5364732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5365732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov ContentValues values = new ContentValues(); 5366732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 5367732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri2, values, null, null); 5368732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5369732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 5370732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5371732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 5372732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 5373732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId2); 5374732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5375732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri1, values, null, null); 5376732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 5377732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov } 5378732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 53798e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public void testUpdatePhoto() { 53808e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov ContentValues values = new ContentValues(); 53818e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 53828e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 53838e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 53848e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 53858e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri twigUri = Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 53868e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov queryContactId(rawContactId)), Contacts.Photo.CONTENT_DIRECTORY); 53878e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 53888e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 53898e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 53908e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 53918e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.putNull(Photo.PHOTO); 53928e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 53938e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long photoId = ContentUris.parseId(dataUri); 53948e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5395155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov assertEquals(0, getCount(twigUri, null, null)); 53968e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 53978e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 53988e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Photo.PHOTO, loadTestPhoto()); 53998e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov mResolver.update(dataUri, values, null, null); 540081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 54018e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5402f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long twigId = getStoredLongValue(twigUri, Data._ID); 54038e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov assertEquals(photoId, twigId); 54048e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov } 54058e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 54064e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactDataPhoto() { 54077d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a contact with a null photo 54087d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentValues values = new ContentValues(); 54097d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 54107d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh long rawContactId = ContentUris.parseId(rawContactUri); 54117d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 54127d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a photo 54137d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.RAW_CONTACT_ID, rawContactId); 54147d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 54157d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.putNull(Photo.PHOTO); 54167d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 54177d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // try to do an update before insert should return count == 0 54187d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri dataUri = Uri.withAppendedPath( 54197d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 54207d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh RawContacts.Data.CONTENT_DIRECTORY); 54217d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(0, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 54227d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 54237d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 54247d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh mResolver.insert(Data.CONTENT_URI, values); 54257d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 54267d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // save a photo to the db 54277d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.clear(); 54287d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 54297d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Photo.PHOTO, loadTestPhoto()); 54307d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(1, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 54317d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 54327d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 54337d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // verify the photo 54344e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Cursor storedPhoto = mResolver.query(dataUri, new String[] {Photo.PHOTO}, 54357d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Data.MIMETYPE + "=?", new String[] {Photo.CONTENT_ITEM_TYPE}, null); 54364e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov storedPhoto.moveToFirst(); 5437f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro MoreAsserts.assertEquals(loadTestPhoto(PhotoSize.THUMBNAIL), storedPhoto.getBlob(0)); 54380265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov storedPhoto.close(); 54397d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh } 54407d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 5441f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactId() throws IOException { 5442f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5443f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5444f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5445f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_URI.buildUpon() 5446f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5447f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 544887426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5449f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5450f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5451f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5452f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5453f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKey() throws IOException { 5454f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5455f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5456f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5457f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5458f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5459f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5460f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 546187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5462f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5463f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5464f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5465f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5466f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKeyAndId() throws IOException { 5467f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5468f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5469f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5470f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5471f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5472f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5473f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5474f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 547587426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5476f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5477f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5478f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5479f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5480f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForRawContactId() throws IOException { 5481f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5482f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5483f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = RawContacts.CONTENT_URI.buildUpon() 5484f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5485f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 548687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5487f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5488f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5489f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5490f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5491f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoByPhotoUri() throws IOException { 5492f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5493f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5494f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5495f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5496f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Get the photo URI out and check the content. 5497f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5498f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5499f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 550087426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5501f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5502f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5503f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5504f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5505f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForDisplayPhoto() { 5506f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5507f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5508f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5509f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is larger than a thumbnail, so it will be stored as a file. 5510f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5511f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoFileId = getStoredValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 5512f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5513f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5514f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5515f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5516f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5517f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI differs from the thumbnail. 5518f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5519f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5520f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5521f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(photoUri.equals(thumbnailUri)); 5522f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5523f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form display_photo/ID 5524f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath(DisplayPhoto.CONTENT_URI, photoFileId).toString(), 5525f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5526f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5527f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5528f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForThumbnailPhoto() throws IOException { 5529f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5530f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5531f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5532f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is a thumbnail, so it will only be stored in a BLOB. The photo URI 5533f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // will fall back to the thumbnail URI. 5534f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 5535f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5536f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5537f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5538f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5539f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI is equal to the thumbnail URI. 5540f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5541f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5542f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5543f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 5544f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5545f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form contacts/ID/photo 5546f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath( 5547f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5548f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.Photo.CONTENT_DIRECTORY).toString(), 5549f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5550f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5551f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Loading the photo URI content should get the thumbnail. 555287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5553f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 5554f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5555f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5556f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5557c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteNewPhotoToAssetFile() throws Exception { 5558f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5559f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5560f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5561f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 5562c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final byte[] originalPhoto = loadPhotoFromResource( 5563c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL); 5564f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5565f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 5566c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 5567f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5568f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5569c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 5570f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5571f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo and thumbnail have been set. 5572c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro String photoUri = null; 5573c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro for (int i = 0; i < 10 && photoUri == null; i++) { 5574c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Wait a tick for the photo processing to occur. 5575c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(100); 5576c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro photoUri = getStoredValue( 5577c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5578c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Contacts.PHOTO_URI); 5579c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5580c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5581f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(photoUri)); 5582f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5583f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5584f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5585f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(thumbnailUri)); 5586c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro assertNotSame(photoUri, thumbnailUri); 5587f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5588f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 558987426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5590f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 5591f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 559287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5593f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 5594f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(thumbnailUri))); 5595f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5596f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5597c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteUpdatedPhotoToAssetFile() throws Exception { 5598f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5599f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5600f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5601f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a large photo first. 5602f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_large); 5603f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String largeEarthPhotoUri = getStoredValue( 5604f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 5605f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5606f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 5607f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro byte[] originalPhoto = loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL); 5608f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5609f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 5610f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 5611f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5612f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5613c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 5614c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5615c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Allow a second for processing to occur. 5616c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(1000); 5617f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5618f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo URI has been modified. 5619f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthPhotoUri = getStoredValue( 5620f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 5621f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(hugeEarthPhotoUri.equals(largeEarthPhotoUri)); 5622f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5623f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 5624f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthThumbnailUri = getStoredValue( 5625f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5626f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 562787426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5628f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 5629f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthPhotoUri))); 563087426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5631f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 5632f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthThumbnailUri))); 5633f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5634f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5635f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5636c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro private void writePhotoAsync(final Uri uri, final byte[] photoBytes) throws Exception { 5637c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro AsyncTask<Object, Object, Object> task = new AsyncTask<Object, Object, Object>() { 5638c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro @Override 5639c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro protected Object doInBackground(Object... params) { 5640c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro OutputStream os; 5641c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro try { 5642c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os = mResolver.openOutputStream(uri, "rw"); 5643c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.write(photoBytes); 5644c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.close(); 5645c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro return null; 5646c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } catch (IOException ioe) { 5647c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro throw new RuntimeException(ioe); 5648c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5649c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5650c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro }; 5651c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Object[])null).get(); 5652c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5653c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5654f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoDimensionLimits() { 5655f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 5656f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.DISPLAY_MAX_DIM, 256); 5657f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.THUMBNAIL_MAX_DIM, 96); 5658f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValues(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI, values); 5659f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5660f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5661f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoStoreCleanup() throws IOException { 5662f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 5663c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro PhotoStore photoStore = provider.getPhotoStore(); 5664f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5665f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 5666f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 5667f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5668f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a couple of contacts with photos. 5669f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId1 = createRawContactWithName(); 5670f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId1 = queryContactId(rawContactId1); 5671f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId1 = ContentUris.parseId(insertPhoto(rawContactId1, R.drawable.earth_normal)); 5672f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = 5673f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId1), 5674f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5675f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5676f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId2 = createRawContactWithName(); 5677f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId2 = queryContactId(rawContactId2); 5678f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId2 = ContentUris.parseId(insertPhoto(rawContactId2, R.drawable.earth_normal)); 5679f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId2 = 5680f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 5681f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5682f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5683f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Update the second raw contact with a different photo. 5684f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 5685f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId2); 5686f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 5687f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL)); 5688f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(1, mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 5689f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId2)})); 5690f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long replacementPhotoFileId = 5691f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 5692f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5693f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5694f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a third raw contact that has a bogus photo file ID. 5695f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusFileId = 1234567; 5696f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId3 = createRawContactWithName(); 5697f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId3 = queryContactId(rawContactId3); 5698f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.clear(); 5699f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId3); 5700f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 5701f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_normal, 5702f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoSize.THUMBNAIL)); 5703f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO_FILE_ID, bogusFileId); 5704f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DataRowHandlerForPhoto.SKIP_PROCESSING_KEY, true); 5705f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.insert(Data.CONTENT_URI, values); 5706f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5707c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // Insert a fourth raw contact with a stream item that has a photo, then remove that photo 5708c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // from the photo store. 5709c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Account socialAccount = new Account("social", "social"); 5710c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long rawContactId4 = createRawContactWithName(socialAccount); 5711c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemUri = 5712c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro insertStreamItem(rawContactId4, buildGenericStreamItemValues(), socialAccount); 5713c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 5714c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 5715c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 5716c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 5717c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 5718c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro photoStore.remove(streamItemPhotoFileId); 5719c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 5720f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Also insert a bogus photo that nobody is using. 5721f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusPhotoId = photoStore.insert(new PhotoProcessor(loadPhotoFromResource( 5722f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL), 256, 96)); 5723f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5724f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Manually trigger another cleanup in the provider. 5725f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 5726f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5727f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // The following things should have happened. 5728f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5729f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 1. Raw contact 1 and its photo remain unaffected. 5730f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoFileId1, (long) getStoredLongValue( 5731f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1), 5732f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5733f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5734f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 2. Raw contact 2 retains its new photo. The old one is deleted from the photo store. 5735f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(replacementPhotoFileId, (long) getStoredLongValue( 5736f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2), 5737f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5738f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(photoFileId2)); 5739f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5740f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 3. Raw contact 3 should have its photo file reference cleared. 5741f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue( 5742f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId3), 5743f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5744f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5745f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 4. The bogus photo that nobody was using should be cleared from the photo store. 5746f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(bogusPhotoId)); 5747c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 5748c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // 5. The bogus stream item photo should be cleared from the stream item. 5749c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro assertStoredValues(Uri.withAppendedPath( 5750c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 5751c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 5752c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro new ContentValues[0]); 5753f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5754f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5755d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro public void testPhotoStoreCleanupForProfile() { 5756d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 5757d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro PhotoStore profilePhotoStore = provider.getProfilePhotoStore(); 5758d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5759d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 5760ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki provider.switchToProfileModeForTest(); 5761d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 5762d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5763d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Create the profile contact and add a photo. 5764d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Account socialAccount = new Account("social", "social"); 5765d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentValues values = new ContentValues(); 5766d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_NAME, socialAccount.name); 5767d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_TYPE, socialAccount.type); 5768d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileRawContactId = createBasicProfileContact(values); 5769d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileContactId = queryContactId(profileRawContactId); 5770d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long dataId = ContentUris.parseId( 5771d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertPhoto(profileRawContactId, R.drawable.earth_normal)); 5772d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profilePhotoFileId = 5773d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 5774d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Photo.PHOTO_FILE_ID); 5775d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5776d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Also add a stream item with a photo. 5777d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemUri = 5778d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertStreamItem(profileRawContactId, buildGenericStreamItemValues(), 5779d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro socialAccount); 5780d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 5781d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 5782d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 5783d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 5784d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 5785d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5786d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Remove the stream item photo and the profile photo. 5787d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(profilePhotoFileId); 5788d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(streamItemPhotoFileId); 5789d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5790d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Manually trigger another cleanup in the provider. 5791ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki provider.switchToProfileModeForTest(); 5792d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 5793d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5794d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The following things should have happened. 5795d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5796d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The stream item photo should have been removed. 5797d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertStoredValues(Uri.withAppendedPath( 5798d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 5799d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 5800d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro new ContentValues[0]); 5801d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5802d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The profile photo should have been cleared. 5803d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertNull(getStoredValue( 5804d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 5805d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Contacts.PHOTO_FILE_ID)); 5806d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5807d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro } 5808d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5809f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOverwritePhotoWithThumbnail() throws IOException { 5810f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5811f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5812f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5813f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5814f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write a regular-size photo. 5815f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5816f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Long photoFileId = getStoredLongValue(contactUri, Contacts.PHOTO_FILE_ID); 5817f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertTrue(photoFileId != null && photoFileId > 0); 5818f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5819f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Now overwrite the photo with a thumbnail-sized photo. 5820f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues update = new ContentValues(); 5821f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro update.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_small, PhotoSize.ORIGINAL)); 5822f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.update(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), update, null, null); 5823f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5824f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo file ID should have been nulled out, and the photo URI should be the same as the 5825f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // thumbnail URI. 5826f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue(contactUri, Contacts.PHOTO_FILE_ID)); 5827f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue(contactUri, Contacts.PHOTO_URI); 5828f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI); 5829f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 5830f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5831f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Retrieving the photo URI should get the thumbnail content. 583287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5833c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 5834f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5835f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5836f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 58374e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactSetStarred() { 58384e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId1 = createRawContactWithName(); 58394e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 58404e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId2 = createRawContactWithName(); 58414e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 584247fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 584347fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 58444e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58454e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 58464e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 58474e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 58484e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58494e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov ContentValues values = new ContentValues(); 58504e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "1"); 58514e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58524e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 58534e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58544e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 58554e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 58564e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 58574e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58584e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "0"); 58594e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 58604e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58614e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "0"); 58624e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 58634e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 58644e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58654e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(Contacts.STARRED, "1"); 58664e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(contactUri, values, null, null); 58674e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58684e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 58694e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "1"); 58704e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 58714e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov } 58724e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 58736dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testSetAndClearSuperPrimaryEmail() { 58746dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId1 = createRawContact(new Account("a", "a")); 58756dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri11 = insertEmail(rawContactId1, "test1@domain1.com"); 58766dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri12 = insertEmail(rawContactId1, "test2@domain1.com"); 58776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 58786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId2 = createRawContact(new Account("b", "b")); 58796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri21 = insertEmail(rawContactId2, "test1@domain2.com"); 58806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri22 = insertEmail(rawContactId2, "test2@domain2.com"); 58816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 58826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 58836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 58846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 58856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 58866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 58876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 58886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 0); 58896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 58906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 58916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Set super primary on the first pair, primary on the second 58926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 58936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 58946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 58956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 58966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 58976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 58986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 58996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 59006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 59016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 59026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 1); 59046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 1); 59056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 59066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 59076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 59086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 59096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 59106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 59116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Clear primary on the first pair, make sure second is not affected and super_primary is 59136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // also cleared 59146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 59156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 59166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 59176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 59186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 59196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 59216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 59226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 59236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 59246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 59256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 59266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 59276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 59286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear super_primary, if we specify the correct data row 59306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 59316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 59326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 59336dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 59346dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 59356dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59366dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 59376dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 59386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 59396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 59406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear primary, if we specify the correct data row 59426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 59436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 59446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 59456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 59466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 59476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59486dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 59496dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 59506dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 59516dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 59526dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59536dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Now clear super-primary for real 59546dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 59556dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 59566dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 59576dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 59586dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 59596dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59606dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 59616dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 59626dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 59636dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 59646dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 59656dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 59666dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 59676dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 59686dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 59696dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59706dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann /** 59716dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * Common function for the testNewPrimaryIn* functions. Its four configurations 59726dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * are each called from its own test 59736dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann */ 59746dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testChangingPrimary(boolean inUpdate, boolean withSuperPrimary) { 59756dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId = createRawContact(new Account("a", "a")); 59766dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri1 = insertEmail(rawContactId, "test1@domain1.com", true); 59776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (withSuperPrimary) { 59796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 59806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 59816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri1, values, null, null); 59826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 59836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 59856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 59866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Insert another item 59886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final Uri mailUri2; 59896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (inUpdate) { 59906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com"); 59916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 59936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 59946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 0); 59956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, 0); 59966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 59976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 59986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 1); 59996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri2, values, null, null); 60006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } else { 60016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // directly add as default 60026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com", true); 60036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 60046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 60056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that primary has been unset on the first 60066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // If withSuperPrimary is set, also ensure that is has been moved to the new item 60076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 0); 60086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, 0); 60096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 1); 60106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 60116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 60126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 60136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsert() { 60146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, false); 60156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 60166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 60176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsertWithSuperPrimary() { 60186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, true); 60196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 60206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 60216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdate() { 60226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, false); 60236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 60246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 60256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdateWithSuperPrimary() { 60266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, true); 60276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 60286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 6029ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov public void testContactCounts() { 6030ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Uri uri = Contacts.CONTENT_URI.buildUpon() 6031ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build(); 6032ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6033ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContact(); 6034ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("James", "Sullivan"); 6035ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("The Abominable", "Snowman"); 6036ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mike", "Wazowski"); 6037ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("randall", "boggs"); 6038ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Boo", null); 6039ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mary", null); 6040ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Roz", null); 6041ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6042ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Cursor cursor = mResolver.query(uri, 6043ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 6044ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_PRIMARY + " COLLATE LOCALIZED"); 6045ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 604635997f3fdee2984b6d5373326110eda26929001aMakoto Onuki assertFirstLetterValues(cursor, "", "B", "J", "M", "R", "T"); 6047ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 1, 1, 2, 2, 1); 6048ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 6049ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6050ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor = mResolver.query(uri, 6051ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 6052ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_ALTERNATIVE + " COLLATE LOCALIZED DESC"); 6053ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 605435997f3fdee2984b6d5373326110eda26929001aMakoto Onuki assertFirstLetterValues(cursor, "W", "S", "R", "M", "B", ""); 6055ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 2, 1, 1, 2, 1); 6056ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 6057ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 6058ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6059ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterValues(Cursor cursor, String... expected) { 6060ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov String[] actual = cursor.getExtras() 6061ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getStringArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_TITLES); 6062ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 6063ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 6064ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6065ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterCounts(Cursor cursor, int... expected) { 6066ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov int[] actual = cursor.getExtras() 6067ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getIntArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS); 6068ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 6069ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 6070ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6071f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testReadBooleanQueryParameter() { 6072f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", true, true); 6073f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", false, false); 6074f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=0", "bool", true, false); 6075f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1", "bool", false, true); 6076f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false", "bool", true, false); 6077f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=true", "bool", false, true); 6078f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=FaLsE", "bool", true, false); 6079f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false&some=some", "bool", true, false); 6080f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1&some=some", "bool", false, true); 6081f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?some=bool", "bool", true, true); 6082f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool", "bool", true, true); 6083f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6084f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 6085f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertBooleanUriParameter(String uriString, String parameter, 6086f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov boolean defaultValue, boolean expectedValue) { 6087f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.readBooleanQueryParameter( 6088f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter, defaultValue)); 6089f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6090f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 6091f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testGetQueryParameter() { 6092f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar", "param", null); 6093f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param", "param", null); 6094f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=", "param", ""); 6095f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val", "param", "val"); 6096f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val&some=some", "param", "val"); 6097f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val", "param", "val"); 6098f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val&else=else", "param", "val"); 6099f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=john%40doe.com", "param", "john@doe.com"); 61005fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val", "param", null); 61015fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2", "param", "val2"); 61025fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=", "param", ""); 61035fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m", "param", null); 61045fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1&another_param=val2¶m=val3", 61055fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val3"); 61065fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2&some_param=val3", 61075fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val2"); 61085fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?param=val1&some_param=val2", "param", "val1"); 61095fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?p=val1&pp=val2", "p", "val1"); 61105fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?pp=val1&p=val2", "p", "val2"); 61115fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val1&pp=val2&p=val3", "p", "val3"); 61125fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val&", "p", null); 6113f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6114f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 6115e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testMissingAccountTypeParameter() { 6116e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try querying for RawContacts only using ACCOUNT_NAME 6117e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri queryUri = RawContacts.CONTENT_URI.buildUpon().appendQueryParameter( 6118e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey RawContacts.ACCOUNT_NAME, "lolwut").build(); 6119e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 6120e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Cursor cursor = mResolver.query(queryUri, null, null, null, null); 6121e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to query with incomplete account query parameters"); 6122e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 6123e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 6124e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6125e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6126e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 6127e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testInsertInconsistentAccountType() { 6128e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try inserting RawContact with inconsistent Accounts 6129e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account red = new Account("red", "red"); 6130e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account blue = new Account("blue", "blue"); 6131e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 6132e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final ContentValues values = new ContentValues(); 6133e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_NAME, red.name); 6134e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_TYPE, red.type); 6135e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 6136e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri insertUri = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, blue); 6137e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 6138e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey mResolver.insert(insertUri, values); 6139e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to insert RawContact with inconsistent account details"); 6140e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 6141e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 6142e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6143e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6144e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 61453826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusNoContactsNoAccounts() throws Exception { 61463826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 61473826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 61483826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 61493826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusOnlyLocalContacts() throws Exception { 61503826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov long rawContactId = createRawContact(); 61513826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 61523826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov mResolver.delete( 61533826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null, null); 61543826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 61553826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 61563826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 61573826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusWithAccounts() throws Exception { 61583826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 6159bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{ACCOUNT_1}); 61603826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[]{ACCOUNT_1}); 61613826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 6162bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[0]); 61633826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[0]); 61643826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 61653826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 61663826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 61673826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov private void assertProviderStatus(int expectedProviderStatus) { 616809c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov Cursor cursor = mResolver.query(ProviderStatus.CONTENT_URI, 616909c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov new String[]{ProviderStatus.DATA1, ProviderStatus.STATUS}, null, null, null); 617009c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertTrue(cursor.moveToFirst()); 617109c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertEquals(0, cursor.getLong(0)); 61723826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertEquals(expectedProviderStatus, cursor.getInt(1)); 617309c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov cursor.close(); 617409c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov } 617509c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov 6176b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void testProperties() throws Exception { 6177743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ContactsProvider2 provider = (ContactsProvider2)getProvider(); 6178b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContactsDatabaseHelper helper = (ContactsDatabaseHelper)provider.getDatabaseHelper(); 6179b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertNull(helper.getProperty("non-existent", null)); 6180b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("non-existent", "default")); 6181b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 6182b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", "string1"); 6183b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent2", "string2"); 6184b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string1", helper.getProperty("existent1", "default")); 6185b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string2", helper.getProperty("existent2", "default")); 6186b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", null); 6187b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("existent1", "default")); 6188b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 6189b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 619042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private class VCardTestUriCreator { 619142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup1; 619242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup2; 619342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 619442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public VCardTestUriCreator(String lookup1, String lookup2) { 619542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann super(); 619642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup1 = lookup1; 619742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup2 = lookup2; 619842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 619942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 620042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri1() { 620142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup1); 620242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 620342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 620442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri2() { 620542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup2); 620642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 620742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 620842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getCombinedUri() { 620942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, 621042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(mLookup1 + ":" + mLookup2)); 621142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 621242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 621342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 621442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private VCardTestUriCreator createVCardTestContacts() { 621542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId1 = createRawContact(mAccount, RawContacts.SOURCE_ID, "4:12"); 621642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId1, "John", "Doe"); 621742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 621842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId2 = createRawContact(mAccount, RawContacts.SOURCE_ID, "3:4%121"); 621942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId2, "Jane", "Doh"); 622042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 622142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId1 = queryContactId(rawContactId1); 622242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId2 = queryContactId(rawContactId2); 622342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact1Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1); 622442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact2Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2); 622542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup1 = 622642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact1Uri).getPathSegments().get(2)); 622742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup2 = 622842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact2Uri).getPathSegments().get(2)); 622942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return new VCardTestUriCreator(lookup1, lookup2); 623042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 623142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 623242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryMultiVCard() { 623342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // No need to create any contacts here, because the query for multiple vcards 623442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // does not go into the database at all 623542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri uri = Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, Uri.encode("123:456")); 623642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(uri, null, null, null, null); 623742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 623842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 623942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 624042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 624142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 624242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // The resulting name contains date and time. Ensure that before and after are correct 624342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.startsWith("vcards_")); 624442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.endsWith(".vcf")); 624542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 624642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 624742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 624842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryFileSingleVCard() { 624942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 625042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 625142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 625242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri1(), null, null, null, null); 625342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 625442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 625542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 625642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 625742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("John Doe.vcf", filename); 625842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 625942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 626042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 626142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 626242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri2(), null, null, null, null); 626342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 626442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 626542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 626642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 626742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("Jane Doh.vcf", filename); 626842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 626942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 627042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 627142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 627224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryFileProfileVCard() { 627324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 627424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor cursor = mResolver.query(Profile.CONTENT_VCARD_URI, null, null, null, null); 627524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(1, cursor.getCount()); 627624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.moveToFirst()); 627724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 627824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 627924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals("Mia Prophyl.vcf", filename); 628024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro cursor.close(); 628124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 628242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 628342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileMultiVCard() throws IOException { 628442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 628542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 628642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 628742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getCombinedUri(), "r"); 628842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 628942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String data = readToEnd(inputStream); 629042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 629142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 629242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 629342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the resulting VCard has both contacts 629442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doe;John;;;")); 629542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 629642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 629742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 629842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileSingleVCard() throws IOException { 629942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 630042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 630142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the right VCard is being created in each case 630242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 630342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 630442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri1(), "r"); 630542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 630642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 630742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 630842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 630924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 631024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(data.contains("N:Doe;John;;;")); 631124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertFalse(data.contains("N:Doh;Jane;;;")); 631242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 631342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 631442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 631542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 631642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri2(), "r"); 631742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 631842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 631942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 632042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 632142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 632242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertFalse(data.contains("N:Doe;John;;;")); 632342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 632442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 632542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 632642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 6327dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testAutoGroupMembership() { 6328dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 6329dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6330dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false /* favorite */); 6331dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, false/* favorite */); 6332dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6333dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccountTwo); 6334dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(null); 6335dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6336dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6337dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6338dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6339dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6340dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6341dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6342dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6343dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6344dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6345dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6346dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 6347dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6348dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6349dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g3, c.getLong(0)); 6350dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r2, c.getLong(1)); 6351dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6352dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6353dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6354dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6355dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6356dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6357dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testNoAutoAddMembershipAfterGroupCreation() { 6358dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6359dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6360dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount); 6361dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo); 6362dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 6363dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null); 6364dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6365dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6366dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6367dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6368dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 6369dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6370dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false/* favorite */); 6371dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6372dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6373dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6374dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6375dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6376dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // create some starred and non-starred contacts, some associated with account, some not 6377dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group created 6378dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // the starred contacts should be added to group 6379dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group removed 6380dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // no change to starred status 6381dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesMembershipAfterGroupCreation() { 6382dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6383dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6384dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6385dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo, RawContacts.STARRED, "1"); 6386dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 6387dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null, RawContacts.STARRED, "1"); 6388dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r7 = createRawContact(null); 6389dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6390dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6391dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6392dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6393dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6394dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6395dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, false /* autoAdd */, false/* favorite */); 6396dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6397dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6398dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6399dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6400dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6401dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6402dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6403dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6404dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6405dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6406dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6407dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6408dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6409dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6410dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6411dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6412dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6413dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6414dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6415dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6416dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6417dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6418dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6419dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(RawContacts.CONTENT_URI, r6, 6420dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_NAME, mAccount.name, 6421dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_TYPE, mAccount.type); 6422dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6423dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6424dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6425dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6426dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6427dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6428dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6429dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6430dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6431dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6432dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6433dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r6, c.getLong(1)); 6434dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6435dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6436dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6437dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6438dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6439dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(ContentUris.withAppendedId(Groups.CONTENT_URI, g1), null, null); 6440dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6441dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6442dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6443dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6444dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6445dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6446dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6447dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6448dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6449dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6450dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6451dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6452dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6453dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesGroupMembershipChangeAfterStarChange() { 6454dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6455dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6456dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6457dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6458dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6459dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6460dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6461dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6462dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6463dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6464dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6465dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6466dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6467dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6468dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6469dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6470dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6471dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6472dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6473dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6474dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6475dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6476dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6477dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6478dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6479dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6480dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred 6481dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "1")); 6482dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6483dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6484dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6485dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6486dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6487dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6488dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6489dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6490dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6491dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6492dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6493dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6494dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6495dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6496dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6497dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6498dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6499dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6500dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6501dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6502e3e79030101447da07547647bad225686eb9b8dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(r1)); 6503dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNotNull(contactUri); 6504dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6505dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred via its contact lookup uri 6506dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(contactUri, Contacts.STARRED, "1")); 6507dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6508dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6509dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6510dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6511dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6512dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6513dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6514dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6515dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6516dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6517dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6518dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6519dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6520dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6521dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6522dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(contactUri, Contacts.STARRED, "0"); 6523dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6524dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6525dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6526dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6527dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6528dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testStarChangedAfterGroupMembershipChange() { 6529dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6530dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6531dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6532dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6533dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6534dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6535dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6536dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6537dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6538dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6539dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6540dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6541dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c; 6542dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6543dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r1 to one favorites group 6544dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should automatically be set 6545dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1 should automatically be added to the other favorites group 6546dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir1g1 = insertGroupMembership(r1, g1); 6547dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6548dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6549dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6550dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6551dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6552dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6553dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6554dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6555dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6556dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6557dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6558dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6559dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6560dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6561dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r1 from one favorites group 6562dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir1g1, null, null); 6563dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should no longer be set 6564dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6565dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6566dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6567dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // there should be no membership rows 6568dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6569dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6570dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6571dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r3 to the one favorites group for that account 6572dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be set 6573dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir3g4 = insertGroupMembership(r3, g4); 6574dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6575dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6576dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6577dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6578dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 6579dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6580dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6581dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g4, c.getLong(0)); 6582dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6583dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6584dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6585dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6586dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6587dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6588dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r3 from the favorites group 6589dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir3g4, null, null); 6590dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be cleared 6591dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6592dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6593dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6594dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6595dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6596dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6597dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 659897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyRawContact() { 659997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 660097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 660197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 660297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 660397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 660497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "second"); 660597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 660697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 660797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = rawContactUri.buildUpon() 660897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 660997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 661097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, RawContacts.CUSTOM_RINGTONE, "third"); 661197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "third"); 661297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 661397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 661497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyDataRow() { 661597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 661697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "email"); 661797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "555-1111"); 661897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 661997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Data.IS_READ_ONLY, "1"); 662097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Email.ADDRESS, "changed"); 662197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(phoneUri, Phone.NUMBER, "555-2222"); 662297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "email"); 662397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(phoneUri, Phone.NUMBER, "555-2222"); 662497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 662597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = emailUri.buildUpon() 662697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 662797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 662897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, Email.ADDRESS, "changed"); 662997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "changed"); 663097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 663197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 663297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testContactWithReadOnlyRawContact() { 663397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId1 = createRawContact(); 663497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 663597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "first"); 663697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 663797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId2 = createRawContact(); 663897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 663997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 664097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 664197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 664297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 664397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov rawContactId1, rawContactId2); 664497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 664597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long contactId = queryContactId(rawContactId1); 664697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 664797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 664897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 664997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 665097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "rt"); 665197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 665297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 665397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 66547a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameParsingQuery() { 66557a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 66567a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr.").build(); 66577a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 66587a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 66597a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr."); 666017a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr."); 66617a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 66627a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 66637a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 66647a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 66657a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 66667a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 66677a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 66687a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 66697a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 66707a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 66717a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameConcatenationQuery() { 66727a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 66737a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.PREFIX, "Mr") 66747a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.GIVEN_NAME, "John") 66757a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.MIDDLE_NAME, "Q.") 66767a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.FAMILY_NAME, "Doe") 66777a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.SUFFIX, "Jr.") 66787a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .build(); 66797a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 66807a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 668155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr John Q. Doe, Jr."); 66827a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 66837a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 66847a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 66857a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 66867a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 66877a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 66887a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 66897a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 66907a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 66917a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 66927a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 6693084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki public void testBuildSingleRowResult() { 6694084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 6695084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"b"}, 6696084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 6697084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 6698084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {2} 6699084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 6700084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6701084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 6702084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"b", "a", "b"}, 6703084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 6704084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 6705084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {2, 1, 2} 6706084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 6707084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6708084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 6709084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki null, // all columns 6710084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 6711084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 6712084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2} 6713084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 6714084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6715084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki try { 6716084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki // Access non-existent column 6717084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ContactsProvider2.buildSingleRowResult(new String[] {"a"}, new String[] {"b"}, 6718084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Object[] {1}); 6719084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki fail(); 6720084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } catch (IllegalArgumentException expected) { 6721084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6722084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6723084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6724084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki private void checkBuildSingleRowResult(String[] projection, String[] availableColumns, 6725084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki Object[] data, Integer[] expectedValues) { 6726084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki final Cursor c = ContactsProvider2.buildSingleRowResult(projection, availableColumns, data); 6727084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki try { 6728084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertTrue(c.moveToFirst()); 6729084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals(1, c.getCount()); 6730084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals(expectedValues.length, c.getColumnCount()); 6731084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6732084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki for (int i = 0; i < expectedValues.length; i++) { 6733084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals("column " + i, expectedValues[i], (Integer) c.getInt(i)); 6734084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6735084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } finally { 6736084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki c.close(); 6737084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6738084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 6739084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 6740dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki public void testDataUsageFeedbackAndDelete() { 6741dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6742dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.install(); 6743dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6744dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long startTime = sMockClock.currentTimeMillis(); 6745dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6746dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid1 = createRawContactWithName("contact", "a"); 6747dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did1a = ContentUris.parseId(insertEmail(rid1, "email_1_a@email.com")); 6748dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did1b = ContentUris.parseId(insertEmail(rid1, "email_1_b@email.com")); 6749dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did1p = ContentUris.parseId(insertPhoneNumber(rid1, "555-555-5555")); 6750dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6751dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid2 = createRawContactWithName("contact", "b"); 6752dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did2a = ContentUris.parseId(insertEmail(rid2, "email_2_a@email.com")); 6753dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did2p = ContentUris.parseId(insertPhoneNumber(rid2, "555-555-5556")); 6754dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6755dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Aggregate 1 and 2 6756dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, rid1, rid2); 6757dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6758dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid3 = createRawContactWithName("contact", "c"); 6759dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did3a = ContentUris.parseId(insertEmail(rid3, "email_3@email.com")); 6760dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did3p = ContentUris.parseId(insertPhoneNumber(rid3, "555-3333")); 6761dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6762dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid4 = createRawContactWithName("contact", "d"); 6763dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did4p = ContentUris.parseId(insertPhoneNumber(rid4, "555-4444")); 6764dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6765dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long cid1 = queryContactId(rid1); 6766dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long cid3 = queryContactId(rid3); 6767dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long cid4 = queryContactId(rid4); 6768dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6769dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Make sure 1+2, 3 and 4 aren't aggregated 6770dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(cid1, cid3); 6771dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(cid1, cid4); 6772dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(cid3, cid4); 6773dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6774dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime 6775dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6776a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // First, there's no frequent. (We use strequent here only because frequent is hidden 6777a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // and may be removed someday.) 6778a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_STREQUENT_URI, null, null); 6779a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6780dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 1. touch data 1a 6781dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a); 6782a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6783dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Now, there's a single frequent. (contact 1) 6784a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(1, Contacts.CONTENT_STREQUENT_URI, null, null); 6785a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6786dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime + 1 6787dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.advance(); 6788dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6789dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 2. touch data 1a, 2a and 3a 6790dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a, did2a, did3a); 6791dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6792dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Now, contact 1 and 3 are in frequent. 6793dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertRowCount(2, Contacts.CONTENT_STREQUENT_URI, null, null); 6794dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6795dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime + 2 6796dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.advance(); 6797dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6798dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 2. touch data 2p (call) 6799dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did2p); 6800dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6801dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // There're still two frequent. 6802dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertRowCount(2, Contacts.CONTENT_STREQUENT_URI, null, null); 6803dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6804dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime + 3 6805dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.advance(); 6806dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6807dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 3. touch data 2p and 3p (short text) 6808dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, did2p, did3p); 6809dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6810dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Let's check the tables. 6811dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6812dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Fist, check the data_usage_stat table, which has no public URI. 6813dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesDb("SELECT " + DataUsageStatColumns.DATA_ID + 6814dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki "," + DataUsageStatColumns.USAGE_TYPE_INT + 6815dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki "," + DataUsageStatColumns.TIMES_USED + 6816dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki "," + DataUsageStatColumns.LAST_TIME_USED + 6817dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki " FROM " + Tables.DATA_USAGE_STAT, null, 6818dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did1a, 6819dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 6820dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT, 6821dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 2, 6822dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 1 6823dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6824dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did2a, 6825dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 6826dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT, 6827dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 6828dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 1 6829dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6830dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did3a, 6831dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 6832dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT, 6833dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 6834dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 1 6835dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6836dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did2p, 6837dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 6838dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_CALL, 6839dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 6840dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 2 6841dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6842dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did2p, 6843dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 6844dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_SHORT_TEXT, 6845dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 6846dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 3 6847dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6848dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did3p, 6849dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 6850dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_SHORT_TEXT, 6851dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 6852dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 3 6853dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 6854dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 6855dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6856dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Next, check the raw_contacts table 6857dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesWithProjection(RawContacts.CONTENT_URI, 6858dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid1, 6859dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 2, 6860dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, startTime + 1 6861dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6862dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid2, 6863dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 3, 6864dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, startTime + 3 6865dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6866dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid3, 6867dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 2, 6868dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, startTime + 3 6869dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6870dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid4, 6871dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 0, 6872dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, null // 4 wasn't touched. 6873dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 6874dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 6875dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6876dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Lastly, check the contacts table. 6877dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6878dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Note contact1.TIMES_CONTACTED = 4, even though raw_contact1.TIMES_CONTACTED + 6879dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // raw_contact1.TIMES_CONTACTED = 5, because in test 2, data 1a and data 2a were touched 6880dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // at once. 6881dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesWithProjection(Contacts.CONTENT_URI, 6882dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(Contacts._ID, cid1, 6883dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.TIMES_CONTACTED, 4, 6884dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.LAST_TIME_CONTACTED, startTime + 3 6885dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6886dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(Contacts._ID, cid3, 6887dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.TIMES_CONTACTED, 2, 6888dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.LAST_TIME_CONTACTED, startTime + 3 6889dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 6890dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(Contacts._ID, cid4, 6891dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.TIMES_CONTACTED, 0, 6892dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.LAST_TIME_CONTACTED, 0 // For contacts, the default is 0, not null. 6893dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 6894dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 6895a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6896dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Let's test the delete too. 6897b6186821548995dce533ee502e82e9abf4c0aadcMakoto Onuki assertTrue(mResolver.delete(DataUsageFeedback.DELETE_USAGE_URI, null, null) > 0); 6898a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6899a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // Now there's no frequent. 6900a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_STREQUENT_URI, null, null); 6901a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6902dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // No rows in the stats table. 6903dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesDb("SELECT " + DataUsageStatColumns.DATA_ID + 6904dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki " FROM " + Tables.DATA_USAGE_STAT, null, 6905dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki new ContentValues[0]); 6906dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 6907a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // The following values should all be 0 or null. 6908a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_URI, Contacts.TIMES_CONTACTED + ">0", null); 6909a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_URI, Contacts.LAST_TIME_CONTACTED + ">0", null); 6910a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, RawContacts.CONTENT_URI, RawContacts.TIMES_CONTACTED + ">0", null); 6911a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, RawContacts.CONTENT_URI, RawContacts.LAST_TIME_CONTACTED + ">0", null); 6912a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6913a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // Calling it when there's no usage stats will still return a positive value. 6914b6186821548995dce533ee502e82e9abf4c0aadcMakoto Onuki assertTrue(mResolver.delete(DataUsageFeedback.DELETE_USAGE_URI, null, null) > 0); 6915a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki } 6916a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 6917dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana private Cursor queryGroupMemberships(Account account) { 6918dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = mResolver.query(maybeAddAccountQueryParameters(Data.CONTENT_URI, account), 6919dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana new String[]{GroupMembership.GROUP_ROW_ID, GroupMembership.RAW_CONTACT_ID}, 6920dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Data.MIMETYPE + "=?", new String[]{GroupMembership.CONTENT_ITEM_TYPE}, 6921dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana GroupMembership.GROUP_SOURCE_ID); 6922dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return c; 6923dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6924dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 692542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String readToEnd(FileInputStream inputStream) { 692642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann try { 6927bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("DECLARED INPUT STREAM LENGTH: " + inputStream.available()); 692842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann int ch; 692942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann StringBuilder stringBuilder = new StringBuilder(); 6930bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov int index = 0; 6931bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov while (true) { 6932bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov ch = inputStream.read(); 6933bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("READ CHARACTER: " + index + " " + ch); 6934bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov if (ch == -1) { 6935bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov break; 6936bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 693742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann stringBuilder.append((char)ch); 6938bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov index++; 6939bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 694042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return stringBuilder.toString(); 694142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } catch (IOException e) { 694242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return null; 694342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 694442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 694542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 6946f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertQueryParameter(String uriString, String parameter, String expectedValue) { 6947f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.getQueryParameter( 6948f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter)); 6949f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6950f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 69514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private long createContact(ContentValues values, String firstName, String givenName, 69524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 6953aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 695424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createContact(values, firstName, givenName, phoneNumber, email, presenceStatus, 695524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, false); 695624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 695724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 695824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createContact(ContentValues values, String firstName, String givenName, 695924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 696024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 696148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return queryContactId(createRawContact(values, firstName, givenName, phoneNumber, email, 696224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro presenceStatus, timesContacted, starred, groupId, chatMode, isUserProfile)); 696348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 696448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 696548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String firstName, String givenName, 696648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 6967aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 696848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 6969aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori timesContacted, starred, groupId, chatMode); 697048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov insertStructuredName(rawContactId, firstName, givenName); 697148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 697248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 697348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 697424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String firstName, String givenName, 697524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 697624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 697724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 697824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, isUserProfile); 697924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertStructuredName(rawContactId, firstName, givenName); 698024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return rawContactId; 698124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 698224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 698348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String phoneNumber, String email, 6984aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori int presenceStatus, int timesContacted, int starred, long groupId, int chatMode) { 698524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createRawContact(values, phoneNumber, email, presenceStatus, timesContacted, starred, 698624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro groupId, chatMode, false); 698724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 698824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 698924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String phoneNumber, String email, 699024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro int presenceStatus, int timesContacted, int starred, long groupId, int chatMode, 699124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro boolean isUserProfile) { 69924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, starred); 69934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 69944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "beethoven5"); 69954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, timesContacted); 699624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 699724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri insertionUri = isUserProfile 699824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ? Profile.CONTENT_RAW_CONTACTS_URI 699924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro : RawContacts.CONTENT_URI; 700024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri rawContactUri = mResolver.insert(insertionUri, values); 70014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 70024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 70034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 70044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.PHOTO_ID, photoId); 70059dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(phoneNumber)) { 70069dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId, phoneNumber); 70079dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 70089dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(email)) { 70099dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertEmail(rawContactId, email); 70109dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 70114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 7012aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, email, presenceStatus, "hacking", 70135d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro chatMode, isUserProfile); 70144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 70154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov if (groupId != 0) { 70164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertGroupMembership(rawContactId, groupId); 70174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 701824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 701948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 70204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 70214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 702224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 702324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values under the user's profile. 702424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param profileValues Values to be used to create the entry (common values will be 702524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 702624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 702724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 702824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicProfileContact(ContentValues profileValues) { 702924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createRawContact(profileValues, "Mia", "Prophyl", 703024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18005554411", "mia.prophyl@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 703124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, true); 703224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.put(Contacts.DISPLAY_NAME, "Mia Prophyl"); 703324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return profileRawContactId; 703424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 703524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 703624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 703724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values that is not under the user's profile. 703824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param nonProfileValues Values to be used to create the entry (common values will be 703924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 704024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 704124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 704224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicNonProfileContact(ContentValues nonProfileValues) { 704324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createRawContact(nonProfileValues, "John", "Doe", 704424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 704524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 704624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nonProfileValues.put(Contacts.DISPLAY_NAME, "John Doe"); 704724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return nonProfileRawContactId; 704824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 704924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 70504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private void putDataValues(ContentValues values, long rawContactId) { 70514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 70524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 70534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 70544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 70554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 70564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA1, "one"); 70574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA2, "two"); 70584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA3, "three"); 70594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA4, "four"); 70604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA5, "five"); 70614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA6, "six"); 70624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA7, "seven"); 70634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA8, "eight"); 70644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA9, "nine"); 70654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA10, "ten"); 70664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA11, "eleven"); 70674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA12, "twelve"); 70684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA13, "thirteen"); 70694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA14, "fourteen"); 70704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA15, "fifteen"); 70714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC1, "sync1"); 70724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC2, "sync2"); 70734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC3, "sync3"); 70744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC4, "sync4"); 70754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 70764928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 70774928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa /** 70784928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param data1 email address or phone number 70794928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param usageType One of {@link DataUsageFeedback#USAGE_TYPE} 70804928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param values ContentValues for this feedback. Useful for incrementing 70814928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * {Contacts#TIMES_CONTACTED} in the ContentValue. Can be null. 70824928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa */ 70834928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa private void sendFeedback(String data1, String usageType, ContentValues values) { 70844928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final long dataId = getStoredLongValue(Data.CONTENT_URI, 70854928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa Data.DATA1 + "=?", new String[] { data1 }, Data._ID); 7086dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(0, updateDataUsageFeedback(usageType, dataId)); 70874928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa if (values != null && values.containsKey(Contacts.TIMES_CONTACTED)) { 70884928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa values.put(Contacts.TIMES_CONTACTED, values.getAsInteger(Contacts.TIMES_CONTACTED) + 1); 70894928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 70904928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 7091dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7092dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki private int updateDataUsageFeedback(String usageType, long... ids) { 7093dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final StringBuilder idList = new StringBuilder(); 7094dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki for (long id : ids) { 7095dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki if (idList.length() > 0) idList.append(","); 7096dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki idList.append(id); 7097dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki } 7098dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki return mResolver.update(DataUsageFeedback.FEEDBACK_URI.buildUpon() 7099dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki .appendPath(idList.toString()) 7100dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, usageType) 7101dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki .build(), new ContentValues(), null, null); 7102dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki } 7103d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov} 7104