From faba406212e16c7153bb03350a075df1953782dc Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Tue, 14 May 2019 15:27:17 +0200 Subject: [PATCH] GestureNav: Fix broken split screen navbar With gesture navigation, it no longer makes sense to force the navigation bar to black in split screen, instead we can show the respective navbar backgrounds of the applications. Fixes: 130913061 Test: enable gesture navigation, enter splitscreen, observe that navigation bar backgrounds are properly drawn, also verify the same if IME is open. Change-Id: If1464dd9cf0c5499c7c33caab06eb430fb59cb30 --- .../android/internal/policy/DecorView.java | 7 ++++--- core/res/res/values/config.xml | 3 ++- .../res/values/config.xml | 9 +++++++++ .../com/android/server/wm/DisplayPolicy.java | 20 +++++++++++++++---- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 1a1615026bdf0..585a27978c4f3 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -1160,16 +1160,17 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind // Note: We don't need to check for IN_SCREEN or INSET_DECOR because unlike the status bar, // these flags wouldn't make the window draw behind the navigation bar, unless // LAYOUT_HIDE_NAVIGATION was set. + boolean hideNavigation = (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0; boolean forceConsumingNavBar = (mForceWindowDrawsBarBackgrounds && (attrs.flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0 && (sysUiVisibility & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) == 0 - && (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) - || mLastShouldAlwaysConsumeSystemBars; + && !hideNavigation) + || (mLastShouldAlwaysConsumeSystemBars && hideNavigation); boolean consumingNavBar = ((attrs.flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 && (sysUiVisibility & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) == 0 - && (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) + && !hideNavigation) || forceConsumingNavBar; // If we didn't request fullscreen layout, but we still got it because of the diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 9bd56ad2f91d1..14abb77aad7d2 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3279,7 +3279,8 @@ various workspace stacks. 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always - opaque. + opaque. + 2 - Nav bar is never forced opaque. --> 0 diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml index f1d2e0b273537..96ed7b4cc3537 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> false + + 2 + true diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 21f01ff38a0eb..7badc7a437743 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -198,6 +198,8 @@ public class DisplayPolicy { private static final int NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED = 0; // Nav bar is always translucent when the freeform stack is visible, otherwise always opaque. private static final int NAV_BAR_TRANSLUCENT_WHEN_FREEFORM_OPAQUE_OTHERWISE = 1; + // Nav bar is never forced opaque. + private static final int NAV_BAR_FORCE_TRANSPARENT = 2; /** * These are the system UI flags that, when changing, can cause the layout @@ -3288,8 +3290,10 @@ public class DisplayPolicy { : mTopFullscreenOpaqueWindowState; vis = mStatusBarController.applyTranslucentFlagLw(fullscreenTransWin, vis, oldVis); vis = mNavigationBarController.applyTranslucentFlagLw(fullscreenTransWin, vis, oldVis); - final int dockedVis = mStatusBarController.applyTranslucentFlagLw( + int dockedVis = mStatusBarController.applyTranslucentFlagLw( mTopDockedOpaqueWindowState, 0, 0); + dockedVis = mNavigationBarController.applyTranslucentFlagLw( + mTopDockedOpaqueWindowState, dockedVis, 0); final boolean fullscreenDrawsStatusBarBackground = drawsStatusBarBackground(vis, mTopFullscreenOpaqueWindowState); @@ -3297,6 +3301,8 @@ public class DisplayPolicy { drawsStatusBarBackground(dockedVis, mTopDockedOpaqueWindowState); final boolean fullscreenDrawsNavBarBackground = drawsNavigationBarBackground(vis, mTopFullscreenOpaqueWindowState); + final boolean dockedDrawsNavigationBarBackground = + drawsNavigationBarBackground(dockedVis, mTopDockedOpaqueWindowState); // prevent status bar interaction from clearing certain flags int type = win.getAttrs().type; @@ -3321,7 +3327,7 @@ public class DisplayPolicy { } vis = configureNavBarOpacity(vis, dockedStackVisible, freeformStackVisible, resizing, - fullscreenDrawsNavBarBackground); + fullscreenDrawsNavBarBackground, dockedDrawsNavigationBarBackground); // update status bar boolean immersiveSticky = @@ -3439,8 +3445,14 @@ public class DisplayPolicy { */ private int configureNavBarOpacity(int visibility, boolean dockedStackVisible, boolean freeformStackVisible, boolean isDockedDividerResizing, - boolean fullscreenDrawsBackground) { - if (mNavBarOpacityMode == NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED) { + boolean fullscreenDrawsBackground, boolean dockedDrawsNavigationBarBackground) { + if (mNavBarOpacityMode == NAV_BAR_FORCE_TRANSPARENT) { + if (fullscreenDrawsBackground && dockedDrawsNavigationBarBackground) { + visibility = setNavBarTransparentFlag(visibility); + } else if (dockedStackVisible) { + visibility = setNavBarOpaqueFlag(visibility); + } + } else if (mNavBarOpacityMode == NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED) { if (dockedStackVisible || freeformStackVisible || isDockedDividerResizing) { visibility = setNavBarOpaqueFlag(visibility); } else if (fullscreenDrawsBackground) {