1fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott/* 2fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * Copyright (C) 2016 The Android Open Source Project 3fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * 4fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * Licensed under the Apache License, Version 2.0 (the "License"); 5fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * you may not use this file except in compliance with the License. 6fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * You may obtain a copy of the License at 7fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * 8fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * http://www.apache.org/licenses/LICENSE-2.0 9fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * 10fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * Unless required by applicable law or agreed to in writing, software 11fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * distributed under the License is distributed on an "AS IS" BASIS, 12fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * See the License for the specific language governing permissions and 14fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott * limitations under the License. 15fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott */ 1669c182afb0e6d82a341a28b4317aa703af768906Gary Maipackage com.android.contacts.model; 17fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 18bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerottimport android.content.ContentProvider; 19fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.content.ContentResolver; 20fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.database.Cursor; 21fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.database.MatrixCursor; 22fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.net.Uri; 23fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.os.CancellationSignal; 24fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.provider.ContactsContract; 25fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.provider.ContactsContract.RawContacts; 26fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.support.annotation.Nullable; 27fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.test.AndroidTestCase; 28fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.test.mock.MockContentResolver; 29fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.test.suitebuilder.annotation.SmallTest; 30fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 310a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.test.mocks.MockContentProvider; 32fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport com.android.contacts.tests.FakeDeviceAccountTypeFactory; 330a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.util.DeviceLocalAccountTypeFactory; 34fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 35fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport java.util.Arrays; 36fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport java.util.Collections; 37bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerottimport java.util.HashMap; 38a5c0b8d8a7265ccf45a5e961a80e4eb62a5822d1Marcus Hagerottimport java.util.HashSet; 39fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport java.util.List; 40bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerottimport java.util.Map; 41fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 42fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott@SmallTest 437a756abd07f2074374cea81aa4e9a0ac8d52b6f1Marcus Hagerottpublic class Cp2DeviceLocalAccountLocatorTests extends AndroidTestCase { 44fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 45fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott // Basic smoke test that just checks that it doesn't throw when loading from CP2. We don't 46fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott // care what CP2 actually contains for this. 47fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public void testShouldNotCrash() { 487a756abd07f2074374cea81aa4e9a0ac8d52b6f1Marcus Hagerott final DeviceLocalAccountLocator sut = new Cp2DeviceLocalAccountLocator( 49fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott getContext().getContentResolver(), 50fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott new DeviceLocalAccountTypeFactory.Default(getContext()), 51c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott Collections.<String>emptySet()); 52fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott sut.getDeviceLocalAccounts(); 53fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott // We didn't throw so it passed 54fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 55fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 56bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott public void test_getDeviceLocalAccounts_returnsEmptyListWhenQueryReturnsNull() { 57bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott final DeviceLocalAccountLocator sut = createWithQueryResult(null); 58bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott assertTrue(sut.getDeviceLocalAccounts().isEmpty()); 59bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott } 60bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott 61fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public void test_getDeviceLocalAccounts_returnsEmptyListWhenNoRawContactsHaveDeviceType() { 62fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott final DeviceLocalAccountLocator sut = createWithQueryResult(queryResult( 63fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott "user", "com.example", 64fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott "user", "com.example", 65fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott "user", "com.example")); 66fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott assertTrue(sut.getDeviceLocalAccounts().isEmpty()); 67fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 68fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 69fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public void test_getDeviceLocalAccounts_returnsListWithItemForNullAccount() { 70fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott final DeviceLocalAccountLocator sut = createWithQueryResult(queryResult( 71fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott "user", "com.example", 72fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott null, null, 73fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott "user", "com.example", 74fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott null, null)); 75fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 76fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott assertEquals(1, sut.getDeviceLocalAccounts().size()); 77fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 78fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 79fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public void test_getDeviceLocalAccounts_containsItemForEachDeviceAccount() { 80fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott final DeviceLocalAccountTypeFactory stubFactory = new FakeDeviceAccountTypeFactory() 81fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott .withDeviceTypes(null, "vnd.sec.contact.phone") 82fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott .withSimTypes("vnd.sec.contact.sim"); 83c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott final DeviceLocalAccountLocator sut = createLocator(queryResult( 84c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "user", "com.example", 85c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "user", "com.example", 86c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "phone_account", "vnd.sec.contact.phone", 87c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott null, null, 88c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "phone_account", "vnd.sec.contact.phone", 89c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "user", "com.example", 90c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott null, null, 91c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "sim_account", "vnd.sec.contact.sim", 92c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "sim_account_2", "vnd.sec.contact.sim" 93c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott ), stubFactory); 94c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott 95fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 96fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott assertEquals(4, sut.getDeviceLocalAccounts().size()); 97fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 98fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 99c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott public void test_getDeviceLocalAccounts_doesNotContainItemsForKnownAccountTypes() { 1007a756abd07f2074374cea81aa4e9a0ac8d52b6f1Marcus Hagerott final Cp2DeviceLocalAccountLocator sut = new Cp2DeviceLocalAccountLocator( 101fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott getContext().getContentResolver(), new FakeDeviceAccountTypeFactory(), 102a5c0b8d8a7265ccf45a5e961a80e4eb62a5822d1Marcus Hagerott new HashSet<>(Arrays.asList("com.example", "com.example.1"))); 103fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 104c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott assertTrue("Selection should filter known accounts", 105c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott sut.getSelection().contains("NOT IN (?,?)")); 106fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 107fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott final List<String> args = Arrays.asList(sut.getSelectionArgs()); 108fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott assertEquals(2, args.size()); 109fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott assertTrue("Selection args is missing an expected value", args.contains("com.example")); 110fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott assertTrue("Selection args is missing an expected value", args.contains("com.example.1")); 111fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 112fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 113bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott public void test_getDeviceLocalAccounts_includesAccountsFromSettings() { 114bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott final DeviceLocalAccountTypeFactory stubFactory = new FakeDeviceAccountTypeFactory() 115bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott .withDeviceTypes(null, "vnd.sec.contact.phone") 116bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott .withSimTypes("vnd.sec.contact.sim"); 117c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott final DeviceLocalAccountLocator sut = createLocator(new FakeContactsProvider() 118c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott .withQueryResult(ContactsContract.Settings.CONTENT_URI, queryResult( 119c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "phone_account", "vnd.sec.contact.phone", 120c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "sim_account", "vnd.sec.contact.sim" 121c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott )), stubFactory); 122bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott 123bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott assertEquals(2, sut.getDeviceLocalAccounts().size()); 124bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott } 125bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott 126bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott public void test_getDeviceLocalAccounts_includesAccountsFromGroups() { 127bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott final DeviceLocalAccountTypeFactory stubFactory = new FakeDeviceAccountTypeFactory() 128bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott .withDeviceTypes(null, "vnd.sec.contact.phone") 129bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott .withSimTypes("vnd.sec.contact.sim"); 130c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott final DeviceLocalAccountLocator sut = createLocator(new FakeContactsProvider() 131c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott .withQueryResult(ContactsContract.Groups.CONTENT_URI, queryResult( 132c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "phone_account", "vnd.sec.contact.phone", 133c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott "sim_account", "vnd.sec.contact.sim" 134c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott )), stubFactory); 135bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott 136bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott assertEquals(2, sut.getDeviceLocalAccounts().size()); 137bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott } 138bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott 139fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott private DeviceLocalAccountLocator createWithQueryResult( 140fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott Cursor cursor) { 141c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott return createLocator(cursor, new DeviceLocalAccountTypeFactory.Default(mContext)); 142c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott } 143c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott 144c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott private DeviceLocalAccountLocator createLocator(ContentProvider contactsProvider, 145c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott DeviceLocalAccountTypeFactory localAccountTypeFactory) { 146c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott final DeviceLocalAccountLocator locator = new Cp2DeviceLocalAccountLocator( 147c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott createContentResolverWithProvider(contactsProvider), 148c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott localAccountTypeFactory, Collections.<String>emptySet()); 149c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott return locator; 150c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott } 151c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott 152c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott private DeviceLocalAccountLocator createLocator(Cursor cursor, 153c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott DeviceLocalAccountTypeFactory localAccountTypeFactory) { 1547a756abd07f2074374cea81aa4e9a0ac8d52b6f1Marcus Hagerott final DeviceLocalAccountLocator locator = new Cp2DeviceLocalAccountLocator( 155fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott createStubResolverWithContentQueryResult(cursor), 156c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott localAccountTypeFactory, 157c2093f312f71e730e1cc4daaa305782fda394215Marcus Hagerott Collections.<String>emptySet()); 158fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott return locator; 159fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 160fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 161bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott private ContentResolver createContentResolverWithProvider(ContentProvider contactsProvider) { 162bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott final MockContentResolver resolver = new MockContentResolver(); 163bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott resolver.addProvider(ContactsContract.AUTHORITY, contactsProvider); 164bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott return resolver; 165bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott } 166bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott 167fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott private ContentResolver createStubResolverWithContentQueryResult(Cursor cursor) { 168fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott final MockContentResolver resolver = new MockContentResolver(); 169bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott resolver.addProvider(ContactsContract.AUTHORITY, new FakeContactsProvider() 170bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott .withDefaultQueryResult(cursor)); 171fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott return resolver; 172fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 173fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 174fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott private Cursor queryResult(String... nameTypePairs) { 175fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott final MatrixCursor cursor = new MatrixCursor(new String[] 176fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott { RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE, RawContacts.DATA_SET }); 177fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott for (int i = 0; i < nameTypePairs.length; i+=2) { 178fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott cursor.newRow().add(nameTypePairs[i]).add(nameTypePairs[i+1]) 179fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott .add(null); 180fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 181fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott return cursor; 182fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 183fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 184fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott private static class FakeContactsProvider extends MockContentProvider { 185fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public Cursor mNextQueryResult; 186bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott public Map<Uri, Cursor> mNextResultMapping = new HashMap<>(); 187fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 188fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public FakeContactsProvider() {} 189fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 190bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott public FakeContactsProvider withDefaultQueryResult(Cursor cursor) { 191bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott mNextQueryResult = cursor; 192bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott return this; 193fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 194fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 195bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott public FakeContactsProvider withQueryResult(Uri uri, Cursor cursor) { 196bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott mNextResultMapping.put(uri, cursor); 197bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott return this; 198fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 199fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 200fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott @Override 201fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 202fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott String sortOrder) { 203fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott return query(uri, projection, selection, selectionArgs, sortOrder, null); 204fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 205fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott 206fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott @Nullable 207fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott @Override 208fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 209fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott String sortOrder, CancellationSignal cancellationSignal) { 210bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott final Cursor result = mNextResultMapping.get(uri); 211bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott if (result == null) { 212bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott return mNextQueryResult; 213bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott } else { 214bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott return result; 215bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott } 216bc5108495a35010073b925f9c7e04ee35fe1120eMarcus Hagerott } 217fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott } 218fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott} 219