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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user