Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 150c1a9e authored by Tiger's avatar Tiger
Browse files

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
parent a85de1fb
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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;
        }

+7 −3
Original line number Diff line number Diff line
@@ -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();
            }

+2 −1
Original line number Diff line number Diff line
@@ -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());
+6 −2
Original line number Diff line number Diff line
@@ -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.