ContactsProvider2Test.java revision 0f4b7a9bfe4b2079a7c5bb22b4114b5672639b05
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 2170d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wongimport android.accounts.Account; 22d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderOperation; 23d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderResult; 24d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentUris; 25d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentValues; 269261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.content.Entity; 2733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.content.EntityIterator; 2842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport android.content.res.AssetFileDescriptor; 29d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.database.Cursor; 30d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.net.Uri; 31c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoroimport android.os.AsyncTask; 32c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract; 33d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 34e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Callable; 358f8b122c7556350d94c2e349b3093024b0205d8dYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Contactables;; 36dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 37dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 38dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 39dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 40dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 41dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 42e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.SipAddress; 43dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 44dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 45ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikovimport android.provider.ContactsContract.ContactCounts; 46c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 479261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.Data; 4846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback; 49dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.Directory; 505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.DisplayNameSources; 51f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.DisplayPhoto; 527a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 533cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.PhoneLookup; 555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.PhoneticNameStyle; 5624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport android.provider.ContactsContract.Profile; 5709c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus; 5833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 5962318e1ea8306142a10526534b7d83560ecf5b3aFred Quintanaimport android.provider.ContactsContract.RawContactsEntity; 60916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikovimport android.provider.ContactsContract.SearchSnippetColumns; 6189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikovimport android.provider.ContactsContract.Settings; 6282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItemPhotos; 64f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.StreamItems; 65dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.OpenableColumns; 667d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekhimport android.test.MoreAsserts; 67d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 68f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.text.TextUtils; 6938210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki 7038210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.internal.util.ArrayUtils; 71a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Leeimport com.android.providers.contacts.ContactsDatabaseHelper; 7238210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.AggregationExceptionColumns; 73a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shraunerimport com.android.providers.contacts.ContactsDatabaseHelper.ContactsColumns; 7438210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.DataUsageStatColumns; 7538210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.DbProperties; 7638210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns; 77a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shraunerimport com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns; 7838210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.Tables; 7938210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.tests.R; 8038210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.google.android.collect.Lists; 8138210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.google.android.collect.Sets; 82d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 8342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.FileInputStream; 8442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.IOException; 85f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport java.io.OutputStream; 865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.text.Collator; 873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.ArrayList; 885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Arrays; 893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.List; 905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 919ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onukiimport java.util.Set; 925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 93d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/** 94d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}. 95d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 96d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Run the test like this: 97d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * <code> 9823ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki adb shell am instrument -e class com.android.providers.contacts.ContactsProvider2Test -w \ 9923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 100d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * </code> 101d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 102d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov@LargeTest 103d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovpublic class ContactsProvider2Test extends BaseContactsProvider2Test { 104d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 10547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_1 = new Account("account_name_1", "account_type_1"); 10647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_2 = new Account("account_name_2", "account_type_2"); 10747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov 108dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsProjection() { 109dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_URI, new String[]{ 110dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 111dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 112dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 113dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 114dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 115dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 116dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 117dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 118a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_PRIMARY, 119a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 120a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 121a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 122dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 123dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 124dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 125dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 126dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 127f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1283d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1293d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 130dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 131dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 132dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 13324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 134dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 135dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 136dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 137dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 138dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 139dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 140dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 141dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 142dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 143dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 144dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 145dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 14663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki public void testContactsStrequentProjection() { 14763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertProjection(Contacts.CONTENT_STREQUENT_URI, new String[]{ 14863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts._ID, 14963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_PRIMARY, 15063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_ALTERNATIVE, 15163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_SOURCE, 15263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME, 15363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME_STYLE, 15463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_PRIMARY, 15563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_ALTERNATIVE, 156a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_PRIMARY, 157a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 158a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 159a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 16063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LAST_TIME_CONTACTED, 16163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.TIMES_CONTACTED, 16263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.STARRED, 16363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IN_VISIBLE_GROUP, 16463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_ID, 16563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_FILE_ID, 16663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_URI, 16763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_THUMBNAIL_URI, 16863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CUSTOM_RINGTONE, 16963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.HAS_PHONE_NUMBER, 17063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SEND_TO_VOICEMAIL, 17163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IS_USER_PROFILE, 17263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LOOKUP_KEY, 17363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.NAME_RAW_CONTACT_ID, 17463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_PRESENCE, 17563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_CHAT_CAPABILITY, 17663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS, 17763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_TIMESTAMP, 17863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_RES_PACKAGE, 17963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_LABEL, 18063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_ICON, 18163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.TIMES_USED, 18263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, 18363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki }); 18463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 18563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 18663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki public void testContactsStrequentPhoneOnlyProjection() { 18763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertProjection(Contacts.CONTENT_STREQUENT_URI.buildUpon() 18863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true").build(), 18963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki new String[] { 19063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts._ID, 19163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_PRIMARY, 19263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_ALTERNATIVE, 19363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.DISPLAY_NAME_SOURCE, 19463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME, 19563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHONETIC_NAME_STYLE, 19663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_PRIMARY, 19763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SORT_KEY_ALTERNATIVE, 198a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_PRIMARY, 199a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 200a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 201a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 20263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LAST_TIME_CONTACTED, 20363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.TIMES_CONTACTED, 20463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.STARRED, 20563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IN_VISIBLE_GROUP, 20663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_ID, 20763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_FILE_ID, 20863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_URI, 20963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.PHOTO_THUMBNAIL_URI, 21063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CUSTOM_RINGTONE, 21163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.HAS_PHONE_NUMBER, 21263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.SEND_TO_VOICEMAIL, 21363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.IS_USER_PROFILE, 21463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.LOOKUP_KEY, 21563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.NAME_RAW_CONTACT_ID, 21663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_PRESENCE, 21763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_CHAT_CAPABILITY, 21863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS, 21963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_TIMESTAMP, 22063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_RES_PACKAGE, 22163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_LABEL, 22263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Contacts.CONTACT_STATUS_ICON, 22363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.TIMES_USED, 22463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, 22563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Phone.NUMBER, 22663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Phone.TYPE, 22763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Phone.LABEL, 22863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki }); 22963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 23063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 231dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsWithSnippetProjection() { 232dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_FILTER_URI.buildUpon().appendPath("nothing").build(), 233dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 234dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 235dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 236dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 237dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 238dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 239dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 240dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 241dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 242a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_PRIMARY, 243a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 244a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 245a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 246dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 247dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 248dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 249dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 250dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 251f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 2523d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 2533d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 254dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 255dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 256dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 25724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 258dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 259dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 260dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 261dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 262dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 263dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 264dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 265dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 266dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 267dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 26830cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov SearchSnippetColumns.SNIPPET, 269dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 270dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 271dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 272dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawContactsProjection() { 273dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContacts.CONTENT_URI, new String[]{ 274dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 275dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 276dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 277dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 27843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 27943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 280dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 281dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 28224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 283dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 284dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 285dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 286dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE, 287dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 288dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME, 289dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE, 290dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 291dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_PRIMARY, 292dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE, 293a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner RawContactsColumns.PHONEBOOK_LABEL_PRIMARY, 294a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner RawContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 295a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner RawContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 296a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner RawContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 297dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.TIMES_CONTACTED, 298dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.LAST_TIME_CONTACTED, 299dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CUSTOM_RINGTONE, 300dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL, 301dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 302dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.AGGREGATION_MODE, 303dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 304dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 305dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 306dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 307dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 308dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 309dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 310dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDataProjection() { 311dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Data.CONTENT_URI, new String[]{ 312dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 313dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RAW_CONTACT_ID, 314dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 315dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 316dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 317dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 318dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 319dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 320dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 321dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 322dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 323dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 324dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 325dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 326dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 327dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 328dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 329dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 330dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 331dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 332dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 333dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 334dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 335dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 336dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 337dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 338dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 339dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 340dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 341dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 342dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 343dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 344dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 345dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 346dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 347dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 34843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 34943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 350dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 351dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 352dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 353dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 35424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 355dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 356dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 357dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 358dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 359dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 360dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 361dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 362dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 363a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_PRIMARY, 364a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 365a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 366a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 367dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 368dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 369dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 370dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 371dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 372f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 3733d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 3743d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 375dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 376dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 377dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 378dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 379cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 380dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 381dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 382dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 383dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 384dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 385dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 386dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 387dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 388dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 389dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 390dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 391dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDistinctDataProjection() { 392dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Phone.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 393dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 394dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 395dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 396dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 397dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 398dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 399dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 400dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 401dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 402dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 403dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 404dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 405dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 406dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 407dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 408dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 409dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 410dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 411dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 412dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 413dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 414dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 415dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 416dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 417dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 418dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 419dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 420dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 421dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 422dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 423dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 424dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 425dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 426dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 42724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 428dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 429dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 430dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 431dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 432dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 433dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 434dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 435dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 436a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_PRIMARY, 437a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 438a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 439a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 440dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 441dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 442dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 443dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 444dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 445f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 4463d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 4473d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 448cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 449dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 450dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 451dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 452dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 453dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 454dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 455dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 456dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 457dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 458dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 459dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 460dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 461dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 462dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 463a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testEntityProjection() { 464a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertProjection( 465a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 0), 466a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.CONTENT_DIRECTORY), 467a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov new String[]{ 468a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity._ID, 469a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.DATA_ID, 470a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID, 471a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA_VERSION, 472a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_PRIMARY, 473a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_SUPER_PRIMARY, 474a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.RES_PACKAGE, 475a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.MIMETYPE, 476a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA1, 477a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA2, 478a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA3, 479a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA4, 480a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA5, 481a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA6, 482a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA7, 483a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA8, 484a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA9, 485a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA10, 486a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA11, 487a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA12, 488a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA13, 489a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA14, 490a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA15, 491a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC1, 492a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC2, 493a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC3, 494a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC4, 495a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CONTACT_ID, 496a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.PRESENCE, 497a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CHAT_CAPABILITY, 498a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS, 499a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_TIMESTAMP, 500a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_RES_PACKAGE, 501a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_LABEL, 502a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_ICON, 503a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_NAME, 504a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_TYPE, 50543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 50643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 507a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SOURCE_ID, 508a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.VERSION, 509a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DELETED, 510a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DIRTY, 511a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.NAME_VERIFIED, 512a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC1, 513a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC2, 514a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC3, 515a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC4, 516a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts._ID, 517a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 518a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 519a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 520a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME, 521a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 522a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 523a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 524a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_PRIMARY, 525a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_PRIMARY, 526a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, 527a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE, 528a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 529a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.TIMES_CONTACTED, 530a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.STARRED, 531a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 532a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHOTO_ID, 533f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 5343d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 5353d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 536a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CUSTOM_RINGTONE, 537a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 53824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 539a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LOOKUP_KEY, 540a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 541cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 542a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_PRESENCE, 543a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 544a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS, 545a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 546a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 547a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 548a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 549a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 550a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov }); 551a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 552a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 553dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawEntityProjection() { 554dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContactsEntity.CONTENT_URI, new String[]{ 555dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.Entity.DATA_ID, 556dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 557dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 558dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 559dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 56043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 56143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 562dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 563dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 564dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 565dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 566dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 567dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 568dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 569dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 570dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 571dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 57224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 573dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 574dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 575dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 576dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 577dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 578dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 579dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 580dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 581dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 582dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 583dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 584dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 585dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 586dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 587dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 588dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 589dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 590dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 591dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 592dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 593dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 594dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 595dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 596dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 597dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 598dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 599dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 600dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 601dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testPhoneLookupProjection() { 602dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(PhoneLookup.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 603dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 604dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup._ID, 605dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LOOKUP_KEY, 606dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.DISPLAY_NAME, 607dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LAST_TIME_CONTACTED, 608dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TIMES_CONTACTED, 609dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.STARRED, 610dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.IN_VISIBLE_GROUP, 611dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.PHOTO_ID, 6123d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_URI, 6133d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_THUMBNAIL_URI, 614dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.CUSTOM_RINGTONE, 615dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.HAS_PHONE_NUMBER, 616dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.SEND_TO_VOICEMAIL, 617dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.NUMBER, 618dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TYPE, 619dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LABEL, 6202530512f639c4979fd7371c7dd25dd67e8118124Bai Tao PhoneLookup.NORMALIZED_NUMBER, 621dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 622dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 623dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 624dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsProjection() { 625dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_URI, new String[]{ 626dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 627dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 628dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 62943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 63043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 631dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 632dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 633dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 634dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 635dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 636dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 637dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 638dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 639dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 640dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 641dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 642dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 643dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 644c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 645dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 646dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 647dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 648dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 649dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 650dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 651dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 652dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsSummaryProjection() { 653dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_SUMMARY_URI, new String[]{ 654dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 655dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 656dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 65743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 65843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 659dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 660dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 661dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 662dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 663dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 664dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 665dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 666dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 667dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 668dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 669dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 670dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 671dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 672c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 673dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 674dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 675dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 676dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 677dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_COUNT, 678dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_WITH_PHONES, 67918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 680dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 681dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 682dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 683dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testAggregateExceptionProjection() { 684dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(AggregationExceptions.CONTENT_URI, new String[]{ 685dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptionColumns._ID, 686dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.TYPE, 687dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1, 688dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2, 689dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 690dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 691dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 692dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testSettingsProjection() { 693dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Settings.CONTENT_URI, new String[]{ 694dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_NAME, 695dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_TYPE, 696f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Settings.DATA_SET, 697dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_VISIBLE, 698dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.SHOULD_SYNC, 699dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ANY_UNSYNCED, 700dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_COUNT, 701dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_WITH_PHONES, 702dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 703dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 704dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 705dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testStatusUpdatesProjection() { 706dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(StatusUpdates.CONTENT_URI, new String[]{ 707dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID, 708dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.DATA_ID, 709dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_ACCOUNT, 710dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_HANDLE, 711dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PROTOCOL, 712dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL, 713dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PRESENCE, 714dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CHAT_CAPABILITY, 715dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS, 716dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP, 717dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE, 718dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_ICON, 719dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_LABEL, 720dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 721dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 722dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 723dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDirectoryProjection() { 724dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Directory.CONTENT_URI, new String[]{ 725dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory._ID, 726dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.PACKAGE_NAME, 727dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.TYPE_RESOURCE_ID, 728dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DISPLAY_NAME, 729dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DIRECTORY_AUTHORITY, 730dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_TYPE, 731dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_NAME, 732dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.EXPORT_SUPPORT, 733778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.SHORTCUT_SUPPORT, 734778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.PHOTO_SUPPORT, 735dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 736dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 737dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 7383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testRawContactsInsert() { 7393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 7403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_NAME, "a"); 7423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_TYPE, "b"); 7439d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki values.put(RawContacts.DATA_SET, "ds"); 7443cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SOURCE_ID, "c"); 7453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.VERSION, 42); 7463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DIRTY, 1); 7473cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DELETED, 1); 7483cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED); 7493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 7503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 7513cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 7523cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 7533cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC1, "e"); 7543cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC2, "f"); 7553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC3, "g"); 7563cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC4, "h"); 7573cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7583cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values); 7594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rowUri); 7603cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7613cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 7624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(RawContacts.CONTENT_URI, values, RawContacts._ID, rawContactId); 76381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 7643cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 7653cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 7662149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov public void testDataDirectoryWithLookupUri() { 7672149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov ContentValues values = new ContentValues(); 7682149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7692149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long rawContactId = createRawContactWithName(); 7702149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertPhoneNumber(rawContactId, "555-GOOG-411"); 7712149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertEmail(rawContactId, "google@android.com"); 7722149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7732149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long contactId = queryContactId(rawContactId); 7742149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 7752149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7762149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete and valid lookup URI 7772149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 7782149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 7792149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7802149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 7812149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7822149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete but stale lookup URI 7832149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 7842149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 7852149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 7862149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7872149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Incomplete lookup URI (lookup key only, no contact ID) 7882149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, 7892149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupKey), Contacts.Data.CONTENT_DIRECTORY); 7902149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 7912149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 7922149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 7932149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov private void assertDataRows(Uri dataUri, ContentValues values) { 7942149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Cursor cursor = mResolver.query(dataUri, new String[]{ Data.DATA1 }, null, null, Data._ID); 7952149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertEquals(3, cursor.getCount()); 7962149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToFirst(); 7972149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "John Doe"); 7982149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 7992149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 8002149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 8012149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "555-GOOG-411"); 8022149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 8032149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 8042149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 8052149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "google@android.com"); 8062149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 8072149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 8082149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.close(); 8092149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 8102149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 811a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithIdBasedUri() { 812a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 813a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 814a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 815a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 816a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 817a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 818a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 8195d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 820a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 821a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 822a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 823a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 824a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 825a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 826a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 827a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 828a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY); 829a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 830a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 831a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 832a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 833a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithLookupUri() { 834a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 835a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 836a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 837a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 838a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 839a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 840a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 8415d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 842a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 843a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 844a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 845a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 846a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 847a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 848a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 849a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 850a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First try with a matching contact ID 851a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 852a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 853a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 854a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 855a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try with a contact ID mismatch 856a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 857a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 858a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 859a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 860a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try without an ID altogether 861a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey); 862a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 863a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 864a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 865a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 866a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov private void assertEntityRows(Uri entityUri, long contactId, long rawContactId1, 867a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2) { 868a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 869a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 870a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Cursor cursor = mResolver.query(entityUri, null, null, null, 871a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID + "," + Contacts.Entity.DATA_ID); 872a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEquals(3, cursor.getCount()); 873a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 874a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First row - name 875a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToFirst(); 876a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 877a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 878a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 879a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "John Doe"); 880a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 881a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 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 // Second row - IM 892a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 893a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 894a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 895a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, Im.CONTENT_ITEM_TYPE); 896a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "gtalk"); 897a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 898a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 899a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 900a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 901a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 902a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 903a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 904a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 905a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.PRESENCE, StatusUpdates.IDLE); 906a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 907a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 908a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Third row - second raw contact, not data 909a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 910a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 911a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId2); 912a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.MIMETYPE); 913a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA_ID); 914a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA1); 915a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act2"); 916a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype2"); 917a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 918a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 919a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 920a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 921a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 922a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 923a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 924a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 925a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 926a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.close(); 927a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 928a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 9293cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testDataInsert() { 9304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("John", "Doe"); 9314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 9334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov putDataValues(values, rawContactId); 9344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 9354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 9364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 9384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 9394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(dataUri, values); 9404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Data.CONTENT_URI, values, Data._ID, dataId); 9424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under RawContacts 9444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 9454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactDataUri = 9464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri.withAppendedPath(rawContactUri, RawContacts.Data.CONTENT_DIRECTORY); 9474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(rawContactDataUri, values, Data._ID, dataId); 9484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under Contacts 9504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 9514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactDataUri = Uri.withAppendedPath(contactUri, Contacts.Data.CONTENT_DIRECTORY); 9524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(contactDataUri, values, Data._ID, dataId); 95381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 9544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 9553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 95689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactDataQuery() { 95789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 95889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 95989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 96089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri1 = insertStructuredName(rawContactId1, "John", "Doe"); 96189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 96289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri2 = insertStructuredName(rawContactId2, "Jane", "Doe"); 96389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 96489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(dataUri1, account1); 96589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(dataUri2, account2); 96689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Data._ID, ContentUris.parseId(dataUri1)) ; 96789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Data._ID, ContentUris.parseId(dataUri2)) ; 96889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 96989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 9704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesQuery() { 9717d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 9723cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 9734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 9744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 9754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 9764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 9774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 9784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 9804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 9814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 9834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertPhoneNumber(rawContactId, "18004664411"); 9844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long phoneId = ContentUris.parseId(uri); 9854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 9874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 9884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 9894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, phoneId); 9903cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 9914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 9924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 9934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 9944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 9954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 9964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 9974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 9984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 9994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 10004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 10014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 10024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 100348828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Phone.CONTENT_URI, phoneId), values); 10044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Phone.CONTENT_URI, values, Data._ID, phoneId); 10054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 10064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1007cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa public void testPhonesWithMergedContacts() { 1008cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId1 = createRawContact(); 1009cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId1, "123456789", true); 1010cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 1011cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId2 = createRawContact(); 1012cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId2, "123456789", true); 1013cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 10140992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 10150992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki rawContactId1, rawContactId2); 10160992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki assertNotAggregated(rawContactId1, rawContactId2); 10170992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki 1018cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa ContentValues values1 = new ContentValues(); 1019cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "123456789"); 1020cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1021cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Phone.NUMBER, "123456789"); 1022cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 10230992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // There are two phone numbers, so we should get two rows. 1024cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 1025cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 10260992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now set the dedupe flag. But still we should get two rows, because they're two 10270992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // different contacts. We only dedupe within each contact. 10288ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Phone.CONTENT_URI.buildUpon() 10298ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 10308ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 10318ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, new ContentValues[] {values1, values1}); 10328ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 10330992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now join them into a single contact. 1034cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 1035cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa rawContactId1, rawContactId2); 1036cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 1037cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertAggregated(rawContactId1, rawContactId2, "123456789"); 1038cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 10390992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Contact merge won't affect the default result of Phone Uri, where we don't dedupe. 10408ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 10418ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 10420992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki // Now we dedupe them. 10438ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values1); 1044cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa } 1045cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 1046904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann public void testPhonesNormalizedNumber() { 1047904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final long rawContactId = createRawContact(); 1048904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1049904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Write both a number and a normalized number. Those should be written as-is 1050904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final ContentValues values = new ContentValues(); 1051904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Data.RAW_CONTACT_ID, rawContactId); 1052904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1053904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "1234"); 1054904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "5678"); 1055904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.TYPE, Phone.TYPE_HOME); 1056904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1057904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann final Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 1058904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 105910840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki // Check the lookup table. 1060904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1061904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1234"), null, null)); 1062904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1063904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "5678"), null, null)); 1064904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 106510840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki // Check the data table. 106610840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertStoredValues(dataUri, 106710840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki cv(Phone.NUMBER, "1234", Phone.NORMALIZED_NUMBER, "5678") 106810840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki ); 106910840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 1070904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace both in an UPDATE 1071904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 1072904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NUMBER, "4321"); 1073904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "8765"); 1074904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 1075904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1076904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1234"), null, null)); 1077904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1078904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "4321"), null, null)); 1079904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1080904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "5678"), null, null)); 1081904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(1, 1082904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 1083904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 108410840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertStoredValues(dataUri, 108510840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki cv(Phone.NUMBER, "4321", Phone.NORMALIZED_NUMBER, "8765") 108610840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki ); 108710840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 1088904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace only NUMBER ==> NORMALIZED_NUMBER will be inferred (we test that by making 1089904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // sure the old manual value can not be found anymore) 1090904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 109110840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki values.put(Phone.NUMBER, "+1-800-466-5432"); 1092904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 1093904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals( 1094904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1, 109510840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "+1-800-466-5432"), null, 1096904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann null)); 1097904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1098904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 1099904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 110010840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertStoredValues(dataUri, 110110840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki cv(Phone.NUMBER, "+1-800-466-5432", Phone.NORMALIZED_NUMBER, "+18004665432") 110210840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki ); 110310840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 1104904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann // Replace only NORMALIZED_NUMBER ==> call is ignored, things will be unchanged 1105904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.clear(); 1106904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann values.put(Phone.NORMALIZED_NUMBER, "8765"); 1107904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann mResolver.update(dataUri, values, null, null); 1108904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals( 1109904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 1, 111010840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "+1-800-466-5432"), null, 1111904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann null)); 1112904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann assertEquals(0, 1113904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "8765"), null, null)); 111410840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 111510840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertStoredValues(dataUri, 111610840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki cv(Phone.NUMBER, "+1-800-466-5432", Phone.NORMALIZED_NUMBER, "+18004665432") 111710840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki ); 111810840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 111910840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki // Replace NUMBER with an "invalid" number which can't be normalized. It should clear 112010840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki // NORMALIZED_NUMBER. 112110840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 112210840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki // 1. Set 999 to NORMALIZED_NUMBER explicitly. 112310840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki values.clear(); 112410840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki values.put(Phone.NUMBER, "888"); 112510840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki values.put(Phone.NORMALIZED_NUMBER, "999"); 112610840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki mResolver.update(dataUri, values, null, null); 112710840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 112810840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertEquals(1, 112910840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "999"), null, null)); 113010840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 113110840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertStoredValues(dataUri, 113210840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki cv(Phone.NUMBER, "888", Phone.NORMALIZED_NUMBER, "999") 113310840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki ); 113410840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 113510840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki // 2. Set an invalid number to NUMBER. 113610840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki values.clear(); 113710840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki values.put(Phone.NUMBER, "1"); 113810840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki mResolver.update(dataUri, values, null, null); 113910840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 114010840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertEquals(0, 114110840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki getCount(Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "999"), null, null)); 114210840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki 114310840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki assertStoredValues(dataUri, 114410840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki cv(Phone.NUMBER, "1", Phone.NORMALIZED_NUMBER, null) 114510840c6bcd8bf0ab2e5f846d345d14e5df9858a7Makoto Onuki ); 1146904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann } 1147904f4a2addf4fdf063cb40185cb73252ff0edefdDaniel Lehmann 11484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesFilterQuery() { 1149e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Phone.CONTENT_FILTER_URI); 1150e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1151e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1152e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** 1153e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * A convenient method for {@link #testPhonesFilterQuery()} and 1154e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link #testCallablesFilterQuery()}. 1155e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 1156e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * This confirms if both URIs return identical results for phone-only contacts and 1157e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * appropriately different results for contacts with sip addresses. 1158e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 1159e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * @param baseFilterUri Either {@link Phone#CONTENT_FILTER_URI} or 1160e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link Callable#CONTENT_FILTER_URI}. 1161e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa */ 1162e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa private void testPhonesFilterQueryInter(Uri baseFilterUri) { 1163e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertTrue("Unsupported Uri (" + baseFilterUri + ")", 1164e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa Phone.CONTENT_FILTER_URI.equals(baseFilterUri) 1165e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa || Callable.CONTENT_FILTER_URI.equals(baseFilterUri)); 1166e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1167e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 11685e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId1, "1-800-466-4411"); 11695e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1170e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("Chilled", "Guacamole", ACCOUNT_2); 11712a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1-800-466-5432"); 117258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "0@example.com", false, Phone.TYPE_PAGER); 117358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "1@example.com", false, Phone.TYPE_PAGER); 11745e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1175e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri1 = Uri.withAppendedPath(baseFilterUri, "tamale"); 11764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 11774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 11784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 11795e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Phone.NUMBER, "1-800-466-4411"); 11804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 11814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 11825e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 11834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1184e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri2 = Uri.withAppendedPath(baseFilterUri, "1-800-GOOG-411"); 11855e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri2, values); 11865e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1187e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri3 = Uri.withAppendedPath(baseFilterUri, "18004664"); 11885e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri3, values); 11895e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1190e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri4 = Uri.withAppendedPath(baseFilterUri, "encilada"); 11915e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 119245d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov 1193e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri5 = Uri.withAppendedPath(baseFilterUri, "*"); 119445d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 119558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 119658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values1 = new ContentValues(); 119758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 119858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 119958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.NUMBER, "1-800-466-5432"); 120058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 120158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.putNull(Phone.LABEL); 120258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 120358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values2 = new ContentValues(); 120458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 120558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 120658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.NUMBER, "0@example.com"); 120758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.TYPE, Phone.TYPE_PAGER); 120858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.putNull(Phone.LABEL); 120958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 121058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values3 = new ContentValues(); 121158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 121258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 121358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.NUMBER, "1@example.com"); 121458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.TYPE, Phone.TYPE_PAGER); 121558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.putNull(Phone.LABEL); 121658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 1217e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri6 = Uri.withAppendedPath(baseFilterUri, "Chilled"); 1218dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng assertStoredValues(filterUri6, new ContentValues[]{values1, values2, values3}); 1219e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1220e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Insert a SIP address. From here, Phone URI and Callable URI may return different results 1221e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // than each other. 1222e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip_hot_tamale@example.com"); 1223e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip:sip_hot@example.com"); 1224e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1225e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri7 = Uri.withAppendedPath(baseFilterUri, "sip_hot"); 1226e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri8 = Uri.withAppendedPath(baseFilterUri, "sip_hot_tamale"); 1227e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa if (Callable.CONTENT_FILTER_URI.equals(baseFilterUri)) { 1228e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values4 = new ContentValues(); 1229e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1230e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1231e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(SipAddress.SIP_ADDRESS, "sip_hot_tamale@example.com"); 1232e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1233e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values5 = new ContentValues(); 1234e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1235e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1236e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(SipAddress.SIP_ADDRESS, "sip:sip_hot@example.com"); 1237e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri1, new ContentValues[] {values, values4, values5}); 1238e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1239e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri7, new ContentValues[] {values4, values5}); 1240e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri8, values4); 1241e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } else { 1242e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sip address should not affect Phone URI. 1243e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValuesWithProjection(filterUri1, values); 1244e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri7, null, null)); 1245e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1246e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1247e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sanity test. Run tests for "Chilled Guacamole" again and see nothing changes 1248e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // after the Sip address being inserted. 1249e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri2, values); 1250e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri4, null, null)); 1251e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri5, null, null)); 125258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} ); 12534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 12544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 12554c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki public void testPhonesFilterSearchParams() { 12564c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki final long rid1 = createRawContactWithName("Dad", null); 12574c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki insertPhoneNumber(rid1, "123-456-7890"); 12584c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 12594c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki final long rid2 = createRawContactWithName("Mam", null); 12604c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki insertPhoneNumber(rid2, "323-123-4567"); 12614c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 12624c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki // By default, "dad" will match both the display name and the phone number. 12634c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki // Because "dad" is "323" after the dialpad conversion, it'll match "Mam" too. 12644c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 12654c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad").build(), 12664c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890"), 12674c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567") 12684c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki ); 12694c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 12704c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad") 12714c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0") 12724c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .build(), 12734c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890") 12744c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki ); 12754c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 12764c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 12774c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad") 12784c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0") 12794c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki .build(), 12804c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567") 12814c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki ); 12824c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki assertStoredValues( 12834c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad") 1284dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0") 1285dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0") 1286dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng .build() 1287dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng ); 12884c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki } 12894c3a04572ead6ad9f0cfc20a34db3252fdb31201Makoto Onuki 1290e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public void testPhoneLookup() { 1291e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov ContentValues values = new ContentValues(); 1292e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1293e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1294e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1295e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1296e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1297e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1298e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 12994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 13004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1301ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // We'll create two lookup records, 18004664411 and +18004664411, and the below lookup 1302ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // will match both. 1303ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki 13044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1305e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1306e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.clear(); 1307e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup._ID, queryContactId(rawContactId)); 1308e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 1309e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.NUMBER, "18004664411"); 1310e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.TYPE, Phone.TYPE_HOME); 1311e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.putNull(PhoneLookup.LABEL); 1312e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.CUSTOM_RINGTONE, "d"); 1313e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.SEND_TO_VOICEMAIL, 1); 1314ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertStoredValues(lookupUri1, null, null, new ContentValues[] {values, values}); 13154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1316892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // In the context that 8004664411 is a valid number, "4664411" as a 131734984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia // call id should match to both "8004664411" and "+18004664411". 1318e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "4664411"); 131934984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia assertEquals(2, getCount(lookupUri2, null, null)); 13206db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee 13216db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee // A wrong area code 799 vs 800 should not be matched 13226db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "7994664411"); 13236db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee assertEquals(0, getCount(lookupUri2, null, null)); 1324892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1325892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1326892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void testPhoneLookupUseCases() { 1327892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues values = new ContentValues(); 1328892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri rawContactUri; 1329892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactId; 1330892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri lookupUri2; 1331892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1332892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1333892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1334892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1335892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // International format in contacts 1336892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1337892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1338892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1339892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1340892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "+1-650-861-0000"); 1341892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1342892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1343892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1344892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1345892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0000"); 1346892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1347892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1348892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1349892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0000"); 1350892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1351892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 13526db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee // does not match with wrong area code 13536db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "649 861 0000"); 13546db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee assertEquals(0, getCount(lookupUri2, null, null)); 13556db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee 13566db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee // does not match with missing digits in mistyped area code 13576db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "5 861 0000"); 13586db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee assertEquals(0, getCount(lookupUri2, null, null)); 13596db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee 13606db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee // does not match with missing digit in mistyped area code 13616db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "65 861 0000"); 13626db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee assertEquals(0, getCount(lookupUri2, null, null)); 13636db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee 1364892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // National format in contacts 1365892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1366892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1367892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1368892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1369892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1370892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1371892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot1", "Tamale"); 1372892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "650-861-0001"); 1373892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1374892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1375892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1376892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1377892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0001"); 1378892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1379892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1380892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1381892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0001"); 1382892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1383892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1384892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Local format in contacts 1385892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1386892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1387892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1388892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1389892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1390892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1391892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot2", "Tamale"); 1392892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "861-0002"); 1393892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1394892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1395892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1396892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1397892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0002"); 1398892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1399892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1400892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1401892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0002"); 1402892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 14034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 14044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 140556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testIntlPhoneLookupUseCases() { 14066db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee // Checks the logic that relies on phone_number_compare_loose(Gingerbread) as a fallback 14076db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee //for phone number lookups. 140856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String fullNumber = "01197297427289"; 140956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 141056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 141156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 141256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 141356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 141456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 141556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, fullNumber); 141656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 141756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Full number should definitely match. 141856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 141956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, fullNumber), null, null)); 142056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 142156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Shorter (local) number with 0 prefix should also match. 142256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 142356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "097427289"), null, null)); 142456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 14256db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee // Number with international (+972) prefix should also match. 14266db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee assertEquals(1, getCount(Uri.withAppendedPath( 14276db6c6d74da066cbbe3e3b5b89caf1ba5626d240Yorke Lee PhoneLookup.CONTENT_FILTER_URI, "+97297427289"), null, null)); 142856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 142956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with dashes should match. 143056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 143156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09-742-7289"), null, null)); 143256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 143356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with spaces should match. 143456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 143556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09 742 7289"), null, null)); 143656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 143756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Some other number should not match. 143856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(0, getCount(Uri.withAppendedPath( 143956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "049102395"), null, null)); 144056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 144156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 144256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testPhoneLookupB5252190() { 144356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Test cases from b/5252190 144456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String storedNumber = "796010101"; 144556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 144656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 144756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 144856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 144956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 145056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 145156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, storedNumber); 145256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 145356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 145456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "0796010101"), null, null)); 145556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 145656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 145756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "+48796010101"), null, null)); 145856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 145956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 146056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "48796010101"), null, null)); 146156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 146256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 146356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4-879-601-0101"), null, null)); 146456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 146556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 146656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4 879 601 0101"), null, null)); 146756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 146856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 1469a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee public void testPhoneLookupUseStrictPhoneNumberCompare() { 1470a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // Test lookup cases when mUseStrictPhoneNumberComparison is true 1471a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee final ContactsProvider2 cp = (ContactsProvider2) getProvider(); 1472a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee final ContactsDatabaseHelper dbHelper = cp.getThreadActiveDatabaseHelperForTest(); 1473a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // Get and save the original value of mUseStrictPhoneNumberComparison so that we 1474a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // can restore it when we are done with the test 1475a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee final boolean oldUseStrict = dbHelper.getUseStrictPhoneNumberComparisonForTest(); 1476a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee dbHelper.setUseStrictPhoneNumberComparisonForTest(true); 1477a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1478a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1479a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee try { 1480a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee String fullNumber = "01197297427289"; 1481a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee ContentValues values = new ContentValues(); 1482a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1483a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1484a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee long rawContactId = ContentUris.parseId( 1485a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee mResolver.insert(RawContacts.CONTENT_URI, values)); 1486a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee insertStructuredName(rawContactId, "Senor", "Chang"); 1487a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee insertPhoneNumber(rawContactId, fullNumber); 1488a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee insertPhoneNumber(rawContactId, "5103337596"); 1489a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee insertPhoneNumber(rawContactId, "+19012345678"); 1490a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // One match for full number 1491a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee assertEquals(1, getCount(Uri.withAppendedPath( 1492a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee PhoneLookup.CONTENT_FILTER_URI, fullNumber), null, null)); 1493a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1494a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // No matches for extra digit at the front 1495a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee assertEquals(0, getCount(Uri.withAppendedPath( 1496a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee PhoneLookup.CONTENT_FILTER_URI, "55103337596"), null, null)); 1497a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // No matches for mispelled area code 1498a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee assertEquals(0, getCount(Uri.withAppendedPath( 1499a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee PhoneLookup.CONTENT_FILTER_URI, "5123337596"), null, null)); 1500a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1501a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // One match for matching number with dashes 1502a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee assertEquals(1, getCount(Uri.withAppendedPath( 1503a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee PhoneLookup.CONTENT_FILTER_URI, "510-333-7596"), null, null)); 1504a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1505a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // One match for matching number with international code 1506a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee assertEquals(1, getCount(Uri.withAppendedPath( 1507a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee PhoneLookup.CONTENT_FILTER_URI, "+1-510-333-7596"), null, null)); 1508a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee values.clear(); 1509a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1510a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // No matches for extra 0 in front 1511a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee assertEquals(0, getCount(Uri.withAppendedPath( 1512a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee PhoneLookup.CONTENT_FILTER_URI, "0-510-333-7596"), null, null)); 1513a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee values.clear(); 1514a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1515a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // No matches for different country code 1516a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee assertEquals(0, getCount(Uri.withAppendedPath( 1517a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee PhoneLookup.CONTENT_FILTER_URI, "+819012345678"), null, null)); 1518a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee values.clear(); 1519a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee } finally { 1520a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // restore the original value of mUseStrictPhoneNumberComparison 1521a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee // upon test completion or failure 1522a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee dbHelper.setUseStrictPhoneNumberComparisonForTest(oldUseStrict); 1523a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee } 1524a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee } 1525a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffcYorke Lee 1526653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov public void testPhoneUpdate() { 1527653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov ContentValues values = new ContentValues(); 1528653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1529653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1530653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1531653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1532653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "18004664411"); 1533653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1534653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1535ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664422"); 1536ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri1, null, null)); 1537ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri2, null, null)); 1538653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1539653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1540653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1541653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1542653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1543ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1544ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 1545653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1546653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Setting number to null will remove the phone lookup record 1547653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1548653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.putNull(Phone.NUMBER); 1549653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1550653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1551ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1552653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov assertEquals(0, getCount(lookupUri2, null, null)); 1553653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1554653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Let's restore that phone lookup record 1555653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1556653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1557653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1558ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1559ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 156081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 1561653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov } 1562653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1563e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** Tests if {@link Callable#CONTENT_URI} returns both phones and sip addresses. */ 1564e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesQuery() { 1565e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId1 = createRawContactWithName("Meghan", "Knox"); 1566e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long phoneId1 = ContentUris.parseId(insertPhoneNumber(rawContactId1, "18004664411")); 1567e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId1 = queryContactId(rawContactId1); 1568e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1569e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId2 = createRawContactWithName("John", "Doe"); 1570e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long sipAddressId2 = ContentUris.parseId( 1571e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId2, "sip@example.com")); 1572e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId2 = queryContactId(rawContactId2); 1573e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1574e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values1 = new ContentValues(); 1575e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data._ID, phoneId1); 1576e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.RAW_CONTACT_ID, rawContactId1); 1577e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(RawContacts.CONTACT_ID, contactId1); 1578e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1579e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.NUMBER, "18004664411"); 1580e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 1581e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.putNull(Phone.LABEL); 1582e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 1583e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1584e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values2 = new ContentValues(); 1585e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data._ID, sipAddressId2); 1586e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.RAW_CONTACT_ID, rawContactId2); 1587e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(RawContacts.CONTACT_ID, contactId2); 1588e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1589e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(SipAddress.SIP_ADDRESS, "sip@example.com"); 1590e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "John Doe"); 1591e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1592e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(2, getCount(Callable.CONTENT_URI, null, null)); 1593e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(Callable.CONTENT_URI, new ContentValues[] { values1, values2 }); 1594e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1595e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1596e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesFilterQuery() { 1597e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Callable.CONTENT_FILTER_URI); 1598e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1599e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 16004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testEmailsQuery() { 16014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 16024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 16034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 16044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 16054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 16064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 16074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 16098ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long rawContactId = ContentUris.parseId(rawContactUri); 16104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 16128ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri = insertEmail(rawContactId, "meghan@acme.com"); 16138ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId = ContentUris.parseId(emailUri); 16144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16158ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 16164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 16174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, emailId); 16184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 16194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 16204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 16214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "meghan@acme.com"); 16224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 16234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 16244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 16254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 16264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 16274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 16284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 16294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 16304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16318ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, values); 163248828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 16334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Email.CONTENT_URI, values, Data._ID, emailId); 16348ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16358ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated email addresses. 16368ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri2 = insertEmail(rawContactId, "meghan@acme.com"); 16378ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId2 = ContentUris.parseId(emailUri2); 16388ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 16398ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, emailId2); 16408ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16418ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Email.CONTENT_URI.buildUpon() 16428ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 16438ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 16448ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16458ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 16468ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 16478ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId), values); 16488ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId2), values2); 16498ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId2), values2); 16508ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16518ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, new ContentValues[] {values, values2}); 16528ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 16538ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 16548ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 16558ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 16568ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 16574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16595e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsLookupQuery() { 16604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Hot", "Tamale"); 16614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertEmail(rawContactId, "tamale@acme.com"); 16624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16635e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "tamale@acme.com"); 16644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 16654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 16664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 16674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 16684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 16694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 16704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(filterUri1, values); 16714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 167208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "Ta<TaMale@acme.com>"); 167308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertStoredValues(filterUri2, values); 167408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 167508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "encilada@acme.com"); 167608768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertEquals(0, getCount(filterUri3, null, null)); 16774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16795e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsFilterQuery() { 168047fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 16815e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 16825e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 16835e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 168447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("Hot", "Tamale", ACCOUNT_2); 16855e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId2, "tamale@acme.com"); 16865e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 16875e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tam"); 16885e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov ContentValues values = new ContentValues(); 16895e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 16905e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 16915e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 16925e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 16935e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.putNull(Email.LABEL); 16945e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 16955e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 16965e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot"); 16975e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri2, values); 16985e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1699155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot tamale"); 17005e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri3, values); 17015e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 17021e530df9f7e496dc47f77d4323c89bd413b79b64Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tamale@acme"); 17035e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri4, values); 17045e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 17055e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri5 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "encilada"); 17065e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 17075e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov } 17085e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 17097d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa /** 1710c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns addresses according to registration order. 1711c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1712c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterDefaultSortOrder() { 1713c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1714c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1715c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com"); 1716c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address3@email.com"); 1717c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1718c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1719c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1720c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1721c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1722c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1723c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1724c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1725dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng assertStoredValuesOrderly(filterUri, new ContentValues[]{v1, v2, v3}); 1726c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1727c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1728c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 1729c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns primary addresses before the other addresses. 1730c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1731c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterPrimaryAddress() { 1732c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1733c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1734c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com", true); 1735c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1736c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1737c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1738c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1739c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1740c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1741c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v2, v1 }); 1742c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1743c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1744c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 17457d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * Tests if ContactsProvider2 has email address associated with a primary account before the 17467d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * other address. 17477d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa */ 17487d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa public void testEmailFilterPrimaryAccount() { 17497d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId1 = createRawContact(ACCOUNT_1); 17507d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId1, "account1@email.com"); 17517d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId2 = createRawContact(ACCOUNT_2); 17527d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId2, "account2@email.com"); 17537d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v1 = new ContentValues(); 17547d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v1.put(Email.ADDRESS, "account1@email.com"); 17557d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v2 = new ContentValues(); 17567d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v2.put(Email.ADDRESS, "account2@email.com"); 17577d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 17587d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri1 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 17597d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 17607d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_1.type) 17617d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 17627d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2 }); 17637d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 17647d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 17657d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 17667d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_2.type) 17677d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 17687d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v2, v1 }); 17697d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 17707d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa // Just with PRIMARY_ACCOUNT_NAME 17717d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 17727d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 17737d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 1774dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng assertStoredValuesOrderly(filterUri3, new ContentValues[]{v1, v2}); 17757d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 17767d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 17777d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 17787d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 17797d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v2, v1 }); 17807d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 17817d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 1782dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng /** 1783dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng * Test emails with the same domain as primary account are ordered first. 1784dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng */ 1785dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng public void testEmailFilterSameDomainAccountOrder() { 1786dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final Account account = new Account("tester@email.com", "not_used"); 1787dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final long rawContactId = createRawContact(account); 1788dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng insertEmail(rawContactId, "account1@testemail.com"); 1789dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng insertEmail(rawContactId, "account1@email.com"); 1790dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 1791dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final ContentValues v1 = cv(Email.ADDRESS, "account1@testemail.com"); 1792dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final ContentValues v2 = cv(Email.ADDRESS, "account1@email.com"); 1793dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 1794dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng Uri filterUri1 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 1795dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, account.name) 1796dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, account.type) 1797dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng .build(); 1798dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng assertStoredValuesOrderly(filterUri1, v2, v1); 1799dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng } 1800dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 1801dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng /** 1802dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng * Test "default" emails are sorted above emails used last. 1803dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng */ 1804c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng public void testEmailFilterSuperPrimaryOverUsageSort() { 1805dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final long rawContactId = createRawContact(ACCOUNT_1); 1806dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final Uri emailUri1 = insertEmail(rawContactId, "account1@testemail.com"); 1807dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final Uri emailUri2 = insertEmail(rawContactId, "account2@testemail.com"); 1808c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng insertEmail(rawContactId, "account3@testemail.com", true, true); 1809dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 1810dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng // Update account1 and account 2 to have higher usage. 1811dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, emailUri1); 1812dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, emailUri1); 1813dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, emailUri2); 1814dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 1815dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final ContentValues v1 = cv(Email.ADDRESS, "account1@testemail.com"); 1816dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final ContentValues v2 = cv(Email.ADDRESS, "account2@testemail.com"); 1817dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final ContentValues v3 = cv(Email.ADDRESS, "account3@testemail.com"); 1818dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 1819dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng // Test that account 3 is first even though account 1 and 2 have higher usage. 1820dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "acc"); 1821dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng assertStoredValuesOrderly(filterUri, v3, v1, v2); 1822dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng } 1823dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 1824c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng /** 1825c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng * Test primary emails are sorted below emails used last. 1826c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng * 1827c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng * primary may be set without super primary. Only super primary indicates "default" in the 1828c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng * contact ui. 1829c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng */ 1830c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng public void testEmailFilterUsageOverPrimarySort() { 1831c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng final long rawContactId = createRawContact(ACCOUNT_1); 1832c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng final Uri emailUri1 = insertEmail(rawContactId, "account1@testemail.com"); 1833c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng final Uri emailUri2 = insertEmail(rawContactId, "account2@testemail.com"); 1834c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng insertEmail(rawContactId, "account3@testemail.com", true); 1835c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng 1836c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng // Update account1 and account 2 to have higher usage. 1837c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, emailUri1); 1838c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, emailUri1); 1839c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, emailUri2); 1840c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng 1841c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng final ContentValues v1 = cv(Email.ADDRESS, "account1@testemail.com"); 1842c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng final ContentValues v2 = cv(Email.ADDRESS, "account2@testemail.com"); 1843c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng final ContentValues v3 = cv(Email.ADDRESS, "account3@testemail.com"); 1844c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng 1845c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng // Test that account 3 is first even though account 1 and 2 have higher usage. 1846c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "acc"); 1847c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng assertStoredValuesOrderly(filterUri, v1, v2, v3); 1848c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng } 1849c6e28121e4c522c31c96e0ea97b66012cc571160Chiao Cheng 185046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** Tests {@link DataUsageFeedback} correctly promotes a data row instead of a raw contact. */ 185146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public void testEmailFilterSortOrderWithFeedback() { 185246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId1 = createRawContact(); 18534928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address1 = "address1@email.com"; 18544928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId1, address1); 1855dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 185646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId2 = createRawContact(); 18574928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address2 = "address2@email.com"; 18584928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId2, address2); 18594928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address3 = "address3@email.com"; 18604928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa ContentUris.parseId(insertEmail(rawContactId2, address3)); 186146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 186246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v1 = new ContentValues(); 186346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 186446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v2 = new ContentValues(); 186546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 186646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v3 = new ContentValues(); 186746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 186846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 186946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 187046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 187146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 187246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_CALL) 187346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 187446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 187546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 187646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT) 187746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 187846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 187946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 188046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_SHORT_TEXT) 188146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 188246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2, v3 }); 188346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v1, v2, v3 }); 188446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2, v3 }); 188546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v1, v2, v3 }); 188646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 18874928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(address3, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, v3); 188846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1889dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesWithProjection(RawContacts.CONTENT_URI, 1890dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rawContactId1, 1891dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 0 1892dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 1893dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rawContactId2, 1894dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 1 1895dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 1896dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 1897dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 1898dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // account3@email.com should be the first. 189946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v3, v1, v2 }); 190046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v3, v1, v2 }); 190146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 190246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1903f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa /** 1904f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * Tests {@link DataUsageFeedback} correctly bucketize contacts using each 1905f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * {@link DataUsageStatColumns#LAST_TIME_USED} 1906f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa */ 1907f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa public void testEmailFilterSortOrderWithOldHistory() { 1908f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long rawContactId1 = createRawContact(); 1909f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId1 = ContentUris.parseId(insertEmail(rawContactId1, "address1@email.com")); 1910f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId2 = ContentUris.parseId(insertEmail(rawContactId1, "address2@email.com")); 1911f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId3 = ContentUris.parseId(insertEmail(rawContactId1, "address3@email.com")); 1912f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId4 = ContentUris.parseId(insertEmail(rawContactId1, "address4@email.com")); 1913f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1914f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1915f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1916f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1917f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1918f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1919f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1920f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1921f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1922f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v4 = new ContentValues(); 1923f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v4.put(Email.ADDRESS, "address4@email.com"); 1924f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1925f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa final ContactsProvider2 provider = (ContactsProvider2) getProvider(); 1926f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1927f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long nowInMillis = System.currentTimeMillis(); 1928f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000); 1929f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000); 1930f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000); 1931f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1932f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address4 is contacted just once yesterday. 1933f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId4), 1934f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, yesterdayInMillis); 1935f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1936f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address3 is contacted twice 1 week ago. 1937f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1938f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1939f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1940f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1941f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1942f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is contacted three times 1 year ago. 1943f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1944f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1945f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1946f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1947f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1948f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1949f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1950f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // auto-complete should prefer recently contacted methods 1951f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v4, v3, v2, v1 }); 1952f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1953f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address2 is contacted right now 1954f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1955f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1956f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1957f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Now address2 is the most recently used address 1958f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v4, v3, v1 }); 1959f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1960f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address1 is contacted right now 1961f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId1), 1962f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1963f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1964f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is preferred to address1 as address2 is used 4 times in total 1965f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v1, v4, v3 }); 1966f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa } 1967f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 19684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPostalsQuery() { 19694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Alice", "Nextore"); 19704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 19718ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId = ContentUris.parseId(dataUri); 19724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 19738ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 19744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 19754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, dataId); 19764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 19774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 19784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 19794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(StructuredPostal.FORMATTED_ADDRESS, "1600 Amphiteatre Ave, Mountain View"); 19804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Alice Nextore"); 19814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 19828ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, values); 198348828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 198448828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov values); 19854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(StructuredPostal.CONTENT_URI, values, Data._ID, dataId); 19868ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 19878ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated addresses. 19888ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa Uri dataUri2 = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 19898ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId2 = ContentUris.parseId(dataUri2); 19908ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 19918ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, dataId2); 19928ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 19938ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = StructuredPostal.CONTENT_URI.buildUpon() 19948ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 19958ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 19968ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 19978ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 19988ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 19998ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values); 20008ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId), values); 20018ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId2), 20028ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2); 20038ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId2), values2); 20048ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 20058ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, new ContentValues[] {values, values2}); 20068ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 20078ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 20088ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 20098ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 20108ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 20114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 20124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 20138f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee public void testDataContentUriInvisibleQuery() { 20148f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues values = new ContentValues(); 20158f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final long contactId = createContact(values, "John", "Doe", 20168f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 20178f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 20188f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20198f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri uri = Data.CONTENT_URI.buildUpon(). 20208f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee appendQueryParameter(Data.VISIBLE_CONTACTS_ONLY, "true").build(); 20218f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertEquals(4, getCount(uri, null, null)); 20228f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20238f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee markInvisible(contactId); 20248f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20258f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertEquals(0, getCount(uri, null, null)); 20268f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee } 20278f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20288f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee public void testContactablesQuery() { 20298f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final long rawContactId = createRawContactWithName("Hot", "Tamale"); 20308f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20318f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertPhoneNumber(rawContactId, "510-123-5769"); 20328f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertEmail(rawContactId, "tamale@acme.com"); 20338f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20348f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv1 = new ContentValues(); 20358f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 20368f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 20378f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Email.DATA, "tamale@acme.com"); 20388f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Email.TYPE, Email.TYPE_HOME); 20398f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.putNull(Email.LABEL); 20408f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20418f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv2 = new ContentValues(); 20428f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 20438f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 20448f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Phone.DATA, "510-123-5769"); 20458f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Phone.TYPE, Phone.TYPE_HOME); 20468f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.putNull(Phone.LABEL); 20478f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20488f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri0 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, ""); 20498f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertEquals(0, getCount(filterUri0, null, null)); 20508f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20518f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri1 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "tamale"); 20528f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri1, cv1, cv2); 20538f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20548f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri2 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "hot"); 20558f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri2, cv1, cv2); 20568f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20578f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri3 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "tamale@ac"); 20588f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri3, cv1, cv2); 20598f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20608f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri4 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "510"); 20618f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri4, cv1, cv2); 20628f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20638f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri5 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "cold"); 20648f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertEquals(0, getCount(filterUri5, null, null)); 20658f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20668f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri6 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, 20678f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee "tamale@google"); 20688f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertEquals(0, getCount(filterUri6, null, null)); 20698f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20708f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri7 = Contactables.CONTENT_URI; 20718f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri7, cv1, cv2); 20728f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee } 20738f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20748f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee public void testContactablesMultipleQuery() { 20758f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20768f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final long rawContactId = createRawContactWithName("Hot", "Tamale"); 20778f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertPhoneNumber(rawContactId, "510-123-5769"); 20788f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertEmail(rawContactId, "tamale@acme.com"); 20798f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertEmail(rawContactId, "hot@google.com"); 20808f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20818f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final long rawContactId2 = createRawContactWithName("Cold", "Tamago"); 20828f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertEmail(rawContactId2, "eggs@farmers.org"); 20838f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20848f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final long rawContactId3 = createRawContactWithName("John", "Doe"); 20858f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertPhoneNumber(rawContactId3, "518-354-1111"); 20868f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee insertEmail(rawContactId3, "doeadeer@afemaledeer.com"); 20878f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20888f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv1 = new ContentValues(); 20898f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 20908f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 20918f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Email.DATA, "tamale@acme.com"); 20928f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.put(Email.TYPE, Email.TYPE_HOME); 20938f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv1.putNull(Email.LABEL); 20948f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 20958f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv2 = new ContentValues(); 20968f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 20978f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 20988f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Phone.DATA, "510-123-5769"); 20998f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.put(Phone.TYPE, Phone.TYPE_HOME); 21008f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv2.putNull(Phone.LABEL); 21018f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21028f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv3 = new ContentValues(); 21038f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv3.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 21048f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv3.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 21058f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv3.put(Email.DATA, "hot@google.com"); 21068f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv3.put(Email.TYPE, Email.TYPE_HOME); 21078f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv3.putNull(Email.LABEL); 21088f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21098f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv4 = new ContentValues(); 21108f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv4.put(Contacts.DISPLAY_NAME, "Cold Tamago"); 21118f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv4.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 21128f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv4.put(Email.DATA, "eggs@farmers.org"); 21138f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv4.put(Email.TYPE, Email.TYPE_HOME); 21148f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv4.putNull(Email.LABEL); 21158f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21168f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv5 = new ContentValues(); 21178f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv5.put(Contacts.DISPLAY_NAME, "John Doe"); 21188f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv5.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 21198f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv5.put(Email.DATA, "doeadeer@afemaledeer.com"); 21208f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv5.put(Email.TYPE, Email.TYPE_HOME); 21218f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv5.putNull(Email.LABEL); 21228f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21238f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final ContentValues cv6 = new ContentValues(); 21248f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv6.put(Contacts.DISPLAY_NAME, "John Doe"); 21258f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv6.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 21268f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv6.put(Phone.DATA, "518-354-1111"); 21278f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv6.put(Phone.TYPE, Phone.TYPE_HOME); 21288f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee cv6.putNull(Phone.LABEL); 21298f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21308f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri1 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "tamale"); 21318f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21328f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri1, cv1, cv2, cv3); 21338f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21348f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri2 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "hot"); 21358f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri2, cv1, cv2, cv3); 21368f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21378f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri3 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "tam"); 21388f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri3, cv1, cv2, cv3, cv4); 21398f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21408f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri4 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "518"); 21418f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri4, cv5, cv6); 21428f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21438f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri5 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "doe"); 21448f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri5, cv5, cv6); 21458f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21468f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri6 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, "51"); 21478f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri6, cv1, cv2, cv3, cv5, cv6); 21488f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21498f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri7 = Uri.withAppendedPath(Contactables.CONTENT_FILTER_URI, 21508f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee "tamale@google"); 21518f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertEquals(0, getCount(filterUri7, null, null)); 21528f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21538f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri8 = Contactables.CONTENT_URI; 21548f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri8, cv1, cv2, cv3, cv4, cv5, cv6); 21558f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21568f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee // test VISIBLE_CONTACTS_ONLY boolean parameter 21578f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee final Uri filterUri9 = filterUri6.buildUpon().appendQueryParameter( 21588f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee Contactables.VISIBLE_CONTACTS_ONLY, "true").build(); 21598f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri9, cv1, cv2, cv3, cv5, cv6); 21608f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee // mark Hot Tamale as invisible - cv1, cv2, and cv3 should no longer be in the cursor 21618f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee markInvisible(queryContactId(rawContactId)); 21628f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee assertStoredValues(filterUri9, cv5, cv6); 21638f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee } 21648f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21658f8b122c7556350d94c2e349b3093024b0205d8dYorke Lee 21664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testQueryContactData() { 21674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 21684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 2169aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 2170d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 21714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 21724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 21734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(contactUri, values); 21744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 21754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 21764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 21770a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testQueryContactWithStatusUpdate() { 21784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 21794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 2180aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 2181aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 218282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 2183aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori values.put(Contacts.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 2184ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 2185ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 2186ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelectionWithProjection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 21874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 21884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2189a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByName() { 21904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 219148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 2192aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 2193d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 2194aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 219548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 219648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov ContentValues nameValues = new ContentValues(); 219748786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.GIVEN_NAME, "Stu"); 219848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.FAMILY_NAME, "Goulash"); 21993b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "goo"); 22003b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "LASH"); 22017ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, nameValues); 220248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 220348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long contactId = queryContactId(rawContactId); 220482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 220548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 2206ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goulash"); 2207ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 22084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 220948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov assertContactFilter(contactId, "goolash"); 22103b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov assertContactFilter(contactId, "lash"); 221148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 2212a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 22133b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov 22143b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov // Phonetic name with given/family reversed should not match 2215a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("lashgoo"); 22167ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 22177ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.clear(); 22187ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "ga"); 22197ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "losh"); 22207ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 22217ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov mResolver.update(nameUri, nameValues, null, null); 22227ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 22237ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov assertContactFilter(contactId, "galosh"); 22247ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 2225a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 2226a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 2227a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2228a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByEmailAddress() { 2229a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 2230a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 2231a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 2232a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 2233a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 2234a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2235a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 2236a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2237a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2238a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 2239a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2240a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goog411@acme.com"); 2241a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 2242a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2243a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog"); 2244a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411"); 2245a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@"); 2246a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme"); 2247a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme.com"); 2248a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2249a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@acme.combo"); 2250a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@le.com"); 2251a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 2252a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 2253a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2254a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByPhoneNumber() { 2255a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 2256a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 2257a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 2258a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 2259a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 2260a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2261a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 2262a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2263a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2264a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 2265a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2266a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "18004664411"); 2267a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 2268a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2269a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "18004664411"); 2270a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "1800466"); 2271a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "+18004664411"); 2272a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "8004664411"); 2273a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2274a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("78004664411"); 2275a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("18004664412"); 2276a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("8884664411"); 22774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 22784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 22792f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa /** 22802f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * Checks ContactsProvider2 works well with strequent Uris. The provider should return starred 22812f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * contacts and frequently used contacts. 22822f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa */ 2283ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactStrequent() { 22844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 22852f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String email1 = "a@acme.com"; 22862f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted1 = 0; 22874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Noah", "Tever", "18004664411", 22882f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa email1, StatusUpdates.OFFLINE, timesContacted1, 0, 0, 2289d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 22904928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final String phoneNumber2 = "18004664412"; 22914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 22924928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa createContact(values2, "Sam", "Times", phoneNumber2, 2293aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "b@acme.com", StatusUpdates.INVISIBLE, 3, 0, 0, 2294aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 22954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values3 = new ContentValues(); 22962f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String phoneNumber3 = "18004664413"; 22972f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted3 = 5; 22982f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa createContact(values3, "Lotta", "Calling", phoneNumber3, 22992f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, timesContacted3, 0, 0, 2300d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO); 23014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values4 = new ContentValues(); 23029dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa final long rawContactId4 = createRawContact(values4, "Fay", "Veritt", null, 2303aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 2304d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO | StatusUpdates.CAPABILITY_HAS_VOICE); 23054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 23062f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Starred contacts should be returned. TIMES_CONTACTED should be ignored and only data 23072f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // usage feedback should be used for "frequently contacted" listing. 23082f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(Contacts.CONTENT_STREQUENT_URI, values4); 23092f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 23102f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Send feedback for the 3rd phone number, pretending we called that person via phone. 23114928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 23122f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 23132f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 3rd contact should be shown after starred one. 23142f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 23152f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa new ContentValues[] { values4, values3 }); 23162f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 23174928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 23182f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Twice. 23194928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 23202f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 23212f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 1st and 3rd contacts should be shown after starred one. 23222f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 23234928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa new ContentValues[] { values4, values1, values3 }); 23242f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 23259dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // With phone-only parameter, 1st and 4th contacts shouldn't be returned because: 23269dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 1st: feedbacks are only about email, not about phone call. 23279dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 4th: it has no phone number though starred. 23282f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Uri phoneOnlyStrequentUri = Contacts.CONTENT_STREQUENT_URI.buildUpon() 23292f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true") 23302f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .build(); 23319dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values3 }); 23329dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 23339dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Now the 4th contact has a phone number. 23349dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId4, "18004664414"); 23359dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 23369dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Phone only strequent should return 4th contact. 23374928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 23384928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 23394928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // Send feedback for the 2rd phone number, pretending we send the person a SMS message. 23404928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber2, DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, values1); 23414928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 23424928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // SMS feedback shouldn't affect phone-only results. 23434928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 23444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2345ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, "fay"); 23462f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(filterUri, values4); 23474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 23484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 234963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki public void testQueryContactStrequentFrequentOrder() { 235063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Prepare test data 235163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid1 = createRawContact(); 235263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did1 = ContentUris.parseId(insertPhoneNumber(rid1, "1")); 235363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did1e = ContentUris.parseId(insertEmail(rid1, "1@email.com")); 235463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 235563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid2 = createRawContact(); 235663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did2 = ContentUris.parseId(insertPhoneNumber(rid2, "2")); 235763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 235863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid3 = createRawContact(); 235963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did3 = ContentUris.parseId(insertPhoneNumber(rid3, "3")); 236063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 236163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid4 = createRawContact(); 236263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did4 = ContentUris.parseId(insertPhoneNumber(rid4, "4")); 236363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 236463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid5 = createRawContact(); 236563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did5 = ContentUris.parseId(insertPhoneNumber(rid5, "5")); 236663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 236763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long rid6 = createRawContact(); 236863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long did6 = ContentUris.parseId(insertPhoneNumber(rid6, "6")); 236963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 237063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid1 = queryContactId(rid1); 237163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid2 = queryContactId(rid2); 237263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid3 = queryContactId(rid3); 237363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid4 = queryContactId(rid4); 237463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid5 = queryContactId(rid5); 237563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long cid6 = queryContactId(rid6); 237663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 237763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Make sure they aren't aggregated. 237863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki EvenMoreAsserts.assertUnique(cid1, cid2, cid3, cid4, cid5, cid6); 237963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 238063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Prepare the clock 238163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.install(); 238263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 238363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // We check the timestamp in SQL, which doesn't know about the MockClock. So we need to 238463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // use the actual (roughly) time. 238563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 238663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long nowInMillis = System.currentTimeMillis(); 238763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000); 238863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000); 238963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki final long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000); 239063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 239163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // A year ago... 239263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.setCurrentTimeMillis(oneYearAgoInMillis); 239363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 239463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did1, did2); 239563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did1); 239663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 239763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // 7 days ago... 239863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.setCurrentTimeMillis(sevenDaysAgoInMillis); 239963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 240063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did3, did4); 240163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did3); 240263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 240363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Yesterday... 240463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki sMockClock.setCurrentTimeMillis(yesterdayInMillis); 240563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 240663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did5, did6); 240763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did5); 240863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 240963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Contact cid1 again, but it's an email, not a phone call. 241063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1e); 241163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 241263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Check the order -- The regular frequent, which is contact based. 241363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Note because we contacted cid1 yesterday, it's been contacted 3 times, so it comes 241463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // first. 241563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 241663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid1), 241763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid5), 241863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid6), 241963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid3), 242063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid4), 242163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Contacts._ID, cid2)); 242263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 242363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Check the order -- phone only frequent, which is data based. 242463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // Note this is based on data, and only looks at phone numbers, so the order is different 242563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki // now. 242663630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI.buildUpon() 242763630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "1").build(), 242863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did5), 242963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did6), 243063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did3), 243163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did4), 243263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did1), 243363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki cv(Data._ID, did2)); 243463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 243563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 243645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa /** 243745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * Checks ContactsProvider2 works well with frequent Uri. The provider should return frequently 243845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * contacted person ordered by number of times contacted. 243945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa */ 244045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa public void testQueryContactFrequent() { 244145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values1 = new ContentValues(); 244245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email1 = "a@acme.com"; 244345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values1, "Noah", "Tever", "18004664411", 244445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email1, StatusUpdates.OFFLINE, 0, 0, 0, 0); 244545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values2 = new ContentValues(); 244645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email2 = "b@acme.com"; 244745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values2, "Sam", "Times", "18004664412", 244845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0); 244945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values3 = new ContentValues(); 245045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String phoneNumber3 = "18004664413"; 2451363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa final long contactId3 = createContact(values3, "Lotta", "Calling", phoneNumber3, 2452363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, 0, 1, 0, 0); 245345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values4 = new ContentValues(); 245445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values4, "Fay", "Veritt", "18004664414", 245545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 0); 245645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 245745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 245845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 245945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, values1); 246045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 246145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Pretend email was sent to the address twice. 246245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 246345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 246445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 246545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1}); 246645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 246745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Three times 246845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 246945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 247045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 247145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 247245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 247345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 2474363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 2475363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa // Test it works with selection/selectionArgs 2476363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2477363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 2478363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values2, values1}); 2479363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2480363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 2481363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3}); 2482363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 2483363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3.put(Contacts.STARRED, 0); 2484363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertEquals(1, 2485363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa mResolver.update(Uri.withAppendedPath(Contacts.CONTENT_URI, 2486363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa String.valueOf(contactId3)), 2487363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3, null, null)); 2488363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2489363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 2490363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 2491363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 2492363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 2493363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {}); 249445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa } 249545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 249680628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki public void testQueryContactFrequentExcludingInvisible() { 249780628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki ContentValues values1 = new ContentValues(); 249880628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final String email1 = "a@acme.com"; 249980628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final long cid1 = createContact(values1, "Noah", "Tever", "18004664411", 250080628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki email1, StatusUpdates.OFFLINE, 0, 0, 0, 0); 250180628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki ContentValues values2 = new ContentValues(); 250280628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final String email2 = "b@acme.com"; 250380628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki final long cid2 = createContact(values2, "Sam", "Times", "18004664412", 250480628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0); 250580628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 250680628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 250780628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 250880628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 250980628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki // First, we have two contacts in frequent. 251080628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1}); 251180628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 251280628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki // Contact 2 goes invisible. 251380628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki markInvisible(cid2); 251480628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 251580628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki // Now we have only 1 frequent. 251680628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values1}); 251780628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki } 251880628945e7e41bb9363c2fbbd2938890b9217792Makoto Onuki 2519ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactGroup() { 25204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long groupId = createGroup(null, "testGroup", "Test Group"); 25214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 25224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 25234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Best", "West", "18004664411", 2524aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "west@acme.com", StatusUpdates.OFFLINE, 0, 0, groupId, 2525aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 25264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 25274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 25284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values2, "Rest", "East", "18004664422", 2529aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "east@acme.com", StatusUpdates.AVAILABLE, 0, 0, 0, 2530aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 25314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2532ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 25334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Cursor c = mResolver.query(filterUri1, null, null, null, Contacts._ID); 25344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 25354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 25364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values1); 25374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 25384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2539ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 25404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri2, null, Contacts.DISPLAY_NAME + "=?", 25414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov new String[] { "Best West" }, Contacts._ID); 25424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 25434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 25444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2545ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Next Group"); 25464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri3, null, null, null, Contacts._ID); 25474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, c.getCount()); 25484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 25493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 25503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 255136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro private void expectSecurityException(String failureMessage, Uri uri, String[] projection, 255236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String selection, String[] selectionArgs, String sortOrder) { 255324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 255424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 255536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro c = mResolver.query(uri, projection, selection, selectionArgs, sortOrder); 255636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail(failureMessage); 255724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 255836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // The security exception is expected to occur because we're missing a permission. 255924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 256024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 256124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 256224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 256324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 256436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 256536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 256636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testQueryProfileRequiresReadPermission() { 256736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 256836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 256936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro createBasicProfileContact(new ContentValues()); 257036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 257136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Case 1: Retrieving profile contact. 257236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 257336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile without READ_PROFILE access should fail.", 257436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI, null, null, null, Contacts._ID); 257524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 257624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieving profile data. 257736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 257836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile data without READ_PROFILE access should fail.", 257936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 258036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 258124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 258224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieving profile entities. 258336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 258436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile entities without READ_PROFILE access should fail.", 258536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon() 258636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entities").build(), null, null, null, Contacts._ID); 258724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 258824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 258924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByContactIdRequiresReadPermission() { 259024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 259124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 259224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 259324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 259424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 259524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // A query for the profile contact by ID should fail. 259636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 259736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile by contact ID without READ_PROFILE access should fail.", 259836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 259936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 260024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 260124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 260224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByRawContactIdRequiresReadPermission() { 260324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 260424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 260524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the raw contact. 260624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 260736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 260836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 260936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, 261036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro profileRawContactId), null, null, null, RawContacts._ID); 261124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 261224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 261324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileRawContactRequiresReadPermission() { 261424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 261524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 261624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the profile's raw contact data. 261724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 261824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 261924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 1: Retrieve the overall raw contact set for the profile. 262036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 262136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 262236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, null, null, null, null); 262324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 262424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieve the raw contact profile data for the inserted raw contact ID. 262536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 262636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile data without READ_PROFILE access should fail.", 262736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 262836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 262936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("data").build(), null, null, null, null); 263024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 263124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieve the raw contact profile entity for the inserted raw contact ID. 263236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 263336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile entities without READ_PROFILE access should fail.", 263436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 263536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 263636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entity").build(), null, null, null, null); 263724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 263824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 263924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataByDataIdRequiresReadPermission() { 264024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 264124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = mResolver.query(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 264224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro new String[]{Data._ID, Data.MIMETYPE}, null, null, null); 264324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(4, c.getCount()); // Photo, phone, email, name. 264424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.moveToFirst(); 264524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileDataId = c.getLong(0); 264624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 264724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 264824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the data 264924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 265036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 265136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 265236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, profileDataId), 265336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 265424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 265524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 265624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataRequiresReadPermission() { 265724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 265824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 265924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve all profile data. 266024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 266136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 266236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 266336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 266436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 266524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 266624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 266724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileRequiresWritePermission() { 266824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 266924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 267024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a non-profile contact should be fine. 267124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(new ContentValues()); 267224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 267324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a profile contact should throw an exception. 267424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 267524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 267624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Creating a profile contact should fail without WRITE_PROFILE access."); 267724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 267824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 267924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 268024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 268124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileDataRequiresWritePermission() { 268224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 268324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 268424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 268524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 268624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertEmail(profileRawContactId, "foo@bar.net", false); 268724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Inserting data into a profile contact should fail without WRITE_PROFILE access."); 268824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 268924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 269024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 269124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 26926ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro public void testUpdateDataDoesNotRequireProfilePermission() { 26936ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 26946ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 26956ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 26966ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Create a non-profile contact. 26976ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long rawContactId = createRawContactWithName("Domo", "Arigato"); 26986ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long dataId = getStoredLongValue(Data.CONTENT_URI, 26996ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", 27006ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(rawContactId), StructuredName.CONTENT_ITEM_TYPE}, 27016ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data._ID); 27026ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 27036ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Updates its name using a selection. 27046ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro ContentValues values = new ContentValues(); 27056ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.GIVEN_NAME, "Bob"); 27066ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.FAMILY_NAME, "Blob"); 27076ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 27086ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(dataId)}); 27096ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 27106ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Check that the update went through. 27116ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro assertStoredValues(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), values); 27126ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro } 27136ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 27145d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro public void testQueryContactThenProfile() { 271524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 271624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 271724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 271824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 271924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 272024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createBasicNonProfileContact(nonProfileValues); 272124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileContactId = queryContactId(nonProfileRawContactId); 272224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 27235d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Contacts.CONTENT_URI, nonProfileValues); 272424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertSelection(Contacts.CONTENT_URI, nonProfileValues, Contacts._ID, nonProfileContactId); 27255d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 27265d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 272724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 272824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 272924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryContactExcludeProfile() { 273024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a profile contact (it should not be returned by the general contact URI). 273124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 273224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 273324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a non-profile contact - this should be returned. 273424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 273524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(nonProfileValues); 273624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 273724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Contacts.CONTENT_URI, new ContentValues[] {nonProfileValues}); 273824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 273924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 274024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfile() { 274124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 274224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 274324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 274424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 274524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 274624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 274724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private ContentValues[] getExpectedProfileDataValues() { 274824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected photo data values (only field is the photo BLOB, which we can't check). 274924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues photoRow = new ContentValues(); 275024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro photoRow.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 275124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 275224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected phone data values. 275324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues phoneRow = new ContentValues(); 275424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 275524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Phone.NUMBER, "18005554411"); 275624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 275724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected email data values. 275824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues emailRow = new ContentValues(); 275924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 276024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Email.ADDRESS, "mia.prophyl@acme.com"); 276124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 276224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected name data values. 276324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nameRow = new ContentValues(); 276424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 276524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.DISPLAY_NAME, "Mia Prophyl"); 276624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.GIVEN_NAME, "Mia"); 276724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.FAMILY_NAME, "Prophyl"); 276824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 276924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return new ContentValues[]{photoRow, phoneRow, emailRow, nameRow}; 277024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 277124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 277224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileData() { 277324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 277424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 277524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 277624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 277724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 277824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 277924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileEntities() { 278024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 278124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 278224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("entities").build(), 278324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 278424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 278524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 278624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfile() { 278724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 278824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 278924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 279024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 279124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 279224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, profileValues); 279324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 279424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 279524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileById() { 279624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 279724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 279824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 279924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 280024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 280124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 280224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId), profileValues); 280324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 280424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 280524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileData() { 280624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 280724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 280824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 280924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 281024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("data").build(), getExpectedProfileDataValues()); 281124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 281224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 281324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileEntity() { 281424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 281524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 281624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 281724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 281824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("entity").build(), getExpectedProfileDataValues()); 281924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 282024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 282124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryDataForProfile() { 282224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 282324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 282424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 282524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 282624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 282724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 2828cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro public void testUpdateProfileRawContact() { 2829cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro createBasicProfileContact(new ContentValues()); 2830cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro ContentValues updatedValues = new ContentValues(); 2831cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.SEND_TO_VOICEMAIL, 0); 2832cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.CUSTOM_RINGTONE, "rachmaninoff3"); 2833cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.STARRED, 1); 2834cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro mResolver.update(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues, null, null); 2835cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2836cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues); 2837cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro } 2838cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2839a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro public void testInsertProfileWithDataSetTriggersAccountCreation() { 2840a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that we have no profile raw contacts. 2841a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, new ContentValues[]{}); 2842a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2843a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Insert a profile record with a new data set. 2844a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Account account = new Account("a", "b"); 2845a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro String dataSet = "c"; 2846a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Uri profileUri = maybeAddAccountQueryParameters(Profile.CONTENT_RAW_CONTACTS_URI, account) 2847a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro .buildUpon().appendQueryParameter(RawContacts.DATA_SET, dataSet).build(); 2848a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro ContentValues values = new ContentValues(); 2849a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(profileUri, values)); 2850a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro values.put(RawContacts._ID, rawContactId); 2851a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2852a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that querying for the profile gets the created raw contact. 2853a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, values); 2854a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro } 2855a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 285685077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfilePhoto() throws IOException { 285785077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 285885077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 285987426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 286085077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.THUMBNAIL), 286185077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, false)); 286285077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 286385077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 286485077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfileDisplayPhoto() throws IOException { 286585077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 286685077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 286787426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 286885077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 286985077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, true)); 287085077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 287185077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 28720a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testPhonesWithStatusUpdate() { 287319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 287419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov ContentValues values = new ContentValues(); 287519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 287619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 287719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 287819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 287919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 288019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 288119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664412"); 288219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog411@acme.com"); 288319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog412@acme.com"); 288419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 288582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 2886aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.INVISIBLE, "Bad", 2887aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 288882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog412@acme.com", 2889aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, "Good", 2890aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VOICE); 289119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long contactId = queryContactId(rawContactId); 289219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 289382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri uri = Data.CONTENT_URI; 289419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 2895a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov Cursor c = mResolver.query(uri, null, RawContacts.CONTACT_ID + "=" + contactId + " AND " 2896a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", null, Phone.NUMBER); 289719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertEquals(2, c.getCount()); 289819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 289919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToFirst(); 290019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 290119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 290282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 29030a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 290419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 290519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 290619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2907a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 290819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 290919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 291019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToNext(); 291119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 291219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 291382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 29140a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 291519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 291619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664412"); 291719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2918a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 291919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 292019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 292119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.close(); 292219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov } 292319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 292489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testGroupQuery() { 292589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 292689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 292789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId1 = createGroup(account1, "e", "f"); 292889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId2 = createGroup(account2, "g", "h"); 292989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account1); 293089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account2); 293189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 293289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 293389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Groups._ID + "=" + groupId1, null, Groups._ID, groupId1) ; 293489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Groups._ID + "=" + groupId2, null, Groups._ID, groupId2) ; 293589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 293689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 29373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testGroupInsert() { 29383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 29393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 29403cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_NAME, "a"); 29413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_TYPE, "b"); 29429d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki values.put(Groups.DATA_SET, "ds"); 29433cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SOURCE_ID, "c"); 29443cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.VERSION, 42); 29453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.GROUP_VISIBLE, 1); 29463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE, "d"); 29473cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE_RES, 1234); 29483cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.NOTES, "e"); 29493cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.RES_PACKAGE, "f"); 29503cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYSTEM_ID, "g"); 295194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana values.put(Groups.DELETED, 1); 29523cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC1, "h"); 29533cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC2, "i"); 29543cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC3, "j"); 29553cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC4, "k"); 29563cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 29573cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(Groups.CONTENT_URI, values); 29583cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 295973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.DIRTY, 1); 29603cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 29613cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 29623cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 2963f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupCreationAfterMembershipInsert() { 2964f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2965f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2966f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2967f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId = assertSingleGroup(NO_LONG, mAccount, "gsid1", null); 2968f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2969f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId, "gsid1"); 2970f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2971f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2972f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupReuseAfterMembershipInsert() { 2973f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2974f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2975f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2976f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2977f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroup(groupId1, mAccount, "gsid1", "title1"); 2978f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2979f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId1, "gsid1"); 2980f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2981f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2982f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupInsertFailureOnGroupIdConflict() { 2983f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2984f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2985f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2986f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues values = new ContentValues(); 2987f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.RAW_CONTACT_ID, rawContactId1); 2988f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 2989f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_SOURCE_ID, "gsid1"); 2990f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_ROW_ID, groupId1); 2991f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa try { 2992f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa mResolver.insert(Data.CONTENT_URI, values); 2993f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa fail("the insert was expected to fail, but it succeeded"); 2994f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } catch (IllegalArgumentException e) { 2995f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // this was expected 2996f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2997f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2998f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 29995f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testGroupDelete_byAccountSelection() { 30005f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account1 = new Account("accountName1", "accountType1"); 30015f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account2 = new Account("accountName2", "accountType2"); 30025f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30035f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId1 = createGroup(account1, "sourceId1", "title1"); 30045f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId2 = createGroup(account2, "sourceId2", "title2"); 30055f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId3 = createGroup(account2, "sourceId3", "title3"); 30065f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30075f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final int numDeleted = mResolver.delete(Groups.CONTENT_URI, 30085f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?", 30095f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[]{account2.name, account2.type}); 30105f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(2, numDeleted); 30115f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30125f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v1 = new ContentValues(); 30135f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups._ID, groupId1); 30145f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups.DELETED, 0); 30155f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30165f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v2 = new ContentValues(); 30175f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups._ID, groupId2); 30185f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups.DELETED, 1); 30195f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30205f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v3 = new ContentValues(); 30215f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups._ID, groupId3); 30225f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups.DELETED, 1); 30235f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30245f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 }); 30255f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 30265f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30275f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testGroupDelete_byAccountParam() { 30285f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account1 = new Account("accountName1", "accountType1"); 30295f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final Account account2 = new Account("accountName2", "accountType2"); 30305f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30315f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId1 = createGroup(account1, "sourceId1", "title1"); 30325f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId2 = createGroup(account2, "sourceId2", "title2"); 30335f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final long groupId3 = createGroup(account2, "sourceId3", "title3"); 30345f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30355f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki final int numDeleted = mResolver.delete( 30365f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Groups.CONTENT_URI.buildUpon() 30375f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .appendQueryParameter(Groups.ACCOUNT_NAME, account2.name) 30385f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .appendQueryParameter(Groups.ACCOUNT_TYPE, account2.type) 30395f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki .build(), 30405f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki null, null); 30415f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(2, numDeleted); 30425f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30435f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v1 = new ContentValues(); 30445f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups._ID, groupId1); 30455f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v1.put(Groups.DELETED, 0); 30465f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30475f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v2 = new ContentValues(); 30485f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups._ID, groupId2); 30495f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v2.put(Groups.DELETED, 1); 30505f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30515f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki ContentValues v3 = new ContentValues(); 30525f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups._ID, groupId3); 30535f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki v3.put(Groups.DELETED, 1); 30545f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 30555f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 }); 30565f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 30575f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 3058f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupSummaryQuery() { 3059f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account1 = new Account("accountName1", "accountType1"); 3060f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account2 = new Account("accountName2", "accountType2"); 3061f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId1 = createGroup(account1, "sourceId1", "title1"); 3062f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId2 = createGroup(account2, "sourceId2", "title2"); 3063f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId3 = createGroup(account2, "sourceId3", "title3"); 3064f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3065f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Prepare raw contact id not used at all, to test group summary uri won't be confused 3066f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // with it. 3067f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId0 = createRawContactWithName("firstName0", "lastName0"); 3068f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3069f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("firstName1", "lastName1"); 3070f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 3071f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId1, groupId1); 3072f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3073f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("firstName2", "lastName2"); 3074f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId2, "address2@email.com"); 3075f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId2, "222-222-2222"); 3076f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId2, groupId1); 3077f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3078f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v1 = new ContentValues(); 3079f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups._ID, groupId1); 3080f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.TITLE, "title1"); 3081f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SOURCE_ID, "sourceId1"); 3082f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_NAME, account1.name); 3083f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_TYPE, account1.type); 3084f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_COUNT, 2); 3085f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, 1); 3086f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3087f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v2 = new ContentValues(); 3088f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups._ID, groupId2); 3089f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.TITLE, "title2"); 3090f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SOURCE_ID, "sourceId2"); 3091f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_NAME, account2.name); 3092f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_TYPE, account2.type); 3093f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, 0); 3094f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, 0); 3095f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3096f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v3 = new ContentValues(); 3097f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups._ID, groupId3); 3098f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.TITLE, "title3"); 3099f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SOURCE_ID, "sourceId3"); 3100f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_NAME, account2.name); 3101f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_TYPE, account2.type); 3102f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_COUNT, 0); 3103f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_WITH_PHONES, 0); 3104f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3105f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 3106f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3107f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Now rawContactId1 has two phone numbers. 3108f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1111"); 3109f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1112"); 3110f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Result should reflect it correctly (don't count phone numbers but raw contacts) 3111f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, v1.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 3112f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 3113f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3114f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce new raw contact, pretending the user added another info. 3115f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId3 = createRawContactWithName("firstName3", "lastName3"); 3116f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId3, "address3@email.com"); 3117f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId3, "333-333-3333"); 3118f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId3, groupId2); 3119f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, v2.getAsInteger(Groups.SUMMARY_COUNT) + 1); 3120f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, v2.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 3121f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3122f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 3123f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 312418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki final Uri uri = Groups.CONTENT_SUMMARY_URI; 312518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki 312618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki // TODO Once SUMMARY_GROUP_COUNT_PER_ACCOUNT is supported remove all the if(false). 312718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 312818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1); 312918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 313018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 313118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 313218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 313318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 313418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 313518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 3136f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3 }); 3137f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 3138f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce another group in account1, testing SUMMARY_GROUP_COUNT_PER_ACCOUNT correctly 3139f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // reflects the change. 3140f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId4 = createGroup(account1, "sourceId4", "title4"); 314118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 314218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 314318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1); 314418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 314518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 314618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 3147f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v4 = new ContentValues(); 3148f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups._ID, groupId4); 3149f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.TITLE, "title4"); 3150f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SOURCE_ID, "sourceId4"); 3151f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_NAME, account1.name); 3152f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_TYPE, account1.type); 3153f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_COUNT, 0); 3154f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_WITH_PHONES, 0); 315518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 315618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 315718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT)); 315818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 315918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 316018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 3161f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3, v4 }); 316223ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki 316323ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // We change the tables dynamically according to the requested projection. 316423ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // Make sure the SUMMARY_COUNT column exists 316523ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.clear(); 316623ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.put(Groups.SUMMARY_COUNT, 2); 316723ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.clear(); 316823ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.put(Groups.SUMMARY_COUNT, 1); 316923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.clear(); 317023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.put(Groups.SUMMARY_COUNT, 0); 317123ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.clear(); 317223ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.put(Groups.SUMMARY_COUNT, 0); 317323ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki assertStoredValuesWithProjection(uri, new ContentValues[] { v1, v2, v3, v4 }); 3174f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 3175f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 317689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testSettingsQuery() { 317789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 317889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 3179f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account3 = new AccountWithDataSet("e", "f", "plus"); 318089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account1, "0", "0"); 318189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account2, "1", "1"); 3182f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account3, "1", "0"); 318389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account1); 318489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account2); 3185f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Uri uri3 = Settings.CONTENT_URI.buildUpon() 3186f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_NAME, account3.getAccountName()) 3187f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_TYPE, account3.getAccountType()) 3188f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.DATA_SET, account3.getDataSet()) 3189f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .build(); 319089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 319189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 3192f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertEquals(1, getCount(uri3, null, null)); 319389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.SHOULD_SYNC, "0") ; 3194f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri1, Settings.UNGROUPED_VISIBLE, "0"); 319589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.SHOULD_SYNC, "1") ; 3196f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri2, Settings.UNGROUPED_VISIBLE, "1"); 3197f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.SHOULD_SYNC, "1"); 3198f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.UNGROUPED_VISIBLE, "0"); 3199f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro } 3200f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 3201f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro public void testSettingsInsertionPreventsDuplicates() { 3202f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Account account1 = new Account("a", "b"); 3203f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account2 = new AccountWithDataSet("c", "d", "plus"); 3204f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account1, "0", "0"); 3205f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account2, "1", "1"); 3206f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 32070e21a867a572679d64d79041eb574d13665178d4Dave Santoro // Now try creating the settings rows again. It should update the existing settings rows. 32080e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account1, "1", "0"); 32090e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 32100e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=?", 32110e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"a", "b"}, Settings.SHOULD_SYNC, "1"); 32120e21a867a572679d64d79041eb574d13665178d4Dave Santoro 32130e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account2, "0", "1"); 32140e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 32150e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=? AND " + 32160e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.DATA_SET + "=?", 32170e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"c", "d", "plus"}, Settings.SHOULD_SYNC, "0"); 321889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 321989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 32204097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsUnspecified() { 3221d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 32224097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 32234097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 32245ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 32254097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 322617a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 32274097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 32284097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 322967c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov public void testDisplayNameParsingWhenPartsAreNull() { 323067c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov long rawContactId = createRawContact(); 323167c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov ContentValues values = new ContentValues(); 323267c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 323367c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 323467c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 323567c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov insertStructuredName(rawContactId, values); 323617a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 323767c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov } 323867c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov 32394097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsSpecified() { 3240d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 32414097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 32424097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 32434097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Johnson"); 32445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 32454097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 32465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertStructuredName(rawContactId, null, null, null, "Johnson", null); 32474097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 32484097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 32495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithoutPhoneticName() { 3250a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactLocaleUtils.setLocale(Locale.ENGLISH); 32515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final long rawContactId = createRawContact(null); 32525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 32535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 32545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 32555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 32565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "K."); 32575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 32585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 32595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 32605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 32615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 32625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 326355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 326455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 32655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 32665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 32675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 3268a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContactsColumns.PHONEBOOK_LABEL_PRIMARY, "J"); 32695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 3270a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "D"); 32715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 32725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 32735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 32745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 32755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 32765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 327755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 327855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 32795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 32805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 32815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 3282a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_PRIMARY, "J"); 32835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 3284a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "D"); 32855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 32865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 32875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 32885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 32895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 32905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 32915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 32925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 32935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 32945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithChineseName() { 3295a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner if (!hasChineseCollator()) { 32965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 32975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 3298a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactLocaleUtils.setLocale(Locale.SIMPLIFIED_CHINESE); 32995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 33015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 3303a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner // "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B" 33045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "\u6BB5\u5C0F\u6D9B"); 33055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 33065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 33085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 33095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 33105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 33115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 33125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 3313a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContacts.SORT_KEY_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 3314a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContactsColumns.PHONEBOOK_LABEL_PRIMARY, "D"); 3315a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContacts.SORT_KEY_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 3316a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "D"); 33175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 33195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 33205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 33225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 33235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 33245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 33255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 33265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 3327a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(Contacts.SORT_KEY_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 3328a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_PRIMARY, "D"); 3329a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 3330a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "D"); 33315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 33335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 33345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 33355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 33375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 33385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 33395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33400f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner public void testJapaneseNameContactInEnglishLocale() { 33410f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner // Need Japanese locale data for transliteration 33420f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner if (!hasJapaneseCollator()) { 33430f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner return; 33440f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner } 33450f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner ContactLocaleUtils.setLocale(Locale.US); 33460f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner long rawContactId = createRawContact(null); 33470f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner 33480f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner ContentValues values = new ContentValues(); 33490f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner values.put(StructuredName.GIVEN_NAME, "\u7A7A\u6D77"); 33500f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner values.put(StructuredName.PHONETIC_GIVEN_NAME, "\u304B\u3044\u304F\u3046"); 33510f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner insertStructuredName(rawContactId, values); 33520f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner 33530f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner long contactId = queryContactId(rawContactId); 33540f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner // en_US should behave same as ja_JP (match on Hiragana and Romaji 33550f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner // but not Pinyin) 33560f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner assertContactFilter(contactId, "\u304B\u3044\u304F\u3046"); 33570f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner assertContactFilter(contactId, "kaiku"); 33580f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner assertContactFilterNoResult("kong"); 33590f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner } 33600f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner 33615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithJapaneseName() { 3362a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner if (!hasJapaneseCollator()) { 3363a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner return; 3364a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 3365a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactLocaleUtils.setLocale(Locale.JAPAN); 33665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 33675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 33695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "\u7A7A\u6D77"); 33705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PHONETIC_GIVEN_NAME, "\u304B\u3044\u304F\u3046"); 33715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 33725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 33745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 33755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 33765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 33775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 33785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 33795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 33805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 3381a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContactsColumns.PHONEBOOK_LABEL_PRIMARY, "\u304B"); 3382a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(RawContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "\u304B"); 33835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 33855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 33865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 33885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 33895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 33905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 33915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 33925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 33935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 33945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 3395a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_PRIMARY, "\u304B"); 3396a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "\u304B"); 33975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 33985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 33995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 34005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 34015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 34025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 34035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 34040f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner 34050f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner long contactId = queryContactId(rawContactId); 34060f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner // ja_JP should match on Hiragana and Romaji but not Pinyin 34070f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner assertContactFilter(contactId, "\u304B\u3044\u304F\u3046"); 34080f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner assertContactFilter(contactId, "kaiku"); 34090f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner assertContactFilterNoResult("kong"); 34105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 34115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 341225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov public void testDisplayNameUpdate() { 341325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId1 = createRawContact(); 341425abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertEmail(rawContactId1, "potato@acme.com", true); 341525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 341625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId2 = createRawContact(); 341725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertPhoneNumber(rawContactId2, "123456789", true); 341825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 34190c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 34200c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 342125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 342225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "123456789"); 342325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 342425abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertStructuredName(rawContactId2, "Potato", "Head"); 342525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 342625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Potato Head"); 342781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 342825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 342925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 343001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov public void testDisplayNameFromData() { 343101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long rawContactId = createRawContact(); 343201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3433a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka ContentValues values = new ContentValues(); 343401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 343501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 343601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 343701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 343801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "mike@monstersinc.com"); 343901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "mike@monstersinc.com"); 344001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 344101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "james@monstersinc.com", true); 344201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "james@monstersinc.com"); 344301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 344401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertPhoneNumber(rawContactId, "1-800-466-4411"); 344501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "1-800-466-4411"); 344601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 3447a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there are title and company, the company is display name. 3448a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 3449a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.COMPANY, "Monsters Inc"); 34505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 345101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Monsters Inc"); 345201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 3453a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is nickname, that is display name. 3454a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertNickname(rawContactId, "Sully"); 3455a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "Sully"); 3456a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 3457a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is structured name, that is display name. 3458a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 3459a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.GIVEN_NAME, "James"); 3460a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.MIDDLE_NAME, "P."); 3461a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.FAMILY_NAME, "Sullivan"); 3462a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertStructuredName(rawContactId, values); 34635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "James P. Sullivan"); 34645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 34655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 34665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithoutPhoneticName() { 34675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 34685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 34695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 34705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 34715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 34725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 34735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 34745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 34755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.TITLE, "Protagonist"); 34765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 34775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Protagonist"); 34785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 34795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there are title and company, the company is display name. 34805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 34815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "Monsters Inc"); 34825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mResolver.update(organizationUri, values, null, null); 34835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 34845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 34855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Monsters Inc"); 34865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 34875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 34885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "Monsters Inc"); 34895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Monsters Inc"); 3490a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_PRIMARY, "M"); 3491a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "M"); 34925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 34935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 34945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 34955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithJapanesePhoneticName() { 3496a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner if (!hasJapaneseCollator()) { 3497a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner return; 3498a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 3499a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactLocaleUtils.setLocale(Locale.JAPAN); 35005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 35015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 35025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 35035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 35045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 35055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 35065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 35075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 35085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "DoCoMo"); 35095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 35105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 35115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 35125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 35135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "DoCoMo"); 35145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 35155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 35165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u30C9\u30B3\u30E2"); 35175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u30C9\u30B3\u30E2"); 3518a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_PRIMARY, "\u305F"); 3519a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "\u305F"); 35205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 35215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 35225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 35235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithChineseName() { 3524a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner if (!hasChineseCollator()) { 35250b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov return; 35260b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 3527a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactLocaleUtils.setLocale(Locale.SIMPLIFIED_CHINESE); 35280b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 35295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 35305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 35315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 35325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 35335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 35345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 35355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 35365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 35375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "\u4E2D\u56FD\u7535\u4FE1"); 35385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 35395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 35405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 35415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "\u4E2D\u56FD\u7535\u4FE1"); 35425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 35435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 3544a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(Contacts.SORT_KEY_PRIMARY, "\u4E2D\u56FD\u7535\u4FE1"); 3545a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_PRIMARY, "Z"); 3546a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u4E2D\u56FD\u7535\u4FE1"); 3547a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner values.put(ContactsColumns.PHONEBOOK_LABEL_ALTERNATIVE, "Z"); 35485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 354901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 355001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 355131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov public void testLookupByOrganization() { 355231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long rawContactId = createRawContact(); 355331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long contactId = queryContactId(rawContactId); 355431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov ContentValues values = new ContentValues(); 355531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 355631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 355731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 355831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "president"); 355931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 356031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 356131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 356231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 356331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 356431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 356531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.DEPARTMENT, "software"); 356631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 356731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 356831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 356931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 357031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 357131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 357231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "incredibles"); 357331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 357431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 357531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 357631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 357731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 357831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 357931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "director"); 358031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 358131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 358231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 358331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "director"); 358431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 358531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 358631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "monsters"); 358731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "scarer"); 358831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 358931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 359031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "monsters"); 359131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "scarer"); 359231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 359331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 359431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov private void assertContactFilter(long contactId, String filter) { 359531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(filter)); 359631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertStoredValue(filterUri, Contacts._ID, contactId); 359731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 359831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 3599a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private void assertContactFilterNoResult(String filter) { 36000f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(filter)); 36010f4b7a9bfe4b2079a7c5bb22b4114b5672639b05Jay Shrauner assertEquals(0, getCount(filterUri, null, null)); 3602a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 3603a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 3604916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetOrganization() throws Exception { 3605916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 3606916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3607916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3608916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Some random data element 3609916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "inc@corp.com"); 3610916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3611916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 3612916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3613916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 36149c6ef008d92017108e3d10dcd8e2146eded9e148Dmitri Plotnikov values.put(Organization.TITLE, "engineer"); 3615916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 3616916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3617916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another matching organization 3618916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmeinc"); 3619916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 3620916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3621916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another non-matching organization 3622916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "corpacme"); 3623916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 3624916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3625916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // And another data element 3626916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "emca@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 3627916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 36286f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 3629916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3630916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3631916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 36323716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "engineer, [acmecorp]"); 3633916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 3634916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 3635916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3636916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetEmail() throws Exception { 3637916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContact(); 3638916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3639916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 3640916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 36413716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "John", "Doe"); 3642916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertEmail(rawContactId, "acme@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 3643916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 36446f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 3645916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3646916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3647916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 36483716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[acme@corp.com]"); 3649916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 3650916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 3651916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3652fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood public void testCountPhoneNumberDigits() { 3653fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("86 (0) 5-55-12-34")); 3654fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("860 555-1234")); 3655fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(3, ContactsProvider2.countPhoneNumberDigits("860")); 3656fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("8605551234")); 3657fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860555")); 3658fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860 555")); 3659fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860-555")); 3660fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(12, ContactsProvider2.countPhoneNumberDigits("+441234098765")); 3661fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("44+1234098765")); 3662fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("+441234098foo")); 3663fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood } 3664fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood 36653716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetPhone() throws Exception { 36663716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 36673716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 36683716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues values = new ContentValues(); 36693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 36703716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 36713716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "(860) 555-1234"); 36723716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 36733716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.clear(); 36743716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(Contacts._ID, contactId); 36753716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[(860) 555-1234]"); 36763716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 36773716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 36783716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("86 (0) 5-55-12-34")), values); 36793716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 36803716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555-1234")), values); 36813716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 36823716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860")), values); 36833716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 36843716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("8605551234")), values); 36853716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 36863716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860555")), values); 36873716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 36883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555")), values); 36893716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 36903716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860-555")), values); 36913716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 36923716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 36936f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro private Uri buildFilterUri(String query, boolean deferredSnippeting) { 36946f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri.Builder builder = Contacts.CONTENT_FILTER_URI.buildUpon() 36956f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro .appendPath(Uri.encode(query)); 36966f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro if (deferredSnippeting) { 36976f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro builder.appendQueryParameter(ContactsContract.DEFERRED_SNIPPETING, "1"); 36986f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 36996f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro return builder.build(); 37006f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 37016f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro 3702916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetNickname() throws Exception { 3703916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 3704916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3705916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 3706916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3707916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertNickname(rawContactId, "Incredible"); 3708916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 37096f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("inc", true); 3710916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 3711916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 3712916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 371330cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov values.put(SearchSnippetColumns.SNIPPET, "[Incredible]"); 3714916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 3715916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 3716916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 37173716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNameInDisplayName() throws Exception { 37183716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 37193716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 37203716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 37213716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 37223716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37233716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 37243716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 37253716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 37263716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 37273716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37286f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 37296f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("john", true), emptySnippet); 37303716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 37313716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37323716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNicknameInDisplayName() throws Exception { 37333716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 37343716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 37353716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNickname(rawContactId, "Caveman"); 37363716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 37373716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37383716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 37393716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 37403716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 37413716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 37423716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37436f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 37443716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 37453716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37463716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForCompanyInDisplayName() throws Exception { 37473716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 37483716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 37493716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues company = new ContentValues(); 37503716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.clear(); 37513716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.COMPANY, "Aperture Science"); 37523716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.TITLE, "President"); 37533716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertOrganization(rawContactId, company); 37543716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "aperturepresident@aperturescience.com", true); 37553716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37563716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 37573716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 37583716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 37593716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 37603716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37616f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("aperture", true), emptySnippet); 37623716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 37633716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37643716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForPhoneInDisplayName() throws Exception { 37653716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 37663716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 37673716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "860-555-1234"); 37683716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "860@aperturescience.com", true); 37693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37703716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 37713716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 37723716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 37733716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 37743716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37756f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("860", true), emptySnippet); 37763716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 37773716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37783716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForEmailInDisplayName() throws Exception { 37793716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 37803716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 37813716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 37823716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNote(rawContactId, "Cave Johnson is president of Aperture Science"); 37833716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37843716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 37853716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 37863716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 37873716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 37883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 37896f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 37903716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 37913716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 3792dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov public void testDisplayNameUpdateFromStructuredNameUpdate() { 3793dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long rawContactId = createRawContact(); 3794dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, "Slinky", "Dog"); 3795dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3796dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3797dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3798dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3799dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky Dog"); 3800dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3801dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov ContentValues values = new ContentValues(); 3802dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 3803dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3804dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3805dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky"); 3806dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3807dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 3808dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3809dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3810dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 3811dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3812dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dog"); 3813dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3814dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3815dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Dog"); 3816dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov } 3817dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3818d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov public void testInsertDataWithContentProviderOperations() throws Exception { 3819d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 3820d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValues(new ContentValues()) 3821d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3822d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 3823d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 3824d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 3825d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 3826d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 3827d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3828d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderResult[] results = 3829d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(cpo1, cpo2)); 3830d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov long contactId = queryContactId(ContentUris.parseId(results[0].uri)); 3831d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3832d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "John Doe"); 3833d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov } 3834d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov 3835d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailDefault() { 3836c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3837d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3838d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3839d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 3840d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 3841d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 3842d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(0, sendToVoicemail); 3843d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 3844d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3845d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3846d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtone() { 3847c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3848d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3849d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3850d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId, true, "foo"); 3851d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, true, "foo"); 385281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 38538c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 38548c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov updateSendToVoicemailAndRingtoneWithSelection(contactId, false, "bar"); 38558c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, false, "bar"); 38568c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertNetworkNotified(false); 3857d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3858d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3859d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailAndRingtoneAfterAggregation() { 38603cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("a", "b"); 3861d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3862d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3863d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 38643cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("c", "d"); 3865d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3866d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, true, "bar"); 3867d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3868d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 38690c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 38700c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3871d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3872d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov // Both contacts had "send to VM", the contact now has the same value 3873d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId1, true, "foo,bar"); // Either foo or bar 3874d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3875d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3876d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testDoNotSendToVoicemailAfterAggregation() { 38773cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("e", "f"); 3878d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3879d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, null); 3880d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 38813cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("g", "h"); 3882d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3883d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, null); 3884d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3885d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 38860c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 38870c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3888d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3889d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Since one of the contacts had "don't send to VM" that setting wins for the aggregate 38900c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), false, null); 3891d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3892d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3893d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtonePreservedAfterJoinAndSplit() { 38943cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("i", "j"); 3895d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3896d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3897d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 38983cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("k", "l"); 3899d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3900d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, "bar"); 3901d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3902d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 39030c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 39040c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3905d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3906d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Split them 39070c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 39080c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3909d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 39103cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), true, "foo"); 3911d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId2), false, "bar"); 3912d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3913d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 391482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateInsert() { 39154dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov long rawContactId = createRawContact(); 39160a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 39170a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 39180a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39190a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 39200a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 39210a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 39220a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.putNull(StatusUpdates.CUSTOM_PROTOCOL); 39230a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 39240a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PRESENCE, StatusUpdates.INVISIBLE); 39250a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 39260a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 100); 39270a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "a.b.c"); 39280a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 1234); 39290a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 2345); 39300a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39310a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 39320a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39330a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 39340a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39350a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long contactId = queryContactId(rawContactId); 39360a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 39370a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 39390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 39400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Hiding"); 39410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 39420a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "a.b.c"); 39430a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 1234); 39440a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 2345); 39450a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39460a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 39470a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39480a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 39490a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 39500a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Cloaked"); 39510a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 200); 39520a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "d.e.f"); 39530a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 4321); 39540a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 5432); 39550a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov mResolver.insert(StatusUpdates.CONTENT_URI, values); 39560a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39570a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 39580a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 39590a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Cloaked"); 39600a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 200); 39610a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "d.e.f"); 39620a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 4321); 39630a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 5432); 39640a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 39650a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 39660a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39670a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateInferAttribution() { 39680a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 39690a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 39700a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 39710a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39720a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 39730a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 39740a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 39750a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 39760a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 39770a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39780a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 39790a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39800a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 39810a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 39820a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, com.android.internal.R.string.imProtocolAim); 39830a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 39840a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39850a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 39860a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 39870a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 39880a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateMatchingImOrEmail() { 39890a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 39904dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 39914dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im"); 399282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertEmail(rawContactId, "m@acme.com"); 39934dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 39944dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (standard) 3995aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3996aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 39974dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 39984dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (custom) 3999aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im", StatusUpdates.IDLE, "Idle", 4000d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 40014dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 40024dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on Email 4003aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "m@acme.com", StatusUpdates.AWAY, "Away", 4004aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 40054dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 40064dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // No match 4007aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_ICQ, null, "12345", StatusUpdates.DO_NOT_DISTURB, "Go away", 4008aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 40094dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 401082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Cursor c = mResolver.query(StatusUpdates.CONTENT_URI, new String[] { 401182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID, StatusUpdates.PROTOCOL, StatusUpdates.CUSTOM_PROTOCOL, 40120a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.PRESENCE, StatusUpdates.STATUS}, 401382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null, StatusUpdates.DATA_ID); 40144dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 401582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_AIM, null, StatusUpdates.AVAILABLE, "Available"); 40164dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 401782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_CUSTOM, "my_im_proto", StatusUpdates.IDLE, "Idle"); 40184dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 401982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_GOOGLE_TALK, null, StatusUpdates.AWAY, "Away"); 40204dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertFalse(c.moveToNext()); 40214dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov c.close(); 4022bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 4023bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 4024bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4025bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 4026bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 402782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 40280a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 4029bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 4030bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov } 4031bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 403282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateUpdateAndDelete() { 4033bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long rawContactId = createRawContact(); 4034bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 4035bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 4036bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 4037bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4038bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 4039bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 404082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 404182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_STATUS); 4042bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 4043bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 4044aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AWAY, "BUSY", 4045aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4046aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.DO_NOT_DISTURB, "GO AWAY", 4047aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 404882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri statusUri = 4049aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 4050aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 405182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 4052bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 405382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 405482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 4055bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 4056bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 40579705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for 40589705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status 40599705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status_ts 40609705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence 40619705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori long updatedTs = 200; 40629705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String testUpdate = "test_update"; 40639705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String selection = StatusUpdates.DATA_ID + "=" + statusId; 40649705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 40659705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 40669705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 40679705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 40689705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 40699705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 40709705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 40719705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 40729705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in status_updates table ONLY 40739705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in presence table are to be updated. 40749705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori updatedTs = 300; 40759705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori testUpdate = "test_update_new"; 40769705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 40779705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 40789705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 40799705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 40809705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 40819705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 40829705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the presence column value is still the old value 40839705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 40849705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 40859705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 40869705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in presence table ONLY 40879705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in status_updates table are to be updated. 40889705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 40899705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 40909705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test_new"); 40919705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 40929705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 40939705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the status_updates table is not updated 40949705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 40959705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 40969705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 40979705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 40989705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // effect "delete status_updates" operation and expect the following 40999705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // data deleted from status_updates table 41009705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence set to null 410182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov mResolver.delete(StatusUpdates.CONTENT_URI, StatusUpdates.DATA_ID + "=" + statusId, null); 41029705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 410382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 4104a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 4105a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 4106a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 4107093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov public void testStatusUpdateUpdateToNull() { 4108093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long rawContactId = createRawContact(); 4109093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 4110093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 4111093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long contactId = queryContactId(rawContactId); 4112093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4113093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 4114093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov ContentValues values = new ContentValues(); 4115093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri statusUri = 4116093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 4117093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 4118093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 4119093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 4120093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 4121093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 4122093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 4123093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 4124093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 4125093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(StatusUpdates.PRESENCE); 4126093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov mResolver.update(StatusUpdates.CONTENT_URI, values, 4127093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.DATA_ID + "=" + statusId, null); 4128093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 4129093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 4130093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 4131093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 4132093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 4133093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov } 4134093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 413582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateWithTimestamp() { 4136a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long rawContactId = createRawContact(); 4137a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 4138a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 4139a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 4140a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long contactId = queryContactId(rawContactId); 4141a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4142aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Offline", 80, 41435d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 4144aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Available", 100, 41455d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 4146aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", 0, "Busy", 90, 41475d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 4148a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 4149a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov // Should return the latest status 4150a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContentValues values = new ContentValues(); 415182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 415282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 4153bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 41544dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 41554dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 415682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov private void assertStatusUpdate(Cursor c, int protocol, String customProtocol, int presence, 415782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String status) { 41584dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov ContentValues values = new ContentValues(); 415982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 416082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.CUSTOM_PROTOCOL, customProtocol); 4161a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(StatusUpdates.PRESENCE, presence); 416282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS, status); 41634dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertCursorValues(c, values); 41644dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 41654dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 41663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item query test cases. 41673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByRawContactId() { 41693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 41703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 41713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, mAccount); 41723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 41733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 41743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 41753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 41763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 41773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 41783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByContactId() { 41803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 41813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 41823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 41833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 41843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 41853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 41863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 41873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 41883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 41893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 41903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 41913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKey() { 41923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 41933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 41943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 41953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 41963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 41973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 41983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 41993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 42003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 42013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 42023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKeyAndContactId() { 42053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 42073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 42083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 42093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 42103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 42113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 42123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 42133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 42143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann contactId), 42153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 42163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 42173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItems() { 42203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 42223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 42233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, values); 42243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsWithSelection() { 42273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 42293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 42303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 42323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 42333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 42343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 42363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 42373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}, firstValues); 42383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 42403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 42413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Goodbye world"}, secondValues); 42423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemById() { 42453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 42473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 42483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 42493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 42513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 42523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 42533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 42543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 42563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 42573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstValues); 42583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 42603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 42613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues); 42623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion + query test cases. 42653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoWithSelection() { 42673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 42693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 42703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 42713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 42733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo1Values, null); 42746802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 42753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(2); 42763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo2Values, null); 42773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first photo. 42793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_PHOTO_URI, StreamItemPhotos.SORT_INDEX + "=?", 42803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"1"}, photo1Values); 42813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemId() { 42843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 42853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 42873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 42883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 42893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 42903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 42923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 42933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 42943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 42953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 42973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 42983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 42996802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 43003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 43023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 43036802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 43046802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 43053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 43066802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 43073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the photos from the second stream item. 43093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 43103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 43113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), photo2Values); 43123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 43133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemPhotoId() { 43153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 43163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 43183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 43193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 43203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 43213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 43233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 43243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 43253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 43263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 43283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 43293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 43303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstPhotoId = ContentUris.parseId(resultUri); 43316802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 43323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 43343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 43356802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 43366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.galaxy, PhotoSize.ORIGINAL)); 43373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 43383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondPhotoId = ContentUris.parseId(resultUri); 43396802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 43403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the first photo. 43423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 43433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 43443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 43453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 43463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstPhotoId), 43473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo1Values); 43483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the second photo. 43503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 43513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 43523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 43533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 43543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondPhotoId), 43553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo2Values); 43563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 43573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item insertion test cases. 43593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemInProfileRequiresWriteProfileAccess() { 43613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long profileRawContactId = createBasicProfileContact(new ContentValues()); 43623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // With our (default) write profile permission, we should be able to insert a stream item. 43643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 43653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 43663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now take away write profile permission. 43683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mActor.removePermissions("android.permission.WRITE_PROFILE"); 43693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Try inserting another stream item. 43713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 43723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 43733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should require WRITE_PROFILE access to insert a stream item in the profile."); 43743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 43753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Trying to insert a stream item in the profile without WRITE_PROFILE permission 43763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // should fail. 43773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 43783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 43793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemWithContentValues() { 43813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 43823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 43833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 43843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.insert(StreamItems.CONTENT_URI, values); 43853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 43863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 43873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 43883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 43893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOverLimit() { 43913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 43923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 43933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 43943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann List<Long> streamItemIds = Lists.newArrayList(); 43963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 43973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX + 1 stream items. 43983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 43993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 6; i++) { 44003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 44013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 44023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.add(ContentUris.parseId(resultUri)); 44033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Long doomedStreamItemId = streamItemIds.get(0); 44053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // There should only be MAX items. The oldest one should have been cleaned up. 44073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query( 44083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 44093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 44103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 44113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItems._ID}, null, null, null); 44123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 44133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann while(c.moveToNext()) { 44143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = c.getLong(0); 44153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.remove(streamItemId); 44163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 44183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 44193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, streamItemIds.size()); 44223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(doomedStreamItemId, streamItemIds.get(0)); 44233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOlderThanOldestInLimit() { 44263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 44273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 44283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 44293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX stream items. 44313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 44323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 44333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 44343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 44353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertNotSame("Expected non-0 stream item ID to be inserted", 44363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 0L, ContentUris.parseId(resultUri)); 44373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now try to insert a stream item that's older. It should be deleted immediately 44403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // and return an ID of 0. 44413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime - 1); 44423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 44433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(0L, ContentUris.parseId(resultUri)); 44443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion test cases. 44473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemsAndPhotosInBatch() throws Exception { 44493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 44503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemValues = buildGenericStreamItemValues(); 44513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemPhotoValues = buildGenericStreamItemPhotoValues(0); 44523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ArrayList<ContentProviderOperation> ops = Lists.newArrayList(); 44543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert( 44553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 44563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 44573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY)) 44583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemValues).build()); 44593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 44603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoValues.put(StreamItemPhotos.SORT_INDEX, i); 44613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert(StreamItems.CONTENT_PHOTO_URI) 44623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemPhotoValues) 44633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValueBackReference(StreamItemPhotos.STREAM_ITEM_ID, 0) 44643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .build()); 44653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.applyBatch(ContactsContract.AUTHORITY, ops); 44673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that all five photos were inserted under the raw contact. 44693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_URI, new String[]{StreamItems._ID}, 44703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)}, 44713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 44723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = 0; 44733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 44743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, c.getCount()); 44753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.moveToFirst(); 44763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemId = c.getLong(0); 44773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 44783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 44793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 44813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c = mResolver.query(Uri.withAppendedPath( 44823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 44836802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 44846802030a777c0c3ba1dc029c534cca4784260632Dave Santoro new String[]{StreamItemPhotos._ID, StreamItemPhotos.PHOTO_URI}, 44853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null, null); 44863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 44873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(5, c.getCount()); 44886802030a777c0c3ba1dc029c534cca4784260632Dave Santoro byte[] expectedPhotoBytes = loadPhotoFromResource( 44896802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO); 44906802030a777c0c3ba1dc029c534cca4784260632Dave Santoro while (c.moveToNext()) { 44916802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String photoUri = c.getString(1); 449287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 4493c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki expectedPhotoBytes, mResolver.openInputStream(Uri.parse(photoUri))); 44946802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 44953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 44963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 44973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 44993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item update test cases. 45013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemById() { 45033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 45043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 45053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 45063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 45073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 45083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), values, 45093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 45103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 45113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 45123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 45133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 45143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemWithContentValues() { 45163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 45173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 45183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 45193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 45203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems._ID, streamItemId); 45213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 45223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(StreamItems.CONTENT_URI, values, null, null); 45233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 45243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 45253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 45263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 45273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo update test cases. 45293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45306802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoById() throws IOException { 45313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 45323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 45333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 45343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 45353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 45363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 45373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 45383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45396802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 45406802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 45413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 45423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 45433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 45443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 45453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 45463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId); 45473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 45486802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 45493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 45506802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 45516802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 45526802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 455387426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 4554c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 45556802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 45563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 45573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45586802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoWithContentValues() throws IOException { 45593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 45603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 45613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 45623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 45633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 45643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 45653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 45663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photoValues.put(StreamItemPhotos._ID, streamItemPhotoId); 45686802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 45696802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 45703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 45713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 45723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 45733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 45743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 45756802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 45763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 45776802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 45786802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 45796802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 458087426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 4581c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 45826802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 45833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 45843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item deletion test cases. 45863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemById() { 45883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 45893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 45903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 45913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 45923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 45943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 45953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 45963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 45973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item. 45983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 45993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 46003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 46023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 46033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 46043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 46053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 46063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemWithSelection() { 46083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 46093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 46103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 46113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 46133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 46143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 46153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item with a custom selection. 46173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 46183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}); 46193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 46213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 46223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 46233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 46243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 46253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo deletion test cases. 46273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoById() { 46293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 46303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 46313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 46323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId( 46333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 46343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete( 46353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 46363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 46373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 46383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 46393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId), null, null); 46403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_PHOTO_URI, 46423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItemPhotos._ID}, 46433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.STREAM_ITEM_ID + "=?", new String[]{String.valueOf(streamItemId)}, 46443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 46453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 46463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals("Expected photo to be deleted.", 0, c.getCount()); 46473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 46483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 46493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 46503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 46513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoWithSelection() { 46533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 46543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 46553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 46563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstPhotoValues = buildGenericStreamItemPhotoValues(0); 46573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondPhotoValues = buildGenericStreamItemPhotoValues(1); 46583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, firstPhotoValues, null); 46596802030a777c0c3ba1dc029c534cca4784260632Dave Santoro firstPhotoValues.remove(StreamItemPhotos.PHOTO); // Removed while processing. 46603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, secondPhotoValues, null); 46613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = Uri.withAppendedPath( 46623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 46633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 46643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(photoUri, StreamItemPhotos.SORT_INDEX + "=1", null); 46653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, firstPhotoValues); 46673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 46683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 466982780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro public void testDeleteStreamItemsWhenRawContactDeleted() { 467082780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro long rawContactId = createRawContact(mAccount); 467182780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemUri = insertStreamItem(rawContactId, 467282780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemValues(), mAccount); 467382780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto(ContentUris.parseId(streamItemUri), 467482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemPhotoValues(0), mAccount); 467582780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro mResolver.delete(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 467682780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro null, null); 467782780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 467882780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro ContentValues[] emptyValues = new ContentValues[0]; 467982780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 468082780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro // The stream item and its photo should be gone. 468182780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemUri, emptyValues); 468282780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemPhotoUri, emptyValues); 468382780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro } 468482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 46853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemLimit() { 46863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 46873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.MAX_ITEMS, 5); 46883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_LIMIT_URI, values); 46893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 46903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 46916802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Tests for inserting or updating stream items as a side-effect of making status updates 46926802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // (forward-compatibility of status updates into the new social stream API). 46936802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 46946802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemInsertedOnStatusUpdate() { 46956802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 46966802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 46976802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 46986802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 46996802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 47006802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 47016802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 47026802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE); 47036802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 47046802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 47056802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 47064747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "hacking"); 4707d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 4708d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(String.valueOf(rawContactId)) 4709d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 4710d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues); 4711d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda } 4712d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4713d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda public void testStreamItemInsertedOnStatusUpdate_HtmlQuoting() { 4714d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4715d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // This method of creating a raw contact automatically inserts a status update with 4716d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // the status message "hacking". 4717d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues values = new ContentValues(); 4718d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda long rawContactId = createRawContact(values, "18004664411", 4719d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 4720d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.CAPABILITY_HAS_VOICE); 4721d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4722d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // Insert a new status update for the raw contact. 4723d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 4724d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.INVISIBLE, "& <b> test '", StatusUpdates.CAPABILITY_HAS_VOICE); 4725d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4726d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues expectedValues = new ContentValues(); 4727d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 47284747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "& <b> test &#39;"); 47296802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 47306802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 47316802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 47326802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 47336802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 47346802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 47356802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemUpdatedOnSecondStatusUpdate() { 47366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 47376802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 47386802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 47396802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 47406802030a777c0c3ba1dc029c534cca4784260632Dave Santoro int chatMode = StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 47416802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE; 47426802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 47436802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, chatMode); 47446802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 47456802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Insert a new status update for the raw contact. 47466802030a777c0c3ba1dc029c534cca4784260632Dave Santoro insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 47476802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.INVISIBLE, "finished hacking", chatMode); 47486802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 47496802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 47506802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 47514747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "finished hacking"); 47526802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 47536802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 47546802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 47556802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 47566802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 47576802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 475836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemReadRequiresReadSocialStreamPermission() { 475936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 476036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long contactId = queryContactId(rawContactId); 476136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String lookupKey = queryLookupKey(contactId); 476236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 476336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 476436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 476536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 476636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item in various ways. 476736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 476836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by contact ID requires social stream read permission", 476936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 477036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 477136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 477236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 477336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 477436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key requires social stream read permission", 477536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.CONTENT_LOOKUP_URI.buildUpon().appendPath(lookupKey) 477636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(Contacts.StreamItems.CONTENT_DIRECTORY).build(), 477736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 477836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 477936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 478036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key and ID requires social stream read permission", 478136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath(Contacts.getLookupUri(contactId, lookupKey), 478236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), 478336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 478436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 478536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 478636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID requires social stream read permission", 478736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 478836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 478936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 479036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 479136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 479236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID and stream item ID requires social " + 479336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "stream read permission", 479436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 479536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 479636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 479736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), 479836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro streamItemId), null, null, null, null); 479936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 480036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 480136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream items requires social stream read permission", 480236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI, null, null, null, null); 480336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 480436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 480536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream item by ID requires social stream read permission", 480636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 480736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 480836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 480936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 481036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoReadRequiresReadSocialStreamPermission() { 481136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 481236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 481336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 481436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 481536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 481636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 481736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 481836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item photo in various ways. 481936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 482036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 482136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 482236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY).build(), 482336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 482436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 482536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 482636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 482736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 482836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 482936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 483036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(), 483136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 483236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 483336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 483436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemModificationRequiresWriteSocialStreamPermission() { 483536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 483636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 483736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 483836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 483936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 484036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 484136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null); 484236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert to stream without write social stream permission"); 484336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 484436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 484536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 484636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 484736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 484836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItems.TEXT, "Goodbye world"); 484936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 485036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values, null, null); 485136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update stream without write social stream permission"); 485236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 485336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 485436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 485536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 485636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 485736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null); 485836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete from stream without write social stream permission"); 485936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 486036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 486136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 486236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 486336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoModificationRequiresWriteSocialStreamPermission() { 486436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 486536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 486636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 486736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 486836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 486936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 487036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 487136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri photoUri = StreamItems.CONTENT_URI.buildUpon() 487236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 487336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 487436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(); 487536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 487636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 487736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(1), null); 487836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert photos without write social stream permission"); 487936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 488036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 488136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 488236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 488336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 488436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource(R.drawable.galaxy, 488536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro PhotoSize.ORIGINAL)); 488636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(photoUri, values, null, null); 488736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update photos without write social stream permission"); 488836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 488936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 489036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 489136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 489236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(photoUri, null, null); 489336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete photos without write social stream permission"); 489436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 489536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 489636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 489736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 489836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStatusUpdateDoesNotRequireReadOrWriteSocialStreamPermission() { 489936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 490036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String handle1 = "test@gmail.com"; 490136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 490236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertImHandle(rawContactId, protocol1, null, handle1); 490336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 490436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 490536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 490636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 490736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA); 490836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 490936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.addPermissions("android.permission.READ_SOCIAL_STREAM"); 491036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 491136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues expectedValues = new ContentValues(); 491236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectedValues.put(StreamItems.TEXT, "Green"); 491336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro assertStoredValues(Uri.withAppendedPath( 491436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 491536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), expectedValues); 491636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 491736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 49183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemValues() { 49193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 49203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Hello world"); 49213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, System.currentTimeMillis()); 49223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.COMMENTS, "Reshared by 123 others"); 49233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 49243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 49253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 49263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemPhotoValues(int sortIndex) { 49273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 49283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItemPhotos.SORT_INDEX, sortIndex); 49296802030a777c0c3ba1dc029c534cca4784260632Dave Santoro values.put(StreamItemPhotos.PHOTO, 49306802030a777c0c3ba1dc029c534cca4784260632Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.ORIGINAL)); 49313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 49323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 49333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 493482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testSingleStatusUpdateRowPerContact() { 4935bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 4936bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar String handle1 = "test@gmail.com"; 4937bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4938d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 49394dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId1, protocol1, null, handle1); 4940bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4941aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 4942aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4943aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AWAY, "Yellow", 4944aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4945aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.INVISIBLE, "Red", 4946aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4947bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4948af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov Cursor c = queryContact(queryContactId(rawContactId1), 494982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov new String[] {Contacts.CONTACT_PRESENCE, Contacts.CONTACT_STATUS}); 49504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 4951bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4952bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar c.moveToFirst(); 495382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(StatusUpdates.INVISIBLE, c.getInt(0)); 495482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals("Red", c.getString(1)); 49550265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov c.close(); 4956bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 4957bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4958d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void updateSendToVoicemailAndRingtone(long contactId, boolean sendToVoicemail, 4959d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String ringtone) { 4960d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 4961d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 4962d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (ringtone != null) { 4963d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 4964d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4965d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4966d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4967d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov int count = mResolver.update(uri, values, null, null); 4968d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(1, count); 49698c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 49708c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 49718c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov private void updateSendToVoicemailAndRingtoneWithSelection(long contactId, 49728c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov boolean sendToVoicemail, String ringtone) { 49738c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov ContentValues values = new ContentValues(); 49748c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 49758c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov if (ringtone != null) { 49768c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 49778c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 49788c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 49798c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov int count = mResolver.update(Contacts.CONTENT_URI, values, Contacts._ID + "=" + contactId, 49808c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov null); 49818c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertEquals(1, count); 4982d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4983d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4984d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void assertSendToVoicemailAndRingtone(long contactId, boolean expectedSendToVoicemail, 4985d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String expectedRingtone) { 4986d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 4987d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 4988d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 4989d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(expectedSendToVoicemail ? 1 : 0, sendToVoicemail); 4990d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String ringtone = c.getString(c.getColumnIndex(Contacts.CUSTOM_RINGTONE)); 4991d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (expectedRingtone == null) { 4992d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertNull(ringtone); 4993d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } else { 4994d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(ArrayUtils.contains(expectedRingtone.split(","), ringtone)); 4995d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4996d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 4997d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 49989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 49990be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov public void testContactVisibilityUpdateOnMembershipChange() { 50000be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long rawContactId = createRawContact(mAccount); 50010be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 50020be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50030be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long visibleGroupId = createGroup(mAccount, "123", "Visible", 1); 50040be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long invisibleGroupId = createGroup(mAccount, "567", "Invisible", 0); 50050be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50060be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership1 = insertGroupMembership(rawContactId, visibleGroupId); 50070be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 50080be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50090be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership2 = insertGroupMembership(rawContactId, invisibleGroupId); 50100be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 50110be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50120be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.delete(membership1, null, null); 50130be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 50140be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50150be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov ContentValues values = new ContentValues(); 50160be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov values.put(GroupMembership.GROUP_ROW_ID, visibleGroupId); 50170be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50180be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.update(membership2, values, null, null); 50190be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 50200be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 50210be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50220be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov private void assertVisibility(long rawContactId, String expectedValue) { 50230be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, Contacts._ID + "=" + queryContactId(rawContactId), 50240be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov null, Contacts.IN_VISIBLE_GROUP, expectedValue); 50250be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 50260be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 50270db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov public void testSupplyingBothValuesAndParameters() throws Exception { 50280db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Account account = new Account("account 1", "type%/:1"); 50290db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Uri uri = ContactsContract.Groups.CONTENT_URI.buildUpon() 50300db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME, account.name) 50310db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE, account.type) 50320db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") 50330db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .build(); 50340db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 50350db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(uri); 50360db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type); 50370db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 50380db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some id"); 50390db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some name"); 50400db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 50410db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 50420db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 50430db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 50440db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder = ContentProviderOperation.newInsert(uri); 50450db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type + "diff"); 50460db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 50470db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some other id"); 50480db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some other name"); 50490db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 50500db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 50510db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov try { 50520db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 50530db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov fail("Expected IllegalArgumentException"); 50540db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } catch (IllegalArgumentException ex) { 50550db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov // Expected 50560db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 50570db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 50580db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 5059a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContentEntityIterator() { 50609261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana // create multiple contacts and check that the selected ones are returned 50619261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id; 50629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 50639261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 50649261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId2 = createGroup(mAccount, "gsid2", "title2"); 50659261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 50663cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0"); 50673cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertGroupMembership(id, "gsid1"); 50683cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertEmail(id, "c0@email.com"); 50693cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertPhoneNumber(id, "5551212c0"); 50709261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 5071226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c1 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c1"); 50729261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_0 = insertGroupMembership(id, "gsid1"); 50739261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_1 = insertGroupMembership(id, "gsid2"); 50749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_2 = insertEmail(id, "c1@email.com"); 50759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_3 = insertPhoneNumber(id, "5551212c1"); 50769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 5077226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c2 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c2"); 50789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_0 = insertGroupMembership(id, "gsid1"); 50799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_1 = insertEmail(id, "c2@email.com"); 50809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_2 = insertPhoneNumber(id, "5551212c2"); 50819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 50823cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long c3 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c3"); 50839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_0 = insertGroupMembership(id, groupId2); 50849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_1 = insertEmail(id, "c3@email.com"); 50859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_2 = insertPhoneNumber(id, "5551212c3"); 50869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 508762318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana EntityIterator iterator = RawContacts.newEntityIterator(mResolver.query( 508862318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana maybeAddAccountQueryParameters(RawContactsEntity.CONTENT_URI, mAccount), null, 508962318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana RawContacts.SOURCE_ID + " in ('c1', 'c2', 'c3')", null, null)); 50909261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Entity entity; 50919261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues[] subValues; 50929261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 50936cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c1, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 50949261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 50959261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(4, subValues.length); 50969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 50979261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_0, 50989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 50999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 51009261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], GroupMembership.CONTENT_ITEM_TYPE, 51019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_1, 51029261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 51039261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 51049261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Email.CONTENT_ITEM_TYPE, 51059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_2, 51069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c1@email.com"); 51079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[3], Phone.CONTENT_ITEM_TYPE, 51089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_3, 51099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c1"); 51109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 51119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 51126cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c2, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 51139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 51149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 51159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 51169261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_0, 51179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 51189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 51199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 51209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_1, 51219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c2@email.com"); 51229261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 51239261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_2, 51249261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c2"); 51259261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 51269261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 51276cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c3, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 51289261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 51299261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 51309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 51319261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_0, 51329261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 51339261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 51349261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 51359261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_1, 51369261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c3@email.com"); 51379261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 51389261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_2, 51399261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c3"); 51409261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 51419261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(iterator.hasNext()); 51423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov iterator.close(); 51439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 514420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 514520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov public void testDataCreateUpdateDeleteByMimeType() throws Exception { 5146d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 514720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 514820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov ContentValues values = new ContentValues(); 51495ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 515020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 515120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 515220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 515320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 515420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "old1"); 515520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "old2"); 515620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "old3"); 515720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "old4"); 515820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "old5"); 515920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "old6"); 516020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "old7"); 516120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "old8"); 516220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "old9"); 516320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "old10"); 516420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "old11"); 516520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "old12"); 516620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "old13"); 516720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "old14"); 516820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "old15"); 516920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Uri uri = mResolver.insert(Data.CONTENT_URI, values); 517020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 517181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 517220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 517320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.clear(); 517420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "newpackage"); 517520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 0); 517620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 0); 517720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "new1"); 517820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "new2"); 517920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "new3"); 518020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "new4"); 518120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "new5"); 518220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "new6"); 518320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "new7"); 518420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "new8"); 518520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "new9"); 518620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "new10"); 518720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "new11"); 518820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "new12"); 518920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "new13"); 519020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "new14"); 519120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "new15"); 51925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mResolver.update(Data.CONTENT_URI, values, Data.RAW_CONTACT_ID + "=" + rawContactId + 519320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov " AND " + Data.MIMETYPE + "='testmimetype'", null); 519481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 519570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 519620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 519720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 51985ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov int count = mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 519920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null); 520020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals(1, count); 52015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertEquals(0, getCount(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 520233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null)); 520381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 520433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 520520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 520689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactQuery() { 520789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 520889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 520989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 521089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 521189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 521289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account1); 521389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account2); 521489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 521589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 521689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, RawContacts._ID, rawContactId1) ; 521789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, RawContacts._ID, rawContactId2) ; 521889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 521989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri1 = ContentUris.withAppendedId(uri1, rawContactId1); 522089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri2 = ContentUris.withAppendedId(uri2, rawContactId2); 522189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri1, RawContacts._ID, rawContactId1) ; 522289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri2, RawContacts._ID, rawContactId2) ; 522389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 522489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 5225373f7d2adc36680c31ff33e9ee12be865af6b5fbDmitri Plotnikov public void testRawContactDeletion() { 5226e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId = createRawContact(mAccount); 52275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 522833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 52294dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 523082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 5231aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 5232aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 5233a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId); 5234a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 523533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 523633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 523782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 52384dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 523933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 524033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(uri, null, null); 524133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 52425870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 524381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 524433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 5245e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 524633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 524733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 524833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 524933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 525082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 52514dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 5252a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 525381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 5254a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov } 5255a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 5256a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov public void testRawContactDeletionKeepingAggregateContact() { 5257e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId1 = createRawContactWithName(mAccount); 5258e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId2 = createRawContactWithName(mAccount); 525947fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 526047fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 5261a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 5262a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 5263a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 5264a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 5265e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 5266a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 5267a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 5268a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(1, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 526920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 52701fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 52715f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testRawContactDeletion_byAccountParam() { 5272e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong long rawContactId = createRawContact(mAccount); 5273e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 5274e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 5275e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 527682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 5277aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 5278aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 5279e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 5280e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong null, null)); 528182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 5282e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong + rawContactId, null)); 5283e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 5284e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Do not delete if we are deleting with wrong account. 5285e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithWrongAccountUri = 5286e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 5287e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountTwo.name) 5288e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccountTwo.type) 5289e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 52905f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki int numDeleted = mResolver.delete(deleteWithWrongAccountUri, null, null); 52915f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(0, numDeleted); 5292e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 52935870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "0"); 5294e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 5295e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Delete if we are deleting with correct account. 5296e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithCorrectAccountUri = 5297e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 5298e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name) 5299e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type) 5300e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 53015f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki numDeleted = mResolver.delete(deleteWithCorrectAccountUri, null, null); 53025f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(1, numDeleted); 53035f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 53045f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValue(uri, RawContacts.DELETED, "1"); 53055f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki } 53065f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 53075f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki public void testRawContactDeletion_byAccountSelection() { 53085f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki long rawContactId = createRawContact(mAccount); 53095f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 53105f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 53115f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki // Do not delete if we are deleting with wrong account. 53125f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki int numDeleted = mResolver.delete(RawContacts.CONTENT_URI, 53135f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", 53145f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[] {mAccountTwo.name, mAccountTwo.type}); 53155f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(0, numDeleted); 53165f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 53175f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertStoredValue(uri, RawContacts.DELETED, "0"); 53185f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki 53195f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki // Delete if we are deleting with correct account. 53205f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki numDeleted = mResolver.delete(RawContacts.CONTENT_URI, 53215f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", 53225f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki new String[] {mAccount.name, mAccount.type}); 53235f673b204620c4c241b3b39c6ac0ee063d22f13bMakoto Onuki assertEquals(1, numDeleted); 5324e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 53255870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 5326e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong } 5327e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 53289ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki /** 53299ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * Test for {@link ContactsProvider2#stringToAccounts} and 53309ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * {@link ContactsProvider2#accountsToString}. 53319ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki */ 53329ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki public void testAccountsToString() { 53339ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_0 = Sets.newHashSet(); 53349ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_1 = Sets.newHashSet(ACCOUNT_1); 53359ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_2 = Sets.newHashSet(ACCOUNT_2); 53369ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> EXPECTED_1_2 = Sets.newHashSet(ACCOUNT_1, ACCOUNT_2); 53379ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53389ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_0 = Sets.newHashSet(); 53399ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_1 = Sets.newHashSet(ACCOUNT_1); 53409ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_2 = Sets.newHashSet(ACCOUNT_2); 53419ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Set<Account> ACTUAL_1_2 = Sets.newHashSet(ACCOUNT_2, ACCOUNT_1); 53429ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53439ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_0))); 53449ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_1))); 53459ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_2))); 53469ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_0.equals(accountsToStringToAccounts(ACTUAL_1_2))); 53479ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53489ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_0))); 53499ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_1))); 53509ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_2))); 53519ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1.equals(accountsToStringToAccounts(ACTUAL_1_2))); 53529ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53539ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_0))); 53549ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_1))); 53559ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_2))); 53569ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_2.equals(accountsToStringToAccounts(ACTUAL_1_2))); 53579ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53589ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_0))); 53599ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_1))); 53609ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_2))); 53619ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(EXPECTED_1_2.equals(accountsToStringToAccounts(ACTUAL_1_2))); 53629ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53639ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki try { 53649ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki ContactsProvider2.stringToAccounts("x"); 53659ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki fail("Didn't throw for malformed input"); 53669ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } catch (IllegalArgumentException expected) { 53679ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 53689ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 53699ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53709ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki private static final Set<Account> accountsToStringToAccounts(Set<Account> accounts) { 53719ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki return ContactsProvider2.stringToAccounts(ContactsProvider2.accountsToString(accounts)); 53729ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 53739ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53749ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki /** 53759ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * Test for {@link ContactsProvider2#haveAccountsChanged} and 53769ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki * {@link ContactsProvider2#saveAccounts}. 53779ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki */ 53789ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki public void testHaveAccountsChanged() { 53799ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final ContactsProvider2 cp = (ContactsProvider2) getProvider(); 53809ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53819ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_0 = new Account[] {}; 53829ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_1 = new Account[] {ACCOUNT_1}; 53839ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_2 = new Account[] {ACCOUNT_2}; 53849ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_1_2 = new Account[] {ACCOUNT_1, ACCOUNT_2}; 53859ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final Account[] ACCOUNTS_2_1 = new Account[] {ACCOUNT_2, ACCOUNT_1}; 53869ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53879ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Add ACCOUNT_1 53889ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53899ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1)); 53909ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_1); 53919ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_1)); 53929ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53939ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Add ACCOUNT_2 53949ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 53959ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1_2)); 53969ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // (try with reverse order) 53979ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_2_1)); 53989ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_1_2); 53999ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_1_2)); 54009ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // (try with reverse order) 54019ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_2_1)); 54029ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 54039ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Remove ACCOUNT_1 54049ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 54059ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_2)); 54069ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_2); 54079ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_2)); 54089ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 54099ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Remove ACCOUNT_2 54109ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 54119ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_0)); 54129ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki cp.saveAccounts(ACCOUNTS_0); 54139ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertFalse(cp.haveAccountsChanged(ACCOUNTS_0)); 54149ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 54159ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // Test with malformed DB property. 54169ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 54179ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki final ContactsDatabaseHelper dbHelper = cp.getThreadActiveDatabaseHelperForTest(); 54189ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki dbHelper.setProperty(DbProperties.KNOWN_ACCOUNTS, "x"); 54199ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 54209ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki // With malformed property the method always return true. 54219ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_0)); 54229ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki assertTrue(cp.haveAccountsChanged(ACCOUNTS_1)); 54239ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki } 54249ba8463dd030e5e26a4f99dfe2a6ad52b2410d73Makoto Onuki 5425627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov public void testAccountsUpdated() { 542670d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // This is to ensure we do not delete contacts with null, null (account name, type) 542770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // accidentally. 542870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId3 = createRawContactWithName("James", "Sullivan"); 542970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertPhoneNumber(rawContactId3, "5234567890"); 5430627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov Uri rawContact3 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId3); 5431743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 543270d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 543370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong ContactsProvider2 cp = (ContactsProvider2) getProvider(); 5434bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount, mAccountTwo}); 5435743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount, mAccountTwo}); 5436743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 5437dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_NAME, null); 5438dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_TYPE, null); 543970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 5440743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 5441743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId1, "account1@email.com"); 5442743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId2 = createRawContact(mAccountTwo); 5443743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId2, "account2@email.com"); 5444743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertImHandle(rawContactId2, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 5445743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 5446aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 5447aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 5448743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 5449bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount}); 5450743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount}); 5451627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov assertEquals(2, getCount(RawContacts.CONTENT_URI, null, null)); 545282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 545370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong + rawContactId2, null)); 545470d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong } 545570d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 545633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov public void testAccountDeletion() { 545733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Account readOnlyAccount = new Account("act", READ_ONLY_ACCOUNT_TYPE); 545833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContactsProvider2 cp = (ContactsProvider2) getProvider(); 5459bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount, mAccount}); 546033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount, mAccount}); 546133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 546233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", readOnlyAccount); 546333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri1 = insertPhoto(rawContactId1); 546433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId2 = createRawContactWithName("john", "doe", mAccount); 546533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri2 = insertPhoto(rawContactId2); 546633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov storeValue(photoUri2, Photo.IS_SUPER_PRIMARY, "1"); 546733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 546833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 546933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 547033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 547133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 547233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the writable account 547333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 547433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 547533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 547633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "john doe"); 547733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 547833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the one we marked as super-primary 547933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 548033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri2)); 548133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 5482bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount}); 548333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // Remove the writable account 548433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount}); 548533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 548633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the remaining account 548733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 548833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 548933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 549033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "John Doe"); 549133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 549233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the remaining one 549333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 549433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri1)); 549533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov } 549633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 5497c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro public void testStreamItemsCleanedUpOnAccountRemoval() { 5498c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account doomedAccount = new Account("doom", "doom"); 5499c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account safeAccount = mAccount; 5500c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContactsProvider2 cp = (ContactsProvider2) getProvider(); 5501c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{doomedAccount, safeAccount}); 5502c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{doomedAccount, safeAccount}); 5503c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5504c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a doomed raw contact, stream item, and photo. 5505c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedRawContactId = createRawContactWithName(doomedAccount); 5506c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemUri = 5507c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(doomedRawContactId, buildGenericStreamItemValues(), doomedAccount); 5508c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedStreamItemId = ContentUris.parseId(doomedStreamItemUri); 5509c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemPhotoUri = insertStreamItemPhoto( 5510c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro doomedStreamItemId, buildGenericStreamItemPhotoValues(0), doomedAccount); 5511c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5512c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a safe raw contact, stream item, and photo. 5513c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeRawContactId = createRawContactWithName(safeAccount); 5514c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemUri = 5515c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(safeRawContactId, buildGenericStreamItemValues(), safeAccount); 5516c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemId = ContentUris.parseId(safeStreamItemUri); 5517c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemPhotoUri = insertStreamItemPhoto( 5518c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeStreamItemId, buildGenericStreamItemPhotoValues(0), safeAccount); 5519c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemPhotoId = ContentUris.parseId(safeStreamItemPhotoUri); 5520c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5521c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Remove the doomed account. 5522c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{safeAccount}); 5523c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{safeAccount}); 5524c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5525c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the doomed stuff has all been nuked. 5526c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContentValues[] noValues = new ContentValues[0]; 5527c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(ContentUris.withAppendedId(RawContacts.CONTENT_URI, doomedRawContactId), 5528c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro noValues); 5529c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemUri, noValues); 5530c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemPhotoUri, noValues); 5531c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5532c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the safe stuff lives on. 5533c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(RawContacts.CONTENT_URI, safeRawContactId, RawContacts._ID, 5534c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeRawContactId); 5535c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemUri, StreamItems._ID, safeStreamItemId); 5536c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemPhotoUri, StreamItemPhotos._ID, safeStreamItemPhotoId); 5537c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro } 5538c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 5539cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov public void testContactDeletion() { 554047fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 554147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_2); 5542cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 5543cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long contactId = queryContactId(rawContactId1); 5544cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 5545cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov mResolver.delete(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), null, null); 5546cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 5547cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1), 5548cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 5549cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2), 5550cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 5551cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov } 5552cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 555373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 555473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov long rawContactId = createRawContact(mAccount); 555573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 555673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 555773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = insertStructuredName(rawContactId, "John", "Doe"); 555873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov clearDirty(rawContactUri); 5559e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri updateUri = setCallerIsSyncAdapter(uri, mAccount); 556073776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 556173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 556273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dough"); 556373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 55645870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, StructuredName.FAMILY_NAME, "Dough"); 556573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(rawContactUri, false); 556681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 55671fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 55681fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 556961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDirtyAndVersion() { 5570d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final long rawContactId = createRawContact(mAccount); 5571d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); 557273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 55731fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 55741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 55751fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 55761fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.DIRTY, 0); 55771fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.SEND_TO_VOICEMAIL, 1); 557861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.AGGREGATION_MODE, 5579c100221f706afc08409e8317a27d6850b11c54d3Omari Stephens RawContacts.AGGREGATION_MODE_IMMEDIATE); 558061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.STARRED, 1); 55811fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(1, mResolver.update(uri, values, null, null)); 55821fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 55831fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 55841fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 558581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 55861fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 558761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "goo@woo.com"); 558861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 558981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 55901fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 55911fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 559261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 55931fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 559461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values = new ContentValues(); 559561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(Email.DATA, "goo@hoo.com"); 559661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.update(emailUri, values, null, null); 55971fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 559881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 55991fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 56001fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 560161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 56021fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 560361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(emailUri, null, null); 56041fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 560581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 56061fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 56071fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 560861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov } 56091fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 561061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactClearDirty() { 561161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 561261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 561361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 561461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov long version = getVersion(uri); 561561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov insertEmail(rawContactId, "goo@woo.com"); 56161fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 561761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 56181fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 56191fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 56201fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana clearDirty(uri); 56211fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 56221fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 56231fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 56241fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 562561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDeletionSetsDirty() { 562661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 56271fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 562861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 56291fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 563061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 563161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, false); 563261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov 563361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(uri, null, null); 56345870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 563561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 563681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 563761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 563861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertEquals(version, getVersion(uri)); 56391fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 56404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 56419fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutName() { 56429fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 56439fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 56449fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 56459fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri phoneUri = insertPhoneNumber(rawContactId, "555-123-45678", true); 56469fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 56479fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 56489fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 56499fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 56509fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 56519fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 56529fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 56539fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 56549fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 56559fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutAnyData() { 56569fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 56579fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 56589fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 56599fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 56609fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 56619fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 56629fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 56639fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 56649fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 56659fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 56669fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 566760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testDeleteContactWithEscapedUri() { 566860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 566960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 567060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 567160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 567260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 567360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 567460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 567560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 567660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, mResolver.delete(lookupUri, null, null)); 567760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 567860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 567960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testQueryContactWithEscapedUri() { 568060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 568160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 568260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 568360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 568460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 568560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 568660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 568760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 568860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Cursor c = mResolver.query(lookupUri, null, null, null, ""); 568960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, c.getCount()); 569060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 569160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 569260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 5693074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov public void testGetPhotoUri() { 5694074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov ContentValues values = new ContentValues(); 5695074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 5696074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 5697074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 5698f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5699f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 5700f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId)}, Photo.PHOTO_FILE_ID); 5701f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId) 5702f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 5703074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 57043d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov assertStoredValue( 57053d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(rawContactId)), 5706f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI, photoUri); 5707074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov } 5708074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 5709bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro public void testGetPhotoViaLookupUri() throws IOException { 5710bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long rawContactId = createRawContact(); 5711bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long contactId = queryContactId(rawContactId); 5712bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5713bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 5714bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro String lookupKey = lookupUri.getPathSegments().get(2); 5715bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 5716bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro byte[] thumbnail = loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL); 5717bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5718bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Two forms of lookup key URIs should be valid - one with the contact ID, one without. 5719bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithId = Uri.withAppendedPath(lookupUri, "photo"); 5720bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithoutId = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5721bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro .appendPath(lookupKey).appendPath("photo").build(); 5722bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5723bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try retrieving as a data record. 5724bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro ContentValues values = new ContentValues(); 5725bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro values.put(Photo.PHOTO, thumbnail); 5726bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithId, values); 5727bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithoutId, values); 5728bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5729bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try opening as an input stream. 573087426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5731c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki thumbnail, mResolver.openInputStream(photoLookupUriWithId)); 573287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5733c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki thumbnail, mResolver.openInputStream(photoLookupUriWithoutId)); 5734bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro } 5735bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 5736ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert public void testInputStreamForPhoto() throws Exception { 5737e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov long rawContactId = createRawContact(); 5738f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5739f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5740f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId); 5741f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_URI)); 5742f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoThumbnailUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI)); 5743e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 574487426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // Check the thumbnail. 574587426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), loadTestPhoto(PhotoSize.THUMBNAIL), 5746f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoThumbnailUri)); 574787426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki 574887426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // Then check the display photo. Note because we only inserted a small photo, but not a 574987426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // display photo, this returns the thumbnail image itself, which was compressed at 575087426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // the thumnail compression rate, which is why we compare to 575187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // loadTestPhoto(PhotoSize.THUMBNAIL) rather than loadTestPhoto(PhotoSize.DISPLAY_PHOTO) 575287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // here. 575387426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // (In other words, loadTestPhoto(PhotoSize.DISPLAY_PHOTO) returns the same photo as 575487426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki // loadTestPhoto(PhotoSize.THUMBNAIL), except it's compressed at a lower compression rate.) 575587426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), loadTestPhoto(PhotoSize.THUMBNAIL), 575687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki mResolver.openInputStream(photoUri)); 5757ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 5758ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert 5759732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov public void testSuperPrimaryPhoto() { 5760732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId1 = createRawContact(new Account("a", "a")); 5761f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri1 = insertPhoto(rawContactId1, R.drawable.earth_normal); 5762732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId1 = ContentUris.parseId(photoUri1); 5763732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5764732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId2 = createRawContact(new Account("b", "b")); 5765f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri2 = insertPhoto(rawContactId2, R.drawable.earth_normal); 5766732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId2 = ContentUris.parseId(photoUri2); 5767732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5768732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 5769732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5770732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5771732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 5772732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 5773f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5774f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 5775f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(photoId1)}, Photo.PHOTO_FILE_ID); 5776f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId1) 5777f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 5778732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 5779f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValue(contactUri, Contacts.PHOTO_URI, photoUri); 5780732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5781732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 5782732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5783732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5784732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov ContentValues values = new ContentValues(); 5785732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 5786732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri2, values, null, null); 5787732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5788732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 5789732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 5790732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 5791732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 5792732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId2); 5793732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 5794732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri1, values, null, null); 5795732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 5796732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov } 5797732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 57988e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public void testUpdatePhoto() { 57998e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov ContentValues values = new ContentValues(); 58008e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 58018e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 58028e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 58038e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 58048e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri twigUri = Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 58058e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov queryContactId(rawContactId)), Contacts.Photo.CONTENT_DIRECTORY); 58068e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 58078e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 58088e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 58098e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 58108e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.putNull(Photo.PHOTO); 58118e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 58128e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long photoId = ContentUris.parseId(dataUri); 58138e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5814155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov assertEquals(0, getCount(twigUri, null, null)); 58158e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 58168e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 58178e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Photo.PHOTO, loadTestPhoto()); 58188e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov mResolver.update(dataUri, values, null, null); 581981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 58208e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5821f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long twigId = getStoredLongValue(twigUri, Data._ID); 58228e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov assertEquals(photoId, twigId); 58238e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov } 58248e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 58254e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactDataPhoto() { 58267d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a contact with a null photo 58277d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentValues values = new ContentValues(); 58287d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 58297d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh long rawContactId = ContentUris.parseId(rawContactUri); 58307d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 58317d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a photo 58327d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.RAW_CONTACT_ID, rawContactId); 58337d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 58347d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.putNull(Photo.PHOTO); 58357d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 58367d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // try to do an update before insert should return count == 0 58377d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri dataUri = Uri.withAppendedPath( 58387d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 58397d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh RawContacts.Data.CONTENT_DIRECTORY); 58407d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(0, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 58417d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 58427d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 58437d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh mResolver.insert(Data.CONTENT_URI, values); 58447d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 58457d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // save a photo to the db 58467d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.clear(); 58477d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 58487d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Photo.PHOTO, loadTestPhoto()); 58497d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(1, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 58507d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 58517d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 58527d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // verify the photo 58534e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Cursor storedPhoto = mResolver.query(dataUri, new String[] {Photo.PHOTO}, 58547d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Data.MIMETYPE + "=?", new String[] {Photo.CONTENT_ITEM_TYPE}, null); 58554e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov storedPhoto.moveToFirst(); 5856f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro MoreAsserts.assertEquals(loadTestPhoto(PhotoSize.THUMBNAIL), storedPhoto.getBlob(0)); 58570265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov storedPhoto.close(); 58587d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh } 58597d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 5860f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactId() throws IOException { 5861f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5862f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5863f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5864f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_URI.buildUpon() 5865f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5866f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 586787426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5868f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5869f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5870f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5871f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5872f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKey() throws IOException { 5873f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5874f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5875f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5876f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5877f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5878f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5879f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 588087426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5881f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5882f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5883f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5884f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5885f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKeyAndId() throws IOException { 5886f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5887f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5888f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5889f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5890f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5891f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5892f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5893f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 589487426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5895f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5896f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5897f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5898f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5899f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForRawContactId() throws IOException { 5900f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5901f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5902f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = RawContacts.CONTENT_URI.buildUpon() 5903f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5904f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 590587426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5906f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5907f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5908f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5909f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5910f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoByPhotoUri() throws IOException { 5911f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5912f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5913f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5914f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5915f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Get the photo URI out and check the content. 5916f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5917f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5918f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 591987426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5920f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5921f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5922f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5923f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5924f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForDisplayPhoto() { 5925f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5926f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5927f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5928f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is larger than a thumbnail, so it will be stored as a file. 5929f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5930f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoFileId = getStoredValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 5931f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5932f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5933f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5934f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5935f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5936f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI differs from the thumbnail. 5937f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5938f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5939f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5940f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(photoUri.equals(thumbnailUri)); 5941f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5942f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form display_photo/ID 5943f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath(DisplayPhoto.CONTENT_URI, photoFileId).toString(), 5944f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5945f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5946f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5947f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForThumbnailPhoto() throws IOException { 5948f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5949f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5950f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5951f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is a thumbnail, so it will only be stored in a BLOB. The photo URI 5952f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // will fall back to the thumbnail URI. 5953f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 5954f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5955f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5956f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5957f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5958f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI is equal to the thumbnail URI. 5959f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5960f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5961f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5962f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 5963f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5964f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form contacts/ID/photo 5965f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath( 5966f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5967f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.Photo.CONTENT_DIRECTORY).toString(), 5968f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5969f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5970f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Loading the photo URI content should get the thumbnail. 597187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 5972f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 5973f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5974f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5975f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5976c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteNewPhotoToAssetFile() throws Exception { 5977f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5978f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5979f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5980f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 5981c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final byte[] originalPhoto = loadPhotoFromResource( 5982c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL); 5983f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5984f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 5985c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 5986f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5987f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5988c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 5989f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5990f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo and thumbnail have been set. 5991c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro String photoUri = null; 5992c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro for (int i = 0; i < 10 && photoUri == null; i++) { 5993c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Wait a tick for the photo processing to occur. 5994c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(100); 5995c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro photoUri = getStoredValue( 5996c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5997c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Contacts.PHOTO_URI); 5998c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5999c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 6000f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(photoUri)); 6001f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 6002f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 6003f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 6004f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(thumbnailUri)); 6005c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro assertNotSame(photoUri, thumbnailUri); 6006f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6007f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 600887426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 6009f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 6010f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 601187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 6012f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 6013f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(thumbnailUri))); 6014f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 6015f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6016c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteUpdatedPhotoToAssetFile() throws Exception { 6017f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 6018f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 6019f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6020f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a large photo first. 6021f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_large); 6022f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String largeEarthPhotoUri = getStoredValue( 6023f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 6024f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6025f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 6026f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro byte[] originalPhoto = loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL); 6027f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6028f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 6029f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 6030f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 6031f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 6032c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 6033c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 6034c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Allow a second for processing to occur. 6035c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(1000); 6036f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6037f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo URI has been modified. 6038f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthPhotoUri = getStoredValue( 6039f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 6040f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(hugeEarthPhotoUri.equals(largeEarthPhotoUri)); 6041f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6042f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 6043f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthThumbnailUri = getStoredValue( 6044f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 6045f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 604687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 6047f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 6048f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthPhotoUri))); 604987426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 6050f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 6051f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthThumbnailUri))); 6052f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6053f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 6054f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6055c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro private void writePhotoAsync(final Uri uri, final byte[] photoBytes) throws Exception { 6056c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro AsyncTask<Object, Object, Object> task = new AsyncTask<Object, Object, Object>() { 6057c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro @Override 6058c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro protected Object doInBackground(Object... params) { 6059c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro OutputStream os; 6060c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro try { 6061c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os = mResolver.openOutputStream(uri, "rw"); 6062c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.write(photoBytes); 6063c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.close(); 6064c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro return null; 6065c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } catch (IOException ioe) { 6066c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro throw new RuntimeException(ioe); 6067c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 6068c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 6069c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro }; 6070c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Object[])null).get(); 6071c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 6072c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 6073f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoDimensionLimits() { 6074f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 6075f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.DISPLAY_MAX_DIM, 256); 6076f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.THUMBNAIL_MAX_DIM, 96); 6077f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValues(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI, values); 6078f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 6079f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6080f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoStoreCleanup() throws IOException { 6081f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 6082c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro PhotoStore photoStore = provider.getPhotoStore(); 6083f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6084f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 6085f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 6086f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6087f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a couple of contacts with photos. 6088f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId1 = createRawContactWithName(); 6089f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId1 = queryContactId(rawContactId1); 6090f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId1 = ContentUris.parseId(insertPhoto(rawContactId1, R.drawable.earth_normal)); 6091f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = 6092f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId1), 6093f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 6094f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6095f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId2 = createRawContactWithName(); 6096f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId2 = queryContactId(rawContactId2); 6097f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId2 = ContentUris.parseId(insertPhoto(rawContactId2, R.drawable.earth_normal)); 6098f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId2 = 6099f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 6100f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 6101f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6102f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Update the second raw contact with a different photo. 6103f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 6104f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId2); 6105f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 6106f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL)); 6107f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(1, mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 6108f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId2)})); 6109f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long replacementPhotoFileId = 6110f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 6111f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 6112f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6113f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a third raw contact that has a bogus photo file ID. 6114f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusFileId = 1234567; 6115f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId3 = createRawContactWithName(); 6116f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId3 = queryContactId(rawContactId3); 6117f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.clear(); 6118f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId3); 6119f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 6120f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_normal, 6121f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoSize.THUMBNAIL)); 6122f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO_FILE_ID, bogusFileId); 6123f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DataRowHandlerForPhoto.SKIP_PROCESSING_KEY, true); 6124f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.insert(Data.CONTENT_URI, values); 6125f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6126c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // Insert a fourth raw contact with a stream item that has a photo, then remove that photo 6127c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // from the photo store. 6128c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Account socialAccount = new Account("social", "social"); 6129c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long rawContactId4 = createRawContactWithName(socialAccount); 6130c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemUri = 6131c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro insertStreamItem(rawContactId4, buildGenericStreamItemValues(), socialAccount); 6132c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 6133c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 6134c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 6135c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 6136c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 6137c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro photoStore.remove(streamItemPhotoFileId); 6138c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 6139f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Also insert a bogus photo that nobody is using. 6140f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusPhotoId = photoStore.insert(new PhotoProcessor(loadPhotoFromResource( 6141f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL), 256, 96)); 6142f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6143f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Manually trigger another cleanup in the provider. 6144f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 6145f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6146f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // The following things should have happened. 6147f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6148f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 1. Raw contact 1 and its photo remain unaffected. 6149f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoFileId1, (long) getStoredLongValue( 6150f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1), 6151f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 6152f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6153f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 2. Raw contact 2 retains its new photo. The old one is deleted from the photo store. 6154f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(replacementPhotoFileId, (long) getStoredLongValue( 6155f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2), 6156f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 6157f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(photoFileId2)); 6158f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6159f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 3. Raw contact 3 should have its photo file reference cleared. 6160f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue( 6161f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId3), 6162f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 6163f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6164f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 4. The bogus photo that nobody was using should be cleared from the photo store. 6165f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(bogusPhotoId)); 6166c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 6167c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // 5. The bogus stream item photo should be cleared from the stream item. 6168c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro assertStoredValues(Uri.withAppendedPath( 6169c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 6170c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 6171c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro new ContentValues[0]); 6172f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 6173f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6174d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro public void testPhotoStoreCleanupForProfile() { 6175d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 6176d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro PhotoStore profilePhotoStore = provider.getProfilePhotoStore(); 6177d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6178d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 6179ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki provider.switchToProfileModeForTest(); 6180d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 6181d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6182d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Create the profile contact and add a photo. 6183d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Account socialAccount = new Account("social", "social"); 6184d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentValues values = new ContentValues(); 6185d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_NAME, socialAccount.name); 6186d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_TYPE, socialAccount.type); 6187d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileRawContactId = createBasicProfileContact(values); 6188d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileContactId = queryContactId(profileRawContactId); 6189d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long dataId = ContentUris.parseId( 6190d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertPhoto(profileRawContactId, R.drawable.earth_normal)); 6191d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profilePhotoFileId = 6192d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 6193d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Photo.PHOTO_FILE_ID); 6194d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6195d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Also add a stream item with a photo. 6196d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemUri = 6197d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertStreamItem(profileRawContactId, buildGenericStreamItemValues(), 6198d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro socialAccount); 6199d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 6200d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 6201d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 6202d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 6203d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 6204d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6205d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Remove the stream item photo and the profile photo. 6206d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(profilePhotoFileId); 6207d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(streamItemPhotoFileId); 6208d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6209d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Manually trigger another cleanup in the provider. 6210ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki provider.switchToProfileModeForTest(); 6211d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 6212d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6213d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The following things should have happened. 6214d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6215d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The stream item photo should have been removed. 6216d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertStoredValues(Uri.withAppendedPath( 6217d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 6218d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 6219d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro new ContentValues[0]); 6220d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6221d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The profile photo should have been cleared. 6222d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertNull(getStoredValue( 6223d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 6224d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Contacts.PHOTO_FILE_ID)); 6225d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6226d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro } 6227d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 6228f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOverwritePhotoWithThumbnail() throws IOException { 6229f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 6230f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 6231f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 6232f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6233f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write a regular-size photo. 6234f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 6235f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Long photoFileId = getStoredLongValue(contactUri, Contacts.PHOTO_FILE_ID); 6236f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertTrue(photoFileId != null && photoFileId > 0); 6237f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6238f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Now overwrite the photo with a thumbnail-sized photo. 6239f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues update = new ContentValues(); 6240f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro update.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_small, PhotoSize.ORIGINAL)); 6241f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.update(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), update, null, null); 6242f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6243f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo file ID should have been nulled out, and the photo URI should be the same as the 6244f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // thumbnail URI. 6245f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue(contactUri, Contacts.PHOTO_FILE_ID)); 6246f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue(contactUri, Contacts.PHOTO_URI); 6247f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI); 6248f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 6249f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 6250f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Retrieving the photo URI should get the thumbnail content. 625187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki EvenMoreAsserts.assertImageRawData(getContext(), 6252c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 6253f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 6254f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 6255f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 62564e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactSetStarred() { 62574e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId1 = createRawContactWithName(); 62584e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 62594e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId2 = createRawContactWithName(); 62604e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 626147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 626247fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 62634e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62644e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 62654e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 62664e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 62674e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62684e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov ContentValues values = new ContentValues(); 62694e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "1"); 62704e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62714e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 62724e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62734e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 62744e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 62754e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 62764e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62774e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "0"); 62784e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 62794e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62804e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "0"); 62814e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 62824e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 62834e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62844e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(Contacts.STARRED, "1"); 62854e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(contactUri, values, null, null); 62864e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62874e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 62884e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "1"); 62894e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 62904e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov } 62914e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 62926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testSetAndClearSuperPrimaryEmail() { 62936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId1 = createRawContact(new Account("a", "a")); 62946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri11 = insertEmail(rawContactId1, "test1@domain1.com"); 62956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri12 = insertEmail(rawContactId1, "test2@domain1.com"); 62966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 62976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId2 = createRawContact(new Account("b", "b")); 62986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri21 = insertEmail(rawContactId2, "test1@domain2.com"); 62996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri22 = insertEmail(rawContactId2, "test2@domain2.com"); 63006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 63026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 63036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 63046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 63056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 63066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 63076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 0); 63086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 63096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Set super primary on the first pair, primary on the second 63116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 63126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 63136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 63146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 63156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 63166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 63176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 63186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 63196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 63206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 63216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 1); 63236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 1); 63246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 63256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 63266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 63276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 63286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 63296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 63306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Clear primary on the first pair, make sure second is not affected and super_primary is 63326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // also cleared 63336dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 63346dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 63356dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 63366dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 63376dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 63386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 63406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 63416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 63426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 63436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 63446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 63456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 63466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 63476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63486dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear super_primary, if we specify the correct data row 63496dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 63506dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 63516dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 63526dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 63536dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 63546dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63556dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 63566dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 63576dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 63586dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 63596dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63606dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear primary, if we specify the correct data row 63616dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 63626dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 63636dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 63646dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 63656dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 63666dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63676dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 63686dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 63696dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 63706dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 63716dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63726dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Now clear super-primary for real 63736dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 63746dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 63756dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 63766dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 63776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 63786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 63806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 63816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 63826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 63836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 63846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 63856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 63866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 63876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 63886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann /** 63906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * Common function for the testNewPrimaryIn* functions. Its four configurations 63916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * are each called from its own test 63926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann */ 63936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testChangingPrimary(boolean inUpdate, boolean withSuperPrimary) { 63946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId = createRawContact(new Account("a", "a")); 63956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri1 = insertEmail(rawContactId, "test1@domain1.com", true); 63966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 63976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (withSuperPrimary) { 63986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 63996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 64006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri1, values, null, null); 64016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 64026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 64046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 64056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Insert another item 64076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final Uri mailUri2; 64086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (inUpdate) { 64096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com"); 64106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 64126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 64136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 0); 64146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, 0); 64156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 64176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 1); 64186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri2, values, null, null); 64196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } else { 64206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // directly add as default 64216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com", true); 64226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 64236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that primary has been unset on the first 64256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // If withSuperPrimary is set, also ensure that is has been moved to the new item 64266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 0); 64276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, 0); 64286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 1); 64296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 64306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 64316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsert() { 64336dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, false); 64346dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 64356dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64366dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsertWithSuperPrimary() { 64376dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, true); 64386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 64396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdate() { 64416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, false); 64426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 64436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 64446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdateWithSuperPrimary() { 64456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, true); 64466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 64476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 6448a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner public void testContactSortOrder() { 6449a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner assertEquals(ContactsColumns.PHONEBOOK_BUCKET_PRIMARY + ", " 6450a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner + Contacts.SORT_KEY_PRIMARY, 6451a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsProvider2.getLocalizedSortOrder(Contacts.SORT_KEY_PRIMARY)); 6452a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner assertEquals(ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE + ", " 6453a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner + Contacts.SORT_KEY_ALTERNATIVE, 6454a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsProvider2.getLocalizedSortOrder(Contacts.SORT_KEY_ALTERNATIVE)); 6455a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner assertEquals(ContactsColumns.PHONEBOOK_BUCKET_PRIMARY + " DESC, " 6456a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner + Contacts.SORT_KEY_PRIMARY + " DESC", 6457a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsProvider2.getLocalizedSortOrder(Contacts.SORT_KEY_PRIMARY + " DESC")); 6458a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner String suffix = " COLLATE LOCALIZED DESC"; 6459a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner assertEquals(ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE + suffix 6460a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner + ", " + Contacts.SORT_KEY_ALTERNATIVE + suffix, 6461a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner ContactsProvider2.getLocalizedSortOrder(Contacts.SORT_KEY_ALTERNATIVE 6462a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner + suffix)); 6463a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 6464a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner 6465ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov public void testContactCounts() { 6466ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Uri uri = Contacts.CONTENT_URI.buildUpon() 6467ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build(); 6468ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6469ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContact(); 6470ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("James", "Sullivan"); 6471ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("The Abominable", "Snowman"); 6472ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mike", "Wazowski"); 6473ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("randall", "boggs"); 6474ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Boo", null); 6475ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mary", null); 6476ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Roz", null); 6477ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6478ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Cursor cursor = mResolver.query(uri, 6479ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 6480a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner null, null, Contacts.SORT_KEY_PRIMARY); 6481ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 648235997f3fdee2984b6d5373326110eda26929001aMakoto Onuki assertFirstLetterValues(cursor, "", "B", "J", "M", "R", "T"); 6483ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 1, 1, 2, 2, 1); 6484ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 6485ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6486ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor = mResolver.query(uri, 6487ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 6488ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_ALTERNATIVE + " COLLATE LOCALIZED DESC"); 6489ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 649035997f3fdee2984b6d5373326110eda26929001aMakoto Onuki assertFirstLetterValues(cursor, "W", "S", "R", "M", "B", ""); 6491ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 2, 1, 1, 2, 1); 6492ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 6493ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 6494ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 64951f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner public void testContactCountsWithGermanNames() { 64961f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner if (!hasGermanCollator()) { 64971f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner return; 64981f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner } 64991f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner ContactLocaleUtils.setLocale(Locale.GERMANY); 65001f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner 65011f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner Uri uri = Contacts.CONTENT_URI.buildUpon() 65021f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build(); 65031f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner 65041f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner createRawContactWithName("Josef", "Sacher"); 65051f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner createRawContactWithName("Franz", "Schiller"); 65061f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner createRawContactWithName("Eckart", "Steiff"); 65071f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner createRawContactWithName("Klaus", "Seiler"); 65081f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner createRawContactWithName("Lars", "Sultan"); 65091f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner createRawContactWithName("Heidi", "Rilke"); 65101f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner createRawContactWithName("Suse", "Thomas"); 65111f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner 65121f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner Cursor cursor = mResolver.query(uri, 65131f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner new String[]{Contacts.DISPLAY_NAME}, 65141f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner null, null, Contacts.SORT_KEY_ALTERNATIVE); 65151f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner 65161f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner assertFirstLetterValues(cursor, "R", "S", "Sch", "St", "T"); 65171f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner assertFirstLetterCounts(cursor, 1, 3, 1, 1, 1); 65181f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner cursor.close(); 65191f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner } 65201f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner 6521ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterValues(Cursor cursor, String... expected) { 6522ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov String[] actual = cursor.getExtras() 6523ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getStringArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_TITLES); 6524ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 6525ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 6526ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6527ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterCounts(Cursor cursor, int... expected) { 6528ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov int[] actual = cursor.getExtras() 6529ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getIntArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS); 6530ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 6531ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 6532ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 6533f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testReadBooleanQueryParameter() { 6534f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", true, true); 6535f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", false, false); 6536f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=0", "bool", true, false); 6537f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1", "bool", false, true); 6538f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false", "bool", true, false); 6539f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=true", "bool", false, true); 6540f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=FaLsE", "bool", true, false); 6541f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false&some=some", "bool", true, false); 6542f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1&some=some", "bool", false, true); 6543f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?some=bool", "bool", true, true); 6544f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool", "bool", true, true); 6545f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6546f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 6547f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertBooleanUriParameter(String uriString, String parameter, 6548f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov boolean defaultValue, boolean expectedValue) { 6549f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.readBooleanQueryParameter( 6550f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter, defaultValue)); 6551f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6552f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 6553f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testGetQueryParameter() { 6554f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar", "param", null); 6555f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param", "param", null); 6556f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=", "param", ""); 6557f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val", "param", "val"); 6558f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val&some=some", "param", "val"); 6559f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val", "param", "val"); 6560f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val&else=else", "param", "val"); 6561f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=john%40doe.com", "param", "john@doe.com"); 65625fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val", "param", null); 65635fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2", "param", "val2"); 65645fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=", "param", ""); 65655fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m", "param", null); 65665fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1&another_param=val2¶m=val3", 65675fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val3"); 65685fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2&some_param=val3", 65695fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val2"); 65705fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?param=val1&some_param=val2", "param", "val1"); 65715fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?p=val1&pp=val2", "p", "val1"); 65725fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?pp=val1&p=val2", "p", "val2"); 65735fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val1&pp=val2&p=val3", "p", "val3"); 65745fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val&", "p", null); 6575f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6576f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 6577e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testMissingAccountTypeParameter() { 6578e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try querying for RawContacts only using ACCOUNT_NAME 6579e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri queryUri = RawContacts.CONTENT_URI.buildUpon().appendQueryParameter( 6580e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey RawContacts.ACCOUNT_NAME, "lolwut").build(); 6581e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 6582e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Cursor cursor = mResolver.query(queryUri, null, null, null, null); 6583e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to query with incomplete account query parameters"); 6584e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 6585e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 6586e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6587e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6588e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 6589e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testInsertInconsistentAccountType() { 6590e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try inserting RawContact with inconsistent Accounts 6591e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account red = new Account("red", "red"); 6592e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account blue = new Account("blue", "blue"); 6593e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 6594e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final ContentValues values = new ContentValues(); 6595e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_NAME, red.name); 6596e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_TYPE, red.type); 6597e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 6598e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri insertUri = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, blue); 6599e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 6600e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey mResolver.insert(insertUri, values); 6601e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to insert RawContact with inconsistent account details"); 6602e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 6603e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 6604e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6605e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 6606e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 66073826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusNoContactsNoAccounts() throws Exception { 66083826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 66093826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 66103826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 66113826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusOnlyLocalContacts() throws Exception { 66123826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov long rawContactId = createRawContact(); 66133826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 66143826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov mResolver.delete( 66153826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null, null); 66163826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 66173826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 66183826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 66193826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusWithAccounts() throws Exception { 66203826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 6621bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{ACCOUNT_1}); 66223826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[]{ACCOUNT_1}); 66233826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 6624bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[0]); 66253826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[0]); 66263826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 66273826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 66283826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 66293826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov private void assertProviderStatus(int expectedProviderStatus) { 663009c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov Cursor cursor = mResolver.query(ProviderStatus.CONTENT_URI, 663109c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov new String[]{ProviderStatus.DATA1, ProviderStatus.STATUS}, null, null, null); 663209c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertTrue(cursor.moveToFirst()); 663309c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertEquals(0, cursor.getLong(0)); 66343826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertEquals(expectedProviderStatus, cursor.getInt(1)); 663509c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov cursor.close(); 663609c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov } 663709c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov 6638b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void testProperties() throws Exception { 6639743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ContactsProvider2 provider = (ContactsProvider2)getProvider(); 6640b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContactsDatabaseHelper helper = (ContactsDatabaseHelper)provider.getDatabaseHelper(); 6641b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertNull(helper.getProperty("non-existent", null)); 6642b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("non-existent", "default")); 6643b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 6644b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", "string1"); 6645b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent2", "string2"); 6646b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string1", helper.getProperty("existent1", "default")); 6647b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string2", helper.getProperty("existent2", "default")); 6648b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", null); 6649b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("existent1", "default")); 6650b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 6651b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 665242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private class VCardTestUriCreator { 665342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup1; 665442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup2; 665542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 665642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public VCardTestUriCreator(String lookup1, String lookup2) { 665742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann super(); 665842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup1 = lookup1; 665942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup2 = lookup2; 666042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 666142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 666242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri1() { 666342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup1); 666442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 666542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 666642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri2() { 666742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup2); 666842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 666942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 667042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getCombinedUri() { 667142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, 667242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(mLookup1 + ":" + mLookup2)); 667342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 667442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 667542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 667642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private VCardTestUriCreator createVCardTestContacts() { 667742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId1 = createRawContact(mAccount, RawContacts.SOURCE_ID, "4:12"); 667842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId1, "John", "Doe"); 667942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 668042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId2 = createRawContact(mAccount, RawContacts.SOURCE_ID, "3:4%121"); 668142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId2, "Jane", "Doh"); 668242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 668342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId1 = queryContactId(rawContactId1); 668442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId2 = queryContactId(rawContactId2); 668542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact1Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1); 668642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact2Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2); 668742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup1 = 668842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact1Uri).getPathSegments().get(2)); 668942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup2 = 669042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact2Uri).getPathSegments().get(2)); 669142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return new VCardTestUriCreator(lookup1, lookup2); 669242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 669342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 669442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryMultiVCard() { 669542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // No need to create any contacts here, because the query for multiple vcards 669642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // does not go into the database at all 669742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri uri = Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, Uri.encode("123:456")); 669842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(uri, null, null, null, null); 669942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 670042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 670142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 670242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 670342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 670442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // The resulting name contains date and time. Ensure that before and after are correct 670542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.startsWith("vcards_")); 670642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.endsWith(".vcf")); 670742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 670842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 670942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 671042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryFileSingleVCard() { 671142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 671242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 671342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 671442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri1(), null, null, null, null); 671542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 671642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 671742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 671842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 671942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("John Doe.vcf", filename); 672042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 672142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 672242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 672342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 672442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri2(), null, null, null, null); 672542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 672642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 672742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 672842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 672942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("Jane Doh.vcf", filename); 673042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 673142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 673242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 673342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 673424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryFileProfileVCard() { 673524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 673624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor cursor = mResolver.query(Profile.CONTENT_VCARD_URI, null, null, null, null); 673724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(1, cursor.getCount()); 673824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.moveToFirst()); 673924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 674024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 674124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals("Mia Prophyl.vcf", filename); 674224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro cursor.close(); 674324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 674442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 674542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileMultiVCard() throws IOException { 674642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 674742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 674842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 674942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getCombinedUri(), "r"); 675042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 675142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String data = readToEnd(inputStream); 675242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 675342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 675442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 675542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the resulting VCard has both contacts 675642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doe;John;;;")); 675742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 675842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 675942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 676042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileSingleVCard() throws IOException { 676142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 676242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 676342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the right VCard is being created in each case 676442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 676542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 676642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri1(), "r"); 676742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 676842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 676942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 677042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 677124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 677224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(data.contains("N:Doe;John;;;")); 677324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertFalse(data.contains("N:Doh;Jane;;;")); 677442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 677542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 677642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 677742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 677842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri2(), "r"); 677942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 678042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 678142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 678242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 678342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 678442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertFalse(data.contains("N:Doe;John;;;")); 678542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 678642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 678742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 678842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 6789dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testAutoGroupMembership() { 6790dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 6791dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6792dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false /* favorite */); 6793dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, false/* favorite */); 6794dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6795dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccountTwo); 6796dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(null); 6797dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6798dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6799dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6800dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6801dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6802dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6803dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6804dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6805dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6806dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6807dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6808dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 6809dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6810dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6811dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g3, c.getLong(0)); 6812dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r2, c.getLong(1)); 6813dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6814dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6815dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6816dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6817dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6818dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6819dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testNoAutoAddMembershipAfterGroupCreation() { 6820dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6821dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6822dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount); 6823dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo); 6824dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 6825dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null); 6826dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6827dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6828dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6829dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6830dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 6831dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6832dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false/* favorite */); 6833dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6834dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6835dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6836dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6837dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6838dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // create some starred and non-starred contacts, some associated with account, some not 6839dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group created 6840dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // the starred contacts should be added to group 6841dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group removed 6842dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // no change to starred status 6843dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesMembershipAfterGroupCreation() { 6844dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6845dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6846dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6847dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo, RawContacts.STARRED, "1"); 6848dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 6849dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null, RawContacts.STARRED, "1"); 6850dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r7 = createRawContact(null); 6851dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6852dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6853dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6854dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6855dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6856dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 6857dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, false /* autoAdd */, false/* favorite */); 6858dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6859dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6860dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6861dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6862dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6863dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6864dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6865dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6866dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6867dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6868dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6869dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6870dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6871dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6872dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6873dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6874dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6875dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6876dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6877dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6878dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6879dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6880dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6881dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(RawContacts.CONTENT_URI, r6, 6882dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_NAME, mAccount.name, 6883dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_TYPE, mAccount.type); 6884dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6885dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6886dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6887dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6888dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6889dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6890dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6891dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6892dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6893dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6894dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6895dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r6, c.getLong(1)); 6896dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6897dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6898dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6899dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6900dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6901dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(ContentUris.withAppendedId(Groups.CONTENT_URI, g1), null, null); 6902dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6903dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6904dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6905dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6906dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6907dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6908dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6909dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6910dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6911dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6912dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6913dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6914dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6915dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesGroupMembershipChangeAfterStarChange() { 6916dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6917dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6918dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6919dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6920dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6921dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6922dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6923dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6924dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6925dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6926dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6927dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6928dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6929dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6930dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6931dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6932dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6933dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6934dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6935dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6936dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6937dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6938dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6939dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6940dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6941dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6942dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred 6943dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "1")); 6944dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6945dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6946dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6947dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6948dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6949dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6950dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6951dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6952dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6953dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6954dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6955dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6956dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6957dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6958dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6959dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6960dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6961dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6962dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6963dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6964e3e79030101447da07547647bad225686eb9b8dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(r1)); 6965dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNotNull(contactUri); 6966dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6967dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred via its contact lookup uri 6968dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(contactUri, Contacts.STARRED, "1")); 6969dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6970dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6971dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6972dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6973dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6974dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6975dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6976dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6977dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6978dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6979dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6980dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6981dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6982dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6983dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6984dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(contactUri, Contacts.STARRED, "0"); 6985dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6986dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6987dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6988dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6989dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6990dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testStarChangedAfterGroupMembershipChange() { 6991dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6992dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6993dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6994dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6995dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6996dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6997dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6998dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6999dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 7000dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 7001dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 7002dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 7003dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c; 7004dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 7005dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r1 to one favorites group 7006dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should automatically be set 7007dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1 should automatically be added to the other favorites group 7008dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir1g1 = insertGroupMembership(r1, g1); 7009dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 7010dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 7011dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 7012dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 7013dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 7014dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 7015dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 7016dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 7017dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 7018dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 7019dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 7020dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 7021dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 7022dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 7023dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r1 from one favorites group 7024dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir1g1, null, null); 7025dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should no longer be set 7026dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 7027dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 7028dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 7029dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // there should be no membership rows 7030dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 7031dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 7032dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 7033dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r3 to the one favorites group for that account 7034dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be set 7035dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir3g4 = insertGroupMembership(r3, g4); 7036dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 7037dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 7038dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 7039dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 7040dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 7041dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 7042dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 7043dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g4, c.getLong(0)); 7044dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 7045dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 7046dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 7047dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 7048dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 7049dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 7050dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r3 from the favorites group 7051dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir3g4, null, null); 7052dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be cleared 7053dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 7054dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 7055dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 7056dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 7057dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 7058dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 7059dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 706097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyRawContact() { 706197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 706297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 706397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 706497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 706597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 706697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "second"); 706797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 706897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 706997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = rawContactUri.buildUpon() 707097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 707197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 707297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, RawContacts.CUSTOM_RINGTONE, "third"); 707397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "third"); 707497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 707597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 707697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyDataRow() { 707797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 707897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "email"); 707997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "555-1111"); 708097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 708197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Data.IS_READ_ONLY, "1"); 708297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Email.ADDRESS, "changed"); 708397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(phoneUri, Phone.NUMBER, "555-2222"); 708497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "email"); 708597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(phoneUri, Phone.NUMBER, "555-2222"); 708697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 708797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = emailUri.buildUpon() 708897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 708997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 709097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, Email.ADDRESS, "changed"); 709197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "changed"); 709297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 709397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 709497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testContactWithReadOnlyRawContact() { 709597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId1 = createRawContact(); 709697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 709797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "first"); 709897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 709997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId2 = createRawContact(); 710097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 710197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 710297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 710397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 710497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 710597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov rawContactId1, rawContactId2); 710697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 710797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long contactId = queryContactId(rawContactId1); 710897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 710997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 711097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 711197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 711297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "rt"); 711397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 711497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 711597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 71167a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameParsingQuery() { 71177a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 71187a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr.").build(); 71197a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 71207a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 71217a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr."); 712217a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr."); 71237a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 71247a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 71257a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 71267a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 71277a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 71287a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 71297a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 71307a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 71317a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 71327a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 71337a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameConcatenationQuery() { 71347a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 71357a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.PREFIX, "Mr") 71367a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.GIVEN_NAME, "John") 71377a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.MIDDLE_NAME, "Q.") 71387a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.FAMILY_NAME, "Doe") 71397a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.SUFFIX, "Jr.") 71407a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .build(); 71417a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 71427a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 714355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr John Q. Doe, Jr."); 71447a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 71457a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 71467a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 71477a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 71487a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 71497a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 71507a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 71517a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 71527a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 71537a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 71547a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 7155084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki public void testBuildSingleRowResult() { 7156084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 7157084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"b"}, 7158084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 7159084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 7160084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {2} 7161084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 7162084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 7163084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 7164084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"b", "a", "b"}, 7165084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 7166084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 7167084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {2, 1, 2} 7168084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 7169084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 7170084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki checkBuildSingleRowResult( 7171084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki null, // all columns 7172084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new String[] {"a", "b"}, 7173084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2}, 7174084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Integer[] {1, 2} 7175084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ); 7176084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 7177084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki try { 7178084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki // Access non-existent column 7179084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki ContactsProvider2.buildSingleRowResult(new String[] {"a"}, new String[] {"b"}, 7180084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki new Object[] {1}); 7181084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki fail(); 7182084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } catch (IllegalArgumentException expected) { 7183084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 7184084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 7185084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 7186084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki private void checkBuildSingleRowResult(String[] projection, String[] availableColumns, 7187084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki Object[] data, Integer[] expectedValues) { 7188084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki final Cursor c = ContactsProvider2.buildSingleRowResult(projection, availableColumns, data); 7189084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki try { 7190084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertTrue(c.moveToFirst()); 7191084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals(1, c.getCount()); 7192084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals(expectedValues.length, c.getColumnCount()); 7193084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 7194084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki for (int i = 0; i < expectedValues.length; i++) { 7195084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki assertEquals("column " + i, expectedValues[i], (Integer) c.getInt(i)); 7196084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 7197084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } finally { 7198084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki c.close(); 7199084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 7200084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki } 7201084fe28445cf74e3fa93522f8f8e5da6e065b8c3Makoto Onuki 7202dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki public void testDataUsageFeedbackAndDelete() { 7203dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7204dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.install(); 7205dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7206dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long startTime = sMockClock.currentTimeMillis(); 7207dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7208dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid1 = createRawContactWithName("contact", "a"); 7209dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did1a = ContentUris.parseId(insertEmail(rid1, "email_1_a@email.com")); 7210dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did1b = ContentUris.parseId(insertEmail(rid1, "email_1_b@email.com")); 7211dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did1p = ContentUris.parseId(insertPhoneNumber(rid1, "555-555-5555")); 7212dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7213dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid2 = createRawContactWithName("contact", "b"); 7214dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did2a = ContentUris.parseId(insertEmail(rid2, "email_2_a@email.com")); 7215dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did2p = ContentUris.parseId(insertPhoneNumber(rid2, "555-555-5556")); 7216dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7217dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Aggregate 1 and 2 7218dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, rid1, rid2); 7219dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7220dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid3 = createRawContactWithName("contact", "c"); 7221dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did3a = ContentUris.parseId(insertEmail(rid3, "email_3@email.com")); 7222dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did3p = ContentUris.parseId(insertPhoneNumber(rid3, "555-3333")); 7223dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7224dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long rid4 = createRawContactWithName("contact", "d"); 7225dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long did4p = ContentUris.parseId(insertPhoneNumber(rid4, "555-4444")); 7226dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7227dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long cid1 = queryContactId(rid1); 7228dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long cid3 = queryContactId(rid3); 7229dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final long cid4 = queryContactId(rid4); 7230dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7231dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Make sure 1+2, 3 and 4 aren't aggregated 7232dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(cid1, cid3); 7233dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(cid1, cid4); 7234dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(cid3, cid4); 7235dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7236dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime 7237dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7238a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // First, there's no frequent. (We use strequent here only because frequent is hidden 7239a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // and may be removed someday.) 7240a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_STREQUENT_URI, null, null); 7241a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7242dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 1. touch data 1a 7243dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a); 7244a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7245dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Now, there's a single frequent. (contact 1) 7246a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(1, Contacts.CONTENT_STREQUENT_URI, null, null); 7247a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7248dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime + 1 7249dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.advance(); 7250dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7251dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 2. touch data 1a, 2a and 3a 7252dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a, did2a, did3a); 7253dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7254dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Now, contact 1 and 3 are in frequent. 7255dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertRowCount(2, Contacts.CONTENT_STREQUENT_URI, null, null); 7256dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7257dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime + 2 7258dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.advance(); 7259dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7260dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 2. touch data 2p (call) 7261dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did2p); 7262dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7263dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // There're still two frequent. 7264dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertRowCount(2, Contacts.CONTENT_STREQUENT_URI, null, null); 7265dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7266dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // time = startTime + 3 7267dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki sMockClock.advance(); 7268dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7269dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Test 3. touch data 2p and 3p (short text) 7270dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, did2p, did3p); 7271dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7272dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Let's check the tables. 7273dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7274dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Fist, check the data_usage_stat table, which has no public URI. 7275dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesDb("SELECT " + DataUsageStatColumns.DATA_ID + 7276dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki "," + DataUsageStatColumns.USAGE_TYPE_INT + 7277dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki "," + DataUsageStatColumns.TIMES_USED + 7278dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki "," + DataUsageStatColumns.LAST_TIME_USED + 7279dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki " FROM " + Tables.DATA_USAGE_STAT, null, 7280dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did1a, 7281dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 7282dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT, 7283dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 2, 7284dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 1 7285dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7286dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did2a, 7287dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 7288dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT, 7289dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 7290dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 1 7291dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7292dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did3a, 7293dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 7294dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT, 7295dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 7296dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 1 7297dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7298dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did2p, 7299dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 7300dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_CALL, 7301dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 7302dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 2 7303dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7304dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did2p, 7305dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 7306dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_SHORT_TEXT, 7307dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 7308dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 3 7309dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7310dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(DataUsageStatColumns.DATA_ID, did3p, 7311dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT, 7312dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.USAGE_TYPE_INT_SHORT_TEXT, 7313dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.TIMES_USED, 1, 7314dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki DataUsageStatColumns.LAST_TIME_USED, startTime + 3 7315dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 7316dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 7317dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7318dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Next, check the raw_contacts table 7319dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesWithProjection(RawContacts.CONTENT_URI, 7320dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid1, 7321dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 2, 7322dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, startTime + 1 7323dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7324dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid2, 7325dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 3, 7326dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, startTime + 3 7327dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7328dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid3, 7329dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 2, 7330dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, startTime + 3 7331dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7332dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(RawContacts._ID, rid4, 7333dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.TIMES_CONTACTED, 0, 7334dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki RawContacts.LAST_TIME_CONTACTED, null // 4 wasn't touched. 7335dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 7336dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 7337dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7338dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Lastly, check the contacts table. 7339dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7340dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Note contact1.TIMES_CONTACTED = 4, even though raw_contact1.TIMES_CONTACTED + 7341dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // raw_contact1.TIMES_CONTACTED = 5, because in test 2, data 1a and data 2a were touched 7342dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // at once. 7343dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesWithProjection(Contacts.CONTENT_URI, 7344dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(Contacts._ID, cid1, 7345dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.TIMES_CONTACTED, 4, 7346dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.LAST_TIME_CONTACTED, startTime + 3 7347dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7348dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(Contacts._ID, cid3, 7349dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.TIMES_CONTACTED, 2, 7350dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.LAST_TIME_CONTACTED, startTime + 3 7351dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ), 7352dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki cv(Contacts._ID, cid4, 7353dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.TIMES_CONTACTED, 0, 7354dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki Contacts.LAST_TIME_CONTACTED, 0 // For contacts, the default is 0, not null. 7355dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ) 7356dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki ); 7357a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7358dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // Let's test the delete too. 7359b6186821548995dce533ee502e82e9abf4c0aadcMakoto Onuki assertTrue(mResolver.delete(DataUsageFeedback.DELETE_USAGE_URI, null, null) > 0); 7360a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7361a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // Now there's no frequent. 7362a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_STREQUENT_URI, null, null); 7363a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7364dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki // No rows in the stats table. 7365dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki assertStoredValuesDb("SELECT " + DataUsageStatColumns.DATA_ID + 7366dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki " FROM " + Tables.DATA_USAGE_STAT, null, 7367dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki new ContentValues[0]); 7368dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7369a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // The following values should all be 0 or null. 7370a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_URI, Contacts.TIMES_CONTACTED + ">0", null); 7371a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, Contacts.CONTENT_URI, Contacts.LAST_TIME_CONTACTED + ">0", null); 7372a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, RawContacts.CONTENT_URI, RawContacts.TIMES_CONTACTED + ">0", null); 7373a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki assertRowCount(0, RawContacts.CONTENT_URI, RawContacts.LAST_TIME_CONTACTED + ">0", null); 7374a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7375a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki // Calling it when there's no usage stats will still return a positive value. 7376b6186821548995dce533ee502e82e9abf4c0aadcMakoto Onuki assertTrue(mResolver.delete(DataUsageFeedback.DELETE_USAGE_URI, null, null) > 0); 7377a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki } 7378a780048d2caafbd922444b0c08adb81790db4635Makoto Onuki 7379dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana private Cursor queryGroupMemberships(Account account) { 7380dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = mResolver.query(maybeAddAccountQueryParameters(Data.CONTENT_URI, account), 7381dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana new String[]{GroupMembership.GROUP_ROW_ID, GroupMembership.RAW_CONTACT_ID}, 7382dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Data.MIMETYPE + "=?", new String[]{GroupMembership.CONTENT_ITEM_TYPE}, 7383dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana GroupMembership.GROUP_SOURCE_ID); 7384dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return c; 7385dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 7386dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 738742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String readToEnd(FileInputStream inputStream) { 738842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann try { 7389bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("DECLARED INPUT STREAM LENGTH: " + inputStream.available()); 739042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann int ch; 739142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann StringBuilder stringBuilder = new StringBuilder(); 7392bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov int index = 0; 7393bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov while (true) { 7394bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov ch = inputStream.read(); 7395bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("READ CHARACTER: " + index + " " + ch); 7396bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov if (ch == -1) { 7397bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov break; 7398bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 739942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann stringBuilder.append((char)ch); 7400bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov index++; 7401bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 740242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return stringBuilder.toString(); 740342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } catch (IOException e) { 740442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return null; 740542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 740642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 740742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 7408f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertQueryParameter(String uriString, String parameter, String expectedValue) { 7409f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.getQueryParameter( 7410f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter)); 7411f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 7412f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 74134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private long createContact(ContentValues values, String firstName, String givenName, 74144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 7415aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 741624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createContact(values, firstName, givenName, phoneNumber, email, presenceStatus, 741724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, false); 741824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 741924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 742024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createContact(ContentValues values, String firstName, String givenName, 742124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 742224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 742348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return queryContactId(createRawContact(values, firstName, givenName, phoneNumber, email, 742424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro presenceStatus, timesContacted, starred, groupId, chatMode, isUserProfile)); 742548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 742648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 742748786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String firstName, String givenName, 742848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 7429aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 743048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 7431aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori timesContacted, starred, groupId, chatMode); 743248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov insertStructuredName(rawContactId, firstName, givenName); 743348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 743448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 743548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 743624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String firstName, String givenName, 743724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 743824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 743924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 744024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, isUserProfile); 744124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertStructuredName(rawContactId, firstName, givenName); 744224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return rawContactId; 744324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 744424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 744548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String phoneNumber, String email, 7446aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori int presenceStatus, int timesContacted, int starred, long groupId, int chatMode) { 744724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createRawContact(values, phoneNumber, email, presenceStatus, timesContacted, starred, 744824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro groupId, chatMode, false); 744924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 745024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 745124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String phoneNumber, String email, 745224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro int presenceStatus, int timesContacted, int starred, long groupId, int chatMode, 745324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro boolean isUserProfile) { 74544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, starred); 74554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 74564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "beethoven5"); 74574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, timesContacted); 745824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 745924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri insertionUri = isUserProfile 746024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ? Profile.CONTENT_RAW_CONTACTS_URI 746124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro : RawContacts.CONTENT_URI; 746224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri rawContactUri = mResolver.insert(insertionUri, values); 74634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 74644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 74654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 74664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.PHOTO_ID, photoId); 74679dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(phoneNumber)) { 74689dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId, phoneNumber); 74699dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 74709dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(email)) { 74719dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertEmail(rawContactId, email); 74729dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 74734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 7474aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, email, presenceStatus, "hacking", 74755d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro chatMode, isUserProfile); 74764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 74774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov if (groupId != 0) { 74784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertGroupMembership(rawContactId, groupId); 74794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 748024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 748148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 74824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 74834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 748424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 748524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values under the user's profile. 748624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param profileValues Values to be used to create the entry (common values will be 748724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 748824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 748924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 749024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicProfileContact(ContentValues profileValues) { 749124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createRawContact(profileValues, "Mia", "Prophyl", 749224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18005554411", "mia.prophyl@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 749324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, true); 749424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.put(Contacts.DISPLAY_NAME, "Mia Prophyl"); 749524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return profileRawContactId; 749624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 749724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 749824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 749924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values that is not under the user's profile. 750024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param nonProfileValues Values to be used to create the entry (common values will be 750124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 750224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 750324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 750424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicNonProfileContact(ContentValues nonProfileValues) { 750524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createRawContact(nonProfileValues, "John", "Doe", 750624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 750724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 750824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nonProfileValues.put(Contacts.DISPLAY_NAME, "John Doe"); 750924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return nonProfileRawContactId; 751024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 751124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 75124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private void putDataValues(ContentValues values, long rawContactId) { 75134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 75144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 75154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 75164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 75174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 75184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA1, "one"); 75194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA2, "two"); 75204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA3, "three"); 75214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA4, "four"); 75224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA5, "five"); 75234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA6, "six"); 75244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA7, "seven"); 75254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA8, "eight"); 75264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA9, "nine"); 75274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA10, "ten"); 75284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA11, "eleven"); 75294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA12, "twelve"); 75304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA13, "thirteen"); 75314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA14, "fourteen"); 75324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA15, "fifteen"); 75334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC1, "sync1"); 75344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC2, "sync2"); 75354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC3, "sync3"); 75364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC4, "sync4"); 75374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 75384928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 75394928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa /** 75404928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param data1 email address or phone number 75414928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param usageType One of {@link DataUsageFeedback#USAGE_TYPE} 75424928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param values ContentValues for this feedback. Useful for incrementing 75434928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * {Contacts#TIMES_CONTACTED} in the ContentValue. Can be null. 75444928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa */ 75454928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa private void sendFeedback(String data1, String usageType, ContentValues values) { 75464928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final long dataId = getStoredLongValue(Data.CONTENT_URI, 75474928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa Data.DATA1 + "=?", new String[] { data1 }, Data._ID); 7548dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki MoreAsserts.assertNotEqual(0, updateDataUsageFeedback(usageType, dataId)); 75494928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa if (values != null && values.containsKey(Contacts.TIMES_CONTACTED)) { 75504928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa values.put(Contacts.TIMES_CONTACTED, values.getAsInteger(Contacts.TIMES_CONTACTED) + 1); 75514928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 75524928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 7553dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki 7554dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng private void updateDataUsageFeedback(String usageType, Uri resultUri) { 7555dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final long id = ContentUris.parseId(resultUri); 7556dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng final boolean successful = updateDataUsageFeedback(usageType, id) > 0; 7557dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng assertTrue(successful); 7558dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng } 7559dacd5de146b413de86d38b6f56a3fe0b2af4b155Chiao Cheng 7560dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki private int updateDataUsageFeedback(String usageType, long... ids) { 7561dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki final StringBuilder idList = new StringBuilder(); 7562dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki for (long id : ids) { 7563dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki if (idList.length() > 0) idList.append(","); 7564dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki idList.append(id); 7565dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki } 7566dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki return mResolver.update(DataUsageFeedback.FEEDBACK_URI.buildUpon() 7567dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki .appendPath(idList.toString()) 7568dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, usageType) 7569dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki .build(), new ContentValues(), null, null); 7570dfab50ecd585e55769dea451cb3a47ff69b8b86dMakoto Onuki } 7571a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner 7572a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner private boolean hasChineseCollator() { 7573a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner final Locale locale[] = Collator.getAvailableLocales(); 7574a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner for (int i = 0; i < locale.length; i++) { 7575a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner if (locale[i].equals(Locale.CHINA)) { 7576a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner return true; 7577a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 7578a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 7579a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner return false; 7580a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 7581a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner 7582a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner private boolean hasJapaneseCollator() { 7583a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner final Locale locale[] = Collator.getAvailableLocales(); 7584a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner for (int i = 0; i < locale.length; i++) { 7585a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner if (locale[i].equals(Locale.JAPAN)) { 7586a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner return true; 7587a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 7588a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 7589a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner return false; 7590a6a9fa802d1b56c206c670ca1d313bc64effcb5dJay Shrauner } 75911f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner 75921f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner private boolean hasGermanCollator() { 75931f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner final Locale locale[] = Collator.getAvailableLocales(); 75941f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner for (int i = 0; i < locale.length; i++) { 75951f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner if (locale[i].equals(Locale.GERMANY)) { 75961f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner return true; 75971f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner } 75981f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner } 75991f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner return false; 76001f8895bc9efd6c20adb02652bccb2c011ebca114Jay Shrauner } 7601d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov} 7602