From 4a49a7628f1451946a8962ab89a9f467f730ca39 Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Tue, 2 Nov 2021 19:05:04 +0800 Subject: [PATCH] Fix Accessibility button & gesture settings did not update correctly in Tablet device Root Cause: ACCESSIBILITY_BUTTON_MODE only be updated in navigationbar, did not be updated in new-design taskbar. Solution: Move updated function up to NavigationBarController, which controlls NavigationBar and Taskbar. Bug: 203173063 Test: manual test Change-Id: Ib18fcd7062bf4e7627f4ffaeefd150c3d1055a47 --- .../systemui/navigationbar/NavigationBar.java | 38 +----------------- .../NavigationBarController.java | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 6a1eae75f9a97..1eef6e87cec0a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -24,9 +24,6 @@ import static android.app.StatusBarManager.WindowType; import static android.app.StatusBarManager.WindowVisibleState; import static android.app.StatusBarManager.windowStateToString; import static android.app.WindowConfiguration.ROTATION_UNDEFINED; -import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; -import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; -import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.containsType; @@ -131,10 +128,10 @@ import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; -import com.android.systemui.shared.rotation.RotationButton; -import com.android.systemui.shared.rotation.RotationButtonController; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.recents.utilities.Utilities; +import com.android.systemui.shared.rotation.RotationButton; +import com.android.systemui.shared.rotation.RotationButtonController; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.AutoHideUiElement; @@ -614,8 +611,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mDeviceProvisionedController.addCallback(mUserSetupListener); mNotificationShadeDepthController.addListener(mDepthListener); - updateAccessibilityButtonModeIfNeeded(); - return barView; } @@ -1406,34 +1401,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, updateSystemUiStateFlags(a11yFlags); } - private void updateAccessibilityButtonModeIfNeeded() { - final int mode = Settings.Secure.getIntForUser(mContentResolver, - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, - ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); - - // ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU is compatible under gestural or non-gestural - // mode, so we don't need to update it. - if (mode == ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU) { - return; - } - - // ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR is incompatible under gestural mode. Need to - // force update to ACCESSIBILITY_BUTTON_MODE_GESTURE. - if (QuickStepContract.isGesturalMode(mNavBarMode) - && mode == ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR) { - Settings.Secure.putIntForUser(mContentResolver, - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_GESTURE, - UserHandle.USER_CURRENT); - // ACCESSIBILITY_BUTTON_MODE_GESTURE is incompatible under non gestural mode. Need to - // force update to ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR. - } else if (!QuickStepContract.isGesturalMode(mNavBarMode) - && mode == ACCESSIBILITY_BUTTON_MODE_GESTURE) { - Settings.Secure.putIntForUser(mContentResolver, - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, - ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); - } - } - public void updateSystemUiStateFlags(int a11yFlags) { if (a11yFlags < 0) { a11yFlags = mNavigationBarA11yHelper.getA11yButtonState(); @@ -1558,7 +1525,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } } updateScreenPinningGestures(); - updateAccessibilityButtonModeIfNeeded(); if (!canShowSecondaryHandle()) { resetSecondaryHandle(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index 4959c7d6808d3..3dc79c43d894d 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -16,10 +16,14 @@ package com.android.systemui.navigationbar; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; import static android.view.Display.DEFAULT_DISPLAY; import static com.android.systemui.shared.recents.utilities.Utilities.isTablet; +import android.content.ContentResolver; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; @@ -27,6 +31,8 @@ import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; +import android.os.UserHandle; +import android.provider.Settings; import android.util.Log; import android.util.SparseArray; import android.view.Display; @@ -46,6 +52,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.model.SysUiState; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.phone.AutoHideController; @@ -142,6 +149,8 @@ public class NavigationBarController implements } final int oldMode = mNavMode; mNavMode = mode; + updateAccessibilityButtonModeIfNeeded(); + mHandler.post(() -> { // create/destroy nav bar based on nav mode only in unfolded state if (oldMode != mNavMode) { @@ -157,6 +166,35 @@ public class NavigationBarController implements }); } + private void updateAccessibilityButtonModeIfNeeded() { + ContentResolver contentResolver = mContext.getContentResolver(); + final int mode = Settings.Secure.getIntForUser(contentResolver, + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, + ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); + + // ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU is compatible under gestural or non-gestural + // mode, so we don't need to update it. + if (mode == ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU) { + return; + } + + // ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR is incompatible under gestural mode. Need to + // force update to ACCESSIBILITY_BUTTON_MODE_GESTURE. + if (QuickStepContract.isGesturalMode(mNavMode) + && mode == ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR) { + Settings.Secure.putIntForUser(contentResolver, + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_GESTURE, + UserHandle.USER_CURRENT); + // ACCESSIBILITY_BUTTON_MODE_GESTURE is incompatible under non gestural mode. Need to + // force update to ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR. + } else if (!QuickStepContract.isGesturalMode(mNavMode) + && mode == ACCESSIBILITY_BUTTON_MODE_GESTURE) { + Settings.Secure.putIntForUser(contentResolver, + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, + ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); + } + } + /** @see #initializeTaskbarIfNecessary() */ private boolean updateNavbarForTaskbar() { boolean taskbarShown = initializeTaskbarIfNecessary(); @@ -222,6 +260,8 @@ public class NavigationBarController implements */ public void createNavigationBars(final boolean includeDefaultDisplay, RegisterStatusBarResult result) { + updateAccessibilityButtonModeIfNeeded(); + // Don't need to create nav bar on the default display if we initialize TaskBar. final boolean shouldCreateDefaultNavbar = includeDefaultDisplay && !initializeTaskbarIfNecessary();