Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +13 −2 Original line number Diff line number Diff line Loading @@ -690,7 +690,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { Cursor cursor = getContentResolver().query(Settings.Global.CONTENT_URI, PROJECTION, null, null, null); try { return extractRelevantValues(cursor, GlobalSettings.SETTINGS_TO_BACKUP); return extractRelevantValues(cursor, getGlobalSettingsToBackup()); } finally { cursor.close(); } Loading Loading @@ -1011,7 +1011,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { Settings.System.LEGACY_RESTORE_SETTINGS); validators = SystemSettingsValidators.VALIDATORS; } else if (contentUri.equals(Settings.Global.CONTENT_URI)) { whitelist = ArrayUtils.concat(String.class, GlobalSettings.SETTINGS_TO_BACKUP, whitelist = ArrayUtils.concat(String.class, getGlobalSettingsToBackup(), Settings.Global.LEGACY_RESTORE_SETTINGS); validators = GlobalSettingsValidators.VALIDATORS; } else { Loading @@ -1021,6 +1021,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { return new SettingsBackupWhitelist(whitelist, validators); } private String[] getGlobalSettingsToBackup() { // On watches, we don't want to backup or restore 'bluetooth_on' setting, as setting it to // false during restore would cause watch OOBE to fail due to bluetooth connection loss. if (isWatch()) { return ArrayUtils.removeElement( String.class, GlobalSettings.SETTINGS_TO_BACKUP, Settings.Global.BLUETOOTH_ON); } return GlobalSettings.SETTINGS_TO_BACKUP; } private boolean isBlockedByDynamicList(Set<String> dynamicBlockList, Uri areaUri, String key) { String contentKey = Uri.withAppendedPath(areaUri, key).toString(); return dynamicBlockList.contains(contentKey); Loading packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.PackageManager; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; Loading Loading @@ -220,6 +221,21 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { assertFalse(settingsHelper.mWrittenValues.containsKey(PRESERVED_TEST_SETTING)); } @Test public void testOnRestore_bluetoothOnRestoredOnNonWearablesOnly() { TestSettingsHelper settingsHelper = new TestSettingsHelper(mContext); mAgentUnderTest.mSettingsHelper = settingsHelper; restoreGlobalSettings(generateBackupData(Map.of(Settings.Global.BLUETOOTH_ON, "0"))); var isWatch = mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH); if (isWatch) { assertFalse(settingsHelper.mWrittenValues.containsKey(Settings.Global.BLUETOOTH_ON)); } else { assertEquals("0", settingsHelper.mWrittenValues.get(Settings.Global.BLUETOOTH_ON)); } } @Test @EnableFlags(Flags.FLAG_CONFIGURABLE_FONT_SCALE_DEFAULT) public void testFindClosestAllowedFontScale() { Loading Loading @@ -266,6 +282,20 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { return buffer.array(); } private void restoreGlobalSettings(byte[] backupData) { mAgentUnderTest.restoreSettings( backupData, /* pos= */ 0, backupData.length, Settings.Global.CONTENT_URI, null, null, null, R.array.restore_blocked_global_settings, /* dynamicBlockList= */ Collections.emptySet(), /* settingsToPreserve= */ Collections.emptySet()); } private byte[] generateUncorruptedHeader() throws IOException { try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { mAgentUnderTest.writeHeader(os); Loading Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +13 −2 Original line number Diff line number Diff line Loading @@ -690,7 +690,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { Cursor cursor = getContentResolver().query(Settings.Global.CONTENT_URI, PROJECTION, null, null, null); try { return extractRelevantValues(cursor, GlobalSettings.SETTINGS_TO_BACKUP); return extractRelevantValues(cursor, getGlobalSettingsToBackup()); } finally { cursor.close(); } Loading Loading @@ -1011,7 +1011,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { Settings.System.LEGACY_RESTORE_SETTINGS); validators = SystemSettingsValidators.VALIDATORS; } else if (contentUri.equals(Settings.Global.CONTENT_URI)) { whitelist = ArrayUtils.concat(String.class, GlobalSettings.SETTINGS_TO_BACKUP, whitelist = ArrayUtils.concat(String.class, getGlobalSettingsToBackup(), Settings.Global.LEGACY_RESTORE_SETTINGS); validators = GlobalSettingsValidators.VALIDATORS; } else { Loading @@ -1021,6 +1021,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { return new SettingsBackupWhitelist(whitelist, validators); } private String[] getGlobalSettingsToBackup() { // On watches, we don't want to backup or restore 'bluetooth_on' setting, as setting it to // false during restore would cause watch OOBE to fail due to bluetooth connection loss. if (isWatch()) { return ArrayUtils.removeElement( String.class, GlobalSettings.SETTINGS_TO_BACKUP, Settings.Global.BLUETOOTH_ON); } return GlobalSettings.SETTINGS_TO_BACKUP; } private boolean isBlockedByDynamicList(Set<String> dynamicBlockList, Uri areaUri, String key) { String contentKey = Uri.withAppendedPath(areaUri, key).toString(); return dynamicBlockList.contains(contentKey); Loading
packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.PackageManager; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; Loading Loading @@ -220,6 +221,21 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { assertFalse(settingsHelper.mWrittenValues.containsKey(PRESERVED_TEST_SETTING)); } @Test public void testOnRestore_bluetoothOnRestoredOnNonWearablesOnly() { TestSettingsHelper settingsHelper = new TestSettingsHelper(mContext); mAgentUnderTest.mSettingsHelper = settingsHelper; restoreGlobalSettings(generateBackupData(Map.of(Settings.Global.BLUETOOTH_ON, "0"))); var isWatch = mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH); if (isWatch) { assertFalse(settingsHelper.mWrittenValues.containsKey(Settings.Global.BLUETOOTH_ON)); } else { assertEquals("0", settingsHelper.mWrittenValues.get(Settings.Global.BLUETOOTH_ON)); } } @Test @EnableFlags(Flags.FLAG_CONFIGURABLE_FONT_SCALE_DEFAULT) public void testFindClosestAllowedFontScale() { Loading Loading @@ -266,6 +282,20 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { return buffer.array(); } private void restoreGlobalSettings(byte[] backupData) { mAgentUnderTest.restoreSettings( backupData, /* pos= */ 0, backupData.length, Settings.Global.CONTENT_URI, null, null, null, R.array.restore_blocked_global_settings, /* dynamicBlockList= */ Collections.emptySet(), /* settingsToPreserve= */ Collections.emptySet()); } private byte[] generateUncorruptedHeader() throws IOException { try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { mAgentUnderTest.writeHeader(os); Loading