Force consuming system bars if nav bar is shown forcibly

This makes the decor view consumes the navigation bar insets, so the app
content won't be overlapped with navigation bar.

Fix: 276506304
Fix: 280915087
Test: Open immersive apps in kids mode. Make sure the app content won't
      be obscured by the visible navigation bar.
Change-Id: Ica4339f4bf9a71fd524501e60a9f69fb53a0bb56
This commit is contained in:
Tiger
2023-06-13 17:22:44 +08:00
parent a85de1fbc6
commit 150c1a9e2f
4 changed files with 17 additions and 7 deletions

View File

@@ -177,7 +177,8 @@ public class InsetsState implements Parcelable {
if ((legacyWindowFlags & FLAG_FULLSCREEN) != 0) {
compatInsetsTypes &= ~statusBars();
}
if (clearsCompatInsets(windowType, legacyWindowFlags, windowingMode)) {
if (clearsCompatInsets(windowType, legacyWindowFlags, windowingMode)
&& !alwaysConsumeSystemBars) {
compatInsetsTypes = 0;
}

View File

@@ -1111,8 +1111,13 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
: controller.getSystemBarsAppearance();
if (insets != null) {
final boolean clearsCompatInsets = clearsCompatInsets(attrs.type, attrs.flags,
getResources().getConfiguration().windowConfiguration.getWindowingMode());
mLastShouldAlwaysConsumeSystemBars = insets.shouldAlwaysConsumeSystemBars();
final boolean clearsCompatInsets =
clearsCompatInsets(attrs.type, attrs.flags,
getResources().getConfiguration().windowConfiguration
.getWindowingMode())
&& !mLastShouldAlwaysConsumeSystemBars;
final Insets stableBarInsets = insets.getInsetsIgnoringVisibility(
WindowInsets.Type.systemBars());
final Insets systemInsets = clearsCompatInsets
@@ -1143,7 +1148,6 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
disallowAnimate |= (hasLeftStableInset != mLastHasLeftStableInset);
mLastHasLeftStableInset = hasLeftStableInset;
mLastShouldAlwaysConsumeSystemBars = insets.shouldAlwaysConsumeSystemBars();
mLastSuppressScrimTypes = insets.getSuppressScrimTypes();
}

View File

@@ -2368,7 +2368,8 @@ public class DisplayPolicy {
// We need to force the consumption of the system bars if they are force shown or if they
// are controlled by a remote insets controller.
mForceConsumeSystemBars = mForceShowSystemBars
|| mDisplayContent.getInsetsPolicy().remoteInsetsControllerControlsSystemBars(win);
|| getInsetsPolicy().remoteInsetsControllerControlsSystemBars(win)
|| getInsetsPolicy().forcesShowingNavigationBars(win);
mDisplayContent.getInsetsPolicy().updateBarControlTarget(win);
final boolean topAppHidesStatusBar = topAppHidesSystemBar(Type.statusBars());

View File

@@ -567,8 +567,7 @@ class InsetsPolicy {
return focusedWin;
}
}
if (mPolicy.isForceShowNavigationBarEnabled() && focusedWin != null
&& focusedWin.getActivityType() == ACTIVITY_TYPE_STANDARD) {
if (forcesShowingNavigationBars(focusedWin)) {
// When "force show navigation bar" is enabled, it means both force visible is true, and
// we are in 3-button navigation. In this mode, the navigation bar is forcibly shown
// when activity type is ACTIVITY_TYPE_STANDARD which means Launcher or Recent could
@@ -604,6 +603,11 @@ class InsetsPolicy {
return focusedWin;
}
boolean forcesShowingNavigationBars(WindowState win) {
return mPolicy.isForceShowNavigationBarEnabled() && win != null
&& win.getActivityType() == ACTIVITY_TYPE_STANDARD;
}
/**
* Determines whether the remote insets controller should take control of system bars for all
* windows.