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