| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.provider; |
| |
| import android.content.ContentResolver; |
| import android.content.ContentUris; |
| import android.content.ContentValues; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.pm.PackageManager; |
| import android.content.pm.ResolveInfo; |
| import android.content.pm.UserInfo; |
| import android.database.Cursor; |
| import android.net.Uri; |
| import android.os.UserHandle; |
| import android.os.UserManager; |
| import android.provider.Settings; |
| import android.test.AndroidTestCase; |
| import android.test.suitebuilder.annotation.MediumTest; |
| import android.test.suitebuilder.annotation.SmallTest; |
| |
| import java.util.List; |
| |
| /** Unit test for SettingsProvider. */ |
| public class SettingsProviderTest extends AndroidTestCase { |
| @MediumTest |
| public void testNameValueCache() { |
| ContentResolver r = getContext().getContentResolver(); |
| Settings.Secure.putString(r, "test_service", "Value"); |
| assertEquals("Value", Settings.Secure.getString(r, "test_service")); |
| |
| // Make sure the value can be overwritten. |
| Settings.Secure.putString(r, "test_service", "New"); |
| assertEquals("New", Settings.Secure.getString(r, "test_service")); |
| |
| // Also that delete works. |
| assertEquals(1, r.delete(Settings.Secure.getUriFor("test_service"), null, null)); |
| assertEquals(null, Settings.Secure.getString(r, "test_service")); |
| |
| // Try all the same things in the System table |
| Settings.System.putString(r, "test_setting", "Value"); |
| assertEquals("Value", Settings.System.getString(r, "test_setting")); |
| |
| Settings.System.putString(r, "test_setting", "New"); |
| assertEquals("New", Settings.System.getString(r, "test_setting")); |
| |
| assertEquals(1, r.delete(Settings.System.getUriFor("test_setting"), null, null)); |
| assertEquals(null, Settings.System.getString(r, "test_setting")); |
| } |
| |
| @MediumTest |
| public void testRowNameContentUri() { |
| ContentResolver r = getContext().getContentResolver(); |
| |
| assertEquals("content://settings/system/test_setting", |
| Settings.System.getUriFor("test_setting").toString()); |
| assertEquals("content://settings/secure/test_service", |
| Settings.Secure.getUriFor("test_service").toString()); |
| |
| // These tables use the row name (not ID) as their content URI. |
| Uri tables[] = { Settings.System.CONTENT_URI, Settings.Secure.CONTENT_URI }; |
| for (Uri table : tables) { |
| ContentValues v = new ContentValues(); |
| v.put(Settings.System.NAME, "test_key"); |
| v.put(Settings.System.VALUE, "Test"); |
| Uri uri = r.insert(table, v); |
| assertEquals(table.toString() + "/test_key", uri.toString()); |
| |
| // Query with a specific URI and no WHERE clause succeeds. |
| Cursor c = r.query(uri, null, null, null, null); |
| try { |
| assertTrue(c.moveToNext()); |
| assertEquals("test_key", c.getString(c.getColumnIndex(Settings.System.NAME))); |
| assertEquals("Test", c.getString(c.getColumnIndex(Settings.System.VALUE))); |
| assertFalse(c.moveToNext()); |
| } finally { |
| c.close(); |
| } |
| |
| // Query with a specific URI and a WHERE clause fails. |
| try { |
| r.query(uri, null, "1", null, null); |
| fail("UnsupportedOperationException expected"); |
| } catch (UnsupportedOperationException e) { |
| if (!e.toString().contains("WHERE clause")) throw e; |
| } |
| |
| // Query with a tablewide URI and a WHERE clause succeeds. |
| c = r.query(table, null, "name='test_key'", null, null); |
| try { |
| assertTrue(c.moveToNext()); |
| assertEquals("test_key", c.getString(c.getColumnIndex(Settings.System.NAME))); |
| assertEquals("Test", c.getString(c.getColumnIndex(Settings.System.VALUE))); |
| assertFalse(c.moveToNext()); |
| } finally { |
| c.close(); |
| } |
| |
| v = new ContentValues(); |
| v.put(Settings.System.VALUE, "Toast"); |
| assertEquals(1, r.update(uri, v, null, null)); |
| |
| c = r.query(uri, null, null, null, null); |
| try { |
| assertTrue(c.moveToNext()); |
| assertEquals("test_key", c.getString(c.getColumnIndex(Settings.System.NAME))); |
| assertEquals("Toast", c.getString(c.getColumnIndex(Settings.System.VALUE))); |
| assertFalse(c.moveToNext()); |
| } finally { |
| c.close(); |
| } |
| |
| assertEquals(1, r.delete(uri, null, null)); |
| } |
| |
| assertEquals(null, Settings.System.getString(r, "test_key")); |
| assertEquals(null, Settings.Secure.getString(r, "test_key")); |
| } |
| |
| @MediumTest |
| public void testSettingsChangeForOtherUser() { |
| UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE); |
| ContentResolver r = getContext().getContentResolver(); |
| |
| // Make sure there's an owner |
| assertTrue(findUser(um, UserHandle.USER_OWNER)); |
| |
| // create a new user to use for testing |
| UserInfo otherUser = um.createUser("TestUser1", UserInfo.FLAG_GUEST); |
| assertTrue(otherUser != null); |
| try { |
| assertNotSame("Current calling user id should not be the new guest user", |
| otherUser.id, UserHandle.getCallingUserId()); |
| |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "gps"); |
| Settings.Secure.putStringForUser(r, |
| Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "network", otherUser.id); |
| |
| assertEquals("gps", |
| Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); |
| assertEquals("network", Settings.Secure.getStringForUser( |
| r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, otherUser.id)); |
| |
| assertNotSame("Current calling user id should not be the new guest user", |
| otherUser.id, UserHandle.getCallingUserId()); |
| Settings.Secure.setLocationProviderEnabledForUser(r, "network", false, otherUser.id); |
| assertEquals("", Settings.Secure.getStringForUser( |
| r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, otherUser.id)); |
| |
| } finally { |
| // Tidy up |
| um.removeUser(otherUser.id); |
| } |
| } |
| |
| @MediumTest |
| public void testRowNumberContentUri() { |
| ContentResolver r = getContext().getContentResolver(); |
| |
| // The bookmarks table (and everything else) uses standard row number content URIs. |
| Uri uri = Settings.Bookmarks.add(r, new Intent("TEST"), |
| "Test Title", "Test Folder", '*', 123); |
| |
| assertTrue(ContentUris.parseId(uri) > 0); |
| |
| assertEquals("TEST", Settings.Bookmarks.getIntentForShortcut(r, '*').getAction()); |
| |
| ContentValues v = new ContentValues(); |
| v.put(Settings.Bookmarks.INTENT, "#Intent;action=TOAST;end"); |
| assertEquals(1, r.update(uri, v, null, null)); |
| |
| assertEquals("TOAST", Settings.Bookmarks.getIntentForShortcut(r, '*').getAction()); |
| |
| assertEquals(1, r.delete(uri, null, null)); |
| |
| assertEquals(null, Settings.Bookmarks.getIntentForShortcut(r, '*')); |
| } |
| |
| @MediumTest |
| public void testParseProviderList() { |
| ContentResolver r = getContext().getContentResolver(); |
| |
| // Make sure we get out what we put in. |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, |
| "test1,test2,test3"); |
| assertEquals(Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED), |
| "test1,test2,test3"); |
| |
| // Test adding a value |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, |
| ""); |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test1"); |
| assertEquals("test1", |
| Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); |
| |
| // Test adding a second value |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test2"); |
| assertEquals("test1,test2", |
| Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); |
| |
| // Test adding a third value |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+test3"); |
| assertEquals("test1,test2,test3", |
| Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); |
| |
| // Test deleting the first value in a 3 item list |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test1"); |
| assertEquals("test2,test3", |
| Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); |
| |
| // Test deleting the middle value in a 3 item list |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, |
| "test1,test2,test3"); |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test2"); |
| assertEquals("test1,test3", |
| Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); |
| |
| // Test deleting the last value in a 3 item list |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, |
| "test1,test2,test3"); |
| Settings.Secure.putString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test3"); |
| assertEquals("test1,test2", |
| Settings.Secure.getString(r, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); |
| } |
| |
| private boolean findUser(UserManager um, int userHandle) { |
| for (UserInfo user : um.getUsers()) { |
| if (user.id == userHandle) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| @MediumTest |
| public void testPerUserSettings() { |
| UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE); |
| ContentResolver r = getContext().getContentResolver(); |
| |
| // Make sure there's an owner |
| assertTrue(findUser(um, UserHandle.USER_OWNER)); |
| |
| // create a new user to use for testing |
| UserInfo user = um.createUser("TestUser1", UserInfo.FLAG_GUEST); |
| assertTrue(user != null); |
| |
| try { |
| // Write some settings for that user as well as the current user |
| final String TEST_KEY = "test_setting"; |
| final int SELF_VALUE = 40; |
| final int OTHER_VALUE = 27; |
| |
| Settings.System.putInt(r, TEST_KEY, SELF_VALUE); |
| Settings.System.putIntForUser(r, TEST_KEY, OTHER_VALUE, user.id); |
| |
| // Verify that they read back as intended |
| int myValue = Settings.System.getInt(r, TEST_KEY, 0); |
| int otherValue = Settings.System.getIntForUser(r, TEST_KEY, 0, user.id); |
| assertTrue("Running as user " + UserHandle.myUserId() |
| + " and reading/writing as user " + user.id |
| + ", expected to read " + SELF_VALUE + " but got " + myValue, |
| myValue == SELF_VALUE); |
| assertTrue("Running as user " + UserHandle.myUserId() |
| + " and reading/writing as user " + user.id |
| + ", expected to read " + OTHER_VALUE + " but got " + otherValue, |
| otherValue == OTHER_VALUE); |
| } finally { |
| // Tidy up |
| um.removeUser(user.id); |
| } |
| } |
| |
| @SmallTest |
| public void testSettings() { |
| assertCanBeHandled(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_ADD_ACCOUNT)); |
| assertCanBeHandled(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_APN_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) |
| .setData(Uri.parse("package:" + getContext().getPackageName()))); |
| assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_APPLICATION_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_DATE_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_DEVICE_INFO_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_DISPLAY_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_LOCALE_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_MEMORY_CARD_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_PRIVACY_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_QUICK_LAUNCH_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_SEARCH_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_SECURITY_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_SOUND_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_SYNC_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_SYSTEM_UPDATE_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_USER_DICTIONARY_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_WIFI_IP_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_WIFI_SETTINGS)); |
| assertCanBeHandled(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); |
| } |
| |
| private void assertCanBeHandled(final Intent intent) { |
| PackageManager packageManager = mContext.getPackageManager(); |
| List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, 0); |
| assertNotNull(resolveInfoList); |
| // one or more activity can handle this intent. |
| assertTrue(resolveInfoList.size() > 0); |
| } |
| } |