ContactsProvider2Test.java revision 56abe81ced08c7af625b3eb8dd543f9030da9bad
1d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/* 2d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 4d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * you may not use this file except in compliance with the License. 6d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * You may obtain a copy of the License at 7d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 8d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 10d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * See the License for the specific language governing permissions and 14d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * limitations under the License. 15d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 18d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 19d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport com.android.internal.util.ArrayUtils; 20dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.AggregationExceptionColumns; 21f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawaimport com.android.providers.contacts.ContactsDatabaseHelper.DataUsageStatColumns; 22b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns; 23f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport com.android.providers.contacts.tests.R; 2424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport com.google.android.collect.Lists; 25d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2670d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wongimport android.accounts.Account; 27d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderOperation; 28d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikovimport android.content.ContentProviderResult; 29d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentUris; 30d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentValues; 319261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.content.Entity; 3233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.content.EntityIterator; 3342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport android.content.res.AssetFileDescriptor; 34d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.database.Cursor; 35d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.net.Uri; 36c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoroimport android.os.AsyncTask; 37c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract; 38d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 39e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Callable; 40dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 41dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 42dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 43dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 44dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 45dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 46e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.SipAddress; 47dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 48dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 49ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikovimport android.provider.ContactsContract.ContactCounts; 50c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 519261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.Data; 5246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback; 53dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.ContactsContract.Directory; 545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.DisplayNameSources; 55f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.DisplayPhoto; 567a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 573cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.PhoneLookup; 595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.PhoneticNameStyle; 6024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport android.provider.ContactsContract.Profile; 6109c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus; 6233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 6362318e1ea8306142a10526534b7d83560ecf5b3aFred Quintanaimport android.provider.ContactsContract.RawContactsEntity; 64916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikovimport android.provider.ContactsContract.SearchSnippetColumns; 6589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikovimport android.provider.ContactsContract.Settings; 6682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItemPhotos; 68f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.StreamItems; 69dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikovimport android.provider.OpenableColumns; 707d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekhimport android.test.MoreAsserts; 71d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 72f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.text.TextUtils; 73d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 7442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.FileInputStream; 7542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmannimport java.io.IOException; 76ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringertimport java.io.InputStream; 77f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport java.io.OutputStream; 785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.text.Collator; 793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.ArrayList; 805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Arrays; 813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport java.util.List; 825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 84d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/** 85d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}. 86d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 87d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Run the test like this: 88d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * <code> 8923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki adb shell am instrument -e class com.android.providers.contacts.ContactsProvider2Test -w \ 9023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 91d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * </code> 92d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 93d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov@LargeTest 94d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovpublic class ContactsProvider2Test extends BaseContactsProvider2Test { 95d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 9647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_1 = new Account("account_name_1", "account_type_1"); 9747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov private static final Account ACCOUNT_2 = new Account("account_name_2", "account_type_2"); 9847fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov 99dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsProjection() { 100dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_URI, new String[]{ 101dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 102dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 103dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 104dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 105dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 106dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 107dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 108dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 109dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 110dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 111dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 112dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 113dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 114f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1153d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1163d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 117dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 118dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 119dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 12024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 121dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 122dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 123dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 124dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 125dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 126dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 127dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 128dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 129dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 130dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 131dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 132dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 133dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testContactsWithSnippetProjection() { 134dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Contacts.CONTENT_FILTER_URI.buildUpon().appendPath("nothing").build(), 135dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 136dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 137dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 138dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 139dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 140dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 141dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 142dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 143dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 144dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 145dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 146dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 147dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 148dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 149f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 1503d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 1513d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 152dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 153dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 154dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 15524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 156dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 157dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 158dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 159dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 160dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 161dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 162dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 163dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 164dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 165dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 16630cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov SearchSnippetColumns.SNIPPET, 167dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 168dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 169dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 170dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawContactsProjection() { 171dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContacts.CONTENT_URI, new String[]{ 172dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 173dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 174dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 175dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 17643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 17743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 178dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 179dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 18024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 181dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 182dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 183dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 184dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE, 185dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 186dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME, 187dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE, 188dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 189dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_PRIMARY, 190dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE, 191dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.TIMES_CONTACTED, 192dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.LAST_TIME_CONTACTED, 193dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CUSTOM_RINGTONE, 194dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL, 195dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 196dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.AGGREGATION_MODE, 197dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 198dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 199dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 200dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 201dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 202dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 203dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 204dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDataProjection() { 205dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Data.CONTENT_URI, new String[]{ 206dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 207dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RAW_CONTACT_ID, 208dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 209dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 210dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 211dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 212dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 213dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 214dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 215dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 216dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 217dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 218dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 219dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 220dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 221dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 222dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 223dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 224dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 225dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 226dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 227dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 228dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 229dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 230dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 231dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 232dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 233dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 234dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 235dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 236dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 237dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 238dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 239dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 240dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 241dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 24243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 24343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 244dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 245dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 246dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 247dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 24824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 249dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 250dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 251dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 252dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 253dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 254dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 255dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 256dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 257dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 258dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 259dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 260dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 261dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 262f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 2633d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 2643d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 265dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 266dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 267dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 268dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 269cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 270dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 271dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 272dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 273dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 274dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 275dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 276dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 277dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 278dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 279dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 280dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 281dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDistinctDataProjection() { 282dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Phone.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 283dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 284dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data._ID, 285dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 286dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 287dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 288dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 289dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 290dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 291dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 292dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 293dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 294dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 295dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 296dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 297dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 298dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 299dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 300dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 301dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 302dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 303dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 304dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 305dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 306dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 307dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 308dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 309dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CONTACT_ID, 310dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.PRESENCE, 311dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.CHAT_CAPABILITY, 312dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS, 313dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_TIMESTAMP, 314dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_RES_PACKAGE, 315dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_LABEL, 316dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.STATUS_ICON, 31724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 318dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts._ID, 319dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 320dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 321dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 322dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME, 323dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 324dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 325dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 326dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 327dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.TIMES_CONTACTED, 328dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.STARRED, 329dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 330dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.PHOTO_ID, 331f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 3323d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 3333d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 334cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 335dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CUSTOM_RINGTONE, 336dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 337dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.LOOKUP_KEY, 338dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_PRESENCE, 339dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 340dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS, 341dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 342dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 343dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 344dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 345dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 346dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 347dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 348dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 349a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testEntityProjection() { 350a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertProjection( 351a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 0), 352a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.CONTENT_DIRECTORY), 353a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov new String[]{ 354a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity._ID, 355a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.DATA_ID, 356a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID, 357a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA_VERSION, 358a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_PRIMARY, 359a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.IS_SUPER_PRIMARY, 360a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.RES_PACKAGE, 361a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.MIMETYPE, 362a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA1, 363a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA2, 364a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA3, 365a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA4, 366a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA5, 367a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA6, 368a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA7, 369a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA8, 370a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA9, 371a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA10, 372a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA11, 373a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA12, 374a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA13, 375a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA14, 376a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.DATA15, 377a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC1, 378a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC2, 379a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC3, 380a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.SYNC4, 381a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CONTACT_ID, 382a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.PRESENCE, 383a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.CHAT_CAPABILITY, 384a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS, 385a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_TIMESTAMP, 386a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_RES_PACKAGE, 387a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_LABEL, 388a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Data.STATUS_ICON, 389a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_NAME, 390a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.ACCOUNT_TYPE, 39143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 39243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 393a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SOURCE_ID, 394a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.VERSION, 395a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DELETED, 396a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.DIRTY, 397a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.NAME_VERIFIED, 398a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC1, 399a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC2, 400a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC3, 401a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov RawContacts.SYNC4, 402a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts._ID, 403a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_PRIMARY, 404a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_ALTERNATIVE, 405a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.DISPLAY_NAME_SOURCE, 406a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME, 407a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHONETIC_NAME_STYLE, 408a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_PRIMARY, 409a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SORT_KEY_ALTERNATIVE, 410a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED, 411a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.TIMES_CONTACTED, 412a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.STARRED, 413a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.IN_VISIBLE_GROUP, 414a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.PHOTO_ID, 415f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID, 4163d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI, 4173d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI, 418a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CUSTOM_RINGTONE, 419a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL, 42024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE, 421a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.LOOKUP_KEY, 422a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID, 423cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER, 424a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_PRESENCE, 425a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_CHAT_CAPABILITY, 426a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS, 427a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_TIMESTAMP, 428a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_RES_PACKAGE, 429a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_LABEL, 430a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.CONTACT_STATUS_ICON, 431a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 432a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov }); 433a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 434a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 435dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testRawEntityProjection() { 436dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(RawContactsEntity.CONTENT_URI, new String[]{ 437dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.Entity.DATA_ID, 438dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts._ID, 439dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.CONTACT_ID, 440dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_NAME, 441dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.ACCOUNT_TYPE, 44243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET, 44343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE_AND_DATA_SET, 444dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SOURCE_ID, 445dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.VERSION, 446dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DIRTY, 447dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.NAME_VERIFIED, 448dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.DELETED, 449dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC1, 450dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC2, 451dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC3, 452dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.SYNC4, 453dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov RawContacts.STARRED, 45424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE, 455dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA_VERSION, 456dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_PRIMARY, 457dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.IS_SUPER_PRIMARY, 458dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.RES_PACKAGE, 459dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.MIMETYPE, 460dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA1, 461dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA2, 462dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA3, 463dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA4, 464dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA5, 465dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA6, 466dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA7, 467dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA8, 468dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA9, 469dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA10, 470dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA11, 471dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA12, 472dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA13, 473dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA14, 474dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.DATA15, 475dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC1, 476dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC2, 477dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC3, 478dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Data.SYNC4, 479dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov GroupMembership.GROUP_SOURCE_ID, 480dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 481dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 482dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 483dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testPhoneLookupProjection() { 484dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(PhoneLookup.CONTENT_FILTER_URI.buildUpon().appendPath("123").build(), 485dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov new String[]{ 486dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup._ID, 487dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LOOKUP_KEY, 488dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.DISPLAY_NAME, 489dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LAST_TIME_CONTACTED, 490dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TIMES_CONTACTED, 491dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.STARRED, 492dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.IN_VISIBLE_GROUP, 493dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.PHOTO_ID, 4943d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_URI, 4953d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov PhoneLookup.PHOTO_THUMBNAIL_URI, 496dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.CUSTOM_RINGTONE, 497dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.HAS_PHONE_NUMBER, 498dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.SEND_TO_VOICEMAIL, 499dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.NUMBER, 500dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.TYPE, 501dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PhoneLookup.LABEL, 5022530512f639c4979fd7371c7dd25dd67e8118124Bai Tao PhoneLookup.NORMALIZED_NUMBER, 503dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 504dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 505dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 506dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsProjection() { 507dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_URI, new String[]{ 508dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 509dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 510dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 51143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 51243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 513dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 514dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 515dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 516dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 517dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 518dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 519dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 520dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 521dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 522dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 523dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 524dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 525dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 526c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 527dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 528dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 529dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 530dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 531dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 532dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 533dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 534dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testGroupsSummaryProjection() { 535dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Groups.CONTENT_SUMMARY_URI, new String[]{ 536dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups._ID, 537dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_NAME, 538dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.ACCOUNT_TYPE, 53943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET, 54043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET, 541dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SOURCE_ID, 542dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DIRTY, 543dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.VERSION, 544dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.RES_PACKAGE, 545dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE, 546dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.TITLE_RES, 547dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.GROUP_VISIBLE, 548dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYSTEM_ID, 549dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.DELETED, 550dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.NOTES, 551dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SHOULD_SYNC, 552dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.FAVORITES, 553dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.AUTO_ADD, 554c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY, 555dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC1, 556dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC2, 557dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC3, 558dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SYNC4, 559dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_COUNT, 560dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Groups.SUMMARY_WITH_PHONES, 56118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 562dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 563dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 564dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 565dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testAggregateExceptionProjection() { 566dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(AggregationExceptions.CONTENT_URI, new String[]{ 567dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptionColumns._ID, 568dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.TYPE, 569dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1, 570dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2, 571dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 572dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 573dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 574dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testSettingsProjection() { 575dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Settings.CONTENT_URI, new String[]{ 576dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_NAME, 577dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ACCOUNT_TYPE, 578f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Settings.DATA_SET, 579dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_VISIBLE, 580dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.SHOULD_SYNC, 581dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.ANY_UNSYNCED, 582dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_COUNT, 583dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Settings.UNGROUPED_WITH_PHONES, 584dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 585dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 586dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 587dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testStatusUpdatesProjection() { 588dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(StatusUpdates.CONTENT_URI, new String[]{ 589dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID, 590dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.DATA_ID, 591dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_ACCOUNT, 592dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.IM_HANDLE, 593dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PROTOCOL, 594dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL, 595dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.PRESENCE, 596dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.CHAT_CAPABILITY, 597dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS, 598dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP, 599dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE, 600dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_ICON, 601dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov StatusUpdates.STATUS_LABEL, 602dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 603dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 604dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 605dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov public void testDirectoryProjection() { 606dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov assertProjection(Directory.CONTENT_URI, new String[]{ 607dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory._ID, 608dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.PACKAGE_NAME, 609dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.TYPE_RESOURCE_ID, 610dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DISPLAY_NAME, 611dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.DIRECTORY_AUTHORITY, 612dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_TYPE, 613dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.ACCOUNT_NAME, 614dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov Directory.EXPORT_SUPPORT, 615778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.SHORTCUT_SUPPORT, 616778d92d4dce5f76c649e2aca9d00d3f214cd7643Dmitri Plotnikov Directory.PHOTO_SUPPORT, 617dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov }); 618dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov } 619dd300fe5f5a1071b1c135af7c76e3ae149edda4dDmitri Plotnikov 6203cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testRawContactsInsert() { 6213cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 6223cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6233cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_NAME, "a"); 6243cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.ACCOUNT_TYPE, "b"); 6253cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SOURCE_ID, "c"); 6263cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.VERSION, 42); 6273cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DIRTY, 1); 6283cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.DELETED, 1); 6293cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED); 6303cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 6313cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 6323cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 6333cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 6343cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC1, "e"); 6353cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC2, "f"); 6363cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC3, "g"); 6373cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(RawContacts.SYNC4, "h"); 6383cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6393cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values); 6404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rowUri); 6413cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6423cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 6434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(RawContacts.CONTENT_URI, values, RawContacts._ID, rawContactId); 64481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 6453cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 6463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 6472149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov public void testDataDirectoryWithLookupUri() { 6482149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov ContentValues values = new ContentValues(); 6492149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6502149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long rawContactId = createRawContactWithName(); 6512149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertPhoneNumber(rawContactId, "555-GOOG-411"); 6522149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov insertEmail(rawContactId, "google@android.com"); 6532149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6542149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov long contactId = queryContactId(rawContactId); 6552149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 6562149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6572149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete and valid lookup URI 6582149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 6592149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 6602149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6612149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6622149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6632149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Complete but stale lookup URI 6642149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 6652149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY); 6662149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6672149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6682149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov // Incomplete lookup URI (lookup key only, no contact ID) 6692149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov dataUri = Uri.withAppendedPath(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, 6702149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov lookupKey), Contacts.Data.CONTENT_DIRECTORY); 6712149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertDataRows(dataUri, values); 6722149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 6732149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6742149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov private void assertDataRows(Uri dataUri, ContentValues values) { 6752149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov Cursor cursor = mResolver.query(dataUri, new String[]{ Data.DATA1 }, null, null, Data._ID); 6762149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertEquals(3, cursor.getCount()); 6772149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToFirst(); 6782149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "John Doe"); 6792149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6802149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6812149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 6822149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "555-GOOG-411"); 6832149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6842149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6852149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.moveToNext(); 6862149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov values.put(Data.DATA1, "google@android.com"); 6872149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov assertCursorValues(cursor, values); 6882149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 6892149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov cursor.close(); 6902149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov } 6912149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov 692a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithIdBasedUri() { 693a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 694a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 695a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 696a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 697a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 698a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 699a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 7005d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 701a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 702a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 703a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 704a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 705a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 706a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 707a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 708a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 709a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY); 710a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 711a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 712a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 713a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 714a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContactEntitiesWithLookupUri() { 715a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 716a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account1 = new Account("act1", "actype1"); 717a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Account account2 = new Account("act2", "actype2"); 718a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 719a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId1 = createRawContactWithName(account1); 720a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertImHandle(rawContactId1, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 721a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", StatusUpdates.IDLE, "Busy", 90, 7225d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 723a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 724a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 725a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov setAggregationException( 726a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 727a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 728a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 729a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String lookupKey = queryLookupKey(contactId); 730a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 731a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First try with a matching contact ID 732a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 733a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Uri entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 734a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 735a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 736a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try with a contact ID mismatch 737a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = ContactsContract.Contacts.getLookupUri(contactId + 1, lookupKey); 738a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 739a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 740a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 741a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Now try without an ID altogether 742a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov contactLookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey); 743a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov entityUri = Uri.withAppendedPath(contactLookupUri, Contacts.Entity.CONTENT_DIRECTORY); 744a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEntityRows(entityUri, contactId, rawContactId1, rawContactId2); 745a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 746a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 747a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov private void assertEntityRows(Uri entityUri, long contactId, long rawContactId1, 748a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov long rawContactId2) { 749a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov ContentValues values = new ContentValues(); 750a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 751a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Cursor cursor = mResolver.query(entityUri, null, null, null, 752a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Contacts.Entity.RAW_CONTACT_ID + "," + Contacts.Entity.DATA_ID); 753a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertEquals(3, cursor.getCount()); 754a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 755a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // First row - name 756a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToFirst(); 757a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 758a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 759a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 760a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "John Doe"); 761a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 762a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 763a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 764a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 765a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 766a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 767a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 768a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 769a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 770a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 771a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 772a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Second row - IM 773a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 774a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 775a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId1); 776a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.MIMETYPE, Im.CONTENT_ITEM_TYPE); 777a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DATA1, "gtalk"); 778a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act1"); 779a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype1"); 780a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 781a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 782a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 783a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 784a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 785a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 786a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.PRESENCE, StatusUpdates.IDLE); 787a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 788a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 789a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov // Third row - second raw contact, not data 790a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.moveToNext(); 791a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_ID, contactId); 792a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.RAW_CONTACT_ID, rawContactId2); 793a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.MIMETYPE); 794a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA_ID); 795a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.DATA1); 796a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_NAME, "act2"); 797a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.ACCOUNT_TYPE, "actype2"); 798a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME, "John Doe"); 799a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.DISPLAY_NAME_ALTERNATIVE, "Doe, John"); 800a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.NAME_RAW_CONTACT_ID, rawContactId1); 801a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 802a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_PRESENCE, StatusUpdates.IDLE); 803a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(Contacts.Entity.CONTACT_STATUS, "Busy"); 804a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.putNull(Contacts.Entity.PRESENCE); 805a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov assertCursorValues(cursor, values); 806a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 807a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov cursor.close(); 808a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 809a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 8103cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testDataInsert() { 8114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("John", "Doe"); 8124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 8144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov putDataValues(values, rawContactId); 8154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 8164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long dataId = ContentUris.parseId(dataUri); 8174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 8194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 8204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(dataUri, values); 8214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Data.CONTENT_URI, values, Data._ID, dataId); 8234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under RawContacts 8254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 8264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactDataUri = 8274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri.withAppendedPath(rawContactUri, RawContacts.Data.CONTENT_DIRECTORY); 8284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(rawContactDataUri, values, Data._ID, dataId); 8294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Access the same data through the directory under Contacts 8314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 8324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactDataUri = Uri.withAppendedPath(contactUri, Contacts.Data.CONTENT_DIRECTORY); 8334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(contactDataUri, values, Data._ID, dataId); 83481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 8354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 8363cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 83789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactDataQuery() { 83889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 83989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 84089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 84189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri1 = insertStructuredName(rawContactId1, "John", "Doe"); 84289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 84389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri dataUri2 = insertStructuredName(rawContactId2, "Jane", "Doe"); 84489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 84589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(dataUri1, account1); 84689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(dataUri2, account2); 84789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Data._ID, ContentUris.parseId(dataUri1)) ; 84889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Data._ID, ContentUris.parseId(dataUri2)) ; 84989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 85089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 8514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesQuery() { 8527d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 8533cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 8544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 8554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 8564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 8574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 8584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 8594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 8614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 8624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 8644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri uri = insertPhoneNumber(rawContactId, "18004664411"); 8654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long phoneId = ContentUris.parseId(uri); 8664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 8684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = queryContactId(rawContactId); 8694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 8704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, phoneId); 8713cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 8724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 8734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 8744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 8754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 8764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 8774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 8784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 8794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 8804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 8814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 8824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 8834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 88448828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Phone.CONTENT_URI, phoneId), values); 8854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Phone.CONTENT_URI, values, Data._ID, phoneId); 8864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 8874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 888cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa public void testPhonesWithMergedContacts() { 889cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId1 = createRawContact(); 890cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId1, "123456789", true); 891cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 892cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa long rawContactId2 = createRawContact(); 893cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa insertPhoneNumber(rawContactId2, "123456789", true); 894cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 895cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa ContentValues values1 = new ContentValues(); 896cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "123456789"); 897cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 898cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa values1.put(Phone.NUMBER, "123456789"); 899cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 900cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa // Two results should come, since they are separate entries anyway. 901cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 902cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9038ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Even with remove_duplicate_entries flag, we should return two results here, because 9048ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // they have different raw_contact_id-s. 9058ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Phone.CONTENT_URI.buildUpon() 9068ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 9078ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 9088ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, new ContentValues[] {values1, values1}); 9098ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 910cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 911cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa rawContactId1, rawContactId2); 912cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 913cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa assertAggregated(rawContactId1, rawContactId2, "123456789"); 914cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9158ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Contact merge won't affect the default result of Phone Uri. 9168ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Phone.CONTENT_URI, new ContentValues[] {values1, values1}); 9178ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 9188ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // We should detect duplicates when requested. 9198ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values1); 920cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa } 921cf55cbe8932f620484a3634d13ecc116c32fdc99Daisuke Miyakawa 9224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPhonesFilterQuery() { 923e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Phone.CONTENT_FILTER_URI); 924e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 925e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 926e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** 927e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * A convenient method for {@link #testPhonesFilterQuery()} and 928e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link #testCallablesFilterQuery()}. 929e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 930e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * This confirms if both URIs return identical results for phone-only contacts and 931e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * appropriately different results for contacts with sip addresses. 932e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * 933e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * @param baseFilterUri Either {@link Phone#CONTENT_FILTER_URI} or 934e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa * {@link Callable#CONTENT_FILTER_URI}. 935e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa */ 936e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa private void testPhonesFilterQueryInter(Uri baseFilterUri) { 937e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertTrue("Unsupported Uri (" + baseFilterUri + ")", 938e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa Phone.CONTENT_FILTER_URI.equals(baseFilterUri) 939e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa || Callable.CONTENT_FILTER_URI.equals(baseFilterUri)); 940e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 941e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 9425e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertPhoneNumber(rawContactId1, "1-800-466-4411"); 9435e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 944e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("Chilled", "Guacamole", ACCOUNT_2); 9452a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov insertPhoneNumber(rawContactId2, "1-800-466-5432"); 94658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "0@example.com", false, Phone.TYPE_PAGER); 94758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa insertPhoneNumber(rawContactId2, "1@example.com", false, Phone.TYPE_PAGER); 9485e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 949e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri1 = Uri.withAppendedPath(baseFilterUri, "tamale"); 9504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 9514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 9524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 9535e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Phone.NUMBER, "1-800-466-4411"); 9544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 9554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Phone.LABEL); 9565e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 9574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 958e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri2 = Uri.withAppendedPath(baseFilterUri, "1-800-GOOG-411"); 9595e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri2, values); 9605e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 961e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri3 = Uri.withAppendedPath(baseFilterUri, "18004664"); 9625e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValues(filterUri3, values); 9635e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 964e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri4 = Uri.withAppendedPath(baseFilterUri, "encilada"); 9655e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 96645d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov 967e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri5 = Uri.withAppendedPath(baseFilterUri, "*"); 96845d8626bf586b5c7111fa86324a7201ae8073607Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 96958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 97058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values1 = new ContentValues(); 97158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 97258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 97358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.NUMBER, "1-800-466-5432"); 97458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 97558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values1.putNull(Phone.LABEL); 97658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 97758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values2 = new ContentValues(); 97858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 97958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 98058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.NUMBER, "0@example.com"); 98158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.put(Phone.TYPE, Phone.TYPE_PAGER); 98258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values2.putNull(Phone.LABEL); 98358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 98458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa ContentValues values3 = new ContentValues(); 98558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Contacts.DISPLAY_NAME, "Chilled Guacamole"); 98658567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 98758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.NUMBER, "1@example.com"); 98858567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.put(Phone.TYPE, Phone.TYPE_PAGER); 98958567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values3.putNull(Phone.LABEL); 99058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 991e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri6 = Uri.withAppendedPath(baseFilterUri, "Chilled"); 992e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} ); 993e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 994e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Insert a SIP address. From here, Phone URI and Callable URI may return different results 995e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // than each other. 996e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip_hot_tamale@example.com"); 997e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId1, "sip:sip_hot@example.com"); 998e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 999e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri7 = Uri.withAppendedPath(baseFilterUri, "sip_hot"); 1000e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa final Uri filterUri8 = Uri.withAppendedPath(baseFilterUri, "sip_hot_tamale"); 1001e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa if (Callable.CONTENT_FILTER_URI.equals(baseFilterUri)) { 1002e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values4 = new ContentValues(); 1003e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1004e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1005e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values4.put(SipAddress.SIP_ADDRESS, "sip_hot_tamale@example.com"); 1006e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1007e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values5 = new ContentValues(); 1008e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 1009e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1010e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values5.put(SipAddress.SIP_ADDRESS, "sip:sip_hot@example.com"); 1011e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri1, new ContentValues[] {values, values4, values5}); 1012e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1013e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri7, new ContentValues[] {values4, values5}); 1014e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri8, values4); 1015e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } else { 1016e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sip address should not affect Phone URI. 1017e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValuesWithProjection(filterUri1, values); 1018e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri7, null, null)); 1019e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1020e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1021e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // Sanity test. Run tests for "Chilled Guacamole" again and see nothing changes 1022e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa // after the Sip address being inserted. 1023e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri2, values); 1024e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(filterUri3, values); 1025e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri4, null, null)); 1026e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(0, getCount(filterUri5, null, null)); 102758567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} ); 10284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 10294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1030e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public void testPhoneLookup() { 1031e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov ContentValues values = new ContentValues(); 1032e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1033e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1034e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1035e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1036e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1037e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1038e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 10394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 10404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1041ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // We'll create two lookup records, 18004664411 and +18004664411, and the below lookup 1042ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // will match both. 1043ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki 10444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1045e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 1046e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.clear(); 1047e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup._ID, queryContactId(rawContactId)); 1048e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.DISPLAY_NAME, "Hot Tamale"); 1049e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.NUMBER, "18004664411"); 1050e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.TYPE, Phone.TYPE_HOME); 1051e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.putNull(PhoneLookup.LABEL); 1052e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.CUSTOM_RINGTONE, "d"); 1053e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov values.put(PhoneLookup.SEND_TO_VOICEMAIL, 1); 1054ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertStoredValues(lookupUri1, null, null, new ContentValues[] {values, values}); 10554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1056892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // In the context that 8004664411 is a valid number, "4664411" as a 105734984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia // call id should match to both "8004664411" and "+18004664411". 1058e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "4664411"); 105934984173c94fffb45710673f4f92150b87134ce4Shaopeng Jia assertEquals(2, getCount(lookupUri2, null, null)); 1060892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1061892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1062892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void testPhoneLookupUseCases() { 1063892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues values = new ContentValues(); 1064892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri rawContactUri; 1065892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactId; 1066892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri lookupUri2; 1067892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1068892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1069892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1070892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1071892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // International format in contacts 1072892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1073892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1074892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1075892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1076892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "+1-650-861-0000"); 1077892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1078892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1079892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1080892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1081892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0000"); 1082892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1083892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1084892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1085892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0000"); 1086892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1087892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1088892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // National format in contacts 1089892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1090892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1091892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1092892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1093892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1094892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1095892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot1", "Tamale"); 1096892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "650-861-0001"); 1097892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1098892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1099892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1100892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1101892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0001"); 1102892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1103892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1104892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1105892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0001"); 1106892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(2, getCount(lookupUri2, null, null)); 1107892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1108892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Local format in contacts 1109892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1110892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 1111892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 1112892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1113892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov rawContactId = ContentUris.parseId(rawContactUri); 1114892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1115892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertStructuredName(rawContactId, "Hot2", "Tamale"); 1116892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov insertPhoneNumber(rawContactId, "861-0002"); 1117892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1118892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov values.clear(); 1119892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1120892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with international format 1121892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+1 650 861 0002"); 1122892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 1123892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1124892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // match with national format 1125892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "650 861 0002"); 1126892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals(1, getCount(lookupUri2, null, null)); 11274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 11284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 112956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testIntlPhoneLookupUseCases() { 113056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Checks the logic that relies on using the trailing 7-digits as a fallback for phone 113156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // number lookups. 113256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String fullNumber = "01197297427289"; 113356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 113456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 113556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 113656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 113756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 113856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 113956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, fullNumber); 114056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 114156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Full number should definitely match. 114256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 114356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, fullNumber), null, null)); 114456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 114556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Shorter (local) number with 0 prefix should also match. 114656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 114756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "097427289"), null, null)); 114856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 114956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Shorter (local) number with +0 prefix should also match. 115056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 115156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "+097427289"), null, null)); 115256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 115356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with dashes should match. 115456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 115556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09-742-7289"), null, null)); 115656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 115756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Same shorter number with spaces should match. 115856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(2, getCount(Uri.withAppendedPath( 115956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "09 742 7289"), null, null)); 116056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 116156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Some other number should not match. 116256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(0, getCount(Uri.withAppendedPath( 116356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "049102395"), null, null)); 116456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 116556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 116656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro public void testPhoneLookupB5252190() { 116756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro // Test cases from b/5252190 116856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro String storedNumber = "796010101"; 116956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 117056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro ContentValues values = new ContentValues(); 117156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.CUSTOM_RINGTONE, "d"); 117256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 117356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(RawContacts.CONTENT_URI, values)); 117456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertStructuredName(rawContactId, "Senor", "Chang"); 117556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro insertPhoneNumber(rawContactId, storedNumber); 117656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 117756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 117856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "0796010101"), null, null)); 117956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 118056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 118156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "+48796010101"), null, null)); 118256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 118356abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 118456abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "48796010101"), null, null)); 118556abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 118656abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 118756abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4-879-601-0101"), null, null)); 118856abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 118956abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro assertEquals(1, getCount(Uri.withAppendedPath( 119056abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro PhoneLookup.CONTENT_FILTER_URI, "4 879 601 0101"), null, null)); 119156abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro } 119256abe81ced08c7af625b3eb8dd543f9030da9badDave Santoro 1193653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov public void testPhoneUpdate() { 1194653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov ContentValues values = new ContentValues(); 1195653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 1196653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 1197653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1198653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov insertStructuredName(rawContactId, "Hot", "Tamale"); 1199653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "18004664411"); 1200653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1201653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664411"); 1202ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki Uri lookupUri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "8004664422"); 1203ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri1, null, null)); 1204ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri2, null, null)); 1205653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1206653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1207653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1208653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1209653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1210ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1211ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 1212653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1213653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Setting number to null will remove the phone lookup record 1214653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1215653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.putNull(Phone.NUMBER); 1216653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1217653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1218ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1219653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov assertEquals(0, getCount(lookupUri2, null, null)); 1220653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1221653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov // Let's restore that phone lookup record 1222653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.clear(); 1223653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov values.put(Phone.NUMBER, "18004664422"); 1224653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov mResolver.update(phoneUri, values, null, null); 1225ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(0, getCount(lookupUri1, null, null)); 1226ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki assertEquals(2, getCount(lookupUri2, null, null)); 122781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 1228653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov } 1229653f73c9417ee0d2cf90e9aacd32848016747cf7Dmitri Plotnikov 1230e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa /** Tests if {@link Callable#CONTENT_URI} returns both phones and sip addresses. */ 1231e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesQuery() { 1232e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId1 = createRawContactWithName("Meghan", "Knox"); 1233e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long phoneId1 = ContentUris.parseId(insertPhoneNumber(rawContactId1, "18004664411")); 1234e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId1 = queryContactId(rawContactId1); 1235e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1236e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long rawContactId2 = createRawContactWithName("John", "Doe"); 1237e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long sipAddressId2 = ContentUris.parseId( 1238e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa insertSipAddress(rawContactId2, "sip@example.com")); 1239e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa long contactId2 = queryContactId(rawContactId2); 1240e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1241e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values1 = new ContentValues(); 1242e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data._ID, phoneId1); 1243e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.RAW_CONTACT_ID, rawContactId1); 1244e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(RawContacts.CONTACT_ID, contactId1); 1245e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1246e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.NUMBER, "18004664411"); 1247e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Phone.TYPE, Phone.TYPE_HOME); 1248e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.putNull(Phone.LABEL); 1249e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values1.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 1250e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1251e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values2 = new ContentValues(); 1252e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data._ID, sipAddressId2); 1253e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.RAW_CONTACT_ID, rawContactId2); 1254e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(RawContacts.CONTACT_ID, contactId2); 1255e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 1256e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(SipAddress.SIP_ADDRESS, "sip@example.com"); 1257e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values2.put(Contacts.DISPLAY_NAME, "John Doe"); 1258e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1259e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertEquals(2, getCount(Callable.CONTENT_URI, null, null)); 1260e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa assertStoredValues(Callable.CONTENT_URI, new ContentValues[] { values1, values2 }); 1261e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1262e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 1263e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa public void testCallablesFilterQuery() { 1264e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa testPhonesFilterQueryInter(Callable.CONTENT_FILTER_URI); 1265e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 1266e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 12674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testEmailsQuery() { 12684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 12694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "d"); 12704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 12714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.LAST_TIME_CONTACTED, 12345); 12724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, 54321); 12734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, 1); 12744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 12754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 12768ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long rawContactId = ContentUris.parseId(rawContactUri); 12774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 12784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertStructuredName(rawContactId, "Meghan", "Knox"); 12798ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri = insertEmail(rawContactId, "meghan@acme.com"); 12808ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId = ContentUris.parseId(emailUri); 12814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 12828ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 12834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.clear(); 12844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, emailId); 12854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 12864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 12874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 12884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "meghan@acme.com"); 12894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 12904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 12914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Meghan Knox"); 12924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, "d"); 12934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, 1); 12944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.LAST_TIME_CONTACTED, 12345); 12954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.TIMES_CONTACTED, 54321); 12964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.STARRED, 1); 12974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 12988ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, values); 129948828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 13004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Email.CONTENT_URI, values, Data._ID, emailId); 13018ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13028ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated email addresses. 13038ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri emailUri2 = insertEmail(rawContactId, "meghan@acme.com"); 13048ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long emailId2 = ContentUris.parseId(emailUri2); 13058ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 13068ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, emailId2); 13078ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13088ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = Email.CONTENT_URI.buildUpon() 13098ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 13108ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 13118ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13128ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 13138ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values); 13148ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId), values); 13158ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId2), values2); 13168ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, emailId2), values2); 13178ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13188ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(Email.CONTENT_URI, new ContentValues[] {values, values2}); 13198ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 13208ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 13218ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 13228ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 13238ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 13244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 13254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13265e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsLookupQuery() { 13274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Hot", "Tamale"); 13284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertEmail(rawContactId, "tamale@acme.com"); 13294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13305e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "tamale@acme.com"); 13314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 13324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 13334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 13344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 13354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 13364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.putNull(Email.LABEL); 13374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(filterUri1, values); 13384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 133908768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "Ta<TaMale@acme.com>"); 134008768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertStoredValues(filterUri2, values); 134108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 134208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, "encilada@acme.com"); 134308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov assertEquals(0, getCount(filterUri3, null, null)); 13444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 13454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13465e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov public void testEmailsFilterQuery() { 134747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1); 13485e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 13495e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId1, "tamale@acme.com"); 13505e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 135147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("Hot", "Tamale", ACCOUNT_2); 13525e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov insertEmail(rawContactId2, "tamale@acme.com"); 13535e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 13545e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tam"); 13555e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov ContentValues values = new ContentValues(); 13565e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Hot Tamale"); 13575e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 13585e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.DATA, "tamale@acme.com"); 13595e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_HOME); 13605e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov values.putNull(Email.LABEL); 13615e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 13625e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 13635e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot"); 13645e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri2, values); 13655e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 1366155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "hot tamale"); 13675e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri3, values); 13685e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 13691e530df9f7e496dc47f77d4323c89bd413b79b64Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "tamale@acme"); 13705e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertStoredValuesWithProjection(filterUri4, values); 13715e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 13725e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov Uri filterUri5 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "encilada"); 13735e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov assertEquals(0, getCount(filterUri5, null, null)); 13745e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov } 13755e99505757457d11d9388f6d04960e97fc776a59Dmitri Plotnikov 13767d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa /** 1377c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns addresses according to registration order. 1378c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1379c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterDefaultSortOrder() { 1380c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1381c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1382c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com"); 1383c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address3@email.com"); 1384c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1385c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1386c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1387c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1388c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1389c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1390c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1391c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1392c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v1, v2, v3 }); 1393c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1394c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1395c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 1396c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa * Tests if ContactsProvider2 returns primary addresses before the other addresses. 1397c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa */ 1398c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa public void testEmailFilterPrimaryAddress() { 1399c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa long rawContactId1 = createRawContact(); 1400c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 1401c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa insertEmail(rawContactId1, "address2@email.com", true); 1402c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1403c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1404c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1405c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1406c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1407c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1408c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa assertStoredValuesOrderly(filterUri, new ContentValues[] { v2, v1 }); 1409c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa } 1410c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa 1411c591cc2ffecdd0038f787a133606752752294c13Daisuke Miyakawa /** 14127d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * Tests if ContactsProvider2 has email address associated with a primary account before the 14137d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa * other address. 14147d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa */ 14157d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa public void testEmailFilterPrimaryAccount() { 14167d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId1 = createRawContact(ACCOUNT_1); 14177d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId1, "account1@email.com"); 14187d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa long rawContactId2 = createRawContact(ACCOUNT_2); 14197d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa insertEmail(rawContactId2, "account2@email.com"); 14207d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v1 = new ContentValues(); 14217d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v1.put(Email.ADDRESS, "account1@email.com"); 14227d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa ContentValues v2 = new ContentValues(); 14237d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa v2.put(Email.ADDRESS, "account2@email.com"); 14247d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 14257d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri1 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 14267d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 14277d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_1.type) 14287d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 14297d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2 }); 14307d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 14317d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 14327d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 14337d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_TYPE, ACCOUNT_2.type) 14347d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 14357d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v2, v1 }); 14367d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 14377d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa // Just with PRIMARY_ACCOUNT_NAME 14387d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 14397d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_1.name) 14407d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 14417d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2 }); 14427d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 14437d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("acc") 14447d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .appendQueryParameter(ContactsContract.PRIMARY_ACCOUNT_NAME, ACCOUNT_2.name) 14457d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa .build(); 14467d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v2, v1 }); 14477d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 14487d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 144946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** Tests {@link DataUsageFeedback} correctly promotes a data row instead of a raw contact. */ 145046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public void testEmailFilterSortOrderWithFeedback() { 145146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId1 = createRawContact(); 14524928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address1 = "address1@email.com"; 14534928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId1, address1); 145446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa long rawContactId2 = createRawContact(); 14554928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address2 = "address2@email.com"; 14564928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa insertEmail(rawContactId2, address2); 14574928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa String address3 = "address3@email.com"; 14584928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa ContentUris.parseId(insertEmail(rawContactId2, address3)); 145946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 146046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v1 = new ContentValues(); 146146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 146246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v2 = new ContentValues(); 146346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 146446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ContentValues v3 = new ContentValues(); 146546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 146646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 146746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 146846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri2 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 146946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 147046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_CALL) 147146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 147246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri3 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 147346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 147446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT) 147546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 147646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Uri filterUri4 = Email.CONTENT_FILTER_URI.buildUpon().appendPath("address") 147746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 147846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_SHORT_TEXT) 147946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa .build(); 148046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2, v3 }); 148146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri2, new ContentValues[] { v1, v2, v3 }); 148246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2, v3 }); 148346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri4, new ContentValues[] { v1, v2, v3 }); 148446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 14854928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(address3, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, v3); 148646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 148746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa // account3@email.com should be the first. account2@email.com should also be promoted as 148846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa // it has same contact id. 148946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v3, v1, v2 }); 149046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa assertStoredValuesOrderly(filterUri3, new ContentValues[] { v3, v1, v2 }); 149146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 149246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1493f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa /** 1494f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * Tests {@link DataUsageFeedback} correctly bucketize contacts using each 1495f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa * {@link DataUsageStatColumns#LAST_TIME_USED} 1496f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa */ 1497f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa public void testEmailFilterSortOrderWithOldHistory() { 1498f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long rawContactId1 = createRawContact(); 1499f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId1 = ContentUris.parseId(insertEmail(rawContactId1, "address1@email.com")); 1500f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId2 = ContentUris.parseId(insertEmail(rawContactId1, "address2@email.com")); 1501f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId3 = ContentUris.parseId(insertEmail(rawContactId1, "address3@email.com")); 1502f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long dataId4 = ContentUris.parseId(insertEmail(rawContactId1, "address4@email.com")); 1503f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1504f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address"); 1505f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1506f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v1 = new ContentValues(); 1507f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v1.put(Email.ADDRESS, "address1@email.com"); 1508f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v2 = new ContentValues(); 1509f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v2.put(Email.ADDRESS, "address2@email.com"); 1510f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v3 = new ContentValues(); 1511f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v3.put(Email.ADDRESS, "address3@email.com"); 1512f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa ContentValues v4 = new ContentValues(); 1513f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa v4.put(Email.ADDRESS, "address4@email.com"); 1514f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1515f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa final ContactsProvider2 provider = (ContactsProvider2) getProvider(); 1516f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1517f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long nowInMillis = System.currentTimeMillis(); 1518f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000); 1519f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000); 1520f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000); 1521f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1522f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address4 is contacted just once yesterday. 1523f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId4), 1524f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, yesterdayInMillis); 1525f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1526f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address3 is contacted twice 1 week ago. 1527f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1528f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1529f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId3), 1530f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis); 1531f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1532f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is contacted three times 1 year ago. 1533f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1534f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1535f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1536f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1537f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1538f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis); 1539f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1540f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // auto-complete should prefer recently contacted methods 1541f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v4, v3, v2, v1 }); 1542f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1543f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address2 is contacted right now 1544f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId2), 1545f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1546f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1547f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Now address2 is the most recently used address 1548f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v4, v3, v1 }); 1549f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1550f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // Pretend address1 is contacted right now 1551f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa provider.updateDataUsageStat(Arrays.asList(dataId1), 1552f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis); 1553f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 1554f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa // address2 is preferred to address1 as address2 is used 4 times in total 1555f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v1, v4, v3 }); 1556f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa } 1557f9648a03e88e2d1a91c616a20d903e4c9a2468e5Daisuke Miyakawa 15584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testPostalsQuery() { 15594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = createRawContactWithName("Alice", "Nextore"); 15604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri dataUri = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 15618ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId = ContentUris.parseId(dataUri); 15624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15638ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long contactId = queryContactId(rawContactId); 15644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 15654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data._ID, dataId); 15664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 15674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 15684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 15694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(StructuredPostal.FORMATTED_ADDRESS, "1600 Amphiteatre Ave, Mountain View"); 15704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Alice Nextore"); 15714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15728ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, values); 157348828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 157448828f54daafda2edb122258c4c6a7d2ca704128Dmitri Plotnikov values); 15754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(StructuredPostal.CONTENT_URI, values, Data._ID, dataId); 15768ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 15778ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // Check if the provider detects duplicated addresses. 15788ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa Uri dataUri2 = insertPostalAddress(rawContactId, "1600 Amphiteatre Ave, Mountain View"); 15798ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final long dataId2 = ContentUris.parseId(dataUri2); 15808ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final ContentValues values2 = new ContentValues(values); 15818ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2.put(Data._ID, dataId2); 15828ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 15838ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa final Uri dedupeUri = StructuredPostal.CONTENT_URI.buildUpon() 15848ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true") 15858ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa .build(); 15868ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 15878ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // URI with ID should return a correct result. 15888ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId), 15898ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values); 15908ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId), values); 15918ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(StructuredPostal.CONTENT_URI, dataId2), 15928ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values2); 15938ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(ContentUris.withAppendedId(dedupeUri, dataId2), values2); 15948ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 15958ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(StructuredPostal.CONTENT_URI, new ContentValues[] {values, values2}); 15968ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa 15978ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // If requested to remove duplicates, the query should return just one result, 15988ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa // whose _ID won't be deterministic. 15998ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa values.remove(Data._ID); 16008ead0dc62d0031a22af0d14c7ed05893507893c9Daisuke Miyakawa assertStoredValues(dedupeUri, values); 16014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public void testQueryContactData() { 16044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 16054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1606aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1607d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 16084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 16094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertStoredValues(contactUri, values); 16114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertSelection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 16124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16140a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testQueryContactWithStatusUpdate() { 16154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 16164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long contactId = createContact(values, "John", "Doe", 1617aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1618aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 161982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1620aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori values.put(Contacts.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 1621ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 1622ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 1623ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelectionWithProjection(Contacts.CONTENT_URI, values, Contacts._ID, contactId); 16244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 16254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1626a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByName() { 16274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 162848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1629aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1630d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1631aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 163248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 163348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov ContentValues nameValues = new ContentValues(); 163448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.GIVEN_NAME, "Stu"); 163548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov nameValues.put(StructuredName.FAMILY_NAME, "Goulash"); 16363b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "goo"); 16373b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "LASH"); 16387ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, nameValues); 163948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 164048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long contactId = queryContactId(rawContactId); 164182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 164248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1643ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goulash"); 1644ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 16454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 164648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov assertContactFilter(contactId, "goolash"); 16473b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov assertContactFilter(contactId, "lash"); 164848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 1649a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 16503b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov 16513b10d3a1ed1052dcdf529da370cb71b74164b158Dmitri Plotnikov // Phonetic name with given/family reversed should not match 1652a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("lashgoo"); 16537ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 16547ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.clear(); 16557ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "ga"); 16567ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "losh"); 16577ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 16587ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov mResolver.update(nameUri, nameValues, null, null); 16597ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 16607ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov assertContactFilter(contactId, "galosh"); 16617ceafd016eb07d2de808d18cd5a9463efaee781dDmitri Plotnikov 1662a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1663a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1664a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1665a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByEmailAddress() { 1666a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1667a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1668a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1669a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1670a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1671a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1672a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1673a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1674a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1675a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1676a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1677a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goog411@acme.com"); 1678a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1679a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1680a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog"); 1681a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411"); 1682a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@"); 1683a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme"); 1684a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "goog411@acme.com"); 1685a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1686a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@acme.combo"); 1687a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goog411@le.com"); 1688a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("goolish"); 1689a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 1690a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1691a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public void testQueryContactFilterByPhoneNumber() { 1692a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov ContentValues values = new ContentValues(); 1693a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long rawContactId = createRawContact(values, "18004664411", 1694a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 1695a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 1696a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov StatusUpdates.CAPABILITY_HAS_VOICE); 1697a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1698a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov insertStructuredName(rawContactId, "James", "Bond"); 1699a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1700a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov long contactId = queryContactId(rawContactId); 1701a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 1702a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1703a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "18004664411"); 1704a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertStoredValuesWithProjection(filterUri1, values); 1705a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1706a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "18004664411"); 1707a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "1800466"); 1708a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "+18004664411"); 1709a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilter(contactId, "8004664411"); 1710a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 1711a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("78004664411"); 1712a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("18004664412"); 1713a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertContactFilterNoResult("8884664411"); 17144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 17154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17162f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa /** 17172f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * Checks ContactsProvider2 works well with strequent Uris. The provider should return starred 17182f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa * contacts and frequently used contacts. 17192f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa */ 1720ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactStrequent() { 17214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 17222f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String email1 = "a@acme.com"; 17232f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted1 = 0; 17244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Noah", "Tever", "18004664411", 17252f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa email1, StatusUpdates.OFFLINE, timesContacted1, 0, 0, 1726d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 17274928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final String phoneNumber2 = "18004664412"; 17284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 17294928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa createContact(values2, "Sam", "Times", phoneNumber2, 1730aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "b@acme.com", StatusUpdates.INVISIBLE, 3, 0, 0, 1731aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 17324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values3 = new ContentValues(); 17332f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final String phoneNumber3 = "18004664413"; 17342f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa final int timesContacted3 = 5; 17352f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa createContact(values3, "Lotta", "Calling", phoneNumber3, 17362f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, timesContacted3, 0, 0, 1737d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO); 17384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values4 = new ContentValues(); 17399dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa final long rawContactId4 = createRawContact(values4, "Fay", "Veritt", null, 1740aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 1741d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_VIDEO | StatusUpdates.CAPABILITY_HAS_VOICE); 17424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 17432f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Starred contacts should be returned. TIMES_CONTACTED should be ignored and only data 17442f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // usage feedback should be used for "frequently contacted" listing. 17452f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(Contacts.CONTENT_STREQUENT_URI, values4); 17462f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 17472f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Send feedback for the 3rd phone number, pretending we called that person via phone. 17484928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 17492f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 17502f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 3rd contact should be shown after starred one. 17512f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 17522f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa new ContentValues[] { values4, values3 }); 17532f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 17544928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 17552f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // Twice. 17564928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 17572f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 17582f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa // After the feedback, 1st and 3rd contacts should be shown after starred one. 17592f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI, 17604928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa new ContentValues[] { values4, values1, values3 }); 17612f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 17629dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // With phone-only parameter, 1st and 4th contacts shouldn't be returned because: 17639dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 1st: feedbacks are only about email, not about phone call. 17649dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // 4th: it has no phone number though starred. 17652f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Uri phoneOnlyStrequentUri = Contacts.CONTENT_STREQUENT_URI.buildUpon() 17662f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true") 17672f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa .build(); 17689dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values3 }); 17699dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 17709dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Now the 4th contact has a phone number. 17719dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId4, "18004664414"); 17729dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa 17739dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa // Phone only strequent should return 4th contact. 17744928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 17754928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 17764928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // Send feedback for the 2rd phone number, pretending we send the person a SMS message. 17774928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa sendFeedback(phoneNumber2, DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, values1); 17784928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 17794928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa // SMS feedback shouldn't affect phone-only results. 17804928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values4, values3 }); 17814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1782ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, "fay"); 17832f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertStoredValues(filterUri, values4); 17844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 17854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 178645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa /** 178745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * Checks ContactsProvider2 works well with frequent Uri. The provider should return frequently 178845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa * contacted person ordered by number of times contacted. 178945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa */ 179045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa public void testQueryContactFrequent() { 179145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values1 = new ContentValues(); 179245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email1 = "a@acme.com"; 179345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values1, "Noah", "Tever", "18004664411", 179445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email1, StatusUpdates.OFFLINE, 0, 0, 0, 0); 179545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values2 = new ContentValues(); 179645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String email2 = "b@acme.com"; 179745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values2, "Sam", "Times", "18004664412", 179845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0); 179945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values3 = new ContentValues(); 180045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa final String phoneNumber3 = "18004664413"; 1801363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa final long contactId3 = createContact(values3, "Lotta", "Calling", phoneNumber3, 1802363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa "c@acme.com", StatusUpdates.AWAY, 0, 1, 0, 0); 180345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa ContentValues values4 = new ContentValues(); 180445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa createContact(values4, "Fay", "Veritt", "18004664414", 180545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa "d@acme.com", StatusUpdates.AVAILABLE, 0, 1, 0, 0); 180645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 180745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1); 180845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 180945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, values1); 181045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 181145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Pretend email was sent to the address twice. 181245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 181345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2); 181445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 181545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1}); 181645ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 181745ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa // Three times 181845ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 181945ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 182045ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3); 182145ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 182245ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 182345ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 1824363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 1825363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa // Test it works with selection/selectionArgs 1826363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1827363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 1828363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values2, values1}); 1829363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1830363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 1831363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3}); 1832363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa 1833363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3.put(Contacts.STARRED, 0); 1834363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertEquals(1, 1835363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa mResolver.update(Uri.withAppendedPath(Contacts.CONTENT_URI, 1836363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa String.valueOf(contactId3)), 1837363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa values3, null, null)); 1838363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1839363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"0"}, 1840363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {values3, values2, values1}); 1841363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa assertStoredValues(Contacts.CONTENT_FREQUENT_URI, 1842363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa Contacts.STARRED + "=?", new String[] {"1"}, 1843363bdaba2994539e1a3a2342a9fcf223604d69eaDaisuke Miyakawa new ContentValues[] {}); 184445ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa } 184545ae7eaf0e2c9459ccbeeb5eb5977f055c4ed8ecDaisuke Miyakawa 1846ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void testQueryContactGroup() { 18474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long groupId = createGroup(null, "testGroup", "Test Group"); 18484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 18494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values1 = new ContentValues(); 18504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values1, "Best", "West", "18004664411", 1851aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "west@acme.com", StatusUpdates.OFFLINE, 0, 0, groupId, 1852aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 18534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 18544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values2 = new ContentValues(); 18554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov createContact(values2, "Rest", "East", "18004664422", 1856aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "east@acme.com", StatusUpdates.AVAILABLE, 0, 0, 0, 1857aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 18584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1859ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 18604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Cursor c = mResolver.query(filterUri1, null, null, null, Contacts._ID); 18614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 18624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.moveToFirst(); 18634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertCursorValues(c, values1); 18644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 18654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1866ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri2 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Test Group"); 18674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri2, null, Contacts.DISPLAY_NAME + "=?", 18684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov new String[] { "Best West" }, Contacts._ID); 18694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 18704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 18714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1872ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Uri filterUri3 = Uri.withAppendedPath(Contacts.CONTENT_GROUP_URI, "Next Group"); 18734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c = mResolver.query(filterUri3, null, null, null, Contacts._ID); 18744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(0, c.getCount()); 18754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov c.close(); 18763cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 18773cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 187836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro private void expectSecurityException(String failureMessage, Uri uri, String[] projection, 187936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String selection, String[] selectionArgs, String sortOrder) { 188024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = null; 188124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 188236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro c = mResolver.query(uri, projection, selection, selectionArgs, sortOrder); 188336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail(failureMessage); 188424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 188536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // The security exception is expected to occur because we're missing a permission. 188624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } finally { 188724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (c != null) { 188824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 188924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 189024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 189136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 189236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 189336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testQueryProfileRequiresReadPermission() { 189436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 189536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 189636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro createBasicProfileContact(new ContentValues()); 189736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 189836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Case 1: Retrieving profile contact. 189936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 190036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile without READ_PROFILE access should fail.", 190136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI, null, null, null, Contacts._ID); 190224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 190324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieving profile data. 190436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 190536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile data without READ_PROFILE access should fail.", 190636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 190736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 190824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 190924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieving profile entities. 191036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 191136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile entities without READ_PROFILE access should fail.", 191236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon() 191336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entities").build(), null, null, null, Contacts._ID); 191424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 191524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 191624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByContactIdRequiresReadPermission() { 191724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 191824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 191924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 192024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 192124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 192224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // A query for the profile contact by ID should fail. 192336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 192436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the profile by contact ID without READ_PROFILE access should fail.", 192536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 192636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, Contacts._ID); 192724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 192824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 192924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileByRawContactIdRequiresReadPermission() { 193024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 193124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 193224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the raw contact. 193324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 193436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 193536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 193636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, 193736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro profileRawContactId), null, null, null, RawContacts._ID); 193824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 193924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 194024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileRawContactRequiresReadPermission() { 194124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 194224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 194324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the profile's raw contact data. 194424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 194524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 194624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 1: Retrieve the overall raw contact set for the profile. 194736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 194836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw contact profile without READ_PROFILE access should fail.", 194936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, null, null, null, null); 195024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 195124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 2: Retrieve the raw contact profile data for the inserted raw contact ID. 195236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 195336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile data without READ_PROFILE access should fail.", 195436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 195536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 195636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("data").build(), null, null, null, null); 195724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 195824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Case 3: Retrieve the raw contact profile entity for the inserted raw contact ID. 195936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 196036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the raw profile entities without READ_PROFILE access should fail.", 196136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 196236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 196336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath("entity").build(), null, null, null, null); 196424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 196524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 196624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataByDataIdRequiresReadPermission() { 196724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 196824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor c = mResolver.query(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 196924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro new String[]{Data._ID, Data.MIMETYPE}, null, null, null); 197024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(4, c.getCount()); // Photo, phone, email, name. 197124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.moveToFirst(); 197224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileDataId = c.getLong(0); 197324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro c.close(); 197424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 197524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve the data 197624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 197736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 197836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 197936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Data.CONTENT_URI, profileDataId), 198036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 198124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 198224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 198324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileDataRequiresReadPermission() { 198424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 198524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 198624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Remove profile read permission and attempt to retrieve all profile data. 198724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 198836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 198936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying for the data in the profile without READ_PROFILE access should fail.", 199036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 199136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 199224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 199324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 199424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileRequiresWritePermission() { 199524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 199624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 199724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a non-profile contact should be fine. 199824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(new ContentValues()); 199924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 200024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Creating a profile contact should throw an exception. 200124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 200224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 200324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Creating a profile contact should fail without WRITE_PROFILE access."); 200424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 200524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 200624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 200724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 200824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testInsertProfileDataRequiresWritePermission() { 200924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 201024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 201124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 201224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro try { 201324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertEmail(profileRawContactId, "foo@bar.net", false); 201424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro fail("Inserting data into a profile contact should fail without WRITE_PROFILE access."); 201524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } catch (SecurityException expected) { 201624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 201724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 201824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 20196ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro public void testUpdateDataDoesNotRequireProfilePermission() { 20206ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.READ_PROFILE"); 20216ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mActor.removePermissions("android.permission.WRITE_PROFILE"); 20226ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 20236ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Create a non-profile contact. 20246ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long rawContactId = createRawContactWithName("Domo", "Arigato"); 20256ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro long dataId = getStoredLongValue(Data.CONTENT_URI, 20266ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", 20276ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(rawContactId), StructuredName.CONTENT_ITEM_TYPE}, 20286ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro Data._ID); 20296ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 20306ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Updates its name using a selection. 20316ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro ContentValues values = new ContentValues(); 20326ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.GIVEN_NAME, "Bob"); 20336ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro values.put(StructuredName.FAMILY_NAME, "Blob"); 20346ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 20356ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro new String[]{String.valueOf(dataId)}); 20366ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 20376ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro // Check that the update went through. 20386ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro assertStoredValues(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), values); 20396ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro } 20406ae89770d8047852b6a1f6fb3cbac812910aa476Dave Santoro 20415d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro public void testQueryContactThenProfile() { 204224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 204324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 204424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileContactId = queryContactId(profileRawContactId); 204524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 204624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 204724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createBasicNonProfileContact(nonProfileValues); 204824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileContactId = queryContactId(nonProfileRawContactId); 204924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 20505d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Contacts.CONTENT_URI, nonProfileValues); 205124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertSelection(Contacts.CONTENT_URI, nonProfileValues, Contacts._ID, nonProfileContactId); 20525d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 20535d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 205424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 205524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 205624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryContactExcludeProfile() { 205724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a profile contact (it should not be returned by the general contact URI). 205824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 205924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 206024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Create a non-profile contact - this should be returned. 206124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nonProfileValues = new ContentValues(); 206224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicNonProfileContact(nonProfileValues); 206324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 206424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Contacts.CONTENT_URI, new ContentValues[] {nonProfileValues}); 206524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 206624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 206724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfile() { 206824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 206924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 207024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 207124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI, profileValues); 207224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 207324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 207424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private ContentValues[] getExpectedProfileDataValues() { 207524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected photo data values (only field is the photo BLOB, which we can't check). 207624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues photoRow = new ContentValues(); 207724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro photoRow.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 207824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 207924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected phone data values. 208024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues phoneRow = new ContentValues(); 208124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 208224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro phoneRow.put(Phone.NUMBER, "18005554411"); 208324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 208424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected email data values. 208524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues emailRow = new ContentValues(); 208624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 208724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro emailRow.put(Email.ADDRESS, "mia.prophyl@acme.com"); 208824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 208924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Expected name data values. 209024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues nameRow = new ContentValues(); 209124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 209224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.DISPLAY_NAME, "Mia Prophyl"); 209324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.GIVEN_NAME, "Mia"); 209424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nameRow.put(StructuredName.FAMILY_NAME, "Prophyl"); 209524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 209624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return new ContentValues[]{photoRow, phoneRow, emailRow, nameRow}; 209724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 209824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 209924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileData() { 210024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 210124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 210224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 210324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 210424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 210524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 210624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryProfileEntities() { 210724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 210824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 210924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("entities").build(), 211024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 211124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 211224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 211324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfile() { 211424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 211524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(profileValues); 211624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 211724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 211824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 211924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, profileValues); 212024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 212124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 212224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileById() { 212324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ContentValues profileValues = new ContentValues(); 212424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(profileValues); 212524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 212624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // The raw contact view doesn't include the photo ID. 212724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.remove(Contacts.PHOTO_ID); 212824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 212924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId), profileValues); 213024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 213124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 213224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileData() { 213324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 213424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 213524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 213624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 213724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("data").build(), getExpectedProfileDataValues()); 213824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 213924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 214024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryRawProfileEntity() { 214124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createBasicProfileContact(new ContentValues()); 214224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 214324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(ContentUris.withAppendedId( 214424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId).buildUpon() 214524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro .appendPath("entity").build(), getExpectedProfileDataValues()); 214624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 214724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 214824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryDataForProfile() { 214924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 215024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 215124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertStoredValues(Profile.CONTENT_URI.buildUpon().appendPath("data").build(), 215224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro getExpectedProfileDataValues()); 215324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 215424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 2155cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro public void testUpdateProfileRawContact() { 2156cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro createBasicProfileContact(new ContentValues()); 2157cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro ContentValues updatedValues = new ContentValues(); 2158cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.SEND_TO_VOICEMAIL, 0); 2159cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.CUSTOM_RINGTONE, "rachmaninoff3"); 2160cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro updatedValues.put(RawContacts.STARRED, 1); 2161cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro mResolver.update(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues, null, null); 2162cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2163cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, updatedValues); 2164cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro } 2165cce1c9cf029f40b62955f4b545f94c993daefbd2Dave Santoro 2166a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro public void testInsertProfileWithDataSetTriggersAccountCreation() { 2167a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that we have no profile raw contacts. 2168a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, new ContentValues[]{}); 2169a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2170a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Insert a profile record with a new data set. 2171a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Account account = new Account("a", "b"); 2172a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro String dataSet = "c"; 2173a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro Uri profileUri = maybeAddAccountQueryParameters(Profile.CONTENT_RAW_CONTACTS_URI, account) 2174a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro .buildUpon().appendQueryParameter(RawContacts.DATA_SET, dataSet).build(); 2175a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro ContentValues values = new ContentValues(); 2176a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro long rawContactId = ContentUris.parseId(mResolver.insert(profileUri, values)); 2177a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro values.put(RawContacts._ID, rawContactId); 2178a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 2179a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro // Check that querying for the profile gets the created raw contact. 2180a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, values); 2181a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro } 2182a09d7527b132ec82f98cde1564b0262fd85768c2Dave Santoro 218385077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfilePhoto() throws IOException { 218485077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 218585077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 218685077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro assertInputStreamContent( 218785077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.THUMBNAIL), 218885077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, false)); 218985077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 219085077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 219185077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro public void testLoadProfileDisplayPhoto() throws IOException { 219285077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro long rawContactId = createBasicProfileContact(new ContentValues()); 219385077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 219485077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro assertInputStreamContent( 219585077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 219685077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro Contacts.openContactPhotoInputStream(mResolver, Profile.CONTENT_URI, true)); 219785077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro } 219885077339f2e0c6f21fd92fb8df335f3aae004fbaDave Santoro 21990a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testPhonesWithStatusUpdate() { 220019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 220119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov ContentValues values = new ContentValues(); 220219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 220319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 220419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 220519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 220619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 220719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664411"); 220819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertPhoneNumber(rawContactId, "18004664412"); 220919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog411@acme.com"); 221019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov insertEmail(rawContactId, "goog412@acme.com"); 221119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 221282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 2213aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.INVISIBLE, "Bad", 2214aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 221582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog412@acme.com", 2216aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, "Good", 2217aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VOICE); 221819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov long contactId = queryContactId(rawContactId); 221919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 222082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri uri = Data.CONTENT_URI; 222119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 2222a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov Cursor c = mResolver.query(uri, null, RawContacts.CONTACT_ID + "=" + contactId + " AND " 2223a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", null, Phone.NUMBER); 222419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertEquals(2, c.getCount()); 222519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 222619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToFirst(); 222719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 222819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 222982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 22300a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 223119a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 223219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664411"); 223319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2234a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 223519a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 223619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 223719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.moveToNext(); 223819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 223919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.clear(); 224082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 22410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Bad"); 224219a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "John Doe"); 224319a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.put(Phone.NUMBER, "18004664412"); 224419a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov values.putNull(Phone.LABEL); 2245a6def2055f5d12cb6ee5cc3dc1adaf39f2b7c97cDmitri Plotnikov values.put(RawContacts.CONTACT_ID, contactId); 224619a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov assertCursorValues(c, values); 224719a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 224819a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov c.close(); 224919a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov } 225019a0962e62c13a5e5f8e5b4eed5e30d3477894b4Dmitri Plotnikov 225189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testGroupQuery() { 225289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 225389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 225489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId1 = createGroup(account1, "e", "f"); 225589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long groupId2 = createGroup(account2, "g", "h"); 225689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account1); 225789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account2); 225889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 225989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 226089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Groups._ID + "=" + groupId1, null, Groups._ID, groupId1) ; 226189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Groups._ID + "=" + groupId2, null, Groups._ID, groupId2) ; 226289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 226389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 22643cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov public void testGroupInsert() { 22653cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov ContentValues values = new ContentValues(); 22663cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 22673cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_NAME, "a"); 22683cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.ACCOUNT_TYPE, "b"); 22693cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SOURCE_ID, "c"); 22703cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.VERSION, 42); 22713cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.GROUP_VISIBLE, 1); 22723cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE, "d"); 22733cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.TITLE_RES, 1234); 22743cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.NOTES, "e"); 22753cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.RES_PACKAGE, "f"); 22763cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYSTEM_ID, "g"); 227794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana values.put(Groups.DELETED, 1); 22783cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC1, "h"); 22793cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC2, "i"); 22803cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC3, "j"); 22813cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov values.put(Groups.SYNC4, "k"); 22823cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 22833cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Uri rowUri = mResolver.insert(Groups.CONTENT_URI, values); 22843cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 228573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.DIRTY, 1); 22863cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertStoredValues(rowUri, values); 22873cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 22883cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 2289f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupCreationAfterMembershipInsert() { 2290f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2291f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2292f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2293f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId = assertSingleGroup(NO_LONG, mAccount, "gsid1", null); 2294f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2295f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId, "gsid1"); 2296f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2297f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2298f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupReuseAfterMembershipInsert() { 2299f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2300f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2301f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Uri groupMembershipUri = insertGroupMembership(rawContactId1, "gsid1"); 2302f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2303f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroup(groupId1, mAccount, "gsid1", "title1"); 2304f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertSingleGroupMembership(ContentUris.parseId(groupMembershipUri), 2305f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa rawContactId1, groupId1, "gsid1"); 2306f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2307f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2308f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupInsertFailureOnGroupIdConflict() { 2309f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long rawContactId1 = createRawContact(mAccount); 2310f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa long groupId1 = createGroup(mAccount, "gsid1", "title1"); 2311f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2312f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues values = new ContentValues(); 2313f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.RAW_CONTACT_ID, rawContactId1); 2314f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 2315f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_SOURCE_ID, "gsid1"); 2316f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa values.put(GroupMembership.GROUP_ROW_ID, groupId1); 2317f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa try { 2318f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa mResolver.insert(Data.CONTENT_URI, values); 2319f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa fail("the insert was expected to fail, but it succeeded"); 2320f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } catch (IllegalArgumentException e) { 2321f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // this was expected 2322f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2323f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2324f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2325f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public void testGroupSummaryQuery() { 2326f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account1 = new Account("accountName1", "accountType1"); 2327f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final Account account2 = new Account("accountName2", "accountType2"); 2328f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId1 = createGroup(account1, "sourceId1", "title1"); 2329f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId2 = createGroup(account2, "sourceId2", "title2"); 2330f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId3 = createGroup(account2, "sourceId3", "title3"); 2331f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2332f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Prepare raw contact id not used at all, to test group summary uri won't be confused 2333f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // with it. 2334f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId0 = createRawContactWithName("firstName0", "lastName0"); 2335f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2336f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId1 = createRawContactWithName("firstName1", "lastName1"); 2337f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId1, "address1@email.com"); 2338f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId1, groupId1); 2339f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2340f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId2 = createRawContactWithName("firstName2", "lastName2"); 2341f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId2, "address2@email.com"); 2342f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId2, "222-222-2222"); 2343f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId2, groupId1); 2344f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2345f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v1 = new ContentValues(); 2346f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups._ID, groupId1); 2347f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.TITLE, "title1"); 2348f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SOURCE_ID, "sourceId1"); 2349f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_NAME, account1.name); 2350f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.ACCOUNT_TYPE, account1.type); 2351f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_COUNT, 2); 2352f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, 1); 2353f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2354f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v2 = new ContentValues(); 2355f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups._ID, groupId2); 2356f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.TITLE, "title2"); 2357f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SOURCE_ID, "sourceId2"); 2358f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_NAME, account2.name); 2359f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.ACCOUNT_TYPE, account2.type); 2360f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, 0); 2361f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, 0); 2362f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2363f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v3 = new ContentValues(); 2364f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups._ID, groupId3); 2365f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.TITLE, "title3"); 2366f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SOURCE_ID, "sourceId3"); 2367f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_NAME, account2.name); 2368f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.ACCOUNT_TYPE, account2.type); 2369f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_COUNT, 0); 2370f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v3.put(Groups.SUMMARY_WITH_PHONES, 0); 2371f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2372f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2373f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2374f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Now rawContactId1 has two phone numbers. 2375f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1111"); 2376f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId1, "111-111-1112"); 2377f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Result should reflect it correctly (don't count phone numbers but raw contacts) 2378f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v1.put(Groups.SUMMARY_WITH_PHONES, v1.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2379f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2380f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2381f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce new raw contact, pretending the user added another info. 2382f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long rawContactId3 = createRawContactWithName("firstName3", "lastName3"); 2383f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertEmail(rawContactId3, "address3@email.com"); 2384f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertPhoneNumber(rawContactId3, "333-333-3333"); 2385f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa insertGroupMembership(rawContactId3, groupId2); 2386f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_COUNT, v2.getAsInteger(Groups.SUMMARY_COUNT) + 1); 2387f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v2.put(Groups.SUMMARY_WITH_PHONES, v2.getAsInteger(Groups.SUMMARY_WITH_PHONES) + 1); 2388f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2389f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 }); 2390f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 239118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki final Uri uri = Groups.CONTENT_SUMMARY_URI; 239218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki 239318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki // TODO Once SUMMARY_GROUP_COUNT_PER_ACCOUNT is supported remove all the if(false). 239418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 239518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1); 239618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 239718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2); 239818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 239918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 240018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 240118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 240218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2403f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3 }); 2404f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 2405f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // Introduce another group in account1, testing SUMMARY_GROUP_COUNT_PER_ACCOUNT correctly 2406f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa // reflects the change. 2407f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa final long groupId4 = createGroup(account1, "sourceId4", "title4"); 240818b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 240918b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 241018b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1); 241118b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 241218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 241318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2414f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa ContentValues v4 = new ContentValues(); 2415f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups._ID, groupId4); 2416f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.TITLE, "title4"); 2417f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SOURCE_ID, "sourceId4"); 2418f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_NAME, account1.name); 2419f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.ACCOUNT_TYPE, account1.type); 2420f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_COUNT, 0); 2421f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa v4.put(Groups.SUMMARY_WITH_PHONES, 0); 242218b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki if (false) { 242318b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 242418b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT)); 242518b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } else { 242618b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0); 242718b09495f5f37b38ff2e1c965e087dfde68c27fbMakoto Onuki } 2428f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa assertStoredValues(uri, new ContentValues[] { v1, v2, v3, v4 }); 242923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki 243023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // We change the tables dynamically according to the requested projection. 243123ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki // Make sure the SUMMARY_COUNT column exists 243223ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.clear(); 243323ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v1.put(Groups.SUMMARY_COUNT, 2); 243423ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.clear(); 243523ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v2.put(Groups.SUMMARY_COUNT, 1); 243623ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.clear(); 243723ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v3.put(Groups.SUMMARY_COUNT, 0); 243823ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.clear(); 243923ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki v4.put(Groups.SUMMARY_COUNT, 0); 244023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki assertStoredValuesWithProjection(uri, new ContentValues[] { v1, v2, v3, v4 }); 2441f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa } 2442f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa 244389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testSettingsQuery() { 244489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 244589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 2446f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account3 = new AccountWithDataSet("e", "f", "plus"); 244789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account1, "0", "0"); 244889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov createSettings(account2, "1", "1"); 2449f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account3, "1", "0"); 245089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account1); 245189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(Settings.CONTENT_URI, account2); 2452f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Uri uri3 = Settings.CONTENT_URI.buildUpon() 2453f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_NAME, account3.getAccountName()) 2454f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.ACCOUNT_TYPE, account3.getAccountType()) 2455f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .appendQueryParameter(RawContacts.DATA_SET, account3.getDataSet()) 2456f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro .build(); 245789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 245889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 2459f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertEquals(1, getCount(uri3, null, null)); 246089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, Settings.SHOULD_SYNC, "0") ; 2461f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri1, Settings.UNGROUPED_VISIBLE, "0"); 246289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, Settings.SHOULD_SYNC, "1") ; 2463f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri2, Settings.UNGROUPED_VISIBLE, "1"); 2464f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.SHOULD_SYNC, "1"); 2465f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro assertStoredValue(uri3, Settings.UNGROUPED_VISIBLE, "0"); 2466f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro } 2467f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 2468f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro public void testSettingsInsertionPreventsDuplicates() { 2469f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro Account account1 = new Account("a", "b"); 2470f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro AccountWithDataSet account2 = new AccountWithDataSet("c", "d", "plus"); 2471f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account1, "0", "0"); 2472f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(account2, "1", "1"); 2473f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 24740e21a867a572679d64d79041eb574d13665178d4Dave Santoro // Now try creating the settings rows again. It should update the existing settings rows. 24750e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account1, "1", "0"); 24760e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 24770e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=?", 24780e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"a", "b"}, Settings.SHOULD_SYNC, "1"); 24790e21a867a572679d64d79041eb574d13665178d4Dave Santoro 24800e21a867a572679d64d79041eb574d13665178d4Dave Santoro createSettings(account2, "0", "1"); 24810e21a867a572679d64d79041eb574d13665178d4Dave Santoro assertStoredValue(Settings.CONTENT_URI, 24820e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE + "=? AND " + 24830e21a867a572679d64d79041eb574d13665178d4Dave Santoro Settings.DATA_SET + "=?", 24840e21a867a572679d64d79041eb574d13665178d4Dave Santoro new String[] {"c", "d", "plus"}, Settings.SHOULD_SYNC, "0"); 248589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 248689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 24874097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsUnspecified() { 2488d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 24894097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 24904097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 24915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 24924097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 249317a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 24944097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 24954097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 249667c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov public void testDisplayNameParsingWhenPartsAreNull() { 249767c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov long rawContactId = createRawContact(); 249867c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov ContentValues values = new ContentValues(); 249967c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 250067c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 250167c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 250267c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov insertStructuredName(rawContactId, values); 250317a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov assertStructuredName(rawContactId, "Mr.", "John", "Kevin", "von Smith", "Jr."); 250467c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov } 250567c9ed1cefa5c084d3f373d7f1ecb7122983ff15Dmitri Plotnikov 25064097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov public void testDisplayNameParsingWhenPartsSpecified() { 2507d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 25084097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov ContentValues values = new ContentValues(); 25094097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr.John Kevin von Smith, Jr."); 25104097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Johnson"); 25115ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov insertStructuredName(rawContactId, values); 25124097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 25135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertStructuredName(rawContactId, null, null, null, "Johnson", null); 25144097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 25154097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 25165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithoutPhoneticName() { 25175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final long rawContactId = createRawContact(null); 25185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 25205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 25215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 25225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "K."); 25235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 25245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 25255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 25265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 25285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 252955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 253055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 25315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 25325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 25335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 25345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 25355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 25375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 25385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 25405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 254155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "Mr John K. Doe, Jr."); 254255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "Mr Doe, John K., Jr."); 25435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 25445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 25455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "John K. Doe, Jr."); 25465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Doe, John K., Jr."); 25475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 25495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 25505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 25515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 25535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 25545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithChineseName() { 25575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // Only run this test when Chinese collation is supported 25595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.CHINA)) { 25605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 25615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 25645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 25665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "\u6BB5\u5C0F\u6D9B"); 25675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 25685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 25705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 25715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 25725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 25735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(RawContacts.PHONETIC_NAME); 25745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 25754cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 25764cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(RawContacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 25775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 25795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 25805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 25825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 25835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u6BB5\u5C0F\u6D9B"); 25845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u6BB5\u5C0F\u6D9B"); 25855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 25865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 25874cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 25884cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "DUAN \u6BB5 XIAO \u5C0F TAO \u6D9B"); 25895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 25915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 25925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 25935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 25955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 25965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testContactWithJapaneseName() { 25995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(null); 26005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 26025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "\u7A7A\u6D77"); 26035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(StructuredName.PHONETIC_GIVEN_NAME, "\u304B\u3044\u304F\u3046"); 26045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri dataUri = insertStructuredName(rawContactId, values); 26055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 26075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 26085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 26095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 26105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 26115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 26125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 26135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(RawContacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 26145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 26165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(rawContactUri, values); 26175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 26195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME); 26205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_PRIMARY, "\u7A7A\u6D77"); 26215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME_ALTERNATIVE, "\u7A7A\u6D77"); 26225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u304B\u3044\u304F\u3046"); 26235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 26245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u304B\u3044\u304F\u3046"); 26255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u304B\u3044\u304F\u3046"); 26265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 26285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov queryContactId(rawContactId)); 26295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(contactUri, values); 26305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // The same values should be available through a join with Data 26325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(dataUri, values); 26335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 263525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov public void testDisplayNameUpdate() { 263625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId1 = createRawContact(); 263725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertEmail(rawContactId1, "potato@acme.com", true); 263825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 263925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov long rawContactId2 = createRawContact(); 264025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertPhoneNumber(rawContactId2, "123456789", true); 264125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 26420c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 26430c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 264425abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 264525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "123456789"); 264625abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 264725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov insertStructuredName(rawContactId2, "Potato", "Head"); 264825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 264925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov assertAggregated(rawContactId1, rawContactId2, "Potato Head"); 265081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 265125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 265225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 265301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov public void testDisplayNameFromData() { 265401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long rawContactId = createRawContact(); 265501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2656a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka ContentValues values = new ContentValues(); 265701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 265801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 265901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 266001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 266101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "mike@monstersinc.com"); 266201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "mike@monstersinc.com"); 266301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 266401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertEmail(rawContactId, "james@monstersinc.com", true); 266501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "james@monstersinc.com"); 266601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 266701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov insertPhoneNumber(rawContactId, "1-800-466-4411"); 266801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "1-800-466-4411"); 266901911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 2670a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there are title and company, the company is display name. 2671a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 2672a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.COMPANY, "Monsters Inc"); 26735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 267401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Monsters Inc"); 267501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 2676a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is nickname, that is display name. 2677a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertNickname(rawContactId, "Sully"); 2678a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertStoredValue(uri, Contacts.DISPLAY_NAME, "Sully"); 2679a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 2680a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // If there is structured name, that is display name. 2681a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.clear(); 2682a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.GIVEN_NAME, "James"); 2683a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.MIDDLE_NAME, "P."); 2684a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(StructuredName.FAMILY_NAME, "Sullivan"); 2685a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertStructuredName(rawContactId, values); 26865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "James P. Sullivan"); 26875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithoutPhoneticName() { 26905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 26915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 26925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 26935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 26955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 26975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 26985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.TITLE, "Protagonist"); 26995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 27005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Protagonist"); 27015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there are title and company, the company is display name. 27035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "Monsters Inc"); 27055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mResolver.update(organizationUri, values, null, null); 27065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "Monsters Inc"); 27095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 27105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 27115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "Monsters Inc"); 27125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "Monsters Inc"); 27135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 27145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 27155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithJapanesePhoneticName() { 27175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 27185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 27195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 27205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 27225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 27245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "DoCoMo"); 27265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 27275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 27285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "DoCoMo"); 27315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME, "\u30C9\u30B3\u30E2"); 27325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.JAPANESE); 27335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_PRIMARY, "\u30C9\u30B3\u30E2"); 27345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.SORT_KEY_ALTERNATIVE, "\u30C9\u30B3\u30E2"); 27355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 27365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 27375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public void testDisplayNameFromOrganizationWithChineseName() { 27390b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov boolean hasChineseCollator = false; 27400b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov final Locale locale[] = Collator.getAvailableLocales(); 27410b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov for (int i = 0; i < locale.length; i++) { 27420b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (locale[i].equals(Locale.CHINA)) { 27430b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov hasChineseCollator = true; 27440b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov break; 27450b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 27460b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 27470b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 27480b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov if (!hasChineseCollator) { 27490b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov return; 27500b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov } 27510b1eaf562411ffec26fd9113c3209ebdd29202e1Dmitri Plotnikov 27525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = createRawContact(); 27535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long contactId = queryContactId(rawContactId); 27545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ContentValues values = new ContentValues(); 27555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 27575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // If there is title without company, the title is display name. 27595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Organization.COMPANY, "\u4E2D\u56FD\u7535\u4FE1"); 27615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 27625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 27635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.clear(); 27645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.DISPLAY_NAME, "\u4E2D\u56FD\u7535\u4FE1"); 27655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.putNull(Contacts.PHONETIC_NAME); 27665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov values.put(Contacts.PHONETIC_NAME_STYLE, PhoneticNameStyle.UNDEFINED); 27674cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_PRIMARY, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 27684cd13c4266d8e476e1a49c4b6bcd5b18c33d0de3Bai Tao values.put(Contacts.SORT_KEY_ALTERNATIVE, "ZHONG \u4E2D GUO \u56FD DIAN \u7535 XIN \u4FE1"); 27695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov assertStoredValues(uri, values); 277001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 277101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 277231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov public void testLookupByOrganization() { 277331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long rawContactId = createRawContact(); 277431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov long contactId = queryContactId(rawContactId); 277531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov ContentValues values = new ContentValues(); 277631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 277731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 277831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 277931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "president"); 278031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 278131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 278231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 278331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 278431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 278531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 278631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.DEPARTMENT, "software"); 278731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 278831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 278931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "acmecorp"); 279031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 279131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 279231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 279331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "incredibles"); 279431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 279531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 279631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 279731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "president"); 279831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 279931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 280031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "director"); 280131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 280231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 280331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "incredibles"); 280431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "director"); 280531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 280631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.clear(); 280731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.COMPANY, "monsters"); 280831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov values.put(Organization.TITLE, "scarer"); 280931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov mResolver.update(organizationUri, values, null, null); 281031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 281131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "monsters"); 281231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertContactFilter(contactId, "scarer"); 281331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 281431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 281531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov private void assertContactFilter(long contactId, String filter) { 281631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(filter)); 281731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov assertStoredValue(filterUri, Contacts._ID, contactId); 281831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 281931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 2820a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private void assertContactFilterNoResult(String filter) { 2821a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov Uri filterUri4 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, filter); 2822a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov assertEquals(0, getCount(filterUri4, null, null)); 2823a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 2824a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 2825916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetOrganization() throws Exception { 2826916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 2827916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2828916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2829916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Some random data element 2830916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "inc@corp.com"); 2831916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2832916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2833916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2834916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmecorp"); 28359c6ef008d92017108e3d10dcd8e2146eded9e148Dmitri Plotnikov values.put(Organization.TITLE, "engineer"); 2836916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri organizationUri = insertOrganization(rawContactId, values); 2837916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2838916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another matching organization 2839916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "acmeinc"); 2840916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 2841916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2842916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // Add another non-matching organization 2843916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Organization.COMPANY, "corpacme"); 2844916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertOrganization(rawContactId, values); 2845916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2846916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov // And another data element 2847916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov insertEmail(rawContactId, "emca@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 2848916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 28496f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 2850916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2851916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2852916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 28533716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "engineer, [acmecorp]"); 2854916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2855916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2856916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2857916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetEmail() throws Exception { 2858916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContact(); 2859916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2860916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2861916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 28623716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "John", "Doe"); 2863916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertEmail(rawContactId, "acme@corp.com", true, Email.TYPE_CUSTOM, "Custom"); 2864916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 28656f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("acme", true); 2866916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2867916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2868916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 28693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[acme@corp.com]"); 2870916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2871916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2872916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2873fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood public void testCountPhoneNumberDigits() { 2874fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("86 (0) 5-55-12-34")); 2875fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("860 555-1234")); 2876fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(3, ContactsProvider2.countPhoneNumberDigits("860")); 2877fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(10, ContactsProvider2.countPhoneNumberDigits("8605551234")); 2878fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860555")); 2879fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860 555")); 2880fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860-555")); 2881fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(12, ContactsProvider2.countPhoneNumberDigits("+441234098765")); 2882fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("44+1234098765")); 2883fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood assertEquals(0, ContactsProvider2.countPhoneNumberDigits("+441234098foo")); 2884fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood } 2885fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood 28863716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetPhone() throws Exception { 28873716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 28883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 28893716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues values = new ContentValues(); 28903716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 28913716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 28923716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "(860) 555-1234"); 28933716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 28943716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.clear(); 28953716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(Contacts._ID, contactId); 28963716f1447ceb21180d1301790eabd8b9453f486dDave Santoro values.put(SearchSnippetColumns.SNIPPET, "[(860) 555-1234]"); 28973716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 28983716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 28993716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("86 (0) 5-55-12-34")), values); 29003716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 29013716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555-1234")), values); 29023716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 29033716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860")), values); 29043716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 29053716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("8605551234")), values); 29063716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 29073716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860555")), values); 29083716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 29093716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860 555")), values); 29103716f1447ceb21180d1301790eabd8b9453f486dDave Santoro assertStoredValues(Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 29113716f1447ceb21180d1301790eabd8b9453f486dDave Santoro Uri.encode("860-555")), values); 29123716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 29133716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29146f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro private Uri buildFilterUri(String query, boolean deferredSnippeting) { 29156f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri.Builder builder = Contacts.CONTENT_FILTER_URI.buildUpon() 29166f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro .appendPath(Uri.encode(query)); 29176f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro if (deferredSnippeting) { 29186f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro builder.appendQueryParameter(ContactsContract.DEFERRED_SNIPPETING, "1"); 29196f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 29206f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro return builder.build(); 29216f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 29226f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro 2923916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov public void testSearchSnippetNickname() throws Exception { 2924916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long rawContactId = createRawContactWithName(); 2925916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov long contactId = queryContactId(rawContactId); 2926916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ContentValues values = new ContentValues(); 2927916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2928916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov Uri dataUri = insertNickname(rawContactId, "Incredible"); 2929916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 29306f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Uri filterUri = buildFilterUri("inc", true); 2931916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 2932916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.clear(); 2933916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Contacts._ID, contactId); 293430cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov values.put(SearchSnippetColumns.SNIPPET, "[Incredible]"); 2935916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov assertStoredValues(filterUri, values); 2936916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 2937916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 29383716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNameInDisplayName() throws Exception { 29393716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 29403716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 29413716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertStructuredName(rawContactId, "Cave", "Johnson"); 29423716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 29433716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29443716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 29453716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 29463716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 29473716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 29483716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29496f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 29506f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("john", true), emptySnippet); 29513716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 29523716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29533716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForNicknameInDisplayName() throws Exception { 29543716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 29553716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 29563716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNickname(rawContactId, "Caveman"); 29573716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 29583716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29593716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 29603716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 29613716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 29623716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 29633716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29646f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 29653716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 29663716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29673716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForCompanyInDisplayName() throws Exception { 29683716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 29693716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 29703716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues company = new ContentValues(); 29713716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.clear(); 29723716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.COMPANY, "Aperture Science"); 29733716f1447ceb21180d1301790eabd8b9453f486dDave Santoro company.put(Organization.TITLE, "President"); 29743716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertOrganization(rawContactId, company); 29753716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "aperturepresident@aperturescience.com", true); 29763716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29773716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 29783716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 29793716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 29803716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 29813716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29826f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("aperture", true), emptySnippet); 29833716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 29843716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29853716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForPhoneInDisplayName() throws Exception { 29863716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 29873716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 29883716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertPhoneNumber(rawContactId, "860-555-1234"); 29893716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "860@aperturescience.com", true); 29903716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29913716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 29923716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 29933716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 29943716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 29953716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29966f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("860", true), emptySnippet); 29973716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 29983716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 29993716f1447ceb21180d1301790eabd8b9453f486dDave Santoro public void testSearchSnippetEmptyForEmailInDisplayName() throws Exception { 30003716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long rawContactId = createRawContact(); 30013716f1447ceb21180d1301790eabd8b9453f486dDave Santoro long contactId = queryContactId(rawContactId); 30023716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertEmail(rawContactId, "cave@aperturescience.com", true); 30033716f1447ceb21180d1301790eabd8b9453f486dDave Santoro insertNote(rawContactId, "Cave Johnson is president of Aperture Science"); 30043716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30053716f1447ceb21180d1301790eabd8b9453f486dDave Santoro ContentValues emptySnippet = new ContentValues(); 30063716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.clear(); 30073716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(Contacts._ID, contactId); 30083716f1447ceb21180d1301790eabd8b9453f486dDave Santoro emptySnippet.put(SearchSnippetColumns.SNIPPET, (String) null); 30093716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 30106f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro assertStoredValues(buildFilterUri("cave", true), emptySnippet); 30113716f1447ceb21180d1301790eabd8b9453f486dDave Santoro } 30123716f1447ceb21180d1301790eabd8b9453f486dDave Santoro 3013dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov public void testDisplayNameUpdateFromStructuredNameUpdate() { 3014dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long rawContactId = createRawContact(); 3015dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri nameUri = insertStructuredName(rawContactId, "Slinky", "Dog"); 3016dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3017dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3018dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3019dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3020dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky Dog"); 3021dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3022dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov ContentValues values = new ContentValues(); 3023dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.FAMILY_NAME); 3024dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3025dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3026dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Slinky"); 3027dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3028dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.putNull(StructuredName.GIVEN_NAME); 3029dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3030dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3031dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, null); 3032dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3033dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dog"); 3034dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov mResolver.update(nameUri, values, null, null); 3035dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3036dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "Dog"); 3037dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov } 3038dd0e0f44fe403ff201d46d5534f7f1148e5ad729Dmitri Plotnikov 3039d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov public void testInsertDataWithContentProviderOperations() throws Exception { 3040d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 3041d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValues(new ContentValues()) 3042d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3043d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(Data.CONTENT_URI) 3044d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValueBackReference(Data.RAW_CONTACT_ID, 0) 3045d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 3046d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.GIVEN_NAME, "John") 3047d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .withValue(StructuredName.FAMILY_NAME, "Doe") 3048d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov .build(); 3049d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov ContentProviderResult[] results = 3050d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(cpo1, cpo2)); 3051d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov long contactId = queryContactId(ContentUris.parseId(results[0].uri)); 3052d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3053d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov assertStoredValue(uri, Contacts.DISPLAY_NAME, "John Doe"); 3054d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov } 3055d0f63551e3147babcebde5326b31285d7bdf6739Dmitri Plotnikov 3056d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailDefault() { 3057c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3058d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3059d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3060d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 3061d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 3062d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 3063d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(0, sendToVoicemail); 3064d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 3065d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3066d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3067d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtone() { 3068c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov long rawContactId = createRawContactWithName(); 3069d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3070d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3071d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId, true, "foo"); 3072d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, true, "foo"); 307381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 30748c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 30758c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov updateSendToVoicemailAndRingtoneWithSelection(contactId, false, "bar"); 30768c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId, false, "bar"); 30778c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertNetworkNotified(false); 3078d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3079d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3080d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSendToVoicemailAndRingtoneAfterAggregation() { 30813cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("a", "b"); 3082d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3083d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3084d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 30853cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("c", "d"); 3086d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3087d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, true, "bar"); 3088d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3089d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 30900c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 30910c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3092d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3093d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov // Both contacts had "send to VM", the contact now has the same value 3094d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(contactId1, true, "foo,bar"); // Either foo or bar 3095d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3096d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3097d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testDoNotSendToVoicemailAfterAggregation() { 30983cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("e", "f"); 3099d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3100d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, null); 3101d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 31023cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("g", "h"); 3103d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3104d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, null); 3105d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3106d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 31070c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 31080c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3109d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3110d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Since one of the contacts had "don't send to VM" that setting wins for the aggregate 31110c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), false, null); 3112d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3113d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3114d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov public void testSetSendToVoicemailAndRingtonePreservedAfterJoinAndSplit() { 31153cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId1 = createRawContactWithName("i", "j"); 3116d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 3117d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId1, true, "foo"); 3118d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 31193cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long rawContactId2 = createRawContactWithName("k", "l"); 3120d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 3121d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov updateSendToVoicemailAndRingtone(contactId2, false, "bar"); 3122d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3123d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Aggregate them 31240c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 31250c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3126d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 3127d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov // Split them 31280c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 31290c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov rawContactId1, rawContactId2); 3130d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 31313cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId1), true, "foo"); 3132d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertSendToVoicemailAndRingtone(queryContactId(rawContactId2), false, "bar"); 3133d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 3134d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 313582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateInsert() { 31364dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov long rawContactId = createRawContact(); 31370a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 31380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 31390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 31410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 31420a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 31430a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.putNull(StatusUpdates.CUSTOM_PROTOCOL); 31440a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 31450a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PRESENCE, StatusUpdates.INVISIBLE); 31460a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 31470a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 100); 31480a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "a.b.c"); 31490a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 1234); 31500a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 2345); 31510a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31520a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 31530a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31540a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 31550a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31560a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long contactId = queryContactId(rawContactId); 31570a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 31580a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31590a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 31600a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 31610a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Hiding"); 31620a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 31630a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "a.b.c"); 31640a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 1234); 31650a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 2345); 31660a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31670a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 31680a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31690a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 31700a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 31710a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Cloaked"); 31720a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, 200); 31730a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_RES_PACKAGE, "d.e.f"); 31740a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_ICON, 4321); 31750a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, 5432); 31760a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov mResolver.insert(StatusUpdates.CONTENT_URI, values); 31770a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31780a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 31790a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE); 31800a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Cloaked"); 31810a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 200); 31820a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_RES_PACKAGE, "d.e.f"); 31830a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_ICON, 4321); 31840a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_LABEL, 5432); 31850a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(contactUri, values); 31860a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 31870a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31880a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateInferAttribution() { 31890a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 31900a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri imUri = insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 31910a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long dataId = ContentUris.parseId(imUri); 31920a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31930a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov ContentValues values = new ContentValues(); 31940a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 31950a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_AIM); 31960a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "aim"); 31970a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 31980a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 31990a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov Uri resultUri = mResolver.insert(StatusUpdates.CONTENT_URI, values); 32000a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32010a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.clear(); 32020a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 32030a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS_LABEL, com.android.internal.R.string.imProtocolAim); 32040a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(StatusUpdates.STATUS, "Hiding"); 32050a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32060a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov assertStoredValues(resultUri, values); 32070a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov } 32080a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov 32090a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov public void testStatusUpdateMatchingImOrEmail() { 32100a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov long rawContactId = createRawContact(); 32114dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 32124dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im"); 321382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertEmail(rawContactId, "m@acme.com"); 32144dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 32154dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (standard) 3216aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3217aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 32184dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 32194dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on IM (custom) 3220aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_CUSTOM, "my_im_proto", "my_im", StatusUpdates.IDLE, "Idle", 3221d9b5910dcb5cf99c4e4a81a794d5e81e17e4992eDaniel Lehmann StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO); 32224dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 32234dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // Match on Email 3224aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "m@acme.com", StatusUpdates.AWAY, "Away", 3225aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_VOICE); 32264dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 32274dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov // No match 3228aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_ICQ, null, "12345", StatusUpdates.DO_NOT_DISTURB, "Go away", 3229aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 32304dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 323182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Cursor c = mResolver.query(StatusUpdates.CONTENT_URI, new String[] { 323282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID, StatusUpdates.PROTOCOL, StatusUpdates.CUSTOM_PROTOCOL, 32330a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.PRESENCE, StatusUpdates.STATUS}, 323482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null, StatusUpdates.DATA_ID); 32354dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 323682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_AIM, null, StatusUpdates.AVAILABLE, "Available"); 32374dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 323882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_CUSTOM, "my_im_proto", StatusUpdates.IDLE, "Idle"); 32394dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertTrue(c.moveToNext()); 324082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertStatusUpdate(c, Im.PROTOCOL_GOOGLE_TALK, null, StatusUpdates.AWAY, "Away"); 32414dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertFalse(c.moveToNext()); 32424dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov c.close(); 3243bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3244bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 3245bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3246bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3247bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 324882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 32490a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3250bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3251bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov } 3252bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 325382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateUpdateAndDelete() { 3254bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long rawContactId = createRawContact(); 3255bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3256bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3257bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov long contactId = queryContactId(rawContactId); 3258bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3259bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3260bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov ContentValues values = new ContentValues(); 326182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 326282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_STATUS); 3263bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3264bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 3265aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AWAY, "BUSY", 3266aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 3267aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.DO_NOT_DISTURB, "GO AWAY", 3268aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 326982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov Uri statusUri = 3270aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3271aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 327282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 3273bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 327482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 327582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3276bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3277bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 32789705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for 32799705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status 32809705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // status_updates.status_ts 32819705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence 32829705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori long updatedTs = 200; 32839705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String testUpdate = "test_update"; 32849705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori String selection = StatusUpdates.DATA_ID + "=" + statusId; 32859705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 32869705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 32879705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 32889705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 32899705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 32909705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 32919705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 32929705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 32939705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in status_updates table ONLY 32949705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in presence table are to be updated. 32959705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori updatedTs = 300; 32969705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori testUpdate = "test_update_new"; 32979705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 32989705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 32999705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 33009705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 33019705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 33029705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 33039705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the presence column value is still the old value 33049705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test"); 33059705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 33069705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 33079705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // update status_updates table to set new values for columns in presence table ONLY 33089705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // i.e., no rows in status_updates table are to be updated. 33099705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori selection = StatusUpdates.DATA_ID + "=" + statusId; 33109705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 33119705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.PRESENCE, "presence_test_new"); 33129705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori mResolver.update(StatusUpdates.CONTENT_URI, values, 33139705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori StatusUpdates.DATA_ID + "=" + statusId, null); 33149705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // make sure the status_updates table is not updated 33159705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS_TIMESTAMP, updatedTs); 33169705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.put(StatusUpdates.STATUS, testUpdate); 33179705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori assertStoredValuesWithProjection(StatusUpdates.CONTENT_URI, values); 33189705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori 33199705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // effect "delete status_updates" operation and expect the following 33209705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // data deleted from status_updates table 33219705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori // presence set to null 332282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov mResolver.delete(StatusUpdates.CONTENT_URI, StatusUpdates.DATA_ID + "=" + statusId, null); 33239705f5bcb04c4b3012a762fb3ba8620b518587ccVasu Nori values.clear(); 332482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3325a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3326a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 3327a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3328093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov public void testStatusUpdateUpdateToNull() { 3329093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long rawContactId = createRawContact(); 3330093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3331093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3332093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long contactId = queryContactId(rawContactId); 3333093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3334093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3335093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov ContentValues values = new ContentValues(); 3336093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov Uri statusUri = 3337093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", StatusUpdates.AVAILABLE, "Available", 3338093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.CAPABILITY_HAS_CAMERA); 3339093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov long statusId = ContentUris.parseId(statusUri); 3340093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3341093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.AVAILABLE); 3342093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3343093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3344093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3345093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3346093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(StatusUpdates.PRESENCE); 3347093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov mResolver.update(StatusUpdates.CONTENT_URI, values, 3348093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov StatusUpdates.DATA_ID + "=" + statusId, null); 3349093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 3350093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.clear(); 3351093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.putNull(Contacts.CONTACT_PRESENCE); 3352093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3353093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 3354093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov } 3355093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov 335682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testStatusUpdateWithTimestamp() { 3357a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long rawContactId = createRawContact(); 3358a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_AIM, null, "aim"); 3359a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "gtalk"); 3360a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3361a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov long contactId = queryContactId(rawContactId); 3362a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 3363aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Offline", 80, 33645d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3365aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_AIM, null, "aim", 0, "Available", 100, 33665d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3367aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "gtalk", 0, "Busy", 90, 33685d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 3369a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 3370a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov // Should return the latest status 3371a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContentValues values = new ContentValues(); 337282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS_TIMESTAMP, 100); 337382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(Contacts.CONTACT_STATUS, "Available"); 3374bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov assertStoredValuesWithProjection(contactUri, values); 33754dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 33764dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 337782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov private void assertStatusUpdate(Cursor c, int protocol, String customProtocol, int presence, 337882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String status) { 33794dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov ContentValues values = new ContentValues(); 338082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 338182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.CUSTOM_PROTOCOL, customProtocol); 3382a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov values.put(StatusUpdates.PRESENCE, presence); 338382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS, status); 33844dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov assertCursorValues(c, values); 33854dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 33864dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 33873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item query test cases. 33883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 33893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByRawContactId() { 33903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 33913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 33923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, mAccount); 33933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 33943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 33953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 33963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 33973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 33983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByContactId() { 34013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 34033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 34053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 34063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 34073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 34083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 34093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 34103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKey() { 34133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 34153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 34163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 34183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 34193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 34203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 34213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 34223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 34233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsByLookupKeyAndContactId() { 34263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long contactId = queryContactId(rawContactId); 34283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String lookupKey = queryLookupKey(contactId); 34293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 34313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues( 34323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 34333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 34343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), 34353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann contactId), 34363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Contacts.StreamItems.CONTENT_DIRECTORY), 34373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 34383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItems() { 34413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, null); 34443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, values); 34453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemsWithSelection() { 34483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 34503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 34513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 34533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 34543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 34553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 34573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 34583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}, firstValues); 34593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 34613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 34623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Goodbye world"}, secondValues); 34633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemById() { 34663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 34683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 34693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 34703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 34723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 34733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 34743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 34753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first stream item. 34773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 34783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstValues); 34793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the second stream item. 34813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 34823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues); 34833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 34843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion + query test cases. 34863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoWithSelection() { 34883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 34893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 34903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 34913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 34923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 34943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo1Values, null); 34956802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 34963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(2); 34973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, photo2Values, null); 34983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 34993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the first photo. 35003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_PHOTO_URI, StreamItemPhotos.SORT_INDEX + "=?", 35013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"1"}, photo1Values); 35023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemId() { 35053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 35083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 35093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 35103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 35113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 35133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 35143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 35153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 35163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 35183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 35193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 35206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 35213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 35233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 35246802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 35256802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 35263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 35276802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 35283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select only the photos from the second stream item. 35303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 35313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 35323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), photo2Values); 35333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemPhotoByStreamItemPhotoId() { 35363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 35373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a first stream item. 35393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 35403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 35413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 35423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert a second stream item. 35443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 35453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItem(rawContactId, secondValues, null); 35463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondStreamItemId = ContentUris.parseId(resultUri); 35473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the first stream item. 35493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo1Values = buildGenericStreamItemPhotoValues(1); 35503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(firstStreamItemId, photo1Values, null); 35513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstPhotoId = ContentUris.parseId(resultUri); 35526802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo1Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 35533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Add a photo to the second stream item. 35553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photo2Values = buildGenericStreamItemPhotoValues(1); 35566802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 35576802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.galaxy, PhotoSize.ORIGINAL)); 35583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(secondStreamItemId, photo2Values, null); 35593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long secondPhotoId = ContentUris.parseId(resultUri); 35606802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photo2Values.remove(StreamItemPhotos.PHOTO); // Removed during processing. 35613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the first photo. 35633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 35643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 35663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 35673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann firstPhotoId), 35683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo1Values); 35693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Select the second photo. 35713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(ContentUris.withAppendedId( 35723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 35733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, secondStreamItemId), 35743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 35753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondPhotoId), 35763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photo2Values); 35773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item insertion test cases. 35803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemIntoOtherAccount() { 35823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 35833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 35853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, values, mAccountTwo); 35863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Stream insertion was allowed in another account's raw contact."); 35873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 35883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Trying to insert stream items into account one's raw contact is forbidden. 35893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 35913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemInProfileRequiresWriteProfileAccess() { 35933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long profileRawContactId = createBasicProfileContact(new ContentValues()); 35943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // With our (default) write profile permission, we should be able to insert a stream item. 35963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 35973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 35983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 35993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now take away write profile permission. 36003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mActor.removePermissions("android.permission.WRITE_PROFILE"); 36013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Try inserting another stream item. 36033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 36043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(profileRawContactId, values, null); 36053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should require WRITE_PROFILE access to insert a stream item in the profile."); 36063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 36073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Trying to insert a stream item in the profile without WRITE_PROFILE permission 36083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // should fail. 36093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemWithContentValues() { 36133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 36153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 36163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.insert(StreamItems.CONTENT_URI, values); 36173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 36183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 36193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 36203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOverLimit() { 36233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 36253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 36263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann List<Long> streamItemIds = Lists.newArrayList(); 36283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX + 1 stream items. 36303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 36313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 6; i++) { 36323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 36333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 36343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.add(ContentUris.parseId(resultUri)); 36353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Long doomedStreamItemId = streamItemIds.get(0); 36373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // There should only be MAX items. The oldest one should have been cleaned up. 36393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query( 36403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 36413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 36423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 36433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItems._ID}, null, null, null); 36443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 36453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann while(c.moveToNext()) { 36463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = c.getLong(0); 36473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemIds.remove(streamItemId); 36483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 36503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 36513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, streamItemIds.size()); 36543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(doomedStreamItemId, streamItemIds.get(0)); 36553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemOlderThanOldestInLimit() { 36583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 36603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.RAW_CONTACT_ID, rawContactId); 36613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Insert MAX stream items. 36633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long baseTime = System.currentTimeMillis(); 36643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 36653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime + i); 36663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 36673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertNotSame("Expected non-0 stream item ID to be inserted", 36683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 0L, ContentUris.parseId(resultUri)); 36693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Now try to insert a stream item that's older. It should be deleted immediately 36723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // and return an ID of 0. 36733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, baseTime - 1); 36743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = mResolver.insert(StreamItems.CONTENT_URI, values); 36753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(0L, ContentUris.parseId(resultUri)); 36763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo insertion test cases. 36793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testInsertStreamItemsAndPhotosInBatch() throws Exception { 36813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 36823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemValues = buildGenericStreamItemValues(); 36833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues streamItemPhotoValues = buildGenericStreamItemPhotoValues(0); 36843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 36853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ArrayList<ContentProviderOperation> ops = Lists.newArrayList(); 36863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert( 36873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 36883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 36893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY)) 36903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemValues).build()); 36913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann for (int i = 0; i < 5; i++) { 36923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoValues.put(StreamItemPhotos.SORT_INDEX, i); 36933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ops.add(ContentProviderOperation.newInsert(StreamItems.CONTENT_PHOTO_URI) 36943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValues(streamItemPhotoValues) 36953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .withValueBackReference(StreamItemPhotos.STREAM_ITEM_ID, 0) 36963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann .build()); 36973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 36983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.applyBatch(ContactsContract.AUTHORITY, ops); 36993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that all five photos were inserted under the raw contact. 37013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_URI, new String[]{StreamItems._ID}, 37023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)}, 37033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 37043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = 0; 37053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 37063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(1, c.getCount()); 37073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.moveToFirst(); 37083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemId = c.getLong(0); 37093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 37103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 37113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c = mResolver.query(Uri.withAppendedPath( 37143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 37156802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 37166802030a777c0c3ba1dc029c534cca4784260632Dave Santoro new String[]{StreamItemPhotos._ID, StreamItemPhotos.PHOTO_URI}, 37173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null, null); 37183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 37193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals(5, c.getCount()); 37206802030a777c0c3ba1dc029c534cca4784260632Dave Santoro byte[] expectedPhotoBytes = loadPhotoFromResource( 37216802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO); 37226802030a777c0c3ba1dc029c534cca4784260632Dave Santoro while (c.moveToNext()) { 37236802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String photoUri = c.getString(1); 37246802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(expectedPhotoBytes, 37256802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 37266802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 37273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 37283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 37293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item update test cases. 37333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemById() { 37353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 37383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 37393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 37403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), values, 37413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 37423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 37433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 37443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 37453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemWithContentValues() { 37483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 37513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 37523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems._ID, streamItemId); 37533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 37543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(StreamItems.CONTENT_URI, values, null, null); 37553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 37563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 37573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), values); 37583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemFromOtherAccount() { 37613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 37623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, mAccount); 37643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 37653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems._ID, streamItemId); 37663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Goodbye world"); 37673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 37683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(maybeAddAccountQueryParameters(StreamItems.CONTENT_URI, mAccountTwo), 37693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values, null, null); 37703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to update stream items inserted by another account"); 37713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 37723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't update the stream items from another account. 37733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 37753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo update test cases. 37773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37786802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoById() throws IOException { 37793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 37803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 37813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 37823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 37833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 37843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 37853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 37863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 37876802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 37886802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 37893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 37903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 37913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 37923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 37933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 37943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId); 37953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 37966802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 37973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 37986802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 37996802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 38006802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 38016802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 38026802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 38033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38056802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testUpdateStreamItemPhotoWithContentValues() throws IOException { 38063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 38083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, null); 38093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 38103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 38113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, null); 38123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 38133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photoValues.put(StreamItemPhotos._ID, streamItemPhotoId); 38156802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 38166802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.nebula, PhotoSize.ORIGINAL)); 38173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 38183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 38193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 38203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 38213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 38226802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.remove(StreamItemPhotos.PHOTO); // Removed during processing. 38233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, photoValues); 38246802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 38256802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Check that the photo stored is the expected one. 38266802030a777c0c3ba1dc029c534cca4784260632Dave Santoro String displayPhotoUri = getStoredValue(photoUri, StreamItemPhotos.PHOTO_URI); 38276802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.nebula, PhotoSize.DISPLAY_PHOTO), 38286802030a777c0c3ba1dc029c534cca4784260632Dave Santoro mResolver.openInputStream(Uri.parse(displayPhotoUri))); 38293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testUpdateStreamItemPhotoFromOtherAccount() { 38323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 38333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = buildGenericStreamItemValues(); 38343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, values, mAccount); 38353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId(resultUri); 38363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues photoValues = buildGenericStreamItemPhotoValues(1); 38373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann resultUri = insertStreamItemPhoto(streamItemId, photoValues, mAccount); 38383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId(resultUri); 38393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann photoValues.put(StreamItemPhotos._ID, streamItemPhotoId); 38416802030a777c0c3ba1dc029c534cca4784260632Dave Santoro photoValues.put(StreamItemPhotos.PHOTO, loadPhotoFromResource( 38426802030a777c0c3ba1dc029c534cca4784260632Dave Santoro R.drawable.galaxy, PhotoSize.ORIGINAL)); 38433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = 38443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann maybeAddAccountQueryParameters( 38453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 38463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 38473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 38483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mAccountTwo); 38493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 38503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.update(photoUri, photoValues, null, null); 38513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to update stream item photos inserted by another account"); 38523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 38533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't update a stream item photo inserted by another account. 38543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item deletion test cases. 38583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemById() { 38603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 38623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri resultUri = insertStreamItem(rawContactId, firstValues, null); 38633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long firstStreamItemId = ContentUris.parseId(resultUri); 38643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 38663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 38673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 38683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item. 38703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, firstStreamItemId), 38713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null, null); 38723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38733b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 38743b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 38753b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 38763b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 38773b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38783b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38793b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemWithSelection() { 38803b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 38813b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstValues = buildGenericStreamItemValues(); 38823b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, firstValues, null); 38833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondValues = buildGenericStreamItemValues(); 38853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann secondValues.put(StreamItems.TEXT, "Goodbye world"); 38863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, secondValues, null); 38873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Delete the first stream item with a custom selection. 38893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(StreamItems.CONTENT_URI, StreamItems.TEXT + "=?", 38903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{"Hello world"}); 38913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Check that only the second item remains. 38933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(Uri.withAppendedPath( 38943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 38953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), secondValues); 38963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 38973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 38983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemFromOtherAccount() { 38993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 39003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 39013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), mAccount)); 39023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 39033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete( 39043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann maybeAddAccountQueryParameters( 39053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 39063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mAccountTwo), null, null); 39073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to delete stream item inserted by another account"); 39083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 39093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't delete a stream item from another account. 39103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Stream item photo deletion test cases. 39143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoById() { 39163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 39183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 39193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemPhotoId = ContentUris.parseId( 39203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 39213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete( 39223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId( 39233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 39243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 39253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 39263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann streamItemPhotoId), null, null); 39273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Cursor c = mResolver.query(StreamItems.CONTENT_PHOTO_URI, 39293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann new String[]{StreamItemPhotos._ID}, 39303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.STREAM_ITEM_ID + "=?", new String[]{String.valueOf(streamItemId)}, 39313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann null); 39323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 39333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertEquals("Expected photo to be deleted.", 0, c.getCount()); 39343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } finally { 39353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann c.close(); 39363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoWithSelection() { 39403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(); 39413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 39423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 39433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues firstPhotoValues = buildGenericStreamItemPhotoValues(0); 39443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues secondPhotoValues = buildGenericStreamItemPhotoValues(1); 39453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, firstPhotoValues, null); 39466802030a777c0c3ba1dc029c534cca4784260632Dave Santoro firstPhotoValues.remove(StreamItemPhotos.PHOTO); // Removed while processing. 39473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, secondPhotoValues, null); 39483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri photoUri = Uri.withAppendedPath( 39493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 39503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); 39513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(photoUri, StreamItemPhotos.SORT_INDEX + "=1", null); 39523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(photoUri, firstPhotoValues); 39543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testDeleteStreamItemPhotoFromOtherAccount() { 39573b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long rawContactId = createRawContact(mAccount); 39583b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann long streamItemId = ContentUris.parseId( 39593b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItem(rawContactId, buildGenericStreamItemValues(), mAccount)); 39603b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), mAccount); 39613b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann try { 39623b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mResolver.delete(maybeAddAccountQueryParameters( 39633b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 39643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 39653b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 39663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann mAccountTwo), null, null); 39673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann fail("Should not be able to delete stream item photo inserted by another account"); 39683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } catch (SecurityException expected) { 39693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann // Can't delete a stream item photo from another account. 39703b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39713b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39723b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 397382780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro public void testDeleteStreamItemsWhenRawContactDeleted() { 397482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro long rawContactId = createRawContact(mAccount); 397582780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemUri = insertStreamItem(rawContactId, 397682780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemValues(), mAccount); 397782780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto(ContentUris.parseId(streamItemUri), 397882780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro buildGenericStreamItemPhotoValues(0), mAccount); 397982780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro mResolver.delete(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 398082780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro null, null); 398182780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 398282780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro ContentValues[] emptyValues = new ContentValues[0]; 398382780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 398482780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro // The stream item and its photo should be gone. 398582780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemUri, emptyValues); 398682780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro assertStoredValues(streamItemPhotoUri, emptyValues); 398782780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro } 398882780691f1a3b4d8784e29a961b1140cd07bc9a8Dave Santoro 39893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public void testQueryStreamItemLimit() { 39903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 39913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.MAX_ITEMS, 5); 39923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann assertStoredValues(StreamItems.CONTENT_LIMIT_URI, values); 39933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 39943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 39956802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Tests for inserting or updating stream items as a side-effect of making status updates 39966802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // (forward-compatibility of status updates into the new social stream API). 39976802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 39986802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemInsertedOnStatusUpdate() { 39996802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40006802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 40016802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 40026802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 40036802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 40046802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 40056802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 40066802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE); 40076802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40086802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 40096802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 40104747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "hacking"); 4011d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 4012d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(String.valueOf(rawContactId)) 4013d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 4014d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues); 4015d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda } 4016d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4017d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda public void testStreamItemInsertedOnStatusUpdate_HtmlQuoting() { 4018d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4019d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // This method of creating a raw contact automatically inserts a status update with 4020d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // the status message "hacking". 4021d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues values = new ContentValues(); 4022d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda long rawContactId = createRawContact(values, "18004664411", 4023d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 4024d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.CAPABILITY_HAS_VOICE); 4025d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4026d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda // Insert a new status update for the raw contact. 4027d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 4028d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda StatusUpdates.INVISIBLE, "& <b> test '", StatusUpdates.CAPABILITY_HAS_VOICE); 4029d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda 4030d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda ContentValues expectedValues = new ContentValues(); 4031d5ef5903570e533a501abe6a8e3d533fdb5318fcFlavio Lerda expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 40324747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "& <b> test &#39;"); 40336802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 40346802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 40356802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 40366802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 40376802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 40386802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40396802030a777c0c3ba1dc029c534cca4784260632Dave Santoro public void testStreamItemUpdatedOnSecondStatusUpdate() { 40406802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40416802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This method of creating a raw contact automatically inserts a status update with 40426802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // the status message "hacking". 40436802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues values = new ContentValues(); 40446802030a777c0c3ba1dc029c534cca4784260632Dave Santoro int chatMode = StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO | 40456802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.CAPABILITY_HAS_VOICE; 40466802030a777c0c3ba1dc029c534cca4784260632Dave Santoro long rawContactId = createRawContact(values, "18004664411", 40476802030a777c0c3ba1dc029c534cca4784260632Dave Santoro "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, chatMode); 40486802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40496802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // Insert a new status update for the raw contact. 40506802030a777c0c3ba1dc029c534cca4784260632Dave Santoro insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "goog411@acme.com", 40516802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StatusUpdates.INVISIBLE, "finished hacking", chatMode); 40526802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 40536802030a777c0c3ba1dc029c534cca4784260632Dave Santoro ContentValues expectedValues = new ContentValues(); 40546802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues.put(StreamItems.RAW_CONTACT_ID, rawContactId); 40554747809486541f7a3d342d3e1dd48fb5ea255ad6Flavio Lerda expectedValues.put(StreamItems.TEXT, "finished hacking"); 40566802030a777c0c3ba1dc029c534cca4784260632Dave Santoro assertStoredValues(RawContacts.CONTENT_URI.buildUpon() 40576802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(String.valueOf(rawContactId)) 40586802030a777c0c3ba1dc029c534cca4784260632Dave Santoro .appendPath(RawContacts.StreamItems.CONTENT_DIRECTORY).build(), 40596802030a777c0c3ba1dc029c534cca4784260632Dave Santoro expectedValues); 40606802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 40616802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 406236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemReadRequiresReadSocialStreamPermission() { 406336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 406436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long contactId = queryContactId(rawContactId); 406536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String lookupKey = queryLookupKey(contactId); 406636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 406736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 406836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 406936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 407036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item in various ways. 407136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 407236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by contact ID requires social stream read permission", 407336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 407436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 407536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 407636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 407736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 407836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key requires social stream read permission", 407936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.CONTENT_LOOKUP_URI.buildUpon().appendPath(lookupKey) 408036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(Contacts.StreamItems.CONTENT_DIRECTORY).build(), 408136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 408236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 408336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 408436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by lookup key and ID requires social stream read permission", 408536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath(Contacts.getLookupUri(contactId, lookupKey), 408636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Contacts.StreamItems.CONTENT_DIRECTORY), 408736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 408836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 408936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 409036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID requires social stream read permission", 409136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 409236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 409336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null); 409436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 409536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 409636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream items by raw contact ID and stream item ID requires social " + 409736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "stream read permission", 409836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId( 409936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri.withAppendedPath( 410036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 410136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), 410236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro streamItemId), null, null, null, null); 410336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 410436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 410536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream items requires social stream read permission", 410636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI, null, null, null, null); 410736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 410836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 410936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying stream item by ID requires social stream read permission", 411036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 411136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 411236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 411336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 411436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoReadRequiresReadSocialStreamPermission() { 411536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 411636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 411736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 411836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 411936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 412036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 412136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 412236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro // Try selecting the stream item photo in various ways. 412336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 412436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 412536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 412636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY).build(), 412736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 412836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 412936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectSecurityException( 413036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "Querying all stream item photos requires social stream read permission", 413136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StreamItems.CONTENT_URI.buildUpon() 413236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 413336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 413436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(), 413536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null, null, null); 413636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 413736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 413836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemModificationRequiresWriteSocialStreamPermission() { 413936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 414036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 414136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 414236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 414336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 414436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 414536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null); 414636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert to stream without write social stream permission"); 414736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 414836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 414936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 415036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 415136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 415236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItems.TEXT, "Goodbye world"); 415336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 415436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values, null, null); 415536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update stream without write social stream permission"); 415636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 415736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 415836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 415936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 416036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 416136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro null, null); 416236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete from stream without write social stream permission"); 416336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 416436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 416536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 416636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 416736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStreamItemPhotoModificationRequiresWriteSocialStreamPermission() { 416836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 416936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemId = ContentUris.parseId( 417036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItem(rawContactId, buildGenericStreamItemValues(), null)); 417136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long streamItemPhotoId = ContentUris.parseId( 417236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(0), null)); 417336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 417436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 417536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro Uri photoUri = StreamItems.CONTENT_URI.buildUpon() 417636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemId)) 417736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY) 417836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro .appendPath(String.valueOf(streamItemPhotoId)).build(); 417936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 418036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 418136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStreamItemPhoto(streamItemId, buildGenericStreamItemPhotoValues(1), null); 418236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to insert photos without write social stream permission"); 418336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 418436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 418536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 418636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 418736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues values = new ContentValues(); 418836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource(R.drawable.galaxy, 418936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro PhotoSize.ORIGINAL)); 419036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.update(photoUri, values, null, null); 419136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to update photos without write social stream permission"); 419236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 419336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 419436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 419536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro try { 419636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mResolver.delete(photoUri, null, null); 419736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro fail("Should not be able to delete photos without write social stream permission"); 419836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } catch (SecurityException expected) { 419936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 420036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 420136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 420236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro public void testStatusUpdateDoesNotRequireReadOrWriteSocialStreamPermission() { 420336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 420436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro String handle1 = "test@gmail.com"; 420536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro long rawContactId = createRawContact(); 420636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertImHandle(rawContactId, protocol1, null, handle1); 420736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.READ_SOCIAL_STREAM"); 420836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.removePermissions("android.permission.WRITE_SOCIAL_STREAM"); 420936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 421036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 421136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA); 421236612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 421336612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro mActor.addPermissions("android.permission.READ_SOCIAL_STREAM"); 421436612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 421536612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentValues expectedValues = new ContentValues(); 421636612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro expectedValues.put(StreamItems.TEXT, "Green"); 421736612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro assertStoredValues(Uri.withAppendedPath( 421836612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 421936612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro RawContacts.StreamItems.CONTENT_DIRECTORY), expectedValues); 422036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro } 422136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro 42223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemValues() { 42233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 42243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TEXT, "Hello world"); 42253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.TIMESTAMP, System.currentTimeMillis()); 42263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItems.COMMENTS, "Reshared by 123 others"); 42273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 42283b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 42303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private ContentValues buildGenericStreamItemPhotoValues(int sortIndex) { 42313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentValues values = new ContentValues(); 42323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values.put(StreamItemPhotos.SORT_INDEX, sortIndex); 42336802030a777c0c3ba1dc029c534cca4784260632Dave Santoro values.put(StreamItemPhotos.PHOTO, 42346802030a777c0c3ba1dc029c534cca4784260632Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.ORIGINAL)); 42353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return values; 42363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 42373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 423882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov public void testSingleStatusUpdateRowPerContact() { 4239bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar int protocol1 = Im.PROTOCOL_GOOGLE_TALK; 4240bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar String handle1 = "test@gmail.com"; 4241bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4242d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId1 = createRawContact(); 42434dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId1, protocol1, null, handle1); 4244bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4245aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AVAILABLE, "Green", 4246aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4247aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.AWAY, "Yellow", 4248aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4249aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(protocol1, null, handle1, StatusUpdates.INVISIBLE, "Red", 4250aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4251bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4252af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov Cursor c = queryContact(queryContactId(rawContactId1), 425382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov new String[] {Contacts.CONTACT_PRESENCE, Contacts.CONTACT_STATUS}); 42544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov assertEquals(1, c.getCount()); 4255bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4256bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar c.moveToFirst(); 425782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(StatusUpdates.INVISIBLE, c.getInt(0)); 425882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals("Red", c.getString(1)); 42590265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov c.close(); 4260bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 4261bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4262d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void updateSendToVoicemailAndRingtone(long contactId, boolean sendToVoicemail, 4263d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String ringtone) { 4264d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 4265d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 4266d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (ringtone != null) { 4267d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 4268d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4269d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4270d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4271d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov int count = mResolver.update(uri, values, null, null); 4272d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(1, count); 42738c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 42748c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 42758c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov private void updateSendToVoicemailAndRingtoneWithSelection(long contactId, 42768c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov boolean sendToVoicemail, String ringtone) { 42778c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov ContentValues values = new ContentValues(); 42788c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.SEND_TO_VOICEMAIL, sendToVoicemail); 42798c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov if (ringtone != null) { 42808c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov values.put(Contacts.CUSTOM_RINGTONE, ringtone); 42818c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov } 42828c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov 42838c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov int count = mResolver.update(Contacts.CONTENT_URI, values, Contacts._ID + "=" + contactId, 42848c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov null); 42858c4f838f899daadb6f46f8c27ab7636023e39c38Dmitri Plotnikov assertEquals(1, count); 4286d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4287d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 4288d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private void assertSendToVoicemailAndRingtone(long contactId, boolean expectedSendToVoicemail, 4289d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov String expectedRingtone) { 4290d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 4291d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToNext()); 4292d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov int sendToVoicemail = c.getInt(c.getColumnIndex(Contacts.SEND_TO_VOICEMAIL)); 4293d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(expectedSendToVoicemail ? 1 : 0, sendToVoicemail); 4294d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String ringtone = c.getString(c.getColumnIndex(Contacts.CUSTOM_RINGTONE)); 4295d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (expectedRingtone == null) { 4296d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertNull(ringtone); 4297d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } else { 4298d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(ArrayUtils.contains(expectedRingtone.split(","), ringtone)); 4299d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 4300d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 4301d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 43029261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 43030be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov public void testContactVisibilityUpdateOnMembershipChange() { 43040be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long rawContactId = createRawContact(mAccount); 43050be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 43060be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43070be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long visibleGroupId = createGroup(mAccount, "123", "Visible", 1); 43080be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov long invisibleGroupId = createGroup(mAccount, "567", "Invisible", 0); 43090be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43100be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership1 = insertGroupMembership(rawContactId, visibleGroupId); 43110be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 43120be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43130be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov Uri membership2 = insertGroupMembership(rawContactId, invisibleGroupId); 43140be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 43150be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43160be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.delete(membership1, null, null); 43170be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "0"); 43180be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43190be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov ContentValues values = new ContentValues(); 43200be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov values.put(GroupMembership.GROUP_ROW_ID, visibleGroupId); 43210be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43220be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov mResolver.update(membership2, values, null, null); 43230be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertVisibility(rawContactId, "1"); 43240be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 43250be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43260be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov private void assertVisibility(long rawContactId, String expectedValue) { 43270be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, Contacts._ID + "=" + queryContactId(rawContactId), 43280be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov null, Contacts.IN_VISIBLE_GROUP, expectedValue); 43290be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 43300be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 43310db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov public void testSupplyingBothValuesAndParameters() throws Exception { 43320db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Account account = new Account("account 1", "type%/:1"); 43330db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov Uri uri = ContactsContract.Groups.CONTENT_URI.buildUpon() 43340db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME, account.name) 43350db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE, account.type) 43360db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") 43370db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov .build(); 43380db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43390db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(uri); 43400db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type); 43410db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 43420db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some id"); 43430db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some name"); 43440db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 43450db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43460db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 43470db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43480db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder = ContentProviderOperation.newInsert(uri); 43490db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type + "diff"); 43500db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name); 43510db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.SYSTEM_ID, "some other id"); 43520db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.TITLE, "some other name"); 43530db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1); 43540db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 43550db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov try { 43560db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov mResolver.applyBatch(ContactsContract.AUTHORITY, Lists.newArrayList(builder.build())); 43570db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov fail("Expected IllegalArgumentException"); 43580db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } catch (IllegalArgumentException ex) { 43590db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov // Expected 43600db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 43610db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov } 43620db2cea4e4a8082ca8dd7d2023b9f3025c2768d8Dmitri Plotnikov 4363a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public void testContentEntityIterator() { 43649261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana // create multiple contacts and check that the selected ones are returned 43659261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id; 43669261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 43679261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId1 = createGroup(mAccount, "gsid1", "title1"); 43689261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long groupId2 = createGroup(mAccount, "gsid2", "title2"); 43699261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 43703cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c0"); 43713cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertGroupMembership(id, "gsid1"); 43723cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertEmail(id, "c0@email.com"); 43733cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertPhoneNumber(id, "5551212c0"); 43749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 4375226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c1 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c1"); 43769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_0 = insertGroupMembership(id, "gsid1"); 43779261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_1 = insertGroupMembership(id, "gsid2"); 43789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_2 = insertEmail(id, "c1@email.com"); 43799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_1_3 = insertPhoneNumber(id, "5551212c1"); 43809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 4381226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana long c2 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c2"); 43829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_0 = insertGroupMembership(id, "gsid1"); 43839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_1 = insertEmail(id, "c2@email.com"); 43849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_2_2 = insertPhoneNumber(id, "5551212c2"); 43859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 43863cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov long c3 = id = createRawContact(mAccount, RawContacts.SOURCE_ID, "c3"); 43879261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_0 = insertGroupMembership(id, groupId2); 43889261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_1 = insertEmail(id, "c3@email.com"); 43899261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri id_3_2 = insertPhoneNumber(id, "5551212c3"); 43909261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 439162318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana EntityIterator iterator = RawContacts.newEntityIterator(mResolver.query( 439262318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana maybeAddAccountQueryParameters(RawContactsEntity.CONTENT_URI, mAccount), null, 439362318e1ea8306142a10526534b7d83560ecf5b3aFred Quintana RawContacts.SOURCE_ID + " in ('c1', 'c2', 'c3')", null, null)); 43949261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Entity entity; 43959261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues[] subValues; 43969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 43976cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c1, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 43989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 43999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(4, subValues.length); 44009261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 44019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_0, 44029261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 44039261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 44049261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], GroupMembership.CONTENT_ITEM_TYPE, 44059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_1, 44069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 44079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 44089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Email.CONTENT_ITEM_TYPE, 44099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_2, 44109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c1@email.com"); 44119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[3], Phone.CONTENT_ITEM_TYPE, 44129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_1_3, 44139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c1"); 44149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 44166cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c2, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 44179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 44189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 44199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 44209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_0, 44219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId1, 44229261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid1"); 44239261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 44249261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_1, 44259261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c2@email.com"); 44269261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 44279261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_2_2, 44289261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c2"); 44299261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana entity = iterator.next(); 44316cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov assertEquals(c3, (long) entity.getEntityValues().getAsLong(RawContacts._ID)); 44329261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana subValues = asSortedContentValuesArray(entity.getSubValues()); 44339261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(3, subValues.length); 44349261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[0], GroupMembership.CONTENT_ITEM_TYPE, 44359261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_0, 44369261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_ROW_ID, groupId2, 44379261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana GroupMembership.GROUP_SOURCE_ID, "gsid2"); 44389261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[1], Email.CONTENT_ITEM_TYPE, 44399261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_1, 44409261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "c3@email.com"); 44419261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDataRow(subValues[2], Phone.CONTENT_ITEM_TYPE, 44429261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Data._ID, id_3_2, 44439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Email.DATA, "5551212c3"); 44449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 44459261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(iterator.hasNext()); 44463cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov iterator.close(); 44479261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 444820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 444920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov public void testDataCreateUpdateDeleteByMimeType() throws Exception { 4450d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long rawContactId = createRawContact(); 445120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 445220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov ContentValues values = new ContentValues(); 44535ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 445420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 445520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 445620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 445720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 445820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "old1"); 445920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "old2"); 446020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "old3"); 446120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "old4"); 446220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "old5"); 446320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "old6"); 446420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "old7"); 446520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "old8"); 446620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "old9"); 446720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "old10"); 446820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "old11"); 446920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "old12"); 447020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "old13"); 447120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "old14"); 447220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "old15"); 447320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Uri uri = mResolver.insert(Data.CONTENT_URI, values); 447420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 447581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 447620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 447720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.clear(); 447820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.RES_PACKAGE, "newpackage"); 447920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_PRIMARY, 0); 448020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 0); 448120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA1, "new1"); 448220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA2, "new2"); 448320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA3, "new3"); 448420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA4, "new4"); 448520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA5, "new5"); 448620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA6, "new6"); 448720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA7, "new7"); 448820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA8, "new8"); 448920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA9, "new9"); 449020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA10, "new10"); 449120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA11, "new11"); 449220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA12, "new12"); 449320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA13, "new13"); 449420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA14, "new14"); 449520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov values.put(Data.DATA15, "new15"); 44965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mResolver.update(Data.CONTENT_URI, values, Data.RAW_CONTACT_ID + "=" + rawContactId + 449720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov " AND " + Data.MIMETYPE + "='testmimetype'", null); 449881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 449970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 450020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertStoredValues(uri, values); 450120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 45025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov int count = mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 450320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null); 450420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals(1, count); 45055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertEquals(0, getCount(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId 450633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Data.MIMETYPE + "='testmimetype'", null)); 450781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 450833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 450920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 451089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public void testRawContactQuery() { 451189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account1 = new Account("a", "b"); 451289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Account account2 = new Account("c", "d"); 451389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId1 = createRawContact(account1); 451489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov long rawContactId2 = createRawContact(account2); 451589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 451689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri1 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account1); 451789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri uri2 = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account2); 451889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri1, null, null)); 451989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals(1, getCount(uri2, null, null)); 452089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri1, RawContacts._ID, rawContactId1) ; 452189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(uri2, RawContacts._ID, rawContactId2) ; 452289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 452389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri1 = ContentUris.withAppendedId(uri1, rawContactId1); 452489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Uri rowUri2 = ContentUris.withAppendedId(uri2, rawContactId2); 452589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri1, RawContacts._ID, rawContactId1) ; 452689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertStoredValue(rowUri2, RawContacts._ID, rawContactId2) ; 452789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 452889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 4529373f7d2adc36680c31ff33e9ee12be865af6b5fbDmitri Plotnikov public void testRawContactDeletion() { 4530e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId = createRawContact(mAccount); 45315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 453233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 45334dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 453482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4535aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4536aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4537a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId); 4538a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 453933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 454033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 454182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 45424dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 454333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 454433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(uri, null, null); 454533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 45465870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 454781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 454833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 4549e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 455033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 455133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 455233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov assertEquals(0, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 455333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov null, null)); 455482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 45554dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + rawContactId, null)); 4556a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 455781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 4558a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov } 4559a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4560a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov public void testRawContactDeletionKeepingAggregateContact() { 4561e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId1 = createRawContactWithName(mAccount); 4562e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId2 = createRawContactWithName(mAccount); 456347fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 456447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 4565a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4566a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 4567a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov 4568a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 4569e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 4570a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov mResolver.delete(permanentDeletionUri, null, null); 4571a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 4572a5bfaf55790262eea97de432d9e7f313c219c066Dmitri Plotnikov assertEquals(1, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null)); 457320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 45741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 4575e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong public void testRawContactDeletionWithAccounts() { 4576e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong long rawContactId = createRawContact(mAccount); 4577e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 4578e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4579e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong insertImHandle(rawContactId, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 458082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4581aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4582aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4583e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong assertEquals(1, getCount(Uri.withAppendedPath(uri, RawContacts.Data.CONTENT_DIRECTORY), 4584e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong null, null)); 458582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(1, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 4586e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong + rawContactId, null)); 4587e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4588e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Do not delete if we are deleting with wrong account. 4589e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithWrongAccountUri = 4590e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4591e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountTwo.name) 4592e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccountTwo.type) 4593e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 4594e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong mResolver.delete(deleteWithWrongAccountUri, null, null); 4595e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 45965870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "0"); 4597e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4598e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong // Delete if we are deleting with correct account. 4599e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong Uri deleteWithCorrectAccountUri = 4600e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong RawContacts.CONTENT_URI.buildUpon() 4601e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name) 4602e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type) 4603e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong .build(); 4604e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong mResolver.delete(deleteWithCorrectAccountUri, null, null); 4605e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 46065870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 4607e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong } 4608e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong 4609627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov public void testAccountsUpdated() { 461070d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // This is to ensure we do not delete contacts with null, null (account name, type) 461170d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong // accidentally. 461270d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong long rawContactId3 = createRawContactWithName("James", "Sullivan"); 461370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong insertPhoneNumber(rawContactId3, "5234567890"); 4614627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov Uri rawContact3 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId3); 4615743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 461670d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 461770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4618bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount, mAccountTwo}); 4619743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount, mAccountTwo}); 4620743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov assertEquals(1, getCount(RawContacts.CONTENT_URI, null, null)); 4621dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_NAME, null); 4622dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertStoredValue(rawContact3, RawContacts.ACCOUNT_TYPE, null); 462370d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 4624743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId1 = createRawContact(mAccount); 4625743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId1, "account1@email.com"); 4626743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov long rawContactId2 = createRawContact(mAccountTwo); 4627743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertEmail(rawContactId2, "account2@email.com"); 4628743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertImHandle(rawContactId2, Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com"); 4629743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, "deleteme@android.com", 4630aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.AVAILABLE, null, 4631aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CAPABILITY_HAS_CAMERA); 4632743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 4633bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{mAccount}); 4634743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{mAccount}); 4635627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov assertEquals(2, getCount(RawContacts.CONTENT_URI, null, null)); 463682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov assertEquals(0, getCount(StatusUpdates.CONTENT_URI, PresenceColumns.RAW_CONTACT_ID + "=" 463770d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong + rawContactId2, null)); 463870d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong } 463970d2ff8c87961703351b223ce8b15342fe795a0bCynthia Wong 464033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov public void testAccountDeletion() { 464133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Account readOnlyAccount = new Account("act", READ_ONLY_ACCOUNT_TYPE); 464233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4643bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount, mAccount}); 464433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount, mAccount}); 464533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 464633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", readOnlyAccount); 464733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri1 = insertPhoto(rawContactId1); 464833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long rawContactId2 = createRawContactWithName("john", "doe", mAccount); 464933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Uri photoUri2 = insertPhoto(rawContactId2); 465033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov storeValue(photoUri2, Photo.IS_SUPER_PRIMARY, "1"); 465133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 465233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertAggregated(rawContactId1, rawContactId2); 465333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 465433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 465533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 465633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the writable account 465733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 465833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 465933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 466033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "john doe"); 466133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 466233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the one we marked as super-primary 466333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 466433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri2)); 466533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 4666bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{readOnlyAccount}); 466733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // Remove the writable account 466833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov cp.onAccountsUpdated(new Account[]{readOnlyAccount}); 466933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 467033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The display name should come from the remaining account 467133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Uri.withAppendedPath( 467233fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 467333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.Data.CONTENT_DIRECTORY), 467433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.DISPLAY_NAME, "John Doe"); 467533fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 467633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov // The photo should be the remaining one 467733fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov assertStoredValue(Contacts.CONTENT_URI, contactId, 467833fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov Contacts.PHOTO_ID, ContentUris.parseId(photoUri1)); 467933fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov } 468033fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 4681c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro public void testStreamItemsCleanedUpOnAccountRemoval() { 4682c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account doomedAccount = new Account("doom", "doom"); 4683c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Account safeAccount = mAccount; 4684c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContactsProvider2 cp = (ContactsProvider2) getProvider(); 4685c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{doomedAccount, safeAccount}); 4686c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{doomedAccount, safeAccount}); 4687c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4688c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a doomed raw contact, stream item, and photo. 4689c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedRawContactId = createRawContactWithName(doomedAccount); 4690c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemUri = 4691c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(doomedRawContactId, buildGenericStreamItemValues(), doomedAccount); 4692c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long doomedStreamItemId = ContentUris.parseId(doomedStreamItemUri); 4693c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri doomedStreamItemPhotoUri = insertStreamItemPhoto( 4694c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro doomedStreamItemId, buildGenericStreamItemPhotoValues(0), doomedAccount); 4695c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4696c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Create a safe raw contact, stream item, and photo. 4697c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeRawContactId = createRawContactWithName(safeAccount); 4698c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemUri = 4699c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro insertStreamItem(safeRawContactId, buildGenericStreamItemValues(), safeAccount); 4700c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemId = ContentUris.parseId(safeStreamItemUri); 4701c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro Uri safeStreamItemPhotoUri = insertStreamItemPhoto( 4702c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeStreamItemId, buildGenericStreamItemPhotoValues(0), safeAccount); 4703c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro long safeStreamItemPhotoId = ContentUris.parseId(safeStreamItemPhotoUri); 4704c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4705c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Remove the doomed account. 4706c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro mActor.setAccounts(new Account[]{safeAccount}); 4707c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro cp.onAccountsUpdated(new Account[]{safeAccount}); 4708c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4709c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the doomed stuff has all been nuked. 4710c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro ContentValues[] noValues = new ContentValues[0]; 4711c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(ContentUris.withAppendedId(RawContacts.CONTENT_URI, doomedRawContactId), 4712c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro noValues); 4713c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemUri, noValues); 4714c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValues(doomedStreamItemPhotoUri, noValues); 4715c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4716c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro // Check that the safe stuff lives on. 4717c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(RawContacts.CONTENT_URI, safeRawContactId, RawContacts._ID, 4718c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro safeRawContactId); 4719c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemUri, StreamItems._ID, safeStreamItemId); 4720c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro assertStoredValue(safeStreamItemPhotoUri, StreamItemPhotos._ID, safeStreamItemPhotoId); 4721c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro } 4722c88cc79e0e19b8299a2a356c7d70b48f70b4a93eDave Santoro 4723cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov public void testContactDeletion() { 472447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId1 = createRawContactWithName("John", "Doe", ACCOUNT_1); 472547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov long rawContactId2 = createRawContactWithName("John", "Doe", ACCOUNT_2); 4726cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4727cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov long contactId = queryContactId(rawContactId1); 4728cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4729cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov mResolver.delete(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), null, null); 4730cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 4731cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1), 4732cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 4733cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2), 4734cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov RawContacts.DELETED, "1"); 4735cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov } 4736cb144e1429596701603c016f4a078f6331e6481dDmitri Plotnikov 473773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 473873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov long rawContactId = createRawContact(mAccount); 473973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 474073776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 474173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = insertStructuredName(rawContactId, "John", "Doe"); 474273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov clearDirty(rawContactUri); 4743e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri updateUri = setCallerIsSyncAdapter(uri, mAccount); 474473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 474573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 474673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Dough"); 474773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 47485870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, StructuredName.FAMILY_NAME, "Dough"); 474973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(rawContactUri, false); 475081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 47511fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 47521fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 475361d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDirtyAndVersion() { 4754d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov final long rawContactId = createRawContact(mAccount); 4755d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId); 475673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 47571fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 47581fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 47591fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 47601fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.DIRTY, 0); 47611fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(ContactsContract.RawContacts.SEND_TO_VOICEMAIL, 1); 476261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.AGGREGATION_MODE, 4763c100221f706afc08409e8317a27d6850b11c54d3Omari Stephens RawContacts.AGGREGATION_MODE_IMMEDIATE); 476461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(ContactsContract.RawContacts.STARRED, 1); 47651fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(1, mResolver.update(uri, values, null, null)); 47661fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 47671fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 47681fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 476981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(false); 47701fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 477161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "goo@woo.com"); 477261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 477381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 47741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 47751fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 477661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 47771fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 477861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values = new ContentValues(); 477961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov values.put(Email.DATA, "goo@hoo.com"); 478061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.update(emailUri, values, null, null); 47811fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 478281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 47831fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 47841fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 478561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 47861fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 478761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(emailUri, null, null); 47881fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 478981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 47901fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ++version; 47911fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 479261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov } 47931fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 479461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactClearDirty() { 479561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 479661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 479761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 479861d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov long version = getVersion(uri); 479961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov insertEmail(rawContactId, "goo@woo.com"); 48001fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 480161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 48021fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 48031fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 48041fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana clearDirty(uri); 48051fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 48061fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertEquals(version, getVersion(uri)); 48071fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 48081fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 480961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov public void testRawContactDeletionSetsDirty() { 481061d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov final long rawContactId = createRawContact(mAccount); 48111fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, 481261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov rawContactId); 48131fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana long version = getVersion(uri); 481461d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov clearDirty(uri); 481561d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, false); 481661d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov 481761d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov mResolver.delete(uri, null, null); 48185870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, RawContacts.DELETED, "1"); 481961d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertDirty(uri, true); 482081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 482161d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov version++; 482261d61cb4d13a33c5581765fb4c0f1b3c0b2cdf4cDmitri Plotnikov assertEquals(version, getVersion(uri)); 48231fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 48244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 48259fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutName() { 48269fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 48279fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 48289fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 48299fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri phoneUri = insertPhoneNumber(rawContactId, "555-123-45678", true); 48309fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 48319fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 48329fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 48339fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 48349fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 48359fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 48369fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 48379fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 48389fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 48399fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann public void testDeleteContactWithoutAnyData() { 48409fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues()); 48419fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 48429fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 48439fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann long contactId = queryContactId(rawContactId); 48449fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 48459fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 48469fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 48479fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann int numDeleted = mResolver.delete(lookupUri, null, null); 48489fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann assertEquals(1, numDeleted); 48499fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann } 48509fcf109b56cec0aad05322a3b4594228ea06d859Daniel Lehmann 485160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testDeleteContactWithEscapedUri() { 485260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 485360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 485460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 485560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 485660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 485760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 485860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 485960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 486060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, mResolver.delete(lookupUri, null, null)); 486160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 486260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 486360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann public void testQueryContactWithEscapedUri() { 486460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContentValues values = new ContentValues(); 486560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann values.put(RawContacts.SOURCE_ID, "!@#$%^&*()_+=-/.,<>?;'\":[]}{\\|`~"); 486660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 486760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long rawContactId = ContentUris.parseId(rawContactUri); 486860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 486960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann long contactId = queryContactId(rawContactId); 487060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 487160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 487260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann Cursor c = mResolver.query(lookupUri, null, null, null, ""); 487360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann assertEquals(1, c.getCount()); 487460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 487560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 487660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 4877074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov public void testGetPhotoUri() { 4878074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov ContentValues values = new ContentValues(); 4879074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 4880074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 4881074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 4882f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 4883f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 4884f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId)}, Photo.PHOTO_FILE_ID); 4885f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId) 4886f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 4887074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 48883d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov assertStoredValue( 48893d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(rawContactId)), 4890f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI, photoUri); 4891074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov } 4892074cf38e39d500e92fa851a171d0378ab2c528c2Dmitri Plotnikov 4893bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro public void testGetPhotoViaLookupUri() throws IOException { 4894bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long rawContactId = createRawContact(); 4895bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro long contactId = queryContactId(rawContactId); 4896bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4897bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri lookupUri = Contacts.getLookupUri(mResolver, contactUri); 4898bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro String lookupKey = lookupUri.getPathSegments().get(2); 4899bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 4900bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro byte[] thumbnail = loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL); 4901bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 4902bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Two forms of lookup key URIs should be valid - one with the contact ID, one without. 4903bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithId = Uri.withAppendedPath(lookupUri, "photo"); 4904bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro Uri photoLookupUriWithoutId = Contacts.CONTENT_LOOKUP_URI.buildUpon() 4905bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro .appendPath(lookupKey).appendPath("photo").build(); 4906bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 4907bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try retrieving as a data record. 4908bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro ContentValues values = new ContentValues(); 4909bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro values.put(Photo.PHOTO, thumbnail); 4910bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithId, values); 4911bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertStoredValues(photoLookupUriWithoutId, values); 4912bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 4913bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro // Try opening as an input stream. 4914bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertInputStreamContent(thumbnail, mResolver.openInputStream(photoLookupUriWithId)); 4915bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro assertInputStreamContent(thumbnail, mResolver.openInputStream(photoLookupUriWithoutId)); 4916bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro } 4917bd20dbedba706fdf2db7acb1c7d4391e57129d44Dave Santoro 4918ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert public void testInputStreamForPhoto() throws Exception { 4919e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov long rawContactId = createRawContact(); 4920f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 4921f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 4922f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId); 4923f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_URI)); 4924f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoThumbnailUri = Uri.parse(getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI)); 4925e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 4926f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadTestPhoto(PhotoSize.DISPLAY_PHOTO), 4927f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 4928f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadTestPhoto(PhotoSize.THUMBNAIL), 4929f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoThumbnailUri)); 4930ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 4931ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert 4932ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert private static void assertInputStreamContent(byte[] expected, InputStream is) 4933ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert throws IOException { 4934ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert try { 4935ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert byte[] observed = new byte[expected.length]; 4936ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert int count = is.read(observed); 4937ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert assertEquals(expected.length, count); 4938ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert assertEquals(-1, is.read()); 4939ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert MoreAsserts.assertEquals(expected, observed); 4940ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } finally { 4941ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert is.close(); 4942ac13ddd04d665442de846b59234bdc936a6699b4Bjorn Bringert } 4943e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov } 4944e8d2c8276d6331843410c97751e46fc50b257379Dmitri Plotnikov 4945732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov public void testSuperPrimaryPhoto() { 4946732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId1 = createRawContact(new Account("a", "a")); 4947f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri1 = insertPhoto(rawContactId1, R.drawable.earth_normal); 4948732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId1 = ContentUris.parseId(photoUri1); 4949732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4950732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long rawContactId2 = createRawContact(new Account("b", "b")); 4951f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri2 = insertPhoto(rawContactId2, R.drawable.earth_normal); 4952732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov long photoId2 = ContentUris.parseId(photoUri2); 4953732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4954732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 4955732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 4956732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4957732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 4958732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 4959f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4960f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = getStoredLongValue(Data.CONTENT_URI, Data._ID + "=?", 4961f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(photoId1)}, Photo.PHOTO_FILE_ID); 4962f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoFileId1) 4963f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .toString(); 4964732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 4965f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValue(contactUri, Contacts.PHOTO_URI, photoUri); 4966732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4967732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, 4968732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 4969732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4970732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov ContentValues values = new ContentValues(); 4971732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 4972732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri2, values, null, null); 4973732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4974732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 4975732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov rawContactId1, rawContactId2); 4976732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 4977732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov queryContactId(rawContactId1)); 4978732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId2); 4979732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 4980732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov mResolver.update(photoUri1, values, null, null); 4981732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov assertStoredValue(contactUri, Contacts.PHOTO_ID, photoId1); 4982732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov } 4983732961a5b936d316482f9ded6bfc5fe1c99a65c8Dmitri Plotnikov 49848e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public void testUpdatePhoto() { 49858e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov ContentValues values = new ContentValues(); 49868e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 49878e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 49888e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov insertStructuredName(rawContactId, "John", "Doe"); 49898e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 49908e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri twigUri = Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, 49918e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov queryContactId(rawContactId)), Contacts.Photo.CONTENT_DIRECTORY); 49928e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 49938e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 49948e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 49958e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 49968e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.putNull(Photo.PHOTO); 49978e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov Uri dataUri = mResolver.insert(Data.CONTENT_URI, values); 49988e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov long photoId = ContentUris.parseId(dataUri); 49998e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5000155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov assertEquals(0, getCount(twigUri, null, null)); 50018e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 50028e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.clear(); 50038e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov values.put(Photo.PHOTO, loadTestPhoto()); 50048e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov mResolver.update(dataUri, values, null, null); 500581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov assertNetworkNotified(true); 50068e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 5007f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long twigId = getStoredLongValue(twigUri, Data._ID); 50088e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov assertEquals(photoId, twigId); 50098e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov } 50108e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 50114e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactDataPhoto() { 50127d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a contact with a null photo 50137d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentValues values = new ContentValues(); 50147d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); 50157d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh long rawContactId = ContentUris.parseId(rawContactUri); 50167d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 50177d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // setup a photo 50187d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.RAW_CONTACT_ID, rawContactId); 50197d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 50207d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.putNull(Photo.PHOTO); 50217d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 50227d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // try to do an update before insert should return count == 0 50237d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Uri dataUri = Uri.withAppendedPath( 50247d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 50257d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh RawContacts.Data.CONTENT_DIRECTORY); 50267d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(0, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 50277d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 50287d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 50297d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh mResolver.insert(Data.CONTENT_URI, values); 50307d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 50317d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // save a photo to the db 50327d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.clear(); 50337d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 50347d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh values.put(Photo.PHOTO, loadTestPhoto()); 50357d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh assertEquals(1, mResolver.update(dataUri, values, Data.MIMETYPE + "=?", 50367d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh new String[] {Photo.CONTENT_ITEM_TYPE})); 50377d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 50387d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh // verify the photo 50394e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Cursor storedPhoto = mResolver.query(dataUri, new String[] {Photo.PHOTO}, 50407d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh Data.MIMETYPE + "=?", new String[] {Photo.CONTENT_ITEM_TYPE}, null); 50414e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov storedPhoto.moveToFirst(); 5042f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro MoreAsserts.assertEquals(loadTestPhoto(PhotoSize.THUMBNAIL), storedPhoto.getBlob(0)); 50430265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov storedPhoto.close(); 50447d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh } 50457d9fdcf8346f789436148eff1f00e8f49b370ef0Neel Parekh 5046f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactId() throws IOException { 5047f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5048f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5049f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5050f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_URI.buildUpon() 5051f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5052f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 5053f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5054f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5055f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5056f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5057f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5058f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKey() throws IOException { 5059f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5060f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5061f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5062f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5063f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5064f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5065f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 5066f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5067f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5068f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5069f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5070f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5071f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForContactLookupKeyAndId() throws IOException { 5072f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5073f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5074f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String lookupKey = queryLookupKey(contactId); 5075f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5076f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = Contacts.CONTENT_LOOKUP_URI.buildUpon() 5077f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(lookupKey) 5078f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(contactId)) 5079f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(Contacts.Photo.DISPLAY_PHOTO).build(); 5080f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5081f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5082f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5083f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5084f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5085f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoForRawContactId() throws IOException { 5086f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5087f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5088f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri photoUri = RawContacts.CONTENT_URI.buildUpon() 5089f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5090f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5091f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5092f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5093f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(photoUri)); 5094f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5095f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5096f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOpenDisplayPhotoByPhotoUri() throws IOException { 5097f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5098f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5099f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_normal); 5100f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5101f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Get the photo URI out and check the content. 5102f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5103f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5104f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5105f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5106f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_normal, PhotoSize.DISPLAY_PHOTO), 5107f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5108f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5109f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5110f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForDisplayPhoto() { 5111f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5112f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5113f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5114f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is larger than a thumbnail, so it will be stored as a file. 5115f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5116f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoFileId = getStoredValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 5117f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5118f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5119f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5120f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5121f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5122f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI differs from the thumbnail. 5123f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5124f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5125f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5126f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(photoUri.equals(thumbnailUri)); 5127f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5128f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form display_photo/ID 5129f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath(DisplayPhoto.CONTENT_URI, photoFileId).toString(), 5130f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5131f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5132f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5133f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoUriForThumbnailPhoto() throws IOException { 5134f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5135f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5136f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5137f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo being inserted is a thumbnail, so it will only be stored in a BLOB. The photo URI 5138f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // will fall back to the thumbnail URI. 5139f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_small); 5140f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue( 5141f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5142f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_URI); 5143f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5144f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the photo URI is equal to the thumbnail URI. 5145f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5146f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5147f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5148f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 5149f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5150f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // URI should be of the form contacts/ID/photo 5151f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(Uri.withAppendedPath( 5152f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5153f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.Photo.CONTENT_DIRECTORY).toString(), 5154f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro photoUri); 5155f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5156f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Loading the photo URI content should get the thumbnail. 5157f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5158f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 5159f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5160f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5161f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5162c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteNewPhotoToAssetFile() throws Exception { 5163f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5164f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5165f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5166f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 5167c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final byte[] originalPhoto = loadPhotoFromResource( 5168c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL); 5169f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5170f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 5171c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro final Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 5172f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5173f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5174c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 5175f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5176f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo and thumbnail have been set. 5177c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro String photoUri = null; 5178c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro for (int i = 0; i < 10 && photoUri == null; i++) { 5179c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Wait a tick for the photo processing to occur. 5180c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(100); 5181c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro photoUri = getStoredValue( 5182c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5183c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Contacts.PHOTO_URI); 5184c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5185c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5186f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(photoUri)); 5187f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue( 5188f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5189f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5190f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(TextUtils.isEmpty(thumbnailUri)); 5191c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro assertNotSame(photoUri, thumbnailUri); 5192f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5193f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 5194f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5195f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 5196f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5197f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5198f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 5199f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(thumbnailUri))); 5200f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5201f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5202c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro public void testWriteUpdatedPhotoToAssetFile() throws Exception { 5203f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5204f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5205f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5206f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a large photo first. 5207f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro insertPhoto(rawContactId, R.drawable.earth_large); 5208f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String largeEarthPhotoUri = getStoredValue( 5209f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 5210f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5211f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Load in a huge photo. 5212f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro byte[] originalPhoto = loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL); 5213f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5214f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write it out. 5215f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri writeablePhotoUri = RawContacts.CONTENT_URI.buildUpon() 5216f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(String.valueOf(rawContactId)) 5217f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro .appendPath(RawContacts.DisplayPhoto.CONTENT_DIRECTORY).build(); 5218c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro writePhotoAsync(writeablePhotoUri, originalPhoto); 5219c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5220c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro // Allow a second for processing to occur. 5221c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro Thread.sleep(1000); 5222f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5223f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check that the display photo URI has been modified. 5224f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthPhotoUri = getStoredValue( 5225f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), Contacts.PHOTO_URI); 5226f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertFalse(hugeEarthPhotoUri.equals(largeEarthPhotoUri)); 5227f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5228f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Check the content of the display photo and thumbnail. 5229f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String hugeEarthThumbnailUri = getStoredValue( 5230f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 5231f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_THUMBNAIL_URI); 5232f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5233f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.DISPLAY_PHOTO), 5234f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthPhotoUri))); 5235f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent( 5236f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.THUMBNAIL), 5237f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(hugeEarthThumbnailUri))); 5238f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5239f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5240f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5241c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro private void writePhotoAsync(final Uri uri, final byte[] photoBytes) throws Exception { 5242c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro AsyncTask<Object, Object, Object> task = new AsyncTask<Object, Object, Object>() { 5243c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro @Override 5244c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro protected Object doInBackground(Object... params) { 5245c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro OutputStream os; 5246c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro try { 5247c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os = mResolver.openOutputStream(uri, "rw"); 5248c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.write(photoBytes); 5249c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro os.close(); 5250c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro return null; 5251c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } catch (IOException ioe) { 5252c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro throw new RuntimeException(ioe); 5253c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5254c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5255c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro }; 5256c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Object[])null).get(); 5257c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro } 5258c6eab5080340824edd2c6676c4e6b96e142f87e4Dave Santoro 5259f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoDimensionLimits() { 5260f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 5261f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.DISPLAY_MAX_DIM, 256); 5262f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DisplayPhoto.THUMBNAIL_MAX_DIM, 96); 5263f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertStoredValues(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI, values); 5264f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5265f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5266f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testPhotoStoreCleanup() throws IOException { 5267f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 5268c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro PhotoStore photoStore = provider.getPhotoStore(); 5269f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5270f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 5271f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 5272f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5273f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a couple of contacts with photos. 5274f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId1 = createRawContactWithName(); 5275f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId1 = queryContactId(rawContactId1); 5276f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId1 = ContentUris.parseId(insertPhoto(rawContactId1, R.drawable.earth_normal)); 5277f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId1 = 5278f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId1), 5279f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5280f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5281f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId2 = createRawContactWithName(); 5282f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId2 = queryContactId(rawContactId2); 5283f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId2 = ContentUris.parseId(insertPhoto(rawContactId2, R.drawable.earth_normal)); 5284f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long photoFileId2 = 5285f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 5286f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5287f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5288f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Update the second raw contact with a different photo. 5289f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 5290f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId2); 5291f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 5292f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_huge, PhotoSize.ORIGINAL)); 5293f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(1, mResolver.update(Data.CONTENT_URI, values, Data._ID + "=?", 5294f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro new String[]{String.valueOf(dataId2)})); 5295f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long replacementPhotoFileId = 5296f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId2), 5297f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Photo.PHOTO_FILE_ID); 5298f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5299f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Insert a third raw contact that has a bogus photo file ID. 5300f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusFileId = 1234567; 5301f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId3 = createRawContactWithName(); 5302f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId3 = queryContactId(rawContactId3); 5303f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.clear(); 5304f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId3); 5305f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 5306f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_normal, 5307f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoSize.THUMBNAIL)); 5308f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO_FILE_ID, bogusFileId); 5309f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(DataRowHandlerForPhoto.SKIP_PROCESSING_KEY, true); 5310f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.insert(Data.CONTENT_URI, values); 5311f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5312c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // Insert a fourth raw contact with a stream item that has a photo, then remove that photo 5313c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // from the photo store. 5314c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Account socialAccount = new Account("social", "social"); 5315c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long rawContactId4 = createRawContactWithName(socialAccount); 5316c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemUri = 5317c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro insertStreamItem(rawContactId4, buildGenericStreamItemValues(), socialAccount); 5318c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 5319c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 5320c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 5321c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 5322c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 5323c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro photoStore.remove(streamItemPhotoFileId); 5324c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 5325f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Also insert a bogus photo that nobody is using. 5326f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long bogusPhotoId = photoStore.insert(new PhotoProcessor(loadPhotoFromResource( 5327f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro R.drawable.earth_huge, PhotoSize.ORIGINAL), 256, 96)); 5328f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5329f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Manually trigger another cleanup in the provider. 5330f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro provider.cleanupPhotoStore(); 5331f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5332f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // The following things should have happened. 5333f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5334f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 1. Raw contact 1 and its photo remain unaffected. 5335f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoFileId1, (long) getStoredLongValue( 5336f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1), 5337f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5338f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5339f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 2. Raw contact 2 retains its new photo. The old one is deleted from the photo store. 5340f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(replacementPhotoFileId, (long) getStoredLongValue( 5341f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2), 5342f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5343f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(photoFileId2)); 5344f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5345f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 3. Raw contact 3 should have its photo file reference cleared. 5346f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue( 5347f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId3), 5348f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID)); 5349f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5350f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // 4. The bogus photo that nobody was using should be cleared from the photo store. 5351f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(photoStore.get(bogusPhotoId)); 5352c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro 5353c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro // 5. The bogus stream item photo should be cleared from the stream item. 5354c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro assertStoredValues(Uri.withAppendedPath( 5355c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 5356c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 5357c2714bbd397b09a20da476c89560e1caecdcce58Dave Santoro new ContentValues[0]); 5358f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5359f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5360d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro public void testPhotoStoreCleanupForProfile() { 5361d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro SynchronousContactsProvider2 provider = (SynchronousContactsProvider2) mActor.provider; 5362d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro PhotoStore profilePhotoStore = provider.getProfilePhotoStore(); 5363d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5364d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Trigger an initial cleanup so another one won't happen while we're running this test. 5365d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.switchToProfileMode(); 5366d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 5367d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5368d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Create the profile contact and add a photo. 5369d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Account socialAccount = new Account("social", "social"); 5370d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentValues values = new ContentValues(); 5371d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_NAME, socialAccount.name); 5372d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro values.put(RawContacts.ACCOUNT_TYPE, socialAccount.type); 5373d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileRawContactId = createBasicProfileContact(values); 5374d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profileContactId = queryContactId(profileRawContactId); 5375d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long dataId = ContentUris.parseId( 5376d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertPhoto(profileRawContactId, R.drawable.earth_normal)); 5377d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long profilePhotoFileId = 5378d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro getStoredLongValue(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), 5379d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Photo.PHOTO_FILE_ID); 5380d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5381d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Also add a stream item with a photo. 5382d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemUri = 5383d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro insertStreamItem(profileRawContactId, buildGenericStreamItemValues(), 5384d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro socialAccount); 5385d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemId = ContentUris.parseId(streamItemUri); 5386d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Uri streamItemPhotoUri = insertStreamItemPhoto( 5387d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro streamItemId, buildGenericStreamItemPhotoValues(0), socialAccount); 5388d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro long streamItemPhotoFileId = getStoredLongValue(streamItemPhotoUri, 5389d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItemPhotos.PHOTO_FILE_ID); 5390d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5391d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Remove the stream item photo and the profile photo. 5392d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(profilePhotoFileId); 5393d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro profilePhotoStore.remove(streamItemPhotoFileId); 5394d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5395d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // Manually trigger another cleanup in the provider. 5396d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.switchToProfileMode(); 5397d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro provider.cleanupPhotoStore(); 5398d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5399d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The following things should have happened. 5400d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5401d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The stream item photo should have been removed. 5402d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertStoredValues(Uri.withAppendedPath( 5403d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 5404d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 5405d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro new ContentValues[0]); 5406d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5407d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro // The profile photo should have been cleared. 5408d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro assertNull(getStoredValue( 5409d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro ContentUris.withAppendedId(Contacts.CONTENT_URI, profileContactId), 5410d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro Contacts.PHOTO_FILE_ID)); 5411d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5412d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro } 5413d9125effce84804631c8e618ae88b2cfc69cf529Dave Santoro 5414f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public void testOverwritePhotoWithThumbnail() throws IOException { 5415f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long rawContactId = createRawContactWithName(); 5416f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long contactId = queryContactId(rawContactId); 5417f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 5418f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5419f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Write a regular-size photo. 5420f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro long dataId = ContentUris.parseId(insertPhoto(rawContactId, R.drawable.earth_normal)); 5421f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Long photoFileId = getStoredLongValue(contactUri, Contacts.PHOTO_FILE_ID); 5422f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertTrue(photoFileId != null && photoFileId > 0); 5423f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5424f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Now overwrite the photo with a thumbnail-sized photo. 5425f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues update = new ContentValues(); 5426f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro update.put(Photo.PHOTO, loadPhotoFromResource(R.drawable.earth_small, PhotoSize.ORIGINAL)); 5427f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.update(ContentUris.withAppendedId(Data.CONTENT_URI, dataId), update, null, null); 5428f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5429f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Photo file ID should have been nulled out, and the photo URI should be the same as the 5430f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // thumbnail URI. 5431f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertNull(getStoredValue(contactUri, Contacts.PHOTO_FILE_ID)); 5432f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String photoUri = getStoredValue(contactUri, Contacts.PHOTO_URI); 5433f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String thumbnailUri = getStoredValue(contactUri, Contacts.PHOTO_THUMBNAIL_URI); 5434f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertEquals(photoUri, thumbnailUri); 5435f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 5436f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro // Retrieving the photo URI should get the thumbnail content. 5437f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro assertInputStreamContent(loadPhotoFromResource(R.drawable.earth_small, PhotoSize.THUMBNAIL), 5438f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro mResolver.openInputStream(Uri.parse(photoUri))); 5439f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 5440f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 54414e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov public void testUpdateRawContactSetStarred() { 54424e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId1 = createRawContactWithName(); 54434e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 54444e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long rawContactId2 = createRawContactWithName(); 54454e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 544647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 544747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2); 54484e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54494e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov long contactId = queryContactId(rawContactId1); 54504e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 54514e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 54524e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54534e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov ContentValues values = new ContentValues(); 54544e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "1"); 54554e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54564e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 54574e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54584e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 54594e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 54604e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 54614e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54624e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(RawContacts.STARRED, "0"); 54634e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(rawContactUri1, values, null, null); 54644e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54654e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "0"); 54664e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); 54674e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "0"); 54684e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54694e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov values.put(Contacts.STARRED, "1"); 54704e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov mResolver.update(contactUri, values, null, null); 54714e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54724e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); 54734e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.STARRED, "1"); 54744e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov assertStoredValue(contactUri, Contacts.STARRED, "1"); 54754e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov } 54764e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov 54776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testSetAndClearSuperPrimaryEmail() { 54786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId1 = createRawContact(new Account("a", "a")); 54796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri11 = insertEmail(rawContactId1, "test1@domain1.com"); 54806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri12 = insertEmail(rawContactId1, "test2@domain1.com"); 54816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 54826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId2 = createRawContact(new Account("b", "b")); 54836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri21 = insertEmail(rawContactId2, "test1@domain2.com"); 54846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri22 = insertEmail(rawContactId2, "test2@domain2.com"); 54856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 54866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 54876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 54886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 54896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 54906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 54916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 54926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 0); 54936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 54946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 54956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Set super primary on the first pair, primary on the second 54966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 54976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 54986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 54996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 55006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 55026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 55036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 55046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 55056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 1); 55086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 1); 55096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 55106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 55116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 55126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 55136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 55146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 55156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Clear primary on the first pair, make sure second is not affected and super_primary is 55176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // also cleared 55186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 55196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 55206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 55216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri11, values, null, null); 55226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 55256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 55266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 55276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 55286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 55296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 55306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 55316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 55326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55336dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear super_primary, if we specify the correct data row 55346dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 55356dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 55366dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 55376dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 55386dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55396dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55406dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 55416dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 55426dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 55436dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 55446dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55456dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that we can only clear primary, if we specify the correct data row 55466dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 55476dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 55486dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 0); 55496dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri21, values, null, null); 55506dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55516dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55526dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 55536dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 55546dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 55556dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 1); 55566dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55576dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Now clear super-primary for real 55586dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann { 55596dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann ContentValues values = new ContentValues(); 55606dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 0); 55616dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri22, values, null, null); 55626dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55636dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55646dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_PRIMARY, 0); 55656dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri11, Data.IS_SUPER_PRIMARY, 0); 55666dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_PRIMARY, 0); 55676dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri12, Data.IS_SUPER_PRIMARY, 0); 55686dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_PRIMARY, 0); 55696dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri21, Data.IS_SUPER_PRIMARY, 0); 55706dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_PRIMARY, 1); 55716dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri22, Data.IS_SUPER_PRIMARY, 0); 55726dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55736dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55746dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann /** 55756dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * Common function for the testNewPrimaryIn* functions. Its four configurations 55766dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann * are each called from its own test 55776dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann */ 55786dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testChangingPrimary(boolean inUpdate, boolean withSuperPrimary) { 55796dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann long rawContactId = createRawContact(new Account("a", "a")); 55806dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann Uri mailUri1 = insertEmail(rawContactId, "test1@domain1.com", true); 55816dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55826dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (withSuperPrimary) { 55836dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 55846dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_SUPER_PRIMARY, 1); 55856dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri1, values, null, null); 55866dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 55876dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55886dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 55896dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 55906dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55916dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Insert another item 55926dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final Uri mailUri2; 55936dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann if (inUpdate) { 55946dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com"); 55956dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 55966dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 1); 55976dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 55986dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 0); 55996dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, 0); 56006dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56016dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann final ContentValues values = new ContentValues(); 56026dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann values.put(Data.IS_PRIMARY, 1); 56036dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mResolver.update(mailUri2, values, null, null); 56046dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } else { 56056dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // directly add as default 56066dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann mailUri2 = insertEmail(rawContactId, "test2@domain1.com", true); 56076dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56086dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56096dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // Ensure that primary has been unset on the first 56106dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann // If withSuperPrimary is set, also ensure that is has been moved to the new item 56116dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_PRIMARY, 0); 56126dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri1, Data.IS_SUPER_PRIMARY, 0); 56136dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_PRIMARY, 1); 56146dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann assertStoredValue(mailUri2, Data.IS_SUPER_PRIMARY, withSuperPrimary ? 1 : 0); 56156dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56166dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56176dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsert() { 56186dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, false); 56196dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56206dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56216dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInInsertWithSuperPrimary() { 56226dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(false, true); 56236dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56246dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56256dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdate() { 56266dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, false); 56276dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56286dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 56296dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann public void testNewPrimaryInUpdateWithSuperPrimary() { 56306dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann testChangingPrimary(true, true); 56316dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann } 56326dd371aea88e09cbe56b8c483021f3bf61527331Daniel Lehmann 5633ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov public void testContactCounts() { 5634ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Uri uri = Contacts.CONTENT_URI.buildUpon() 5635ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build(); 5636ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5637ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContact(); 5638ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("James", "Sullivan"); 5639ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("The Abominable", "Snowman"); 5640ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mike", "Wazowski"); 5641ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("randall", "boggs"); 5642ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Boo", null); 5643ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Mary", null); 5644ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov createRawContactWithName("Roz", null); 5645ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5646ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov Cursor cursor = mResolver.query(uri, 5647ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 5648ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_PRIMARY + " COLLATE LOCALIZED"); 5649ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5650ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterValues(cursor, null, "B", "J", "M", "R", "T"); 5651ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 1, 1, 2, 2, 1); 5652ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 5653ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5654ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor = mResolver.query(uri, 5655ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov new String[]{Contacts.DISPLAY_NAME}, 5656ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov null, null, Contacts.SORT_KEY_ALTERNATIVE + " COLLATE LOCALIZED DESC"); 5657ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5658ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterValues(cursor, "W", "S", "R", "M", "B", null); 5659ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov assertFirstLetterCounts(cursor, 1, 2, 1, 1, 2, 1); 5660ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov cursor.close(); 5661ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5662ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5663ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterValues(Cursor cursor, String... expected) { 5664ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov String[] actual = cursor.getExtras() 5665ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getStringArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_TITLES); 5666ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 5667ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5668ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5669ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov private void assertFirstLetterCounts(Cursor cursor, int... expected) { 5670ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov int[] actual = cursor.getExtras() 5671ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov .getIntArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS); 5672ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov MoreAsserts.assertEquals(expected, actual); 5673ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov } 5674ba2c85b4700fbb3ecaf75e1101735f60b5483527Dmitri Plotnikov 5675f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testReadBooleanQueryParameter() { 5676f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", true, true); 5677f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar", "bool", false, false); 5678f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=0", "bool", true, false); 5679f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1", "bool", false, true); 5680f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false", "bool", true, false); 5681f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=true", "bool", false, true); 5682f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=FaLsE", "bool", true, false); 5683f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=false&some=some", "bool", true, false); 5684f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool=1&some=some", "bool", false, true); 5685f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?some=bool", "bool", true, true); 5686f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertBooleanUriParameter("foo:bar?bool", "bool", true, true); 5687f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5688f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5689f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertBooleanUriParameter(String uriString, String parameter, 5690f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov boolean defaultValue, boolean expectedValue) { 5691f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.readBooleanQueryParameter( 5692f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter, defaultValue)); 5693f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5694f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5695f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov public void testGetQueryParameter() { 5696f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar", "param", null); 5697f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param", "param", null); 5698f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=", "param", ""); 5699f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val", "param", "val"); 5700f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=val&some=some", "param", "val"); 5701f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val", "param", "val"); 5702f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?some=some¶m=val&else=else", "param", "val"); 5703f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertQueryParameter("foo:bar?param=john%40doe.com", "param", "john@doe.com"); 57045fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val", "param", null); 57055fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2", "param", "val2"); 57065fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=", "param", ""); 57075fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m", "param", null); 57085fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1&another_param=val2¶m=val3", 57095fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val3"); 57105fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?some_param=val1¶m=val2&some_param=val3", 57115fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa "param", "val2"); 57125fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?param=val1&some_param=val2", "param", "val1"); 57135fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?p=val1&pp=val2", "p", "val1"); 57145fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?pp=val1&p=val2", "p", "val2"); 57155fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val1&pp=val2&p=val3", "p", "val3"); 57165fdc17bae46504edebe7285c3dbc7691ef3fbeb9Daisuke Miyakawa assertQueryParameter("foo:bar?ppp=val&", "p", null); 5717f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 5718f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 5719e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testMissingAccountTypeParameter() { 5720e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try querying for RawContacts only using ACCOUNT_NAME 5721e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri queryUri = RawContacts.CONTENT_URI.buildUpon().appendQueryParameter( 5722e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey RawContacts.ACCOUNT_NAME, "lolwut").build(); 5723e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 5724e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Cursor cursor = mResolver.query(queryUri, null, null, null, null); 5725e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to query with incomplete account query parameters"); 5726e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 5727e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 5728e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5729e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5730e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5731e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey public void testInsertInconsistentAccountType() { 5732e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Try inserting RawContact with inconsistent Accounts 5733e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account red = new Account("red", "red"); 5734e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Account blue = new Account("blue", "blue"); 5735e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5736e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final ContentValues values = new ContentValues(); 5737e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_NAME, red.name); 5738e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey values.put(RawContacts.ACCOUNT_TYPE, red.type); 5739e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 5740e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri insertUri = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, blue); 5741e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey try { 5742e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey mResolver.insert(insertUri, values); 5743e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey fail("Able to insert RawContact with inconsistent account details"); 5744e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } catch (IllegalArgumentException e) { 5745e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey // Expected behavior. 5746e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5747e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 5748e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 57493826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusNoContactsNoAccounts() throws Exception { 57503826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 57513826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 57523826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 57533826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusOnlyLocalContacts() throws Exception { 57543826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov long rawContactId = createRawContact(); 57553826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 57563826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov mResolver.delete( 57573826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null, null); 57583826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 57593826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 57603826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 57613826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov public void testProviderStatusWithAccounts() throws Exception { 57623826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 5763bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[]{ACCOUNT_1}); 57643826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[]{ACCOUNT_1}); 57653826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NORMAL); 5766bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov mActor.setAccounts(new Account[0]); 57673826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated(new Account[0]); 57683826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertProviderStatus(ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS); 57693826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov } 57703826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov 57713826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov private void assertProviderStatus(int expectedProviderStatus) { 577209c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov Cursor cursor = mResolver.query(ProviderStatus.CONTENT_URI, 577309c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov new String[]{ProviderStatus.DATA1, ProviderStatus.STATUS}, null, null, null); 577409c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertTrue(cursor.moveToFirst()); 577509c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov assertEquals(0, cursor.getLong(0)); 57763826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov assertEquals(expectedProviderStatus, cursor.getInt(1)); 577709c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov cursor.close(); 577809c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov } 577909c6613dd14cb1911da5d62e39a4e54eb8f4666fDmitri Plotnikov 5780b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void testProperties() throws Exception { 5781743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ContactsProvider2 provider = (ContactsProvider2)getProvider(); 5782b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContactsDatabaseHelper helper = (ContactsDatabaseHelper)provider.getDatabaseHelper(); 5783b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertNull(helper.getProperty("non-existent", null)); 5784b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("non-existent", "default")); 5785b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 5786b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", "string1"); 5787b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent2", "string2"); 5788b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string1", helper.getProperty("existent1", "default")); 5789b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("string2", helper.getProperty("existent2", "default")); 5790b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov helper.setProperty("existent1", null); 5791b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov assertEquals("default", helper.getProperty("existent1", "default")); 5792b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 5793b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 579442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private class VCardTestUriCreator { 579542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup1; 579642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String mLookup2; 579742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 579842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public VCardTestUriCreator(String lookup1, String lookup2) { 579942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann super(); 580042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup1 = lookup1; 580142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mLookup2 = lookup2; 580242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 580342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 580442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri1() { 580542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup1); 580642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 580742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 580842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getUri2() { 580942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, mLookup2); 581042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 581142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 581242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public Uri getCombinedUri() { 581342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, 581442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(mLookup1 + ":" + mLookup2)); 581542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 581642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 581742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 581842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private VCardTestUriCreator createVCardTestContacts() { 581942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId1 = createRawContact(mAccount, RawContacts.SOURCE_ID, "4:12"); 582042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId1, "John", "Doe"); 582142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 582242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long rawContactId2 = createRawContact(mAccount, RawContacts.SOURCE_ID, "3:4%121"); 582342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann insertStructuredName(rawContactId2, "Jane", "Doh"); 582442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 582542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId1 = queryContactId(rawContactId1); 582642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final long contactId2 = queryContactId(rawContactId2); 582742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact1Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1); 582842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final Uri contact2Uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2); 582942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup1 = 583042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact1Uri).getPathSegments().get(2)); 583142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String lookup2 = 583242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri.encode(Contacts.getLookupUri(mResolver, contact2Uri).getPathSegments().get(2)); 583342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return new VCardTestUriCreator(lookup1, lookup2); 583442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 583542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 583642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryMultiVCard() { 583742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // No need to create any contacts here, because the query for multiple vcards 583842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // does not go into the database at all 583942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Uri uri = Uri.withAppendedPath(Contacts.CONTENT_MULTI_VCARD_URI, Uri.encode("123:456")); 584042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(uri, null, null, null, null); 584142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 584242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 584342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 584442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 584542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 584642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // The resulting name contains date and time. Ensure that before and after are correct 584742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.startsWith("vcards_")); 584842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(filename.endsWith(".vcf")); 584942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 585042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 585142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 585242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testQueryFileSingleVCard() { 585342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 585442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 585542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 585642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri1(), null, null, null, null); 585742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 585842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 585942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 586042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 586142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("John Doe.vcf", filename); 586242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 586342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 586442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 586542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 586642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann Cursor cursor = mResolver.query(contacts.getUri2(), null, null, null, null); 586742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals(1, cursor.getCount()); 586842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.moveToFirst()); 586942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 587042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 587142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertEquals("Jane Doh.vcf", filename); 587242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann cursor.close(); 587342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 587442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 587542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 587624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public void testQueryFileProfileVCard() { 587724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro createBasicProfileContact(new ContentValues()); 587824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Cursor cursor = mResolver.query(Profile.CONTENT_VCARD_URI, null, null, null, null); 587924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals(1, cursor.getCount()); 588024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.moveToFirst()); 588124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(cursor.isNull(cursor.getColumnIndex(OpenableColumns.SIZE))); 588224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 588324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertEquals("Mia Prophyl.vcf", filename); 588424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro cursor.close(); 588524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 588642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 588742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileMultiVCard() throws IOException { 588842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 588942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 589042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 589142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getCombinedUri(), "r"); 589242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 589342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann String data = readToEnd(inputStream); 589442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 589542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 589642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 589742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the resulting VCard has both contacts 589842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doe;John;;;")); 589942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 590042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 590142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 590242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann public void testOpenAssetFileSingleVCard() throws IOException { 590342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final VCardTestUriCreator contacts = createVCardTestContacts(); 590442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 590542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann // Ensure that the right VCard is being created in each case 590642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 590742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 590842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri1(), "r"); 590942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 591042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 591142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 591242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 591324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 591424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertTrue(data.contains("N:Doe;John;;;")); 591524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro assertFalse(data.contains("N:Doh;Jane;;;")); 591642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 591742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 591842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann { 591942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final AssetFileDescriptor descriptor = 592042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann mResolver.openAssetFileDescriptor(contacts.getUri2(), "r"); 592142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final FileInputStream inputStream = descriptor.createInputStream(); 592242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann final String data = readToEnd(inputStream); 592342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann inputStream.close(); 592442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann descriptor.close(); 592542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 592642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertFalse(data.contains("N:Doe;John;;;")); 592742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann assertTrue(data.contains("N:Doh;Jane;;;")); 592842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 592942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 593042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 5931dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testAutoGroupMembership() { 5932dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 5933dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 5934dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false /* favorite */); 5935dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, false/* favorite */); 5936dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 5937dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccountTwo); 5938dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(null); 5939dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5940dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 5941dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5942dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5943dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 5944dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 5945dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5946dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5947dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5948dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5949dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5950dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 5951dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 5952dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 5953dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g3, c.getLong(0)); 5954dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r2, c.getLong(1)); 5955dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 5956dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 5957dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 5958dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5959dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5960dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5961dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testNoAutoAddMembershipAfterGroupCreation() { 5962dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 5963dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 5964dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount); 5965dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo); 5966dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 5967dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null); 5968dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5969dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5970dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5971dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5972dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, true /* autoAdd */, false /* favorite */); 5973dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 5974dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, true /* autoAdd */, false/* favorite */); 5975dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5976dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5977dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5978dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 5979dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5980dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // create some starred and non-starred contacts, some associated with account, some not 5981dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group created 5982dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // the starred contacts should be added to group 5983dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // favorites group removed 5984dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // no change to starred status 5985dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesMembershipAfterGroupCreation() { 5986dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 5987dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 5988dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccount, RawContacts.STARRED, "1"); 5989dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r4 = createRawContact(mAccountTwo, RawContacts.STARRED, "1"); 5990dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r5 = createRawContact(mAccountTwo); 5991dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r6 = createRawContact(null, RawContacts.STARRED, "1"); 5992dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r7 = createRawContact(null); 5993dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5994dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 5995dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 5996dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 5997dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 5998dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false /* favorite */); 5999dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g3 = createGroup(mAccountTwo, "g3", "t3", 0, false /* autoAdd */, false/* favorite */); 6000dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6001dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6002dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6003dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6004dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6005dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6006dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6007dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6008dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6009dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6010dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6011dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6012dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6013dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6014dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6015dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6016dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6017dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6018dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6019dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6020dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6021dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6022dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6023dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(RawContacts.CONTENT_URI, r6, 6024dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_NAME, mAccount.name, 6025dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana RawContacts.ACCOUNT_TYPE, mAccount.type); 6026dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6027dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6028dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6029dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6030dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6031dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6032dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6033dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6034dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6035dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6036dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6037dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r6, c.getLong(1)); 6038dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6039dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6040dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6041dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6042dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6043dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(ContentUris.withAppendedId(Groups.CONTENT_URI, g1), null, null); 6044dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6045dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6046dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6047dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6048dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6049dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6050dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6051dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r4)); 6052dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r5)); 6053dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r6)); 6054dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r7)); 6055dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6056dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6057dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testFavoritesGroupMembershipChangeAfterStarChange() { 6058dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6059dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6060dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6061dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6062dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount, RawContacts.STARRED, "1"); 6063dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6064dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6065dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6066dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6067dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryGroupMemberships(mAccount); 6068dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6069dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6070dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6071dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6072dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6073dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6074dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6075dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6076dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6077dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6078dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6079dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6080dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6081dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6082dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6083dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6084dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred 6085dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "1")); 6086dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6087dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6088dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6089dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6090dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6091dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6092dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6093dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6094dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6095dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6096dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6097dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6098dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6099dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6100dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6101dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(RawContacts.CONTENT_URI, r1, RawContacts.STARRED, "0")); 6102dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6103dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6104dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6105dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6106e3e79030101447da07547647bad225686eb9b8dfDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(r1)); 6107dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNotNull(contactUri); 6108dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6109dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // mark r1 as starred via its contact lookup uri 6110dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(1, updateItem(contactUri, Contacts.STARRED, "1")); 6111dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Now that r1 is starred it should have a membership in the one groups from mAccount 6112dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // that is marked as a favorite. 6113dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // There should be no memberships in mAccountTwo since it has no starred raw contacts. 6114dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6115dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6116dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6117dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6118dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6119dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6120dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6121dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6122dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6123dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6124dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6125dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove the star from r1 6126dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana updateItem(contactUri, Contacts.STARRED, "0"); 6127dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // Since no raw contacts are starred, there should be no group memberships. 6128dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6129dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6130dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6131dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6132dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana public void testStarChangedAfterGroupMembershipChange() { 6133dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g1 = createGroup(mAccount, "g1", "t1", 0, false /* autoAdd */, true /* favorite */); 6134dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g2 = createGroup(mAccount, "g2", "t2", 0, false /* autoAdd */, false/* favorite */); 6135dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g4 = createGroup(mAccountTwo, "g4", "t4", 0, false /* autoAdd */, true /* favorite */); 6136dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long g5 = createGroup(mAccountTwo, "g5", "t5", 0, false /* autoAdd */, false/* favorite */); 6137dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r1 = createRawContact(mAccount); 6138dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r2 = createRawContact(mAccount); 6139dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana long r3 = createRawContact(mAccountTwo); 6140dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6141dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6142dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6143dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6144dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6145dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c; 6146dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6147dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r1 to one favorites group 6148dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should automatically be set 6149dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1 should automatically be added to the other favorites group 6150dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir1g1 = insertGroupMembership(r1, g1); 6151dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r1)); 6152dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6153dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6154dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6155dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccount); 6156dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6157dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6158dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g1, c.getLong(0)); 6159dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r1, c.getLong(1)); 6160dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6161dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6162dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6163dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6164dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6165dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r1 from one favorites group 6166dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir1g1, null, null); 6167dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r1's star should no longer be set 6168dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6169dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6170dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6171dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // there should be no membership rows 6172dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6173dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6174dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6175dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // add r3 to the one favorites group for that account 6176dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be set 6177dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri urir3g4 = insertGroupMembership(r3, g4); 6178dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6179dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6180dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(queryRawContactIsStarred(r3)); 6181dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6182dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c = queryGroupMemberships(mAccountTwo); 6183dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 6184dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToNext()); 6185dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(g4, c.getLong(0)); 6186dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertEquals(r3, c.getLong(1)); 6187dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 6188dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 6189dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 6190dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6191dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 6192dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // remove r3 from the favorites group 6193dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana mResolver.delete(urir3g4, null, null); 6194dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana // r3's star should automatically be cleared 6195dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r1)); 6196dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r2)); 6197dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(queryRawContactIsStarred(r3)); 6198dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccount)); 6199dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertNoRowsAndClose(queryGroupMemberships(mAccountTwo)); 6200dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6201dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 620297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyRawContact() { 620397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 620497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 620597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 620697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 620797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 620897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "second"); 620997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "first"); 621097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 621197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = rawContactUri.buildUpon() 621297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 621397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 621497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, RawContacts.CUSTOM_RINGTONE, "third"); 621597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri, RawContacts.CUSTOM_RINGTONE, "third"); 621697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 621797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 621897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testReadOnlyDataRow() { 621997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId = createRawContact(); 622097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri emailUri = insertEmail(rawContactId, "email"); 622197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri phoneUri = insertPhoneNumber(rawContactId, "555-1111"); 622297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 622397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Data.IS_READ_ONLY, "1"); 622497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(emailUri, Email.ADDRESS, "changed"); 622597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(phoneUri, Phone.NUMBER, "555-2222"); 622697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "email"); 622797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(phoneUri, Phone.NUMBER, "555-2222"); 622897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 622997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri syncAdapterUri = emailUri.buildUpon() 623097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "1") 623197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov .build(); 623297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(syncAdapterUri, Email.ADDRESS, "changed"); 623397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(emailUri, Email.ADDRESS, "changed"); 623497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 623597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 623697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov public void testContactWithReadOnlyRawContact() { 623797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId1 = createRawContact(); 623897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri1 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId1); 623997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "first"); 624097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 624197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long rawContactId2 = createRawContact(); 624297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri rawContactUri2 = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId2); 624397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 624497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(rawContactUri2, RawContacts.RAW_CONTACT_IS_READ_ONLY, 1); 624597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 624697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov setAggregationException(AggregationExceptions.TYPE_KEEP_TOGETHER, 624797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov rawContactId1, rawContactId2); 624897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 624997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov long contactId = queryContactId(rawContactId1); 625097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 625197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 625297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov storeValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 625397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(contactUri, Contacts.CUSTOM_RINGTONE, "rt"); 625497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri1, RawContacts.CUSTOM_RINGTONE, "rt"); 625597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov assertStoredValue(rawContactUri2, RawContacts.CUSTOM_RINGTONE, "second"); 625697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 625797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 62587a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameParsingQuery() { 62597a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 62607a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr.").build(); 62617a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 62627a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 62637a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr. John Q. Doe Jr."); 626417a22fae02931ae536f35293ca13a8de53439f72Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr."); 62657a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 62667a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 62677a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 62687a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 62697a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 62707a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 62717a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 62727a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 62737a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 62747a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 62757a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov public void testNameConcatenationQuery() { 62767a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name") 62777a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.PREFIX, "Mr") 62787a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.GIVEN_NAME, "John") 62797a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.MIDDLE_NAME, "Q.") 62807a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.FAMILY_NAME, "Doe") 62817a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .appendQueryParameter(StructuredName.SUFFIX, "Jr.") 62827a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov .build(); 62837a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov Cursor cursor = mResolver.query(uri, null, null, null, null); 62847a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov ContentValues values = new ContentValues(); 628555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, "Mr John Q. Doe, Jr."); 62867a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.PREFIX, "Mr"); 62877a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, "John"); 62887a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.MIDDLE_NAME, "Q."); 62897a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, "Doe"); 62907a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.SUFFIX, "Jr."); 62917a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov values.put(StructuredName.FULL_NAME_STYLE, FullNameStyle.WESTERN); 62927a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertTrue(cursor.moveToFirst()); 62937a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov assertCursorValues(cursor, values); 62947a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov cursor.close(); 62957a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov } 62967a3c645fa7db38449d34eb04d4e032fd079c3244Dmitri Plotnikov 6297dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana private Cursor queryGroupMemberships(Account account) { 6298dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = mResolver.query(maybeAddAccountQueryParameters(Data.CONTENT_URI, account), 6299dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana new String[]{GroupMembership.GROUP_ROW_ID, GroupMembership.RAW_CONTACT_ID}, 6300dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Data.MIMETYPE + "=?", new String[]{GroupMembership.CONTENT_ITEM_TYPE}, 6301dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana GroupMembership.GROUP_SOURCE_ID); 6302dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return c; 6303dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 6304dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 630542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann private String readToEnd(FileInputStream inputStream) { 630642aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann try { 6307bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("DECLARED INPUT STREAM LENGTH: " + inputStream.available()); 630842aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann int ch; 630942aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann StringBuilder stringBuilder = new StringBuilder(); 6310bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov int index = 0; 6311bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov while (true) { 6312bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov ch = inputStream.read(); 6313bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov System.out.println("READ CHARACTER: " + index + " " + ch); 6314bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov if (ch == -1) { 6315bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov break; 6316bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 631742aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann stringBuilder.append((char)ch); 6318bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov index++; 6319bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov } 632042aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return stringBuilder.toString(); 632142aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } catch (IOException e) { 632242aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann return null; 632342aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 632442aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann } 632542aff67de3f0f4b8664a74fe6ff63ae191aa51bfDaniel Lehmann 6326f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov private void assertQueryParameter(String uriString, String parameter, String expectedValue) { 6327f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov assertEquals(expectedValue, ContactsProvider2.getQueryParameter( 6328f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov Uri.parse(uriString), parameter)); 6329f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov } 6330f7f747a00f4fa7a9e564507693419a5a8db0eb8fDmitri Plotnikov 63314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private long createContact(ContentValues values, String firstName, String givenName, 63324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 6333aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 633424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createContact(values, firstName, givenName, phoneNumber, email, presenceStatus, 633524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, false); 633624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 633724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 633824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createContact(ContentValues values, String firstName, String givenName, 633924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 634024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 634148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return queryContactId(createRawContact(values, firstName, givenName, phoneNumber, email, 634224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro presenceStatus, timesContacted, starred, groupId, chatMode, isUserProfile)); 634348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 634448786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 634548786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String firstName, String givenName, 634648786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 6347aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori long groupId, int chatMode) { 634848786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 6349aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori timesContacted, starred, groupId, chatMode); 635048786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov insertStructuredName(rawContactId, firstName, givenName); 635148786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 635248786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov } 635348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov 635424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String firstName, String givenName, 635524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String phoneNumber, String email, int presenceStatus, int timesContacted, int starred, 635624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long groupId, int chatMode, boolean isUserProfile) { 635724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long rawContactId = createRawContact(values, phoneNumber, email, presenceStatus, 635824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro timesContacted, starred, groupId, chatMode, isUserProfile); 635924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro insertStructuredName(rawContactId, firstName, givenName); 636024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return rawContactId; 636124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 636224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 636348786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov private long createRawContact(ContentValues values, String phoneNumber, String email, 6364aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori int presenceStatus, int timesContacted, int starred, long groupId, int chatMode) { 636524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return createRawContact(values, phoneNumber, email, presenceStatus, timesContacted, starred, 636624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro groupId, chatMode, false); 636724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 636824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 636924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createRawContact(ContentValues values, String phoneNumber, String email, 637024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro int presenceStatus, int timesContacted, int starred, long groupId, int chatMode, 637124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro boolean isUserProfile) { 63724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.STARRED, starred); 63734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.SEND_TO_VOICEMAIL, 1); 63744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.CUSTOM_RINGTONE, "beethoven5"); 63754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(RawContacts.TIMES_CONTACTED, timesContacted); 637624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 637724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri insertionUri = isUserProfile 637824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ? Profile.CONTENT_RAW_CONTACTS_URI 637924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro : RawContacts.CONTENT_URI; 638024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Uri rawContactUri = mResolver.insert(insertionUri, values); 63814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long rawContactId = ContentUris.parseId(rawContactUri); 63824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri photoUri = insertPhoto(rawContactId); 63834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov long photoId = ContentUris.parseId(photoUri); 63844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Contacts.PHOTO_ID, photoId); 63859dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(phoneNumber)) { 63869dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertPhoneNumber(rawContactId, phoneNumber); 63879dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 63889dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa if (!TextUtils.isEmpty(email)) { 63899dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa insertEmail(rawContactId, email); 63909dbfd650ccf93714f3266e80f9fbdbcb526ae7b3Daisuke Miyakawa } 63914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 6392aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori insertStatusUpdate(Im.PROTOCOL_GOOGLE_TALK, null, email, presenceStatus, "hacking", 63935d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro chatMode, isUserProfile); 63944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 63954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov if (groupId != 0) { 63964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov insertGroupMembership(rawContactId, groupId); 63974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 639824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 639948786768751cdd9868fb3cf3c82d63f277a54b6fDmitri Plotnikov return rawContactId; 64004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 64014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 640224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 640324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values under the user's profile. 640424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param profileValues Values to be used to create the entry (common values will be 640524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 640624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 640724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 640824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicProfileContact(ContentValues profileValues) { 640924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long profileRawContactId = createRawContact(profileValues, "Mia", "Prophyl", 641024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18005554411", "mia.prophyl@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 641124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, true); 641224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro profileValues.put(Contacts.DISPLAY_NAME, "Mia Prophyl"); 641324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return profileRawContactId; 641424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 641524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 641624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro /** 641724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Creates a raw contact with pre-set values that is not under the user's profile. 641824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @param nonProfileValues Values to be used to create the entry (common values will be 641924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * automatically populated in createRawContact()). 642024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * @return the raw contact ID that was created. 642124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro */ 642224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private long createBasicNonProfileContact(ContentValues nonProfileValues) { 642324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro long nonProfileRawContactId = createRawContact(nonProfileValues, "John", "Doe", 642424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "18004664411", "goog411@acme.com", StatusUpdates.INVISIBLE, 4, 1, 0, 642524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro StatusUpdates.CAPABILITY_HAS_CAMERA, false); 642624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro nonProfileValues.put(Contacts.DISPLAY_NAME, "John Doe"); 642724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro return nonProfileRawContactId; 642824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 642924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 64304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov private void putDataValues(ContentValues values, long rawContactId) { 64314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 64324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, "testmimetype"); 64334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RES_PACKAGE, "oldpackage"); 64344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 64354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.IS_SUPER_PRIMARY, 1); 64364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA1, "one"); 64374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA2, "two"); 64384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA3, "three"); 64394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA4, "four"); 64404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA5, "five"); 64414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA6, "six"); 64424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA7, "seven"); 64434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA8, "eight"); 64444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA9, "nine"); 64454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA10, "ten"); 64464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA11, "eleven"); 64474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA12, "twelve"); 64484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA13, "thirteen"); 64494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA14, "fourteen"); 64504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.DATA15, "fifteen"); 64514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC1, "sync1"); 64524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC2, "sync2"); 64534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC3, "sync3"); 64544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.SYNC4, "sync4"); 64554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 64564928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa 64574928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa /** 64584928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param data1 email address or phone number 64594928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param usageType One of {@link DataUsageFeedback#USAGE_TYPE} 64604928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * @param values ContentValues for this feedback. Useful for incrementing 64614928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa * {Contacts#TIMES_CONTACTED} in the ContentValue. Can be null. 64624928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa */ 64634928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa private void sendFeedback(String data1, String usageType, ContentValues values) { 64644928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final long dataId = getStoredLongValue(Data.CONTENT_URI, 64654928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa Data.DATA1 + "=?", new String[] { data1 }, Data._ID); 64664928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa final Uri feedbackUri = DataUsageFeedback.FEEDBACK_URI.buildUpon() 64674928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .appendPath(String.valueOf(dataId)) 64684928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, usageType) 64694928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa .build(); 64704928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa assertNotSame(0, mResolver.update(feedbackUri, new ContentValues(), null, null)); 64714928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa if (values != null && values.containsKey(Contacts.TIMES_CONTACTED)) { 64724928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa values.put(Contacts.TIMES_CONTACTED, values.getAsInteger(Contacts.TIMES_CONTACTED) + 1); 64734928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 64744928b8c8c7a49ec088884cd9d330eeecc811dca9Daisuke Miyakawa } 6475d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov} 6476