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
This commit is contained in:
Charles Chen
2022-04-29 14:48:11 +08:00
parent e880b639cf
commit d20446ce09
5 changed files with 34 additions and 12 deletions

View File

@@ -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<NavigationBarView> 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<NavigationBarView> implements
DeadZone deadZone,
DeviceConfigProxy deviceConfigProxy,
NavigationBarTransitions navigationBarTransitions,
Optional<BackAnimation> backAnimation) {
Optional<BackAnimation> backAnimation,
UserContextProvider userContextProvider) {
super(navigationBarView);
mFrame = navigationBarFrame;
mContext = context;
@@ -550,6 +553,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mAutoHideControllerFactory = autoHideControllerFactory;
mTelecomManagerOptional = telecomManagerOptional;
mInputMethodManager = inputMethodManager;
mUserContextProvider = userContextProvider;
mNavBarMode = mNavigationModeController.addListener(mModeChangedListener);
}
@@ -1512,35 +1516,36 @@ public class NavigationBar extends ViewController<NavigationBarView> 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<NavigationBarView> 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;

View File

@@ -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
}

View File

@@ -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<Context, List<UserInfo>> {
val profiles = userManager.getProfiles(user)
val handle = UserHandle(user)

View File

@@ -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() {

View File

@@ -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