DirectoryTest.java revision d3d812af96f7d77e13dc60652626b39f25907147
1d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov/* 2d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * 4d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * you may not use this file except in compliance with the License. 6d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * You may obtain a copy of the License at 7d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * 8d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * 10d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * See the License for the specific language governing permissions and 14d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * limitations under the License. 15d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */ 16d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 17d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovpackage com.android.providers.contacts; 18d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 19d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport com.google.android.collect.Lists; 20d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 21d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.accounts.Account; 22d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentUris; 23d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentValues; 24d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.Context; 25d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.pm.ProviderInfo; 26d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.database.Cursor; 27d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.database.MatrixCursor; 28d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.net.Uri; 29d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract; 30d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 31d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Directory; 32d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Settings; 33d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.test.mock.MockContentProvider; 34d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 35d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 36d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 37d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov/** 38d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}, directory functionality. 39d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * 40d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Run the test like this: 41d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * <code> 42d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * adb shell am instrument -e class com.android.providers.contacts.DirectoryTest -w \ 43d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 44d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * </code> 45d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */ 46d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov@LargeTest 47d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovpublic class DirectoryTest extends BaseContactsProvider2Test { 48d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 49d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testDefaultDirectory() { 50d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 51d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri defaultDirectoryUri = 52d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.DEFAULT); 53d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 54d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, "contactsTestPackage"); 55d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY); 56d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.TYPE_RESOURCE_ID, R.string.default_directory); 57d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE); 58d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.putNull(Directory.ACCOUNT_NAME); 59d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.putNull(Directory.ACCOUNT_TYPE); 60d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.putNull(Directory.DISPLAY_NAME); 61d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 62d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertStoredValues(defaultDirectoryUri, values); 63d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 64d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 65d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testInvisibleLocalDirectory() { 66d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 67d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri defaultDirectoryUri = 68d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.LOCAL_INVISIBLE); 69d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 70d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, "contactsTestPackage"); 71d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY); 72d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.TYPE_RESOURCE_ID, R.string.local_invisible_directory); 73d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE); 74d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.putNull(Directory.ACCOUNT_NAME); 75d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.putNull(Directory.ACCOUNT_TYPE); 76d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.putNull(Directory.DISPLAY_NAME); 77d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 78d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertStoredValues(defaultDirectoryUri, values); 79d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 80d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 81d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testDirectoryInsert() { 82d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 83d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 84d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 85d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.TYPE_RESOURCE_ID, 42); 86d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DISPLAY_NAME, "Universe"); 87d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_ANY_ACCOUNT); 88d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_NAME, "accountName"); 89d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_TYPE, "accountType"); 90d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 91d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 92d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 93d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 94d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertStoredValues(uri, values); 95d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 96d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 97d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testDirectoryInsertWrongPackage() { 98d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 99d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, "wrong.package"); 100d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 101d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 102d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 103d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 104d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov try { 105d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mResolver.insert(Directory.CONTENT_URI, values); 106d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov fail("Was expecting an IllegalArgumentException"); 107d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } catch (IllegalArgumentException ex) { 108d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov // Expected 109d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 110d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 111d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 112d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testDirectoryUpdate() { 113d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 114d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 115d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 116d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.TYPE_RESOURCE_ID, 42); 117d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DISPLAY_NAME, "Universe"); 118d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_ANY_ACCOUNT); 119d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_NAME, "accountName"); 120d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_TYPE, "accountType"); 121d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 122d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 123d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 124d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 125d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 126d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "different_authority"); 127d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.TYPE_RESOURCE_ID, 43); 128d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DISPLAY_NAME, "Beyond Universe"); 129d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE); 130d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_NAME, "newName"); 131d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_TYPE, "newType"); 132d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 133d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov int count = mResolver.update(uri, values, null, null); 134d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(1, count); 135d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertStoredValues(uri, values); 136d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 137d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 138d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testDirectoryUpdateWrongPackage() { 139d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 140d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 141d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 142d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 143d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 144d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 145d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 146d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "different_authority"); 147d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 148d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.packageName = "different.package"; 149d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 150d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 151d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov try { 152d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mResolver.update(uri, values, null, null); 153d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov fail("Was expecting an IllegalArgumentException"); 154d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } catch (IllegalArgumentException ex) { 155d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov // Expected 156d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 157d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 158d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 159d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testDirectorDelete() { 160d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 161d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 162d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 163d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 164d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 165d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 166d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 167d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 168d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mResolver.delete(uri, null, null); 169d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 170d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 171d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 172d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 173d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testDirectorDeleteWrongPackage() { 174d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 175d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 176d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 177d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 178d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 179d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 180d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 181d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "different_authority"); 182d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 183d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.packageName = "different.package"; 184d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 185d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov try { 186d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mResolver.delete(uri, null, null); 187d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov fail("Was expecting an IllegalArgumentException"); 188d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } catch (IllegalArgumentException ex) { 189d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov // Expected 190d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 191d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 192d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 193d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testAccountRemoval() { 194d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated( 195d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov new Account[]{new Account("accountName", "accountType")}); 196d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 197d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 198d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 199d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 200d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_NAME, "accountName"); 201d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.ACCOUNT_TYPE, "accountType"); 202d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 203d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 204d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 205d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 206d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ((ContactsProvider2)getProvider()).onAccountsUpdated( 207d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov new Account[]{new Account("name", "type")}); 208d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 209d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov // Removing the account should trigger the removal of the directory 210d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 211d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 212d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 213d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testPackageRemoval() { 214d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 215d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 216d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "my_authority"); 217d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 218d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 219d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 220d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 221d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ((ContactsProvider2)getProvider()).onPackageUninstalled(ContactsActor.PACKAGE_GREY); 222d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 223d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov // Uninstalling the package should trigger the removal of the directory 224d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(0, getCount(uri, null, null)); 225d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 226d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 227d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testForwardingToLocalContacts() { 228d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov long contactId = queryContactId(createRawContactWithName()); 229d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 230d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter( 231d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)).build(); 232d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 233d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Cursor cursor = mResolver.query(contentUri, 234d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null); 235d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertNotNull(cursor); 236d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(1, cursor.getCount()); 237d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.moveToFirst(); 238d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(contactId, cursor.getLong(0)); 239d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals("John Doe", cursor.getString(1)); 240d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.close(); 241d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 242d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 243d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testForwardingToLocalInvisibleContacts() { 244d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov long visibleContactId = queryContactId(createRawContactWithName("Bob", "Parr")); 245d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 246d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, visibleContactId), 247d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Contacts.IN_VISIBLE_GROUP, "1"); 248d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 249d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov long hiddenContactId = queryContactId(createRawContactWithName("Helen", "Parr", 250d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov new Account("accountName", "accountType"))); 251d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 252d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, hiddenContactId), 253d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Contacts.IN_VISIBLE_GROUP, "0"); 254d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 255d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter( 256d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.LOCAL_INVISIBLE)) 257d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov .build(); 258d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 259d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Cursor cursor = mResolver.query(contentUri, 260d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null); 261d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertNotNull(cursor); 262d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(1, cursor.getCount()); 263d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.moveToFirst(); 264d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(hiddenContactId, cursor.getLong(0)); 265d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals("Helen Parr", cursor.getString(1)); 266d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.close(); 267d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 268d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri filterUri = Contacts.CONTENT_FILTER_URI.buildUpon().appendEncodedPath("parr") 269d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, 270d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov String.valueOf(Directory.LOCAL_INVISIBLE)).build(); 271d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 272d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor = mResolver.query(filterUri, 273d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null); 274d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertNotNull(cursor); 275d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(1, cursor.getCount()); 276d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.moveToFirst(); 277d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(hiddenContactId, cursor.getLong(0)); 278d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals("Helen Parr", cursor.getString(1)); 279d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.close(); 280d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 281d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 282d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void testForwardingToDirectoryProvider() throws Exception { 283d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov addProvider(TestProvider.class, "test_authority"); 284d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 285d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContentValues values = new ContentValues(); 286d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY); 287d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov values.put(Directory.DIRECTORY_AUTHORITY, "test_authority"); 288d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 289d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov mActor.ensureCallingPackage(); 290d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri uri = mResolver.insert(Directory.CONTENT_URI, values); 291d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov long directoryId = ContentUris.parseId(uri); 292d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 293d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter( 294d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(directoryId)).build(); 295d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 296d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov // The request should be forwarded to TestProvider, which will simply 297d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov // package arguments and return them to us for verification 298d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Cursor cursor = mResolver.query(contentUri, 299d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov new String[]{"f1", "f2"}, "query", new String[]{"s1", "s2"}, "so"); 300d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertNotNull(cursor); 301d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals(1, cursor.getCount()); 302d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.moveToFirst(); 303d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals("[f1, f2]", cursor.getString(cursor.getColumnIndex("projection"))); 304d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals("query", cursor.getString(cursor.getColumnIndex("selection"))); 305d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals("[s1, s2]", cursor.getString(cursor.getColumnIndex("selectionArgs"))); 306d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov assertEquals("so", cursor.getString(cursor.getColumnIndex("sortOrder"))); 307d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.close(); 308d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 309d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 310d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public static class TestProvider extends MockContentProvider { 311d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 312d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov @Override 313d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public void attachInfo(Context context, ProviderInfo info) { 314d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 315d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 316d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov @Override 317d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 318d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov String sortOrder) { 319d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov MatrixCursor cursor = new MatrixCursor(new String[] { 320d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov "projection", "selection", "selectionArgs", "sortOrder" 321d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov }); 322d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov cursor.addRow(new Object[] { 323d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Lists.newArrayList(projection).toString(), 324d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov selection, 325d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Lists.newArrayList(selectionArgs).toString(), 326d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov sortOrder 327d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov }); 328d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov return cursor; 329d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 330d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 331d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov} 332d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 333