Loading core/java/android/provider/Settings.java +71 −23 Original line number Diff line number Diff line Loading @@ -911,17 +911,20 @@ public final class Settings { } private static final HashSet<String> MOVED_TO_GLOBAL; private static final HashSet<String> MOVED_TO_SECURE_THEN_GLOBAL; static { MOVED_TO_GLOBAL = new HashSet<String>(); MOVED_TO_SECURE_THEN_GLOBAL = new HashSet<String>(); // these were originally in system but migrated to secure in the past, // so are duplicated in the Secure.* namespace MOVED_TO_GLOBAL.add(Global.ADB_ENABLED); MOVED_TO_GLOBAL.add(Global.BLUETOOTH_ON); MOVED_TO_GLOBAL.add(Global.DATA_ROAMING); MOVED_TO_GLOBAL.add(Global.DEVICE_PROVISIONED); MOVED_TO_GLOBAL.add(Global.INSTALL_NON_MARKET_APPS); MOVED_TO_GLOBAL.add(Global.USB_MASS_STORAGE_ENABLED); MOVED_TO_GLOBAL.add(Global.HTTP_PROXY); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.ADB_ENABLED); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.BLUETOOTH_ON); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DATA_ROAMING); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DEVICE_PROVISIONED); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.INSTALL_NON_MARKET_APPS); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.USB_MASS_STORAGE_ENABLED); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.HTTP_PROXY); // these are moving directly from system to global MOVED_TO_GLOBAL.add(Settings.Global.AIRPLANE_MODE_ON); Loading Loading @@ -954,6 +957,17 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.ALWAYS_FINISH_ACTIVITIES); } /** @hide */ public static void getMovedKeys(HashSet<String> outKeySet) { outKeySet.addAll(MOVED_TO_GLOBAL); outKeySet.addAll(MOVED_TO_SECURE_THEN_GLOBAL); } /** @hide */ public static void getNonLegacyMovedKeys(HashSet<String> outKeySet) { outKeySet.addAll(MOVED_TO_GLOBAL); } /** * Look up a name in the database. * @param resolver to access the database with Loading @@ -972,7 +986,7 @@ public final class Settings { + " to android.provider.Settings.Secure, returning read-only value."); return Secure.getStringForUser(resolver, name, userHandle); } if (MOVED_TO_GLOBAL.contains(name)) { if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Global, returning read-only value."); return Global.getStringForUser(resolver, name, userHandle); Loading @@ -999,7 +1013,7 @@ public final class Settings { + " to android.provider.Settings.Secure, value is unchanged."); return false; } if (MOVED_TO_GLOBAL.contains(name)) { if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Global, value is unchanged."); return false; Loading @@ -1019,7 +1033,7 @@ public final class Settings { + " to android.provider.Settings.Secure, returning Secure URI."); return Secure.getUriFor(Secure.CONTENT_URI, name); } if (MOVED_TO_GLOBAL.contains(name)) { if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Global, returning read-only global URI."); return Global.getUriFor(Global.CONTENT_URI, name); Loading Loading @@ -2257,7 +2271,7 @@ public final class Settings { * @hide */ public static final String[] SETTINGS_TO_BACKUP = { STAY_ON_WHILE_PLUGGED_IN, STAY_ON_WHILE_PLUGGED_IN, // moved to global WIFI_USE_STATIC_IP, WIFI_STATIC_IP, WIFI_STATIC_GATEWAY, Loading @@ -2272,7 +2286,7 @@ public final class Settings { SCREEN_BRIGHTNESS_MODE, SCREEN_AUTO_BRIGHTNESS_ADJ, VIBRATE_INPUT_DEVICES, MODE_RINGER, MODE_RINGER, // moved to global MODE_RINGER_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED, VOLUME_VOICE, Loading @@ -2293,20 +2307,18 @@ public final class Settings { TEXT_AUTO_CAPS, TEXT_AUTO_PUNCTUATE, TEXT_SHOW_PASSWORD, AUTO_TIME, AUTO_TIME_ZONE, AUTO_TIME, // moved to global AUTO_TIME_ZONE, // moved to global TIME_12_24, DATE_FORMAT, DTMF_TONE_WHEN_DIALING, DTMF_TONE_TYPE_WHEN_DIALING, Global.EMERGENCY_TONE, Global.CALL_AUTO_RETRY, HEARING_AID, TTY_MODE, SOUND_EFFECTS_ENABLED, HAPTIC_FEEDBACK_ENABLED, POWER_SOUNDS_ENABLED, DOCK_SOUNDS_ENABLED, POWER_SOUNDS_ENABLED, // moved to global DOCK_SOUNDS_ENABLED, // moved to global LOCKSCREEN_SOUNDS_ENABLED, SHOW_WEB_SUGGESTIONS, NOTIFICATION_LIGHT_PULSE, Loading Loading @@ -2702,6 +2714,11 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.PREFERRED_CDMA_SUBSCRIPTION); } /** @hide */ public static void getMovedKeys(HashSet<String> outKeySet) { outKeySet.addAll(MOVED_TO_GLOBAL); } /** * Look up a name in the database. * @param resolver to access the database with Loading Loading @@ -3993,12 +4010,11 @@ public final class Settings { * @hide */ public static final String[] SETTINGS_TO_BACKUP = { ADB_ENABLED, BUGREPORT_IN_POWER_MENU, ALLOW_MOCK_LOCATION, PARENTAL_CONTROL_ENABLED, PARENTAL_CONTROL_REDIRECT_URL, USB_MASS_STORAGE_ENABLED, USB_MASS_STORAGE_ENABLED, // moved to global ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE, Loading @@ -4017,9 +4033,9 @@ public final class Settings { TTS_DEFAULT_COUNTRY, TTS_ENABLED_PLUGINS, TTS_DEFAULT_LOCALE, WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, WIFI_NUM_OPEN_NETWORKS_KEPT, WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, // moved to global WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, // moved to global WIFI_NUM_OPEN_NETWORKS_KEPT, // moved to global MOUNT_PLAY_NOTIFICATION_SND, MOUNT_UMS_AUTOSTART, MOUNT_UMS_PROMPT, Loading Loading @@ -5251,6 +5267,38 @@ public final class Settings { public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities"; /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. * * These keys may be mentioned in the SETTINGS_TO_BACKUP arrays in System * and Secure as well. This is because those tables drive both backup and * restore, and restore needs to properly whitelist keys that used to live * in those namespaces. The keys will only actually be backed up / restored * if they are also mentioned in this table (Global.SETTINGS_TO_BACKUP). * * NOTE: Settings are backed up and restored in the order they appear * in this array. If you have one setting depending on another, * make sure that they are ordered appropriately. * * @hide */ public static final String[] SETTINGS_TO_BACKUP = { STAY_ON_WHILE_PLUGGED_IN, MODE_RINGER, AUTO_TIME, AUTO_TIME_ZONE, POWER_SOUNDS_ENABLED, DOCK_SOUNDS_ENABLED, USB_MASS_STORAGE_ENABLED, ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED, WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, WIFI_NUM_OPEN_NETWORKS_KEPT, EMERGENCY_TONE, CALL_AUTO_RETRY, }; // Populated lazily, guarded by class object: private static NameValueCache sNameValueCache = new NameValueCache( SYS_PROP_SETTING_VERSION, Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +75 −27 Original line number Diff line number Diff line Loading @@ -46,7 +46,6 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; Loading @@ -64,25 +63,35 @@ public class SettingsBackupAgent extends BackupAgentHelper { private static final String KEY_SYSTEM = "system"; private static final String KEY_SECURE = "secure"; private static final String KEY_GLOBAL = "global"; private static final String KEY_LOCALE = "locale"; //Version 2 adds STATE_WIFI_CONFIG private static final int STATE_VERSION_1 = 1; private static final int STATE_VERSION_1_SIZE = 4; // Versioning of the state file. Increment this version // number any time the set of state items is altered. private static final int STATE_VERSION = 2; private static final int STATE_VERSION = 3; // Slots in the checksum array. Never insert new items in the middle // of this array; new slots must be appended. private static final int STATE_SYSTEM = 0; private static final int STATE_SECURE = 1; private static final int STATE_LOCALE = 2; private static final int STATE_WIFI_SUPPLICANT = 3; private static final int STATE_WIFI_CONFIG = 4; private static final int STATE_SIZE = 5; // The number of state items private static final int STATE_GLOBAL = 5; private static final int STATE_SIZE = 6; // The current number of state items // Number of entries in the checksum array at various version numbers private static final int STATE_SIZES[] = { 0, 4, // version 1 5, // version 2 added STATE_WIFI_CONFIG STATE_SIZE // version 3 added STATE_GLOBAL }; // Versioning of the 'full backup' format private static final int FULL_BACKUP_VERSION = 1; private static final int FULL_BACKUP_VERSION = 2; private static final int FULL_BACKUP_ADDED_GLOBAL = 2; // added the "global" entry private static final int INTEGER_BYTE_COUNT = Integer.SIZE / Byte.SIZE; Loading Loading @@ -257,6 +266,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] locale = mSettingsHelper.getLocaleData(); byte[] wifiSupplicantData = getWifiSupplicant(FILE_WIFI_SUPPLICANT); byte[] wifiConfigData = getFileData(mWifiConfigFile); Loading @@ -267,6 +277,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { writeIfChanged(stateChecksums[STATE_SYSTEM], KEY_SYSTEM, systemSettingsData, data); stateChecksums[STATE_SECURE] = writeIfChanged(stateChecksums[STATE_SECURE], KEY_SECURE, secureSettingsData, data); stateChecksums[STATE_GLOBAL] = writeIfChanged(stateChecksums[STATE_GLOBAL], KEY_GLOBAL, secureSettingsData, data); stateChecksums[STATE_LOCALE] = writeIfChanged(stateChecksums[STATE_LOCALE], KEY_LOCALE, locale, data); stateChecksums[STATE_WIFI_SUPPLICANT] = Loading @@ -283,14 +295,18 @@ public class SettingsBackupAgent extends BackupAgentHelper { public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException { HashSet<String> movedToGlobal = new HashSet<String>(); Settings.System.getMovedKeys(movedToGlobal); Settings.Secure.getMovedKeys(movedToGlobal); while (data.readNextHeader()) { final String key = data.getKey(); final int size = data.getDataSize(); if (KEY_SYSTEM.equals(key)) { restoreSettings(data, Settings.System.CONTENT_URI); restoreSettings(data, Settings.System.CONTENT_URI, movedToGlobal); mSettingsHelper.applyAudioSettings(); } else if (KEY_SECURE.equals(key)) { restoreSettings(data, Settings.Secure.CONTENT_URI); restoreSettings(data, Settings.Secure.CONTENT_URI, movedToGlobal); } else if (KEY_WIFI_SUPPLICANT.equals(key)) { int retainedWifiState = enableWifi(false); restoreWifiSupplicant(FILE_WIFI_SUPPLICANT, data); Loading @@ -317,6 +333,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { public void onFullBackup(FullBackupDataOutput data) throws IOException { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] locale = mSettingsHelper.getLocaleData(); byte[] wifiSupplicantData = getWifiSupplicant(FILE_WIFI_SUPPLICANT); byte[] wifiConfigData = getFileData(mWifiConfigFile); Loading @@ -339,6 +356,9 @@ public class SettingsBackupAgent extends BackupAgentHelper { if (DEBUG_BACKUP) Log.d(TAG, secureSettingsData.length + " bytes of secure settings data"); out.writeInt(secureSettingsData.length); out.write(secureSettingsData); if (DEBUG_BACKUP) Log.d(TAG, globalSettingsData.length + " bytes of global settings data"); out.writeInt(globalSettingsData.length); out.write(globalSettingsData); if (DEBUG_BACKUP) Log.d(TAG, locale.length + " bytes of locale data"); out.writeInt(locale.length); out.write(locale); Loading Loading @@ -371,20 +391,35 @@ public class SettingsBackupAgent extends BackupAgentHelper { int version = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, "Flattened data version " + version); if (version == FULL_BACKUP_VERSION) { if (version <= FULL_BACKUP_VERSION) { // Generate the moved-to-global lookup table HashSet<String> movedToGlobal = new HashSet<String>(); Settings.System.getMovedKeys(movedToGlobal); Settings.Secure.getMovedKeys(movedToGlobal); // system settings data first int nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of settings data"); byte[] buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI); restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI, movedToGlobal); // secure settings nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of secure settings data"); if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI); restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI, movedToGlobal); // Global only if sufficiently new if (version >= FULL_BACKUP_ADDED_GLOBAL) { nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of global settings data"); if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); movedToGlobal.clear(); // no redirection; this *is* the global namespace restoreSettings(buffer, nBytes, Settings.Global.CONTENT_URI, movedToGlobal); } // locale nBytes = in.readInt(); Loading Loading @@ -430,15 +465,9 @@ public class SettingsBackupAgent extends BackupAgentHelper { try { int stateVersion = dataInput.readInt(); if (stateVersion == STATE_VERSION_1) { for (int i = 0; i < STATE_VERSION_1_SIZE; i++) { for (int i = 0; i < STATE_SIZES[stateVersion]; i++) { stateChecksums[i] = dataInput.readLong(); } } else if (stateVersion == STATE_VERSION) { for (int i = 0; i < STATE_SIZE; i++) { stateChecksums[i] = dataInput.readLong(); } } } catch (EOFException eof) { // With the default 0 checksum we'll wind up forcing a backup of // any unhandled data sets, which is appropriate. Loading Loading @@ -496,7 +525,18 @@ public class SettingsBackupAgent extends BackupAgentHelper { } } private void restoreSettings(BackupDataInput data, Uri contentUri) { private byte[] getGlobalSettings() { Cursor cursor = getContentResolver().query(Settings.Global.CONTENT_URI, PROJECTION, null, null, null); try { return extractRelevantValues(cursor, Settings.Global.SETTINGS_TO_BACKUP); } finally { cursor.close(); } } private void restoreSettings(BackupDataInput data, Uri contentUri, HashSet<String> movedToGlobal) { byte[] settings = new byte[data.getDataSize()]; try { data.readEntityData(settings, 0, settings.length); Loading @@ -504,20 +544,23 @@ public class SettingsBackupAgent extends BackupAgentHelper { Log.e(TAG, "Couldn't read entity data"); return; } restoreSettings(settings, settings.length, contentUri); restoreSettings(settings, settings.length, contentUri, movedToGlobal); } private void restoreSettings(byte[] settings, int bytes, Uri contentUri) { private void restoreSettings(byte[] settings, int bytes, Uri contentUri, HashSet<String> movedToGlobal) { if (DEBUG) { Log.i(TAG, "restoreSettings: " + contentUri); } // Figure out the white list. // Figure out the white list and redirects to the global table. String[] whitelist = null; if (contentUri.equals(Settings.Secure.CONTENT_URI)) { whitelist = Settings.Secure.SETTINGS_TO_BACKUP; } else if (contentUri.equals(Settings.System.CONTENT_URI)) { whitelist = Settings.System.SETTINGS_TO_BACKUP; } else if (contentUri.equals(Settings.Global.CONTENT_URI)) { whitelist = Settings.Global.SETTINGS_TO_BACKUP; } else { throw new IllegalArgumentException("Unknown URI: " + contentUri); } Loading Loading @@ -556,15 +599,20 @@ public class SettingsBackupAgent extends BackupAgentHelper { continue; } final Uri destination = (movedToGlobal.contains(key)) ? Settings.Global.CONTENT_URI : contentUri; // The helper doesn't care what namespace the keys are in if (settingsHelper.restoreValue(key, value)) { contentValues.clear(); contentValues.put(Settings.NameValueTable.NAME, key); contentValues.put(Settings.NameValueTable.VALUE, value); getContentResolver().insert(contentUri, contentValues); getContentResolver().insert(destination, contentValues); } if (DEBUG || true) { Log.d(TAG, "Restored setting: " + key + "=" + value); Log.d(TAG, "Restored setting: " + destination + " : "+ key + "=" + value); } } } Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +2 −148 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
core/java/android/provider/Settings.java +71 −23 Original line number Diff line number Diff line Loading @@ -911,17 +911,20 @@ public final class Settings { } private static final HashSet<String> MOVED_TO_GLOBAL; private static final HashSet<String> MOVED_TO_SECURE_THEN_GLOBAL; static { MOVED_TO_GLOBAL = new HashSet<String>(); MOVED_TO_SECURE_THEN_GLOBAL = new HashSet<String>(); // these were originally in system but migrated to secure in the past, // so are duplicated in the Secure.* namespace MOVED_TO_GLOBAL.add(Global.ADB_ENABLED); MOVED_TO_GLOBAL.add(Global.BLUETOOTH_ON); MOVED_TO_GLOBAL.add(Global.DATA_ROAMING); MOVED_TO_GLOBAL.add(Global.DEVICE_PROVISIONED); MOVED_TO_GLOBAL.add(Global.INSTALL_NON_MARKET_APPS); MOVED_TO_GLOBAL.add(Global.USB_MASS_STORAGE_ENABLED); MOVED_TO_GLOBAL.add(Global.HTTP_PROXY); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.ADB_ENABLED); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.BLUETOOTH_ON); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DATA_ROAMING); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DEVICE_PROVISIONED); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.INSTALL_NON_MARKET_APPS); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.USB_MASS_STORAGE_ENABLED); MOVED_TO_SECURE_THEN_GLOBAL.add(Global.HTTP_PROXY); // these are moving directly from system to global MOVED_TO_GLOBAL.add(Settings.Global.AIRPLANE_MODE_ON); Loading Loading @@ -954,6 +957,17 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.ALWAYS_FINISH_ACTIVITIES); } /** @hide */ public static void getMovedKeys(HashSet<String> outKeySet) { outKeySet.addAll(MOVED_TO_GLOBAL); outKeySet.addAll(MOVED_TO_SECURE_THEN_GLOBAL); } /** @hide */ public static void getNonLegacyMovedKeys(HashSet<String> outKeySet) { outKeySet.addAll(MOVED_TO_GLOBAL); } /** * Look up a name in the database. * @param resolver to access the database with Loading @@ -972,7 +986,7 @@ public final class Settings { + " to android.provider.Settings.Secure, returning read-only value."); return Secure.getStringForUser(resolver, name, userHandle); } if (MOVED_TO_GLOBAL.contains(name)) { if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Global, returning read-only value."); return Global.getStringForUser(resolver, name, userHandle); Loading @@ -999,7 +1013,7 @@ public final class Settings { + " to android.provider.Settings.Secure, value is unchanged."); return false; } if (MOVED_TO_GLOBAL.contains(name)) { if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Global, value is unchanged."); return false; Loading @@ -1019,7 +1033,7 @@ public final class Settings { + " to android.provider.Settings.Secure, returning Secure URI."); return Secure.getUriFor(Secure.CONTENT_URI, name); } if (MOVED_TO_GLOBAL.contains(name)) { if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Global, returning read-only global URI."); return Global.getUriFor(Global.CONTENT_URI, name); Loading Loading @@ -2257,7 +2271,7 @@ public final class Settings { * @hide */ public static final String[] SETTINGS_TO_BACKUP = { STAY_ON_WHILE_PLUGGED_IN, STAY_ON_WHILE_PLUGGED_IN, // moved to global WIFI_USE_STATIC_IP, WIFI_STATIC_IP, WIFI_STATIC_GATEWAY, Loading @@ -2272,7 +2286,7 @@ public final class Settings { SCREEN_BRIGHTNESS_MODE, SCREEN_AUTO_BRIGHTNESS_ADJ, VIBRATE_INPUT_DEVICES, MODE_RINGER, MODE_RINGER, // moved to global MODE_RINGER_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED, VOLUME_VOICE, Loading @@ -2293,20 +2307,18 @@ public final class Settings { TEXT_AUTO_CAPS, TEXT_AUTO_PUNCTUATE, TEXT_SHOW_PASSWORD, AUTO_TIME, AUTO_TIME_ZONE, AUTO_TIME, // moved to global AUTO_TIME_ZONE, // moved to global TIME_12_24, DATE_FORMAT, DTMF_TONE_WHEN_DIALING, DTMF_TONE_TYPE_WHEN_DIALING, Global.EMERGENCY_TONE, Global.CALL_AUTO_RETRY, HEARING_AID, TTY_MODE, SOUND_EFFECTS_ENABLED, HAPTIC_FEEDBACK_ENABLED, POWER_SOUNDS_ENABLED, DOCK_SOUNDS_ENABLED, POWER_SOUNDS_ENABLED, // moved to global DOCK_SOUNDS_ENABLED, // moved to global LOCKSCREEN_SOUNDS_ENABLED, SHOW_WEB_SUGGESTIONS, NOTIFICATION_LIGHT_PULSE, Loading Loading @@ -2702,6 +2714,11 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.PREFERRED_CDMA_SUBSCRIPTION); } /** @hide */ public static void getMovedKeys(HashSet<String> outKeySet) { outKeySet.addAll(MOVED_TO_GLOBAL); } /** * Look up a name in the database. * @param resolver to access the database with Loading Loading @@ -3993,12 +4010,11 @@ public final class Settings { * @hide */ public static final String[] SETTINGS_TO_BACKUP = { ADB_ENABLED, BUGREPORT_IN_POWER_MENU, ALLOW_MOCK_LOCATION, PARENTAL_CONTROL_ENABLED, PARENTAL_CONTROL_REDIRECT_URL, USB_MASS_STORAGE_ENABLED, USB_MASS_STORAGE_ENABLED, // moved to global ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE, Loading @@ -4017,9 +4033,9 @@ public final class Settings { TTS_DEFAULT_COUNTRY, TTS_ENABLED_PLUGINS, TTS_DEFAULT_LOCALE, WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, WIFI_NUM_OPEN_NETWORKS_KEPT, WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, // moved to global WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, // moved to global WIFI_NUM_OPEN_NETWORKS_KEPT, // moved to global MOUNT_PLAY_NOTIFICATION_SND, MOUNT_UMS_AUTOSTART, MOUNT_UMS_PROMPT, Loading Loading @@ -5251,6 +5267,38 @@ public final class Settings { public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities"; /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. * * These keys may be mentioned in the SETTINGS_TO_BACKUP arrays in System * and Secure as well. This is because those tables drive both backup and * restore, and restore needs to properly whitelist keys that used to live * in those namespaces. The keys will only actually be backed up / restored * if they are also mentioned in this table (Global.SETTINGS_TO_BACKUP). * * NOTE: Settings are backed up and restored in the order they appear * in this array. If you have one setting depending on another, * make sure that they are ordered appropriately. * * @hide */ public static final String[] SETTINGS_TO_BACKUP = { STAY_ON_WHILE_PLUGGED_IN, MODE_RINGER, AUTO_TIME, AUTO_TIME_ZONE, POWER_SOUNDS_ENABLED, DOCK_SOUNDS_ENABLED, USB_MASS_STORAGE_ENABLED, ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED, WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, WIFI_NUM_OPEN_NETWORKS_KEPT, EMERGENCY_TONE, CALL_AUTO_RETRY, }; // Populated lazily, guarded by class object: private static NameValueCache sNameValueCache = new NameValueCache( SYS_PROP_SETTING_VERSION, Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +75 −27 Original line number Diff line number Diff line Loading @@ -46,7 +46,6 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; Loading @@ -64,25 +63,35 @@ public class SettingsBackupAgent extends BackupAgentHelper { private static final String KEY_SYSTEM = "system"; private static final String KEY_SECURE = "secure"; private static final String KEY_GLOBAL = "global"; private static final String KEY_LOCALE = "locale"; //Version 2 adds STATE_WIFI_CONFIG private static final int STATE_VERSION_1 = 1; private static final int STATE_VERSION_1_SIZE = 4; // Versioning of the state file. Increment this version // number any time the set of state items is altered. private static final int STATE_VERSION = 2; private static final int STATE_VERSION = 3; // Slots in the checksum array. Never insert new items in the middle // of this array; new slots must be appended. private static final int STATE_SYSTEM = 0; private static final int STATE_SECURE = 1; private static final int STATE_LOCALE = 2; private static final int STATE_WIFI_SUPPLICANT = 3; private static final int STATE_WIFI_CONFIG = 4; private static final int STATE_SIZE = 5; // The number of state items private static final int STATE_GLOBAL = 5; private static final int STATE_SIZE = 6; // The current number of state items // Number of entries in the checksum array at various version numbers private static final int STATE_SIZES[] = { 0, 4, // version 1 5, // version 2 added STATE_WIFI_CONFIG STATE_SIZE // version 3 added STATE_GLOBAL }; // Versioning of the 'full backup' format private static final int FULL_BACKUP_VERSION = 1; private static final int FULL_BACKUP_VERSION = 2; private static final int FULL_BACKUP_ADDED_GLOBAL = 2; // added the "global" entry private static final int INTEGER_BYTE_COUNT = Integer.SIZE / Byte.SIZE; Loading Loading @@ -257,6 +266,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] locale = mSettingsHelper.getLocaleData(); byte[] wifiSupplicantData = getWifiSupplicant(FILE_WIFI_SUPPLICANT); byte[] wifiConfigData = getFileData(mWifiConfigFile); Loading @@ -267,6 +277,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { writeIfChanged(stateChecksums[STATE_SYSTEM], KEY_SYSTEM, systemSettingsData, data); stateChecksums[STATE_SECURE] = writeIfChanged(stateChecksums[STATE_SECURE], KEY_SECURE, secureSettingsData, data); stateChecksums[STATE_GLOBAL] = writeIfChanged(stateChecksums[STATE_GLOBAL], KEY_GLOBAL, secureSettingsData, data); stateChecksums[STATE_LOCALE] = writeIfChanged(stateChecksums[STATE_LOCALE], KEY_LOCALE, locale, data); stateChecksums[STATE_WIFI_SUPPLICANT] = Loading @@ -283,14 +295,18 @@ public class SettingsBackupAgent extends BackupAgentHelper { public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException { HashSet<String> movedToGlobal = new HashSet<String>(); Settings.System.getMovedKeys(movedToGlobal); Settings.Secure.getMovedKeys(movedToGlobal); while (data.readNextHeader()) { final String key = data.getKey(); final int size = data.getDataSize(); if (KEY_SYSTEM.equals(key)) { restoreSettings(data, Settings.System.CONTENT_URI); restoreSettings(data, Settings.System.CONTENT_URI, movedToGlobal); mSettingsHelper.applyAudioSettings(); } else if (KEY_SECURE.equals(key)) { restoreSettings(data, Settings.Secure.CONTENT_URI); restoreSettings(data, Settings.Secure.CONTENT_URI, movedToGlobal); } else if (KEY_WIFI_SUPPLICANT.equals(key)) { int retainedWifiState = enableWifi(false); restoreWifiSupplicant(FILE_WIFI_SUPPLICANT, data); Loading @@ -317,6 +333,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { public void onFullBackup(FullBackupDataOutput data) throws IOException { byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); byte[] locale = mSettingsHelper.getLocaleData(); byte[] wifiSupplicantData = getWifiSupplicant(FILE_WIFI_SUPPLICANT); byte[] wifiConfigData = getFileData(mWifiConfigFile); Loading @@ -339,6 +356,9 @@ public class SettingsBackupAgent extends BackupAgentHelper { if (DEBUG_BACKUP) Log.d(TAG, secureSettingsData.length + " bytes of secure settings data"); out.writeInt(secureSettingsData.length); out.write(secureSettingsData); if (DEBUG_BACKUP) Log.d(TAG, globalSettingsData.length + " bytes of global settings data"); out.writeInt(globalSettingsData.length); out.write(globalSettingsData); if (DEBUG_BACKUP) Log.d(TAG, locale.length + " bytes of locale data"); out.writeInt(locale.length); out.write(locale); Loading Loading @@ -371,20 +391,35 @@ public class SettingsBackupAgent extends BackupAgentHelper { int version = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, "Flattened data version " + version); if (version == FULL_BACKUP_VERSION) { if (version <= FULL_BACKUP_VERSION) { // Generate the moved-to-global lookup table HashSet<String> movedToGlobal = new HashSet<String>(); Settings.System.getMovedKeys(movedToGlobal); Settings.Secure.getMovedKeys(movedToGlobal); // system settings data first int nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of settings data"); byte[] buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI); restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI, movedToGlobal); // secure settings nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of secure settings data"); if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI); restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI, movedToGlobal); // Global only if sufficiently new if (version >= FULL_BACKUP_ADDED_GLOBAL) { nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of global settings data"); if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); movedToGlobal.clear(); // no redirection; this *is* the global namespace restoreSettings(buffer, nBytes, Settings.Global.CONTENT_URI, movedToGlobal); } // locale nBytes = in.readInt(); Loading Loading @@ -430,15 +465,9 @@ public class SettingsBackupAgent extends BackupAgentHelper { try { int stateVersion = dataInput.readInt(); if (stateVersion == STATE_VERSION_1) { for (int i = 0; i < STATE_VERSION_1_SIZE; i++) { for (int i = 0; i < STATE_SIZES[stateVersion]; i++) { stateChecksums[i] = dataInput.readLong(); } } else if (stateVersion == STATE_VERSION) { for (int i = 0; i < STATE_SIZE; i++) { stateChecksums[i] = dataInput.readLong(); } } } catch (EOFException eof) { // With the default 0 checksum we'll wind up forcing a backup of // any unhandled data sets, which is appropriate. Loading Loading @@ -496,7 +525,18 @@ public class SettingsBackupAgent extends BackupAgentHelper { } } private void restoreSettings(BackupDataInput data, Uri contentUri) { private byte[] getGlobalSettings() { Cursor cursor = getContentResolver().query(Settings.Global.CONTENT_URI, PROJECTION, null, null, null); try { return extractRelevantValues(cursor, Settings.Global.SETTINGS_TO_BACKUP); } finally { cursor.close(); } } private void restoreSettings(BackupDataInput data, Uri contentUri, HashSet<String> movedToGlobal) { byte[] settings = new byte[data.getDataSize()]; try { data.readEntityData(settings, 0, settings.length); Loading @@ -504,20 +544,23 @@ public class SettingsBackupAgent extends BackupAgentHelper { Log.e(TAG, "Couldn't read entity data"); return; } restoreSettings(settings, settings.length, contentUri); restoreSettings(settings, settings.length, contentUri, movedToGlobal); } private void restoreSettings(byte[] settings, int bytes, Uri contentUri) { private void restoreSettings(byte[] settings, int bytes, Uri contentUri, HashSet<String> movedToGlobal) { if (DEBUG) { Log.i(TAG, "restoreSettings: " + contentUri); } // Figure out the white list. // Figure out the white list and redirects to the global table. String[] whitelist = null; if (contentUri.equals(Settings.Secure.CONTENT_URI)) { whitelist = Settings.Secure.SETTINGS_TO_BACKUP; } else if (contentUri.equals(Settings.System.CONTENT_URI)) { whitelist = Settings.System.SETTINGS_TO_BACKUP; } else if (contentUri.equals(Settings.Global.CONTENT_URI)) { whitelist = Settings.Global.SETTINGS_TO_BACKUP; } else { throw new IllegalArgumentException("Unknown URI: " + contentUri); } Loading Loading @@ -556,15 +599,20 @@ public class SettingsBackupAgent extends BackupAgentHelper { continue; } final Uri destination = (movedToGlobal.contains(key)) ? Settings.Global.CONTENT_URI : contentUri; // The helper doesn't care what namespace the keys are in if (settingsHelper.restoreValue(key, value)) { contentValues.clear(); contentValues.put(Settings.NameValueTable.NAME, key); contentValues.put(Settings.NameValueTable.VALUE, value); getContentResolver().insert(contentUri, contentValues); getContentResolver().insert(destination, contentValues); } if (DEBUG || true) { Log.d(TAG, "Restored setting: " + key + "=" + value); Log.d(TAG, "Restored setting: " + destination + " : "+ key + "=" + value); } } } Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +2 −148 File changed.Preview size limit exceeded, changes collapsed. Show changes