BaseContactsProvider2Test.java revision 0992b9d4969ed0eee6e879db94292b635229e2b7
1d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/* 2d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 4d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * you may not use this file except in compliance with the License. 6d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * You may obtain a copy of the License at 7d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 8d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * 10d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * See the License for the specific language governing permissions and 14d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * limitations under the License. 15d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 18d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 190bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmannimport static com.android.providers.contacts.ContactsActor.PACKAGE_GREY; 200bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann 2181567f4a0f7c9c338506bd82f4d33e83c2ccf159Makoto Onukiimport com.android.providers.contacts.util.Hex; 2209ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport com.google.android.collect.Sets; 2309ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov 24e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikovimport android.accounts.Account; 25bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentProvider; 26b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikovimport android.content.ContentResolver; 27d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentUris; 28d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.ContentValues; 29e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikovimport android.content.Context; 309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.content.Entity; 31d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.database.Cursor; 32d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.net.Uri; 336f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoroimport android.os.Bundle; 34bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.ContactsContract; 35d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 36a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 376d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Event; 389261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 390992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onukiimport android.provider.ContactsContract.CommonDataKinds.Identity; 40e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 41a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Nickname; 426d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note; 4301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 44bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 45ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millarimport android.provider.ContactsContract.CommonDataKinds.Photo; 46e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.SipAddress; 47e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 4909ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 5009ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport android.provider.ContactsContract.Data; 5109ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport android.provider.ContactsContract.Groups; 5209ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 536f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoroimport android.provider.ContactsContract.SearchSnippetColumns; 5409ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport android.provider.ContactsContract.Settings; 5509ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 563b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItems; 5709ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport android.test.MoreAsserts; 58d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.test.mock.MockContentResolver; 59b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikovimport android.util.Log; 60bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov 619261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport java.util.ArrayList; 629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintanaimport java.util.Arrays; 63ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onukiimport java.util.BitSet; 64e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikovimport java.util.Comparator; 65ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikovimport java.util.Iterator; 6620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikovimport java.util.Map; 67ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikovimport java.util.Map.Entry; 6809ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikovimport java.util.Set; 69d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 70d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov/** 71d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov * A common superclass for {@link ContactsProvider2}-related tests. 72d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov */ 73f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoropublic abstract class BaseContactsProvider2Test extends PhotoLoadingTestCase { 74d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 75d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov protected static final String PACKAGE = "ContactsProvider2Test"; 7673f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov public static final String READ_ONLY_ACCOUNT_TYPE = 7773f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov SynchronousContactsProvider2.READ_ONLY_ACCOUNT_TYPE; 78d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 79bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov protected ContactsActor mActor; 80d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov protected MockContentResolver mResolver; 819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected Account mAccount = new Account("account1", "account type1"); 82e2579e029472f76b2dfda141444d775c67da0ec8Cynthia Wong protected Account mAccountTwo = new Account("account2", "account type2"); 839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected final static Long NO_LONG = new Long(0); 859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected final static String NO_STRING = new String(""); 869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected final static Account NO_ACCOUNT = new Account("a", "b"); 87d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 88bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov protected Class<? extends ContentProvider> getProviderClass() { 89bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov return SynchronousContactsProvider2.class; 90bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov } 91bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov 92bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov protected String getAuthority() { 93bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov return ContactsContract.AUTHORITY; 94bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov } 95bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov 96d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov @Override 97d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov protected void setUp() throws Exception { 98d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov super.setUp(); 99d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 100bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov mActor = new ContactsActor(getContext(), PACKAGE_GREY, getProviderClass(), getAuthority()); 101d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov mResolver = mActor.resolver; 102445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov if (mActor.provider instanceof SynchronousContactsProvider2) { 1039a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov getContactsProvider().wipeData(); 104445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov } 10524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 10624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Give the actor access to read/write contacts and profile data by default. 10724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro mActor.addPermissions( 10824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "android.permission.READ_CONTACTS", 10924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "android.permission.WRITE_CONTACTS", 11036612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "android.permission.READ_SOCIAL_STREAM", 11136612112760df799ef89f7e324e5dfabd5ca0d2bDave Santoro "android.permission.WRITE_SOCIAL_STREAM", 11224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "android.permission.READ_PROFILE", 11324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "android.permission.WRITE_PROFILE"); 1149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 1159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 1160265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov @Override 1170265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov protected void tearDown() throws Exception { 1180265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov super.tearDown(); 1190265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov } 1200265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov 1219a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov public SynchronousContactsProvider2 getContactsProvider() { 1229a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov return (SynchronousContactsProvider2) mActor.provider; 1239a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov } 1249a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov 125e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov public Context getMockContext() { 126e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov return mActor.context; 127e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov } 128e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov 129e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov public void addAuthority(String authority) { 130e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov mActor.addAuthority(authority); 131e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov } 132e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov 133e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov public ContentProvider addProvider(Class<? extends ContentProvider> providerClass, 134e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov String authority) throws Exception { 135e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov return mActor.addProvider(providerClass, authority); 136e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov } 137e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov 1383d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov public ContentProvider getProvider() { 1393d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov return mActor.provider; 1403d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov } 1413d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov 1429261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected Uri maybeAddAccountQueryParameters(Uri uri, Account account) { 1439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (account == null) { 1449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return uri; 1459261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 1469261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return uri.buildUpon() 147df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana .appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name) 148df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana .appendQueryParameter(RawContacts.ACCOUNT_TYPE, account.type) 1499261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana .build(); 150d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 151d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 152d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected long createRawContact() { 153226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana return createRawContact(null); 154d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 155d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 156c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov protected long createRawContactWithName() { 157e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey return createRawContactWithName(null); 158e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 159e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 160e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey protected long createRawContactWithName(Account account) { 161e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey return createRawContactWithName("John", "Doe", account); 1623cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov } 1633cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov 1643cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov protected long createRawContactWithName(String firstName, String lastName) { 165e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey return createRawContactWithName(firstName, lastName, null); 166e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 167e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 168e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey protected long createRawContactWithName(String firstName, String lastName, Account account) { 169e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey long rawContactId = createRawContact(account); 1703cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov insertStructuredName(rawContactId, firstName, lastName); 171c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov return rawContactId; 172c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov } 173c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 174e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey protected Uri setCallerIsSyncAdapter(Uri uri, Account account) { 175e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey if (account == null) { 176e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey return uri; 177e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 178e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey final Uri.Builder builder = uri.buildUpon(); 179e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey builder.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, account.name); 180e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey builder.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type); 181e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey builder.appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true"); 182e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey return builder.build(); 183e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey } 184e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey 185226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana protected long createRawContact(Account account, String... extras) { 1869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 187dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana extrasVarArgsToValues(values, extras); 188dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana final Uri uri = maybeAddAccountQueryParameters(RawContacts.CONTENT_URI, account); 189dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri contactUri = mResolver.insert(uri, values); 190dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return ContentUris.parseId(contactUri); 191dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 192dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 193dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana protected int updateItem(Uri uri, long id, String... extras) { 194dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Uri itemUri = ContentUris.withAppendedId(uri, id); 195dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return updateItem(itemUri, extras); 196dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 197dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 198dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana protected int updateItem(Uri uri, String... extras) { 199dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana ContentValues values = new ContentValues(); 200dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana extrasVarArgsToValues(values, extras); 201dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return mResolver.update(uri, values, null, null); 202dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 203dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 204dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana private static void extrasVarArgsToValues(ContentValues values, String... extras) { 205226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana for (int i = 0; i < extras.length; ) { 206226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana values.put(extras[i], extras[i + 1]); 207226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana i += 2; 208226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana } 2099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 2109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 2119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected long createGroup(Account account, String sourceId, String title) { 212dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return createGroup(account, sourceId, title, 1, false, false); 2130be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov } 2140be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov 2150be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov protected long createGroup(Account account, String sourceId, String title, int visible) { 216dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return createGroup(account, sourceId, title, visible, false, false); 217dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 218dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 219f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov protected long createAutoAddGroup(Account account) { 220f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return createGroup(account, "auto", "auto", 221f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 0 /* visible */, true /* auto-add */, false /* fav */); 222f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 223f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 224dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana protected long createGroup(Account account, String sourceId, String title, 225dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana int visible, boolean autoAdd, boolean favorite) { 2269261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 2279261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(Groups.SOURCE_ID, sourceId); 2289261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(Groups.TITLE, title); 2290be993f8ef0078b9825a5ffe6add08a6786d8dacDmitri Plotnikov values.put(Groups.GROUP_VISIBLE, visible); 230dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana values.put(Groups.AUTO_ADD, autoAdd ? 1 : 0); 231dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana values.put(Groups.FAVORITES, favorite ? 1 : 0); 2329261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana final Uri uri = maybeAddAccountQueryParameters(Groups.CONTENT_URI, account); 2339261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return ContentUris.parseId(mResolver.insert(uri, values)); 2349261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 2359261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 23689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov protected void createSettings(Account account, String shouldSync, String ungroupedVisible) { 237f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro createSettings(new AccountWithDataSet(account.name, account.type, null), 238f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro shouldSync, ungroupedVisible); 239f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro } 240f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro 241f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro protected void createSettings(AccountWithDataSet account, String shouldSync, 242f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro String ungroupedVisible) { 24389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov ContentValues values = new ContentValues(); 244f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro values.put(Settings.ACCOUNT_NAME, account.getAccountName()); 245f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro values.put(Settings.ACCOUNT_TYPE, account.getAccountType()); 246f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro if (account.getDataSet() != null) { 247f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro values.put(Settings.DATA_SET, account.getDataSet()); 248f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro } 24989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov values.put(Settings.SHOULD_SYNC, shouldSync); 25089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov values.put(Settings.UNGROUPED_VISIBLE, ungroupedVisible); 25189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov mResolver.insert(Settings.CONTENT_URI, values); 25289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 25389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 2545ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertStructuredName(long rawContactId, String givenName, String familyName) { 255d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 256d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 257d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (givenName != null) { 258d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov sb.append(givenName); 259d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 260d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (givenName != null && familyName != null) { 261d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov sb.append(" "); 262d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 263d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (familyName != null) { 264d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov sb.append(familyName); 265d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 266d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov values.put(StructuredName.DISPLAY_NAME, sb.toString()); 267d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov values.put(StructuredName.GIVEN_NAME, givenName); 268d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov values.put(StructuredName.FAMILY_NAME, familyName); 269d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 2705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov return insertStructuredName(rawContactId, values); 2714097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 2724097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 2735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertStructuredName(long rawContactId, ContentValues values) { 2745ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 2754097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 276d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 277d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov return resultUri; 278d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 279d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 280a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka protected Uri insertOrganization(long rawContactId, ContentValues values) { 281a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka return insertOrganization(rawContactId, values, false); 28201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 28301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 284a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka protected Uri insertOrganization(long rawContactId, ContentValues values, boolean primary) { 28501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 28601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov values.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 28701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov values.put(Organization.TYPE, Organization.TYPE_WORK); 28801911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov if (primary) { 2890265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 29001911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 29101911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 29201911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 29301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov return resultUri; 29401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 29501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov 2965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertPhoneNumber(long rawContactId, String phoneNumber) { 29725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov return insertPhoneNumber(rawContactId, phoneNumber, false); 29825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 29925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 30025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov protected Uri insertPhoneNumber(long rawContactId, String phoneNumber, boolean primary) { 30158567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa return insertPhoneNumber(rawContactId, phoneNumber, primary, Phone.TYPE_HOME); 30258567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa } 30358567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa 30458567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa protected Uri insertPhoneNumber(long rawContactId, String phoneNumber, boolean primary, 30558567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa int type) { 306bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov ContentValues values = new ContentValues(); 3075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 308bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 309bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov values.put(Phone.NUMBER, phoneNumber); 31058567abca253f1efa2db5c39e17e42dca589e916Daisuke Miyakawa values.put(Phone.TYPE, type); 31125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov if (primary) { 3120265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 31325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 314bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 315bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 316bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov return resultUri; 317bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 318bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertEmail(long rawContactId, String email) { 32025abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov return insertEmail(rawContactId, email, false); 32125abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 32225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov 32325abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov protected Uri insertEmail(long rawContactId, String email, boolean primary) { 324916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov return insertEmail(rawContactId, email, primary, Email.TYPE_HOME, null); 325916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 326916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 327916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov protected Uri insertEmail(long rawContactId, String email, boolean primary, int type, 328916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov String label) { 329a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov ContentValues values = new ContentValues(); 3305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 331a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 332a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov values.put(Email.DATA, email); 333916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Email.TYPE, type); 334916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Email.LABEL, label); 33525abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov if (primary) { 336916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 33725abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov } 338e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 339e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 340e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa return resultUri; 341e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 342e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 343e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa protected Uri insertSipAddress(long rawContactId, String sipAddress) { 344e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa return insertSipAddress(rawContactId, sipAddress, false); 345e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 346e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa 347e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa protected Uri insertSipAddress(long rawContactId, String sipAddress, boolean primary) { 348e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa ContentValues values = new ContentValues(); 349e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values.put(Data.RAW_CONTACT_ID, rawContactId); 350e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); 351e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values.put(SipAddress.SIP_ADDRESS, sipAddress); 352e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa if (primary) { 353e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa values.put(Data.IS_PRIMARY, 1); 354e432023d408c461295e53c0593fabb2b4c17aeb3Daisuke Miyakawa } 355a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 356a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 357a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov return resultUri; 358a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 359a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 3605ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertNickname(long rawContactId, String nickname) { 361a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov ContentValues values = new ContentValues(); 3625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 363a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov values.put(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE); 364a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov values.put(Nickname.NAME, nickname); 3653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values.put(Nickname.TYPE, Nickname.TYPE_OTHER_NAME); 366a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 367a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 368a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov return resultUri; 369a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 370a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 3714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov protected Uri insertPostalAddress(long rawContactId, String formattedAddress) { 3724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContentValues values = new ContentValues(); 3734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 3744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 3754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov values.put(StructuredPostal.FORMATTED_ADDRESS, formattedAddress); 3764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 3784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov return resultUri; 3794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 381eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov protected Uri insertPostalAddress(long rawContactId, ContentValues values) { 382eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 383eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 384eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 385eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov return resultUri; 386eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov } 387eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov 3885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertPhoto(long rawContactId) { 389ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar ContentValues values = new ContentValues(); 3905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 391ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 3922482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov values.put(Photo.PHOTO, loadTestPhoto()); 393ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 394ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar return resultUri; 395ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar } 396ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 397f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro protected Uri insertPhoto(long rawContactId, int resourceId) { 398f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro ContentValues values = new ContentValues(); 399f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.RAW_CONTACT_ID, rawContactId); 400f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 401f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro values.put(Photo.PHOTO, loadPhotoFromResource(resourceId, PhotoSize.ORIGINAL)); 402f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 403f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro return resultUri; 404f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 405f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 4065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertGroupMembership(long rawContactId, String sourceId) { 4079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 4085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 4099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 4109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(GroupMembership.GROUP_SOURCE_ID, sourceId); 4119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return mResolver.insert(Data.CONTENT_URI, values); 4129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 4139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 4145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected Uri insertGroupMembership(long rawContactId, Long groupId) { 4159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 4165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 4179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 4189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(GroupMembership.GROUP_ROW_ID, groupId); 4199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return mResolver.insert(Data.CONTENT_URI, values); 4209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 4219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 422f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public void removeGroupMemberships(long rawContactId) { 423f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mResolver.delete(Data.CONTENT_URI, 424f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov Data.MIMETYPE + "=? AND " + GroupMembership.RAW_CONTACT_ID + "=?", 425f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov new String[] { GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(rawContactId) }); 426f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 427f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 42882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov protected Uri insertStatusUpdate(int protocol, String customProtocol, String handle, 429aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori int presence, String status, int chatMode) { 4305d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro return insertStatusUpdate(protocol, customProtocol, handle, presence, status, chatMode, 4315d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro false); 432a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 433a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 43482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov protected Uri insertStatusUpdate(int protocol, String customProtocol, String handle, 4355d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro int presence, String status, int chatMode, boolean isUserProfile) { 4365d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro return insertStatusUpdate(protocol, customProtocol, handle, presence, status, 0, chatMode, 4375d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro isUserProfile); 4385d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro } 4395d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 4405d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro protected Uri insertStatusUpdate(int protocol, String customProtocol, String handle, 4415d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro int presence, String status, long timestamp, int chatMode, boolean isUserProfile) { 442bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar ContentValues values = new ContentValues(); 44382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 44482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.CUSTOM_PROTOCOL, customProtocol); 44582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, handle); 4465d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro return insertStatusUpdate(values, presence, status, timestamp, chatMode, isUserProfile); 447f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov } 448f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 449f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov protected Uri insertStatusUpdate( 450f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov long dataId, int presence, String status, long timestamp, int chatMode) { 4515d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro return insertStatusUpdate(dataId, presence, status, timestamp, chatMode, false); 4525d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro } 4535d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 4545d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro protected Uri insertStatusUpdate( 4555d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro long dataId, int presence, String status, long timestamp, int chatMode, 4565d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro boolean isUserProfile) { 457f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov ContentValues values = new ContentValues(); 458f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov values.put(StatusUpdates.DATA_ID, dataId); 4595d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro return insertStatusUpdate(values, presence, status, timestamp, chatMode, isUserProfile); 460f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov } 461f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 462f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov private Uri insertStatusUpdate( 4635d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro ContentValues values, int presence, String status, long timestamp, int chatMode, 4645d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro boolean isUserProfile) { 465a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov if (presence != 0) { 46682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PRESENCE, presence); 467aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori values.put(StatusUpdates.CHAT_CAPABILITY, chatMode); 468a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 469a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov if (status != null) { 47082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS, status); 471a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 472a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov if (timestamp != 0) { 47382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.STATUS_TIMESTAMP, timestamp); 474a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 475bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4765d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro Uri insertUri = isUserProfile 4775d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro ? StatusUpdates.PROFILE_CONTENT_URI 4785d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro : StatusUpdates.CONTENT_URI; 4795d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro Uri resultUri = mResolver.insert(insertUri, values); 480bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar return resultUri; 481bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 482bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 4833b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann protected Uri insertStreamItem(long rawContactId, ContentValues values, Account account) { 4843b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return mResolver.insert( 4853b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann maybeAddAccountQueryParameters( 4863b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 4873b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 4883b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann RawContacts.StreamItems.CONTENT_DIRECTORY), 4893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann account), 4903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 4913b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 4923b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 4933b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann protected Uri insertStreamItemPhoto(long streamItemId, ContentValues values, Account account) { 4943b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann return mResolver.insert( 4953b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann maybeAddAccountQueryParameters( 4963b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Uri.withAppendedPath( 4973b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), 4983b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), 4993b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann account), 5003b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann values); 5013b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 5023b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 5034dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov protected Uri insertImHandle(long rawContactId, int protocol, String customProtocol, 5044dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov String handle) { 505bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar ContentValues values = new ContentValues(); 5065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 507bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar values.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE); 508bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar values.put(Im.PROTOCOL, protocol); 5094dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov values.put(Im.CUSTOM_PROTOCOL, customProtocol); 510bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar values.put(Im.DATA, handle); 5113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values.put(Im.TYPE, Im.TYPE_HOME); 512bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 513bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 514bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar return resultUri; 515bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 516bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 5176d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov protected Uri insertEvent(long rawContactId, int type, String date) { 5186d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov ContentValues values = new ContentValues(); 5196d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 5206d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov values.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE); 5216d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov values.put(Event.TYPE, type); 5226d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov values.put(Event.START_DATE, date); 5236d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 5246d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov return resultUri; 5256d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov } 5266d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov 5276d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov protected Uri insertNote(long rawContactId, String note) { 5286d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov ContentValues values = new ContentValues(); 5296d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 5306d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov values.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE); 5316d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov values.put(Note.NOTE, note); 5326d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 5336d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov return resultUri; 5346d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov } 5356d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov 5360992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki protected Uri insertIdentity(long rawContactId, String identity, String namespace) { 5370992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki ContentValues values = new ContentValues(); 5380992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki values.put(Data.RAW_CONTACT_ID, rawContactId); 5390992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki values.put(Data.MIMETYPE, Identity.CONTENT_ITEM_TYPE); 5400992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki values.put(Identity.NAMESPACE, namespace); 5410992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki values.put(Identity.IDENTITY, identity); 5420992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki 5430992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki Uri resultUri = mResolver.insert(Data.CONTENT_URI, values); 5440992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki return resultUri; 5450992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki } 5460992b9d4969ed0eee6e879db94292b635229e2b7Makoto Onuki 547767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov protected void setContactAccount(long rawContactId, String accountType, String accountName) { 548ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar ContentValues values = new ContentValues(); 549767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov values.put(RawContacts.ACCOUNT_TYPE, accountType); 5506cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov values.put(RawContacts.ACCOUNT_NAME, accountName); 551ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 552ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar mResolver.update(ContentUris.withAppendedId( 5535ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov RawContacts.CONTENT_URI, rawContactId), values, null, null); 554ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar } 555ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 5560c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov protected void setAggregationException(int type, long rawContactId1, long rawContactId2) { 557d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov ContentValues values = new ContentValues(); 5580c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1); 5590c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2); 560d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov values.put(AggregationExceptions.TYPE, type); 5613d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov assertEquals(1, mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null)); 562d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 563d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 564d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected Cursor queryRawContact(long rawContactId) { 5650c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov return mResolver.query(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 5660c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov null, null, null, null); 567d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 568d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 569d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected Cursor queryContact(long contactId) { 570d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov return mResolver.query(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 571d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov null, null, null, null); 572d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 573d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 574af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov protected Cursor queryContact(long contactId, String[] projection) { 575af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov return mResolver.query(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 576af088aeb51685eed17580edc04b495d12232ecf9Dmitri Plotnikov projection, null, null, null); 577bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar } 578bc5c799a52b5bde2f273efd118ebe2228c3d8f15Evan Millar 579f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov protected Uri getContactUriForRawContact(long rawContactId) { 580f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov return ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(rawContactId)); 581f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov } 582f4015ab9ab7c26b766b5331fbf6655b8c54877eaDmitri Plotnikov 583d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected long queryContactId(long rawContactId) { 584d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryRawContact(rawContactId); 585d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToFirst()); 586d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = c.getLong(c.getColumnIndex(RawContacts.CONTACT_ID)); 587d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 588d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov return contactId; 589d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 590d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 591d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected long queryPhotoId(long contactId) { 592d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 593ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar assertTrue(c.moveToFirst()); 594d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long photoId = c.getInt(c.getColumnIndex(Contacts.PHOTO_ID)); 595ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar c.close(); 596ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar return photoId; 597ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar } 598ae6ca1f34cf5458d79ec803411d4308879a91e92Evan Millar 59987614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro protected long queryPhotoFileId(long contactId) { 60087614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro return getStoredLongValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId), 60187614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro Contacts.PHOTO_FILE_ID); 60287614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro } 60387614d7d293b1519dc1f0f403fd59c8bf4d8a347Dave Santoro 604dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana protected boolean queryRawContactIsStarred(long rawContactId) { 605dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Cursor c = queryRawContact(rawContactId); 606dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 607dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertTrue(c.moveToFirst()); 608dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana return c.getLong(c.getColumnIndex(RawContacts.STARRED)) != 0; 609dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 610dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 611dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 612dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 613dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 614d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected String queryDisplayName(long contactId) { 615d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Cursor c = queryContact(contactId); 616d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertTrue(c.moveToFirst()); 617d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String displayName = c.getString(c.getColumnIndex(Contacts.DISPLAY_NAME)); 618d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov c.close(); 619d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov return displayName; 620d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 621d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 6222149ab82f021c204618d0d3644e261fd7a8d8490Dmitri Plotnikov protected String queryLookupKey(long contactId) { 6232d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill Cursor c = queryContact(contactId); 6242d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill assertTrue(c.moveToFirst()); 6252d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill String lookupKey = c.getString(c.getColumnIndex(Contacts.LOOKUP_KEY)); 6262d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill c.close(); 6272d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill return lookupKey; 6282d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 6292d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 630d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected void assertAggregated(long rawContactId1, long rawContactId2) { 631d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 632d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 633d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertTrue(contactId1 == contactId2); 634bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 635bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 636d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected void assertAggregated(long rawContactId1, long rawContactId2, 637d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String expectedDisplayName) { 638d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 639d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 640d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertTrue(contactId1 == contactId2); 641d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 642d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov String displayName = queryDisplayName(contactId1); 643d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov assertEquals(expectedDisplayName, displayName); 644d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 645d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 646d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov protected void assertNotAggregated(long rawContactId1, long rawContactId2) { 647d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId1 = queryContactId(rawContactId1); 648d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId2 = queryContactId(rawContactId2); 649d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov assertTrue(contactId1 != contactId2); 650d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 6514097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 6525ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected void assertStructuredName(long rawContactId, String prefix, String givenName, 6534097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov String middleName, String familyName, String suffix) { 654f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov Uri uri = Uri.withAppendedPath( 655f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 6566cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.Data.CONTENT_DIRECTORY); 6574097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 6584097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov final String[] projection = new String[] { 6594097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov StructuredName.PREFIX, StructuredName.GIVEN_NAME, StructuredName.MIDDLE_NAME, 6604097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov StructuredName.FAMILY_NAME, StructuredName.SUFFIX 6614097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov }; 6624097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 6634097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov Cursor c = mResolver.query(uri, projection, Data.MIMETYPE + "='" 6644097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov + StructuredName.CONTENT_ITEM_TYPE + "'", null, null); 6654097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov 6664097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov assertTrue(c.moveToFirst()); 6674097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov assertEquals(prefix, c.getString(0)); 6684097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov assertEquals(givenName, c.getString(1)); 6694097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov assertEquals(middleName, c.getString(2)); 6704097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov assertEquals(familyName, c.getString(3)); 6714097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov assertEquals(suffix, c.getString(4)); 6724097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov c.close(); 6734097855e2d672b3f8e1c5c8a169efb80203bf53eDmitri Plotnikov } 6749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 6759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected long assertSingleGroup(Long rowId, Account account, String sourceId, String title) { 6769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Cursor c = mResolver.query(Groups.CONTENT_URI, null, null, null, null); 6779261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana try { 6789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertTrue(c.moveToNext()); 6799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long actualRowId = assertGroup(c, rowId, account, sourceId, title); 6809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(c.moveToNext()); 6819261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return actualRowId; 6829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } finally { 6839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana c.close(); 6849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 6859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 6869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 6875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected long assertSingleGroupMembership(Long rowId, Long rawContactId, Long groupRowId, 6889261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana String sourceId) { 6899261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Cursor c = mResolver.query(ContactsContract.Data.CONTENT_URI, null, null, null, null); 6909261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana try { 6919261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertTrue(c.moveToNext()); 6925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long actualRowId = assertGroupMembership(c, rowId, rawContactId, groupRowId, sourceId); 6939261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(c.moveToNext()); 6949261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return actualRowId; 6959261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } finally { 6969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana c.close(); 6979261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 6989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 6999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 7005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov protected long assertGroupMembership(Cursor c, Long rowId, Long rawContactId, Long groupRowId, 7019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana String sourceId) { 7029261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNullOrEquals(c, rowId, Data._ID); 7035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov assertNullOrEquals(c, rawContactId, GroupMembership.RAW_CONTACT_ID); 7049261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNullOrEquals(c, groupRowId, GroupMembership.GROUP_ROW_ID); 7059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNullOrEquals(c, sourceId, GroupMembership.GROUP_SOURCE_ID); 7069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return c.getLong(c.getColumnIndexOrThrow("_id")); 7079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 7099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected long assertGroup(Cursor c, Long rowId, Account account, String sourceId, String title) { 7109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNullOrEquals(c, rowId, Groups._ID); 7119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNullOrEquals(c, account); 7129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNullOrEquals(c, sourceId, Groups.SOURCE_ID); 7139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNullOrEquals(c, title, Groups.TITLE); 7149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return c.getLong(c.getColumnIndexOrThrow("_id")); 7159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7169261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 7179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana private void assertNullOrEquals(Cursor c, Account account) { 7189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (account == NO_ACCOUNT) { 7199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return; 7209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (account == null) { 7229261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertTrue(c.isNull(c.getColumnIndexOrThrow(Groups.ACCOUNT_NAME))); 7239261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertTrue(c.isNull(c.getColumnIndexOrThrow(Groups.ACCOUNT_TYPE))); 7249261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } else { 725df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana assertEquals(account.name, c.getString(c.getColumnIndexOrThrow(Groups.ACCOUNT_NAME))); 726df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana assertEquals(account.type, c.getString(c.getColumnIndexOrThrow(Groups.ACCOUNT_TYPE))); 7279261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7289261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7299261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 7309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana private void assertNullOrEquals(Cursor c, Long value, String columnName) { 7319261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (value != NO_LONG) { 7329261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (value == null) assertTrue(c.isNull(c.getColumnIndexOrThrow(columnName))); 7339261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana else assertEquals((long) value, c.getLong(c.getColumnIndexOrThrow(columnName))); 7349261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7359261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7369261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 7379261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana private void assertNullOrEquals(Cursor c, String value, String columnName) { 7389261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (value != NO_STRING) { 7399261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (value == null) assertTrue(c.isNull(c.getColumnIndexOrThrow(columnName))); 7409261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana else assertEquals(value, c.getString(c.getColumnIndexOrThrow(columnName))); 7419261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7429261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7439261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 7449261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected void assertDataRow(ContentValues actual, String expectedMimetype, 7459261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Object... expectedArguments) { 7469261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(actual.toString(), expectedMimetype, actual.getAsString(Data.MIMETYPE)); 7479261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana for (int i = 0; i < expectedArguments.length; i += 2) { 7489261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana String columnName = (String) expectedArguments[i]; 7499261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Object expectedValue = expectedArguments[i + 1]; 7509261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (expectedValue instanceof Uri) { 7519261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana expectedValue = ContentUris.parseId((Uri) expectedValue); 7529261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (expectedValue == null) { 7549261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertNull(actual.toString(), actual.get(columnName)); 7559261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7569261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (expectedValue instanceof Long) { 757226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana assertEquals("mismatch at " + columnName + " from " + actual.toString(), 758226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana expectedValue, actual.getAsLong(columnName)); 7599261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } else if (expectedValue instanceof Integer) { 760226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana assertEquals("mismatch at " + columnName + " from " + actual.toString(), 761226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana expectedValue, actual.getAsInteger(columnName)); 7629261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } else if (expectedValue instanceof String) { 763226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana assertEquals("mismatch at " + columnName + " from " + actual.toString(), 764226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana expectedValue, actual.getAsString(columnName)); 7659261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } else { 766226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana assertEquals("mismatch at " + columnName + " from " + actual.toString(), 767226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana expectedValue, actual.get(columnName)); 7689261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7699261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7709261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7719261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 772dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana protected void assertNoRowsAndClose(Cursor c) { 773dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana try { 774dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana assertFalse(c.moveToNext()); 775dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } finally { 776dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana c.close(); 777dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 778dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 779dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 7809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected static class IdComparator implements Comparator<ContentValues> { 78159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee @Override 7829261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public int compare(ContentValues o1, ContentValues o2) { 7839261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id1 = o1.getAsLong(ContactsContract.Data._ID); 7849261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long id2 = o2.getAsLong(ContactsContract.Data._ID); 7859261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana if (id1 == id2) return 0; 7869261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return (id1 < id2) ? -1 : 1; 7879261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7889261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7899261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 7909261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected ContentValues[] asSortedContentValuesArray( 7919261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ArrayList<Entity.NamedContentValues> subValues) { 7929261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues[] result = new ContentValues[subValues.size()]; 7939261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana int i = 0; 7949261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana for (Entity.NamedContentValues subValue : subValues) { 7959261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana result[i] = subValue.values; 7969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana i++; 7979261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 7989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Arrays.sort(result, new IdComparator()); 7999261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return result; 8009261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 8019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 8029261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected void assertDirty(Uri uri, boolean state) { 8039261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Cursor c = mResolver.query(uri, new String[]{"dirty"}, null, null, null); 8049261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertTrue(c.moveToNext()); 8059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(state, c.getLong(0) != 0); 8069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(c.moveToNext()); 8073cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov c.close(); 8089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 8099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 8109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected long getVersion(Uri uri) { 8119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Cursor c = mResolver.query(uri, new String[]{"version"}, null, null, null); 8129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertTrue(c.moveToNext()); 8139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long version = c.getLong(0); 8149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertFalse(c.moveToNext()); 8153cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov c.close(); 8169261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana return version; 8179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 8189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 8199261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana protected void clearDirty(Uri uri) { 8209261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 8219261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put("dirty", 0); 8229261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana mResolver.update(uri, values, null, null); 8239261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 82420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 8255870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov protected void storeValue(Uri contentUri, long id, String column, String value) { 826f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov storeValue(ContentUris.withAppendedId(contentUri, id), column, value); 827f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov } 828f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 829f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov protected void storeValue(Uri contentUri, String column, String value) { 830f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov ContentValues values = new ContentValues(); 831f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov values.put(column, value); 832f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 833f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov mResolver.update(contentUri, values, null, null); 834f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov } 835f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 836f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov protected void storeValue(Uri contentUri, long id, String column, long value) { 837f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov storeValue(ContentUris.withAppendedId(contentUri, id), column, value); 838f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov } 839f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov 840f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov protected void storeValue(Uri contentUri, String column, long value) { 8415870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov ContentValues values = new ContentValues(); 8425870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov values.put(column, value); 8435870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov 844f5a847e8c93db02f3334dbc276debd90bdea5658Dmitri Plotnikov mResolver.update(contentUri, values, null, null); 8455870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov } 8465870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov 847f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov protected void assertStoredValue(Uri contentUri, long id, String column, Object expectedValue) { 848f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(contentUri, id), column, expectedValue); 849f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 850f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 8515870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov protected void assertStoredValue(Uri rowUri, String column, Object expectedValue) { 85220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov String value = getStoredValue(rowUri, column); 85301911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov if (expectedValue == null) { 85401911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertNull("Column value " + column, value); 85501911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } else { 85601911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov assertEquals("Column value " + column, String.valueOf(expectedValue), value); 85701911fa9cfa21f198fd767eedde072acbb879f28Dmitri Plotnikov } 85820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 85920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 86089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov protected void assertStoredValue(Uri rowUri, String selection, String[] selectionArgs, 86189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String column, Object expectedValue) { 86289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String value = getStoredValue(rowUri, selection, selectionArgs, column); 86389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov if (expectedValue == null) { 86489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertNull("Column value " + column, value); 86589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } else { 86689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov assertEquals("Column value " + column, String.valueOf(expectedValue), value); 86789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 86889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 86989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 87020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov protected String getStoredValue(Uri rowUri, String column) { 87189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov return getStoredValue(rowUri, null, null, column); 87289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 87389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 87489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov protected String getStoredValue(Uri uri, String selection, String[] selectionArgs, 87589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String column) { 8768e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov String value = null; 87789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Cursor c = mResolver.query(uri, new String[] { column }, selection, selectionArgs, null); 87820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov try { 879d1746e09bc7739f3d1449cececc66d5045ada498Daniel Lehmann assertEquals("Record count for " + uri, 1, c.getCount()); 88092ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 8818e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov if (c.moveToFirst()) { 8826f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro value = getCursorStringValue(c, column); 8838e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov } 88420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } finally { 88520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov c.close(); 88620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 88720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov return value; 88820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 88920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 8906f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro /** 8916f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro * Retrieves the string value in the given column, handling deferred snippeting if the requested 8926f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro * column is the snippet and the cursor specifies it. 8936f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro */ 8946f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro protected String getCursorStringValue(Cursor c, String column) { 8956f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro String value = c.getString(c.getColumnIndex(column)); 8966f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro if (SearchSnippetColumns.SNIPPET.equals(column)) { 8976f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro Bundle extras = c.getExtras(); 8986f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro if (extras.containsKey(ContactsContract.DEFERRED_SNIPPETING)) { 8996f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro String displayName = "No display name"; 9006f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro int displayNameColumnIndex = c.getColumnIndex(Contacts.DISPLAY_NAME); 9016f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro if (displayNameColumnIndex != -1) { 9026f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro displayName = c.getString(displayNameColumnIndex); 9036f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 9046f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro String query = extras.getString(ContactsContract.DEFERRED_SNIPPETING_QUERY); 9056f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro value = ContactsContract.snippetize(value, displayName, query, 9066f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro '[', ']', "...", 5); 9076f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 9086f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 9096f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro return value; 9106f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro } 9116f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro 9122f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa protected Long getStoredLongValue(Uri uri, String selection, String[] selectionArgs, 9132f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa String column) { 9142f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Long value = null; 9152f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Cursor c = mResolver.query(uri, new String[] { column }, selection, selectionArgs, null); 9162f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa try { 9172f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa assertEquals("Record count", 1, c.getCount()); 9182f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 9192f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa if (c.moveToFirst()) { 9202f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa value = c.getLong(c.getColumnIndex(column)); 9212f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 9222f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } finally { 9232f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa c.close(); 9242f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 9252f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa return value; 9262f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 9272f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 928f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro protected Long getStoredLongValue(Uri uri, String column) { 929f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro return getStoredLongValue(uri, null, null, column); 930f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 931f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 93220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov protected void assertStoredValues(Uri rowUri, ContentValues expectedValues) { 933bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov assertStoredValues(rowUri, null, null, expectedValues); 934bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov } 935bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov 936892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov protected void assertStoredValues(Uri rowUri, ContentValues[] expectedValues) { 937892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertStoredValues(rowUri, null, null, expectedValues); 938892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 939892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 940bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov protected void assertStoredValues(Uri rowUri, String selection, String[] selectionArgs, 941bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov ContentValues expectedValues) { 942bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov Cursor c = mResolver.query(rowUri, null, selection, selectionArgs, null); 94320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov try { 94420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals("Record count", 1, c.getCount()); 94520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov c.moveToFirst(); 94620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertCursorValues(c, expectedValues); 94720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } finally { 94820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov c.close(); 94920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 95020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 95120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 952ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov protected void assertStoredValuesWithProjection(Uri rowUri, ContentValues expectedValues) { 95323ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki assertStoredValuesWithProjection(rowUri, new ContentValues[] {expectedValues}); 95423ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki } 95523ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki 95623ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki protected void assertStoredValuesWithProjection(Uri rowUri, ContentValues[] expectedValues) { 95723ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki assertTrue("Need at least one ContentValues for this test", expectedValues.length > 0); 95823ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki Cursor c = mResolver.query(rowUri, buildProjection(expectedValues[0]), null, null, null); 959ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov try { 96023ba865a6d204ba4aa29d2fad9989e9c44351e81Makoto Onuki assertEquals("Record count", expectedValues.length, c.getCount()); 961ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov c.moveToFirst(); 962ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertCursorValues(c, expectedValues); 963ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } finally { 964ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov c.close(); 965ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 966ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 967ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov 968892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov protected void assertStoredValues( 969892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Uri rowUri, String selection, String[] selectionArgs, ContentValues[] expectedValues) { 970892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Cursor c = mResolver.query(rowUri, null, selection, selectionArgs, null); 971892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov try { 972892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertEquals("Record count", expectedValues.length, c.getCount()); 973892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertCursorValues(c, expectedValues); 974892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } finally { 975892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov c.close(); 976892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 977892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 978892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 9797d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa protected void assertStoredValuesOrderly(Uri rowUri, ContentValues[] expectedValues) { 9807d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertStoredValuesOrderly(rowUri, null, null, expectedValues); 9817d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 9827d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 9837d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa protected void assertStoredValuesOrderly(Uri rowUri, String selection, 9847d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa String[] selectionArgs, ContentValues[] expectedValues) { 9857d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa Cursor c = mResolver.query(rowUri, null, selection, selectionArgs, null); 9867d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa try { 9877d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertEquals("Record count", expectedValues.length, c.getCount()); 9887d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertCursorValuesOrderly(c, expectedValues); 9897d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } finally { 9907d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa c.close(); 9917d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 9927d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 9937d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 99420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov /** 99520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov * Constructs a selection (where clause) out of all supplied values, uses it 99620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov * to query the provider and verifies that a single row is returned and it 99720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov * has the same values as requested. 99820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov */ 99920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov protected void assertSelection(Uri uri, ContentValues values, String idColumn, long id) { 1000ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelection(uri, values, idColumn, id, null); 1001ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 1002ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov 1003ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public void assertSelectionWithProjection(Uri uri, ContentValues values, String idColumn, 1004ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov long id) { 1005ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov assertSelection(uri, values, idColumn, id, buildProjection(values)); 1006ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 1007ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov 1008ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov private void assertSelection(Uri uri, ContentValues values, String idColumn, long id, 1009ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov String[] projection) { 101020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 101120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov ArrayList<String> selectionArgs = new ArrayList<String>(values.size()); 1012c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov if (idColumn != null) { 1013c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov sb.append(idColumn).append("=").append(id); 1014c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov } 101520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Set<Map.Entry<String, Object>> entries = values.valueSet(); 101620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov for (Map.Entry<String, Object> entry : entries) { 101720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov String column = entry.getKey(); 101820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Object value = entry.getValue(); 1019c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov if (sb.length() != 0) { 1020c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov sb.append(" AND "); 1021c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov } 1022c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov sb.append(column); 102320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov if (value == null) { 102420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov sb.append(" IS NULL"); 102520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } else { 102620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov sb.append("=?"); 102720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov selectionArgs.add(String.valueOf(value)); 102820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 102920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 103020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 1031ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Cursor c = mResolver.query(uri, projection, sb.toString(), selectionArgs.toArray(new String[0]), 103220a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov null); 103320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov try { 103420a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertEquals("Record count", 1, c.getCount()); 103520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov c.moveToFirst(); 103620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov assertCursorValues(c, values); 103720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } finally { 103820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov c.close(); 103920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 104020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 104120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov 1042c918b0d3ab17a45a392748f43956b927c83eb402Dmitri Plotnikov protected void assertCursorValue(Cursor cursor, String column, Object expectedValue) { 1043c918b0d3ab17a45a392748f43956b927c83eb402Dmitri Plotnikov String actualValue = cursor.getString(cursor.getColumnIndex(column)); 1044c918b0d3ab17a45a392748f43956b927c83eb402Dmitri Plotnikov assertEquals("Column " + column, String.valueOf(expectedValue), 1045c918b0d3ab17a45a392748f43956b927c83eb402Dmitri Plotnikov String.valueOf(actualValue)); 1046c918b0d3ab17a45a392748f43956b927c83eb402Dmitri Plotnikov } 1047c918b0d3ab17a45a392748f43956b927c83eb402Dmitri Plotnikov 104820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov protected void assertCursorValues(Cursor cursor, ContentValues expectedValues) { 1049892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov StringBuilder message = new StringBuilder(); 1050892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean result = equalsWithExpectedValues(cursor, expectedValues, message); 1051892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertTrue(message.toString(), result); 1052892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1053892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 1054892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov protected void assertCursorValues(Cursor cursor, ContentValues[] expectedValues) { 1055892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov StringBuilder message = new StringBuilder(); 1056ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki 1057ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // In case if expectedValues contains multiple identical values, remember which cursor 1058ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki // rows are "consumed" to prevent multiple ContentValues from hitting the same row. 1059ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki final BitSet used = new BitSet(cursor.getCount()); 1060ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki 1061892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov for (ContentValues v : expectedValues) { 1062892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean found = false; 1063892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov cursor.moveToPosition(-1); 1064892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov while (cursor.moveToNext()) { 1065ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki final int pos = cursor.getPosition(); 1066ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki if (used.get(pos)) continue; 1067892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov found = equalsWithExpectedValues(cursor, v, message); 1068892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (found) { 1069ac61fb8b20b05bb7a9af7c6d68bf8cdbdf675102Makoto Onuki used.set(pos); 1070892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov break; 1071892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1072892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1073892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov assertTrue("Expected values can not be found " + v + message.toString(), found); 1074892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1075892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1076892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 10777d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa protected void assertCursorValuesOrderly(Cursor cursor, ContentValues[] expectedValues) { 10787d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa StringBuilder message = new StringBuilder(); 10797d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa cursor.moveToPosition(-1); 10807d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa for (ContentValues v : expectedValues) { 10817d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertTrue(cursor.moveToNext()); 10827d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa assertTrue("ContentValues didn't match " + v + message.toString(), 10837d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa equalsWithExpectedValues(cursor, v, message)); 10847d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 10857d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa } 10867d82ae92714f2132e3a0971d844ae8cdf10d76e7Daisuke Miyakawa 1087892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov private boolean equalsWithExpectedValues(Cursor cursor, ContentValues expectedValues, 1088892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov StringBuilder msgBuffer) { 1089fba89ea92f519d77ec1d762724ed11bf4ebb7d20Makoto Onuki for (String column : expectedValues.keySet()) { 109020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov int index = cursor.getColumnIndex(column); 1091892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (index == -1) { 1092892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov msgBuffer.append("No such column: ").append(column); 1093892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return false; 1094892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 109520a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov Object expectedValue = expectedValues.get(column); 109620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov String value; 109720a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov if (expectedValue instanceof byte[]) { 109820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov expectedValue = Hex.encodeHex((byte[])expectedValue, false); 109920a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov value = Hex.encodeHex(cursor.getBlob(index), false); 110020a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } else { 110120a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov expectedValue = expectedValues.getAsString(column); 11026f983fd835f0cdd5ac7931ccd49d44e9ea4c87c0Dave Santoro value = getCursorStringValue(cursor, column); 110320a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 1104892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (expectedValue != null && !expectedValue.equals(value) || value != null 1105892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov && !value.equals(expectedValue)) { 1106892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov msgBuffer 1107892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov .append("Column value ") 1108892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov .append(column) 1109892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov .append(" expected <") 1110892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov .append(expectedValue) 1111892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov .append(">, but was <") 1112892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov .append(value) 1113892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov .append('>'); 1114892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return false; 1115892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 111620a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 1117892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return true; 111820a94c86ede7380c8dd8df2f6a72b3c00ac1bed8Dmitri Plotnikov } 111933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1120ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov private String[] buildProjection(ContentValues values) { 1121ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov String[] projection = new String[values.size()]; 1122ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov Iterator<Entry<String, Object>> iter = values.valueSet().iterator(); 1123ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov for (int i = 0; i < projection.length; i++) { 1124ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov projection[i] = iter.next().getKey(); 1125ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 1126ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov return projection; 1127ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 1128ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov 112933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov protected int getCount(Uri uri, String selection, String[] selectionArgs) { 113033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov Cursor c = mResolver.query(uri, null, selection, selectionArgs, null); 113133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov try { 113233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov return c.getCount(); 113333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } finally { 113433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov c.close(); 113533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 113633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov } 1137a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 1138b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov public static void dump(ContentResolver resolver, boolean aggregatedOnly) { 1139b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov String[] projection = new String[] { 1140b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Contacts._ID, 1141b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Contacts.DISPLAY_NAME 1142b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov }; 1143b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov String selection = null; 1144b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov if (aggregatedOnly) { 1145b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov selection = Contacts._ID 1146b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov + " IN (SELECT contact_id" + 1147b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov " FROM raw_contacts GROUP BY contact_id HAVING count(*) > 1)"; 1148b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1149b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov 1150b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Cursor c = resolver.query(Contacts.CONTENT_URI, projection, selection, null, 1151b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Contacts.DISPLAY_NAME); 1152b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov while(c.moveToNext()) { 1153b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov long contactId = c.getLong(0); 1154b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Log.i("Contact ", String.format("%5d %s", contactId, c.getString(1))); 1155b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov dumpRawContacts(resolver, contactId); 1156b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Log.i(" ", "."); 1157b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1158b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov c.close(); 1159b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1160b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov 1161b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov private static void dumpRawContacts(ContentResolver resolver, long contactId) { 1162b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov String[] projection = new String[] { 1163b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov RawContacts._ID, 1164b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov }; 1165b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Cursor c = resolver.query(RawContacts.CONTENT_URI, projection, RawContacts.CONTACT_ID + "=" 1166b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov + contactId, null, null); 1167b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov while(c.moveToNext()) { 1168b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov long rawContactId = c.getLong(0); 1169b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Log.i("RawContact", String.format(" %-5d", rawContactId)); 1170b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov dumpData(resolver, rawContactId); 1171b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1172b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov c.close(); 1173b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1174b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov 1175b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov private static void dumpData(ContentResolver resolver, long rawContactId) { 1176b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov String[] projection = new String[] { 1177b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Data.MIMETYPE, 1178b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Data.DATA1, 1179b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Data.DATA2, 1180b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Data.DATA3, 1181b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov }; 1182b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Cursor c = resolver.query(Data.CONTENT_URI, projection, Data.RAW_CONTACT_ID + "=" 1183b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov + rawContactId, null, Data.MIMETYPE); 1184b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov while(c.moveToNext()) { 1185b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov String mimetype = c.getString(0); 1186b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov if (Photo.CONTENT_ITEM_TYPE.equals(mimetype)) { 1187b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Log.i("Photo ", ""); 1188b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } else { 1189b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov mimetype = mimetype.substring(mimetype.indexOf('/') + 1); 1190b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov Log.i("Data ", String.format(" %-10s %s,%s,%s", mimetype, 1191b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov c.getString(1), c.getString(2), c.getString(3))); 1192b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1193b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1194b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov c.close(); 1195b58058243bcd4405ad5ba5c3a465c46a35182ff7Dmitri Plotnikov } 1196285b771bc955305fa6d49ca23f808cecc8a13d5eDmitri Plotnikov 119781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov protected void assertNetworkNotified(boolean expected) { 11989a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov assertEquals(expected, (getContactsProvider()).isNetworkNotified()); 119981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov } 12005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 120109ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov protected void assertProjection(Uri uri, String[] expectedProjection) { 120209ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov Cursor cursor = mResolver.query(uri, null, "0", null, null); 120309ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov String[] actualProjection = cursor.getColumnNames(); 120409ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov MoreAsserts.assertEquals("Incorrect projection for URI: " + uri, 120509ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov Sets.newHashSet(expectedProjection), Sets.newHashSet(actualProjection)); 120609ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov cursor.close(); 120709ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov } 120809ae48b82b17e24016b14a1ab64706222ab1071fDmitri Plotnikov 12095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 12105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * A contact in the database, and the attributes used to create it. Construct using 12115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * {@link GoldenContactBuilder#build()}. 12125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 12135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public final class GoldenContact { 12145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final long rawContactId; 12165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final long contactId; 12185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String givenName; 12205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String familyName; 12225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12235b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String nickname; 12245b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12255b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final byte[] photo; 12265b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12275b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String company; 12285b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12295b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String title; 12305b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12315b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String phone; 12325b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12335b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String email; 12345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12355b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private GoldenContact(GoldenContactBuilder builder, long rawContactId, long contactId) { 12365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill this.rawContactId = rawContactId; 12385b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill this.contactId = contactId; 12395b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill givenName = builder.givenName; 12405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill familyName = builder.familyName; 12415b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill nickname = builder.nickname; 12425b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill photo = builder.photo; 12435b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill company = builder.company; 12445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill title = builder.title; 12455b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill phone = builder.phone; 12465b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill email = builder.email; 12475b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 12485b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12495b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public void delete() { 12505b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 12515b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill mResolver.delete(rawContactUri, null, null); 12525b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 12535b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12545b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 12555b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the index of the contact in table "raw_contacts" 12565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 12575b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public long getRawContactId() { 12585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return rawContactId; 12595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 12605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 12625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the index of the contact in table "contacts" 12635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 12645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public long getContactId() { 12655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return contactId; 12665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 12675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 12692d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Returns the lookup key for the contact. 12702d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill */ 12712d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill public String getLookupKey() { 12722d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill return queryLookupKey(contactId); 12732d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 12742d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 12752d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill /** 12765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the contact's given name. 12775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 12785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public String getGivenName() { 12795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return givenName; 12805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 12815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 12835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the contact's family name. 12845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 12855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public String getFamilyName() { 12865b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return familyName; 12875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 12885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12895b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 12905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the contact's nickname. 12915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 12925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public String getNickname() { 12935b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return nickname; 12945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 12955b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 12965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 12975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Return's the contact's photo 12985b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 12995b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public byte[] getPhoto() { 13005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return photo; 13015b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13025b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Return's the company at which the contact works. 13055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public String getCompany() { 13075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return company; 13085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the contact's job title. 13125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public String getTitle() { 13145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return title; 13155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the contact's phone number 13195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public String getPhone() { 13215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return phone; 13225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13235b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13245b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13255b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Returns the contact's email address 13265b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13275b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public String getEmail() { 13285b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return email; 13295b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13305b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13315b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13325b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13335b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Builds {@link GoldenContact} objects. Unspecified boolean objects default to false. 13345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Unspecified String objects default to null. 13355b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public final class GoldenContactBuilder { 13375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13385b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String givenName; 13395b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String familyName; 13415b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13425b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String nickname; 13435b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private byte[] photo; 13455b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13465b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String company; 13475b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13485b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String title; 13495b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13505b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String phone; 13515b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13525b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String email; 13535b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13545b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13555b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's given and family names. 13565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * 13575b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * TODO(dplotnikov): inline, or should we require them to set both names if they set either? 13585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder name(String givenName, String familyName) { 13605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return givenName(givenName).familyName(familyName); 13615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's given name. 13655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder givenName(String value) { 13675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill givenName = value; 13685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 13695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's family name. 13735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder familyName(String value) { 13755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill familyName = value; 13765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 13775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's nickname. 13815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder nickname(String value) { 13835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill nickname = value; 13845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 13855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13865b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's photo. 13895b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder photo(byte[] value) { 13915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill photo = value; 13925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 13935b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 13945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 13955b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 13965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The company at which the contact works. 13975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 13985b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder company(String value) { 13995b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill company = value; 14005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 14015b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14025b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 14045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's job title. 14055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 14065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder title(String value) { 14075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill title = value; 14085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 14095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 14125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's phone number. 14135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 14145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder phone(String value) { 14155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill phone = value; 14165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 14175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 14205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The contact's email address; also sets their IM status to {@link StatusUpdates#OFFLINE} 14215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * with a presence of "Coding for Android". 14225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 14235b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContactBuilder email(String value) { 14245b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill email = value; 14255b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 14265b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14275b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14285b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 14295b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Builds the {@link GoldenContact} specified by this builder. 14305b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 14315b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public GoldenContact build() { 14325b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14335b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill final long groupId = createGroup(mAccount, "gsid1", "title1"); 14345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14355b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill long rawContactId = createRawContact(); 14365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill insertGroupMembership(rawContactId, groupId); 14375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14385b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (givenName != null || familyName != null) { 14395b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill insertStructuredName(rawContactId, givenName, familyName); 14405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14415b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (nickname != null) { 14425b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill insertNickname(rawContactId, nickname); 14435b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (photo != null) { 14455b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill insertPhoto(rawContactId); 14465b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14475b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (company != null || title != null) { 14485b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill insertOrganization(rawContactId); 14495b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14505b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (email != null) { 14515b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill insertEmail(rawContactId); 14525b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14535b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (phone != null) { 14545b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill insertPhone(rawContactId); 14555b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14575b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill long contactId = queryContactId(rawContactId); 14585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return new GoldenContact(this, rawContactId, contactId); 14605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private void insertPhoto(long rawContactId) { 14635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill ContentValues values = new ContentValues(); 14645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.RAW_CONTACT_ID, rawContactId); 14655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 14665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Photo.PHOTO, photo); 14675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill mResolver.insert(Data.CONTENT_URI, values); 14685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private void insertOrganization(long rawContactId) { 14715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill ContentValues values = new ContentValues(); 14735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.RAW_CONTACT_ID, rawContactId); 14745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 14755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Organization.TYPE, Organization.TYPE_WORK); 14765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (company != null) { 14775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Organization.COMPANY, company); 14785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (title != null) { 14805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Organization.TITLE, title); 14815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill mResolver.insert(Data.CONTENT_URI, values); 14835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 14845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private void insertEmail(long rawContactId) { 14865b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill ContentValues values = new ContentValues(); 14885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.RAW_CONTACT_ID, rawContactId); 14895b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 14905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Email.TYPE, Email.TYPE_WORK); 14915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Email.DATA, "foo@acme.com"); 14925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill mResolver.insert(Data.CONTENT_URI, values); 14935b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill int protocol = Im.PROTOCOL_GOOGLE_TALK; 14955b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 14965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.clear(); 14975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(StatusUpdates.PROTOCOL, protocol); 14985b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(StatusUpdates.IM_HANDLE, email); 14995b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(StatusUpdates.IM_ACCOUNT, "foo"); 15005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(StatusUpdates.PRESENCE_STATUS, StatusUpdates.OFFLINE); 1501aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori values.put(StatusUpdates.CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA); 15025b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(StatusUpdates.PRESENCE_CUSTOM_STATUS, "Coding for Android"); 15035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill mResolver.insert(StatusUpdates.CONTENT_URI, values); 15045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 15055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 15065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private void insertPhone(long rawContactId) { 15075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill ContentValues values = new ContentValues(); 15085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.RAW_CONTACT_ID, rawContactId); 15095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 15105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Data.IS_PRIMARY, 1); 15115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Phone.TYPE, Phone.TYPE_HOME); 15125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill values.put(Phone.NUMBER, phone); 15135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill mResolver.insert(Data.CONTENT_URI, values); 15145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 15155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 1516d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov} 1517