diff options
2 files changed, 43 insertions, 2 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index 30c4ee55842e..9ab853ff4964 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -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(); } @@ -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 { @@ -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); diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java index d4ca4a35ed26..3a39150523ac 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java @@ -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; @@ -221,6 +222,21 @@ public class SettingsBackupAgentTest extends BaseSettingsProviderTest { } @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() { final String[] availableFontScales = new String[]{"0.5", "0.9", "1.0", "1.1", "1.5"}; @@ -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); |