From d20446ce09f4880e1a7e27d9e7ca508cc8062eba Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Fri, 29 Apr 2022 14:48:11 +0800 Subject: [PATCH] Use current user Context to generate NavBar layout When generating Navigation bar LayoutParams, NavBar should use the Context with the current user, or it still layout as primary user's navBar mode even if users changes nav bar mode on the device with secondary user. fixes: 230707589 Test: manual - see reproducible video in b/230707589#comment2 Test: atest navigationBarTest Change-Id: I71e66501a378490a80189299607a6bab916cb985 --- .../systemui/navigationbar/NavigationBar.java | 25 +++++++++++-------- .../systemui/settings/UserContextProvider.kt | 6 +++++ .../systemui/settings/UserTrackerImpl.kt | 6 +++++ .../navigationbar/NavigationBarTest.java | 8 +++++- .../DeviceControlsControllerImplTest.kt | 1 - 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index c7cd48fd5adf3..3bb4e6481bd6a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -125,6 +125,7 @@ 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.settings.UserContextProvider; import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.rotation.RotationButton; import com.android.systemui.shared.rotation.RotationButtonController; @@ -203,6 +204,7 @@ public class NavigationBar extends ViewController implements private final UiEventLogger mUiEventLogger; private final NavBarHelper mNavBarHelper; private final NotificationShadeDepthController mNotificationShadeDepthController; + private final UserContextProvider mUserContextProvider; private NavigationBarFrame mFrame; private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING; @@ -514,7 +516,8 @@ public class NavigationBar extends ViewController implements DeadZone deadZone, DeviceConfigProxy deviceConfigProxy, NavigationBarTransitions navigationBarTransitions, - Optional backAnimation) { + Optional backAnimation, + UserContextProvider userContextProvider) { super(navigationBarView); mFrame = navigationBarFrame; mContext = context; @@ -550,6 +553,7 @@ public class NavigationBar extends ViewController implements mAutoHideControllerFactory = autoHideControllerFactory; mTelecomManagerOptional = telecomManagerOptional; mInputMethodManager = inputMethodManager; + mUserContextProvider = userContextProvider; mNavBarMode = mNavigationModeController.addListener(mModeChangedListener); } @@ -1512,35 +1516,36 @@ public class NavigationBar extends ViewController implements int insetsHeight = -1; int gravity = Gravity.BOTTOM; boolean navBarCanMove = true; + final Context userContext = mUserContextProvider.createCurrentUserContext(mContext); if (mWindowManager != null && mWindowManager.getCurrentWindowMetrics() != null) { Rect displaySize = mWindowManager.getCurrentWindowMetrics().getBounds(); navBarCanMove = displaySize.width() != displaySize.height() - && mContext.getResources().getBoolean( + && userContext.getResources().getBoolean( com.android.internal.R.bool.config_navBarCanMove); } if (!navBarCanMove) { - height = mContext.getResources().getDimensionPixelSize( + height = userContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.navigation_bar_frame_height); - insetsHeight = mContext.getResources().getDimensionPixelSize( + insetsHeight = userContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.navigation_bar_height); } else { switch (rotation) { case ROTATION_UNDEFINED: case Surface.ROTATION_0: case Surface.ROTATION_180: - height = mContext.getResources().getDimensionPixelSize( + height = userContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.navigation_bar_frame_height); - insetsHeight = mContext.getResources().getDimensionPixelSize( + insetsHeight = userContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.navigation_bar_height); break; case Surface.ROTATION_90: gravity = Gravity.RIGHT; - width = mContext.getResources().getDimensionPixelSize( + width = userContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.navigation_bar_width); break; case Surface.ROTATION_270: gravity = Gravity.LEFT; - width = mContext.getResources().getDimensionPixelSize( + width = userContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.navigation_bar_width); break; } @@ -1565,12 +1570,12 @@ public class NavigationBar extends ViewController implements lp.providedInternalInsets[ITYPE_NAVIGATION_BAR] = null; } lp.token = new Binder(); - lp.accessibilityTitle = mContext.getString(R.string.nav_bar); + lp.accessibilityTitle = userContext.getString(R.string.nav_bar); lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC | WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; lp.windowAnimations = 0; - lp.setTitle("NavigationBar" + mContext.getDisplayId()); + lp.setTitle("NavigationBar" + userContext.getDisplayId()); lp.setFitInsetsTypes(0 /* types */); lp.setTrustedOverlay(); return lp; diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt b/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt index 27af152223271..dae851252271b 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt @@ -23,4 +23,10 @@ import android.content.Context */ interface UserContextProvider { val userContext: Context + + /** + * Creates the {@code context} with the current user. + * @see Context#createContextAsUser(UserHandle, int) + */ + fun createCurrentUserContext(context: Context): Context } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt index 3a6248b793d06..80d5f1681a790 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt @@ -127,6 +127,12 @@ class UserTrackerImpl internal constructor( } } + override fun createCurrentUserContext(context: Context): Context { + synchronized(mutex) { + return context.createContextAsUser(userHandle, 0) + } + } + private fun setUserIdInternal(user: Int): Pair> { val profiles = userManager.getProfiles(user) val handle = UserHandle(user) diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index 3c6aa4803e864..7c303985d6512 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -85,6 +85,7 @@ import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; +import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.rotation.RotationButtonController; import com.android.systemui.statusbar.CommandQueue; @@ -187,6 +188,8 @@ public class NavigationBarTest extends SysuiTestCase { private DeadZone mDeadZone; @Mock private CentralSurfaces mCentralSurfaces; + @Mock + private UserContextProvider mUserContextProvider; private DeviceConfigProxyFake mDeviceConfigProxyFake = new DeviceConfigProxyFake(); @Rule @@ -210,6 +213,8 @@ public class NavigationBarTest extends SysuiTestCase { when(mNavigationBarTransitions.getLightTransitionsController()) .thenReturn(mLightBarTransitionsController); when(mStatusBarKeyguardViewManager.isNavBarVisible()).thenReturn(true); + when(mUserContextProvider.createCurrentUserContext(any(Context.class))) + .thenReturn(mContext); setupSysuiDependency(); // This class inflates views that call Dependency.get, thus these injections are still // necessary. @@ -458,7 +463,8 @@ public class NavigationBarTest extends SysuiTestCase { mDeadZone, mDeviceConfigProxyFake, mNavigationBarTransitions, - Optional.of(mock(BackAnimation.class)))); + Optional.of(mock(BackAnimation.class)), + mUserContextProvider)); } private void processAllMessages() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt index e9d16a6738ca3..64a93cf2c8dc9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt @@ -53,7 +53,6 @@ import org.mockito.Mock import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.Mockito.never -import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.ArgumentMatchers.anyInt