From 779b7a09c5ab88f290b0bb2aecc7ca2222f4208c Mon Sep 17 00:00:00 2001 From: ryanlwlin Date: Thu, 28 May 2020 18:42:50 +0800 Subject: [PATCH] Fix Magnification Settings didn't restore via D2D transfer ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED is replaced with ButtonTargets setting value. We address it in data migration but not in D2D Consider D2D, we restore it to ButtonTargets value when the restored sdk version of the received intent is below R. Bug: 155943759 Test: manual test 1. prepare an Android Q device and an Android R device 2. backup settings value of Android Q device by the google account. 3. Launch setupwizard to restore it by the google account. Change-Id: I5df070dd1ef880ac1ee5c0867b42e88782348a1b --- .../providers/settings/SettingsHelper.java | 1 + .../settings/SettingsHelperRestoreTest.java | 7 +-- .../AccessibilityManagerService.java | 45 +++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 028c3041a50dd..75b680dd3a881 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -80,6 +80,7 @@ public class SettingsHelper { sBroadcastOnRestore.add(Settings.Secure.UI_NIGHT_MODE); sBroadcastOnRestore.add(Settings.Secure.DARK_THEME_CUSTOM_START_TIME); sBroadcastOnRestore.add(Settings.Secure.DARK_THEME_CUSTOM_END_TIME); + sBroadcastOnRestore.add(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED); } private interface SettingsLookup { diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java index 54f8688bf5d60..197788e11973f 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java @@ -31,6 +31,7 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; /** * Tests for {@link SettingsHelper#restoreValue(Context, ContentResolver, ContentValues, Uri, @@ -89,7 +90,7 @@ public class SettingsHelperRestoreTest { float restoreSettingValue = defaultSettingValue + 0.5f; mSettingsHelper.restoreValue( - mContext, + Mockito.mock(Context.class), mContentResolver, new ContentValues(2), Settings.Secure.getUriFor(settingName), @@ -132,7 +133,7 @@ public class SettingsHelperRestoreTest { Settings.Secure.putInt(mContentResolver, settingName, configuredSettingValue); mSettingsHelper.restoreValue( - mContext, + Mockito.mock(Context.class), mContentResolver, new ContentValues(2), Settings.Secure.getUriFor(settingName), @@ -154,7 +155,7 @@ public class SettingsHelperRestoreTest { int restoreSettingValue = 1; mSettingsHelper.restoreValue( - mContext, + Mockito.mock(Context.class), mContentResolver, new ContentValues(2), Settings.Secure.getUriFor(settingName), diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 22b082f84a84b..7f912a4fc1ce2 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -16,6 +16,7 @@ package com.android.server.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED; import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON; import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY; import static android.view.accessibility.AccessibilityManager.ShortcutType; @@ -542,12 +543,56 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE), intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE)); } + } else if (ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED.equals(which)) { + synchronized (mLock) { + restoreLegacyDisplayMagnificationNavBarIfNeededLocked( + intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE), + intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT, + 0)); + } } } } }, UserHandle.ALL, intentFilter, null, null); } + // Called only during settings restore; currently supports only the owner user + // TODO: b/22388012 + private void restoreLegacyDisplayMagnificationNavBarIfNeededLocked(String newSetting, + int restoreFromSdkInt) { + if (restoreFromSdkInt >= Build.VERSION_CODES.R) { + return; + } + + boolean displayMagnificationNavBarEnabled; + try { + displayMagnificationNavBarEnabled = Integer.parseInt(newSetting) == 1; + } catch (NumberFormatException e) { + Slog.w(LOG_TAG, "number format is incorrect" + e); + return; + } + + final AccessibilityUserState userState = getUserStateLocked(UserHandle.USER_SYSTEM); + final Set targetsFromSetting = new ArraySet<>(); + readColonDelimitedSettingToSet(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, + userState.mUserId, targetsFromSetting, str -> str); + final boolean targetsContainMagnification = targetsFromSetting.contains( + MAGNIFICATION_CONTROLLER_NAME); + if (targetsContainMagnification == displayMagnificationNavBarEnabled) { + return; + } + + if (displayMagnificationNavBarEnabled) { + targetsFromSetting.add(MAGNIFICATION_CONTROLLER_NAME); + } else { + targetsFromSetting.remove(MAGNIFICATION_CONTROLLER_NAME); + } + persistColonDelimitedSetToSettingLocked(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, + userState.mUserId, targetsFromSetting, str -> str); + readAccessibilityButtonTargetsLocked(userState); + onUserStateChangedLocked(userState); + } + @Override public long addClient(IAccessibilityManagerClient callback, int userId) { synchronized (mLock) {