Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14075266 authored by Sichu Jiang's avatar Sichu Jiang
Browse files

Don't backup or restore 'bluetooth_on' setting on watches

Setting 'bluetooth_on' to false during restore would cause watch OOBE to fail due to bluetooth connection loss.

Change-Id: I28a4a204eb3bbafdb0898066141f3d3ff846df7e
Tested: atest SettingsProviderTest:SettingsBackupAgentTest
Flag: EXEMPT bugfix
Bug: 355520239
parent eab80079
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -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);
+30 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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() {
@@ -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);