SettingsProviderTest.java revision 43765b77a0286403fd9f7f5305219f0d9a10c953
1683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav/*
2683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Copyright (C) 2015 The Android Open Source Project
3683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *
4683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Licensed under the Apache License, Version 2.0 (the "License");
5683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * you may not use this file except in compliance with the License.
6683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * You may obtain a copy of the License at
7683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *
8683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *      http://www.apache.org/licenses/LICENSE-2.0
9683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *
10683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Unless required by applicable law or agreed to in writing, software
11683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * distributed under the License is distributed on an "AS IS" BASIS,
12683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * See the License for the specific language governing permissions and
14683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * limitations under the License.
15683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav */
16683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
17683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavpackage com.android.providers.settings;
18683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
19683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.content.ContentResolver;
20683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.content.ContentValues;
21683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.database.ContentObserver;
22683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.database.Cursor;
23683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.net.Uri;
24683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.os.Handler;
25683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.os.Looper;
26683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.os.SystemClock;
27683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.os.UserHandle;
28683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.provider.Settings;
29683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.util.Log;
30683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
31683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport java.util.concurrent.atomic.AtomicBoolean;
32683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
33683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav/**
34683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Tests for the SettingContentProvider.
35683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *
36683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Before you run this test you must add a secondary user.
37683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav */
38683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavpublic class SettingsProviderTest extends BaseSettingsProviderTest {
39683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private static final String LOG_TAG = "SettingsProviderTest";
40683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
41683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private static final long WAIT_FOR_SETTING_URI_CHANGE_TIMEOUT_MILLIS = 2000; // 2 sec
42683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
43683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private static final String[] NAME_VALUE_COLUMNS = new String[]{
44683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            Settings.NameValueTable.NAME, Settings.NameValueTable.VALUE
45683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    };
46683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
47683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private final Object mLock = new Object();
48683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
4943765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen    public void testSetAndGetGlobalViaFrontEndApiForSystemUser() throws Exception {
5043765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen        performSetAndGetSettingTestViaFrontEndApi(SETTING_TYPE_GLOBAL, UserHandle.USER_SYSTEM);
51683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
52683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
5343765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen    public void testSetAndGetGlobalViaFrontEndApiForNonSystemUser() throws Exception {
5443765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen        if (mSecondaryUserId == UserHandle.USER_SYSTEM) {
55683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            Log.w(LOG_TAG, "No secondary user. Skipping "
5643765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                    + "testSetAndGetGlobalViaFrontEndApiForNonSystemUser");
57683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            return;
58683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
59683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        performSetAndGetSettingTestViaFrontEndApi(SETTING_TYPE_GLOBAL, mSecondaryUserId);
60683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
61683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
6243765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen    public void testSetAndGetSecureViaFrontEndApiForSystemUser() throws Exception {
6343765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen        performSetAndGetSettingTestViaFrontEndApi(SETTING_TYPE_SECURE, UserHandle.USER_SYSTEM);
64683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
65683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
6643765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen    public void testSetAndGetSecureViaFrontEndApiForNonSystemUser() throws Exception {
6743765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen        if (mSecondaryUserId == UserHandle.USER_SYSTEM) {
68683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            Log.w(LOG_TAG, "No secondary user. Skipping "
6943765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                    + "testSetAndGetSecureViaFrontEndApiForNonSystemUser");
70683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            return;
71683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
72683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        performSetAndGetSettingTestViaFrontEndApi(SETTING_TYPE_SECURE, mSecondaryUserId);
73683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
74683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
7543765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen    public void testSetAndGetSystemViaFrontEndApiForSystemUser() throws Exception {
7643765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen        performSetAndGetSettingTestViaFrontEndApi(SETTING_TYPE_SYSTEM, UserHandle.USER_SYSTEM);
77683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
78683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
7943765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen    public void testSetAndGetSystemViaFrontEndApiForNonSystemUser() throws Exception {
8043765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen        if (mSecondaryUserId == UserHandle.USER_SYSTEM) {
81683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            Log.w(LOG_TAG, "No secondary user. Skipping "
8243765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                    + "testSetAndGetSystemViaFrontEndApiForNonSystemUser");
83683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            return;
84683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
85683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        performSetAndGetSettingTestViaFrontEndApi(SETTING_TYPE_SYSTEM, mSecondaryUserId);
86683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
87683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
88683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSetAndGetGlobalViaProviderApi() throws Exception {
89683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        performSetAndGetSettingTestViaProviderApi(SETTING_TYPE_GLOBAL);
90683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
91683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
92683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSetAndGetSecureViaProviderApi() throws Exception {
93683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        performSetAndGetSettingTestViaProviderApi(SETTING_TYPE_SECURE);
94683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
95683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
96683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSetAndGetSystemViaProviderApi() throws Exception {
97683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        performSetAndGetSettingTestViaProviderApi(SETTING_TYPE_SYSTEM);
98683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
99683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
100683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSelectAllGlobalViaProviderApi() throws Exception {
101683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        setSettingViaProviderApiAndAssertSuccessfulChange(SETTING_TYPE_GLOBAL,
102683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                FAKE_SETTING_NAME, FAKE_SETTING_VALUE, false);
103683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
104683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            queryAllSettingsViaProviderApiSettingAndAssertSettingPresent(SETTING_TYPE_GLOBAL,
105683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    FAKE_SETTING_NAME);
106683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
107683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME);
108683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
109683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
110683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
111683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSelectAllSecureViaProviderApi() throws Exception {
112683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        setSettingViaProviderApiAndAssertSuccessfulChange(SETTING_TYPE_SECURE,
113683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                FAKE_SETTING_NAME, FAKE_SETTING_VALUE, false);
114683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
115683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            queryAllSettingsViaProviderApiSettingAndAssertSettingPresent(SETTING_TYPE_SECURE,
116683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    FAKE_SETTING_NAME);
117683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
118683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(SETTING_TYPE_SECURE, FAKE_SETTING_NAME);
119683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
120683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
121683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
122683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSelectAllSystemViaProviderApi() throws Exception {
123683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        setSettingViaProviderApiAndAssertSuccessfulChange(SETTING_TYPE_SYSTEM,
124683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                FAKE_SETTING_NAME, FAKE_SETTING_VALUE, true);
125683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
126683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            queryAllSettingsViaProviderApiSettingAndAssertSettingPresent(SETTING_TYPE_SYSTEM,
127683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    FAKE_SETTING_NAME);
128683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
129683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(SETTING_TYPE_SYSTEM, FAKE_SETTING_NAME);
130683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
131683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
132683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
133683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testQueryUpdateDeleteGlobalViaProviderApi() throws Exception {
134683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        doTestQueryUpdateDeleteGlobalViaProviderApiForType(SETTING_TYPE_GLOBAL);
135683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
136683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
137683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testQueryUpdateDeleteSecureViaProviderApi() throws Exception {
138683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        doTestQueryUpdateDeleteGlobalViaProviderApiForType(SETTING_TYPE_SECURE);
139683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
140683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
141683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testQueryUpdateDeleteSystemViaProviderApi() throws Exception {
142683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        doTestQueryUpdateDeleteGlobalViaProviderApiForType(SETTING_TYPE_SYSTEM);
143683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
144683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
145683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testBulkInsertGlobalViaProviderApi() throws Exception {
146683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        toTestBulkInsertViaProviderApiForType(SETTING_TYPE_GLOBAL);
147683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
148683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
149683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testBulkInsertSystemViaProviderApi() throws Exception {
150683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        toTestBulkInsertViaProviderApiForType(SETTING_TYPE_SYSTEM);
151683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
152683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
153683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testBulkInsertSecureViaProviderApi() throws Exception {
154683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        toTestBulkInsertViaProviderApiForType(SETTING_TYPE_SECURE);
155683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
156683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
157683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testAppCannotRunsSystemOutOfMemoryWritingSystemSettings() throws Exception {
158683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        int insertedCount = 0;
159683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
160683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            for (; insertedCount < 1200; insertedCount++) {
161683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                Log.w(LOG_TAG, "Adding app specific setting: " + insertedCount);
162683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                insertStringViaProviderApi(SETTING_TYPE_SYSTEM,
163683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                        String.valueOf(insertedCount), FAKE_SETTING_VALUE, false);
164683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
165683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            fail("Adding app specific settings must be bound.");
166683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } catch (Exception e) {
167683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            for (; insertedCount >= 0; insertedCount--) {
168683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                Log.w(LOG_TAG, "Removing app specific setting: " + insertedCount);
169683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                deleteStringViaProviderApi(SETTING_TYPE_SYSTEM,
170683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                        String.valueOf(insertedCount));
171683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
172683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
173683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
174683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
175683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testQueryStringInBracketsGlobalViaProviderApiForType() throws Exception {
176683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        doTestQueryStringInBracketsViaProviderApiForType(SETTING_TYPE_GLOBAL);
177683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
178683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
179683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testQueryStringInBracketsSecureViaProviderApiForType() throws Exception {
180683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        doTestQueryStringInBracketsViaProviderApiForType(SETTING_TYPE_SECURE);
181683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
182683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
183683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testQueryStringInBracketsSystemViaProviderApiForType() throws Exception {
184683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        doTestQueryStringInBracketsViaProviderApiForType(SETTING_TYPE_SYSTEM);
185683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
186683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
1872849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav    public void testQueryStringWithAppendedNameToUriViaProviderApi() throws Exception {
1882849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav        // Make sure we have a clean slate.
1892849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav        deleteStringViaProviderApi(SETTING_TYPE_SYSTEM, FAKE_SETTING_NAME);
1902849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav
1912849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav        try {
1922849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            // Insert the setting.
1932849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            final Uri uri = insertStringViaProviderApi(SETTING_TYPE_SYSTEM, FAKE_SETTING_NAME,
1942849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav                    FAKE_SETTING_VALUE, false);
1952849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            Uri expectUri = Uri.withAppendedPath(getBaseUriForType(SETTING_TYPE_SYSTEM),
1962849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav                    FAKE_SETTING_NAME);
1972849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            assertEquals("Did not get expected Uri.", expectUri, uri);
1982849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav
1992849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            // Make sure the first setting is there.
2002849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            String firstValue = queryStringViaProviderApi(SETTING_TYPE_SYSTEM, FAKE_SETTING_NAME,
2012849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav                    false, true);
2022849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            assertEquals("Setting must be present", FAKE_SETTING_VALUE, firstValue);
2032849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav        } finally {
2042849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            // Clean up.
2052849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            deleteStringViaProviderApi(SETTING_TYPE_SYSTEM, FAKE_SETTING_NAME);
2062849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav        }
2072849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav    }
2082849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav
209683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void doTestQueryStringInBracketsViaProviderApiForType(int type) {
210683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Make sure we have a clean slate.
211683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        deleteStringViaProviderApi(type, FAKE_SETTING_NAME);
212683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
213683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
214683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Insert the setting.
215683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            final Uri uri = insertStringViaProviderApi(type, FAKE_SETTING_NAME,
216683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    FAKE_SETTING_VALUE, false);
217683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            Uri expectUri = Uri.withAppendedPath(getBaseUriForType(type), FAKE_SETTING_NAME);
218683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            assertEquals("Did not get expected Uri.", expectUri, uri);
219683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
220683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Make sure the first setting is there.
2212849465ee19febd5135cb6ab8cb548a3c8ac6a24Svetoslav            String firstValue = queryStringViaProviderApi(type, FAKE_SETTING_NAME, true, false);
222683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            assertEquals("Setting must be present", FAKE_SETTING_VALUE, firstValue);
223683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
224683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Clean up.
225683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(type, FAKE_SETTING_NAME);
226683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
227683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
228683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
229683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void toTestBulkInsertViaProviderApiForType(int type) {
230683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Make sure we have a clean slate.
231683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        deleteStringViaProviderApi(type, FAKE_SETTING_NAME);
232683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        deleteStringViaProviderApi(type, FAKE_SETTING_NAME_1);
2333a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki        deleteStringViaProviderApi(type, FAKE_SETTING_NAME_2);
234683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
235683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
236683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            Uri uri = getBaseUriForType(type);
2373a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            ContentValues[] allValues = new ContentValues[3];
238683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
239683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Insert the first setting.
240683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            ContentValues firstValues = new ContentValues();
241683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            firstValues.put(Settings.NameValueTable.NAME, FAKE_SETTING_NAME);
242683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            firstValues.put(Settings.NameValueTable.VALUE, FAKE_SETTING_VALUE);
243683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            allValues[0] = firstValues;
244683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
2453a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            // Insert the second setting.
246683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            ContentValues secondValues = new ContentValues();
247683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            secondValues.put(Settings.NameValueTable.NAME, FAKE_SETTING_NAME_1);
248683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            secondValues.put(Settings.NameValueTable.VALUE, FAKE_SETTING_VALUE_1);
249683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            allValues[1] = secondValues;
250683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
2513a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            // Insert the third setting. (null)
2523a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            ContentValues thirdValues = new ContentValues();
2533a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            thirdValues.put(Settings.NameValueTable.NAME, FAKE_SETTING_NAME_2);
2543a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            thirdValues.put(Settings.NameValueTable.VALUE, FAKE_SETTING_VALUE_2);
2553a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            allValues[2] = thirdValues;
2563a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki
257683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Verify insertion count.
258683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            final int insertCount = getContext().getContentResolver().bulkInsert(uri, allValues);
2593a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            assertSame("Couldn't insert both values", 3, insertCount);
260683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
261683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Make sure the first setting is there.
262683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            String firstValue = queryStringViaProviderApi(type, FAKE_SETTING_NAME);
263683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            assertEquals("First setting must be present", FAKE_SETTING_VALUE, firstValue);
264683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
265683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Make sure the second setting is there.
266683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            String secondValue = queryStringViaProviderApi(type, FAKE_SETTING_NAME_1);
267683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            assertEquals("Second setting must be present", FAKE_SETTING_VALUE_1, secondValue);
2683a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki
2693a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            // Make sure the third setting is there.
2703a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            String thirdValue = queryStringViaProviderApi(type, FAKE_SETTING_NAME_2);
2713a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            assertEquals("Third setting must be present", FAKE_SETTING_VALUE_2, thirdValue);
272683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
273683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Clean up.
274683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(type, FAKE_SETTING_NAME);
275683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(type, FAKE_SETTING_NAME_1);
2763a2c3578ba5bf8642c994fa357a96eaa4a38cdc9Makoto Onuki            deleteStringViaProviderApi(type, FAKE_SETTING_NAME_2);
277683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
278683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
279683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
280683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void doTestQueryUpdateDeleteGlobalViaProviderApiForType(int type) throws Exception {
281683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Make sure it is not there.
282683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        deleteStringViaProviderApi(type, FAKE_SETTING_NAME);
283683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
284683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Now selection should return nothing.
285683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        String value = queryStringViaProviderApi(type, FAKE_SETTING_NAME);
286683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertNull("Setting should not be present.", value);
287683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
288683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Insert the setting.
289683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        Uri uri = insertStringViaProviderApi(type,
290683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                FAKE_SETTING_NAME, FAKE_SETTING_VALUE, false);
291683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        Uri expectUri = Uri.withAppendedPath(getBaseUriForType(type), FAKE_SETTING_NAME);
292683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertEquals("Did not get expected Uri.", expectUri, uri);
293683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
294683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Now selection should return the setting.
295683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        value = queryStringViaProviderApi(type, FAKE_SETTING_NAME);
296683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertEquals("Setting should be present.", FAKE_SETTING_VALUE, value);
297683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
298683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Update the setting.
299683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final int changeCount = updateStringViaProviderApiSetting(type,
300683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                FAKE_SETTING_NAME, FAKE_SETTING_VALUE_1);
301683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertEquals("Did not get expected change count.", 1, changeCount);
302683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
303683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Now selection should return the new setting.
304683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        value = queryStringViaProviderApi(type, FAKE_SETTING_NAME);
305683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertEquals("Setting should be present.", FAKE_SETTING_VALUE_1, value);
306683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
307683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Delete the setting.
308683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final int deletedCount = deleteStringViaProviderApi(type,
309683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                FAKE_SETTING_NAME);
310683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertEquals("Did not get expected deleted count", 1, deletedCount);
311683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
312683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Now selection should return nothing.
313683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        value = queryStringViaProviderApi(type, FAKE_SETTING_NAME);
314683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertNull("Setting should not be present.", value);
315683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
316683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
317683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void performSetAndGetSettingTestViaFrontEndApi(int type, int userId)
318683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            throws Exception {
319683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
320683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Change the setting and assert a successful change.
321683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            setSettingViaFrontEndApiAndAssertSuccessfulChange(type, FAKE_SETTING_NAME,
322683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    FAKE_SETTING_VALUE, userId);
323683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
324683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Remove the setting.
325683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            setStringViaFrontEndApiSetting(type, FAKE_SETTING_NAME, null, userId);
326683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
327683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
328683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
329683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void performSetAndGetSettingTestViaProviderApi(int type)
330683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            throws Exception {
331683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
332683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Change the setting and assert a successful change.
333683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            setSettingViaProviderApiAndAssertSuccessfulChange(type, FAKE_SETTING_NAME,
334683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    FAKE_SETTING_VALUE, true);
335683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
336683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Remove the setting.
337683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            setSettingViaProviderApiAndAssertSuccessfulChange(type, FAKE_SETTING_NAME, null,
338683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    true);
339683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
340683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
341683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
342683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void setSettingViaFrontEndApiAndAssertSuccessfulChange(final int type,
343683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            final String name, final String value, final int userId) throws Exception {
344683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        setSettingAndAssertSuccessfulChange(new Runnable() {
345683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            @Override
346683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            public void run() {
347683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                setStringViaFrontEndApiSetting(type, name, value, userId);
348683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
349683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }, type, name, value, userId);
350683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
351683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
352683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void setSettingViaProviderApiAndAssertSuccessfulChange(final int type,
353683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            final String name, final String value, final boolean withTableRowUri)
354683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            throws Exception {
355683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        setSettingAndAssertSuccessfulChange(new Runnable() {
356683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            @Override
357683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            public void run() {
358683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                insertStringViaProviderApi(type, name, value, withTableRowUri);
359683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
36043765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen        }, type, name, value, UserHandle.USER_SYSTEM);
361683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
362683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
363683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void setSettingAndAssertSuccessfulChange(Runnable setCommand, final int type,
364683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            final String name, final String value, final int userId) throws Exception {
365683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        ContentResolver contentResolver = getContext().getContentResolver();
366683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
367683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final Uri settingUri = getBaseUriForType(type);
368683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
369683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final AtomicBoolean success = new AtomicBoolean();
370683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
371683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        ContentObserver contentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
372683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            public void onChange(boolean selfChange, Uri changeUri, int changeId) {
373683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                Log.i(LOG_TAG, "onChange(" + selfChange + ", " + changeUri + ", " + changeId + ")");
374683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                assertEquals("Wrong change Uri", changeUri, settingUri);
375683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                assertEquals("Wrong user id", userId, changeId);
376683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                String changeValue = getStringViaFrontEndApiSetting(type, name, userId);
377683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                assertEquals("Wrong setting value", value, changeValue);
378683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
379683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                success.set(true);
380683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
381683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                synchronized (mLock) {
382683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    mLock.notifyAll();
383683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                }
384683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
385683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        };
386683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
387683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        contentResolver.registerContentObserver(settingUri, false, contentObserver, userId);
388683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
389683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
390683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            setCommand.run();
391683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
392683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            final long startTimeMillis = SystemClock.uptimeMillis();
393683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            synchronized (mLock) {
394683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                if (success.get()) {
395683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    return;
396683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                }
397683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
398683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                if (elapsedTimeMillis > WAIT_FOR_SETTING_URI_CHANGE_TIMEOUT_MILLIS) {
399683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    fail("Could not change setting for "
400683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                            + WAIT_FOR_SETTING_URI_CHANGE_TIMEOUT_MILLIS + " ms");
401683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                }
402683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                final long remainingTimeMillis = WAIT_FOR_SETTING_URI_CHANGE_TIMEOUT_MILLIS
403683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                        - elapsedTimeMillis;
404683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                try {
405683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    mLock.wait(remainingTimeMillis);
406683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                } catch (InterruptedException ie) {
407683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    /* ignore */
408683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                }
409683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
410683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
411683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            contentResolver.unregisterContentObserver(contentObserver);
412683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
413683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
414683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
415683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private void queryAllSettingsViaProviderApiSettingAndAssertSettingPresent(int type,
416683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            String name) {
417683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        Uri uri = getBaseUriForType(type);
418683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
419683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        Cursor cursor = getContext().getContentResolver().query(uri, NAME_VALUE_COLUMNS,
420683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                null, null, null);
421683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
422683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        if (cursor == null || !cursor.moveToFirst()) {
423683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            fail("Nothing selected");
424683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
425683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
426683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
427683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            final int nameColumnIdx = cursor.getColumnIndex(Settings.NameValueTable.NAME);
428683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
429683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            while (cursor.moveToNext()) {
430683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                String currentName = cursor.getString(nameColumnIdx);
431683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                if (name.equals(currentName)) {
432683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                    return;
433683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                }
434683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
435683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
436683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            fail("Not found setting: " + name);
437683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
438683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            cursor.close();
439683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
440683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
441683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav}
442