From a281e3e2376b245daff65b7582c699e0637da984 Mon Sep 17 00:00:00 2001 From: Tiger Date: Fri, 17 Feb 2023 17:37:55 +0800 Subject: [PATCH] Don't show status bar while swiping on visible taskbar If the swipe target is visible navigation bar, don't show status bar. The existing logic apply the rule above only when the swipe target is the traditional navigation bar (with window type TYPE_NAVIGATION_BAR), but this CL applies to the target which provides Type.navigationBars. Fix: 263251179 Test: Swipe on visible taskbar and see if status bar becomes visible in an app (Window Insets Controller) which only hides status bar. Change-Id: I966fd87b5a02169ef8b7c7b952ac0abed1110d65 --- .../com/android/server/wm/DisplayPolicy.java | 3 +- .../android/server/wm/DisplayPolicyTests.java | 28 ++++++++----------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 7aeebbc2c585b..2b34660d307fc 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1940,7 +1940,8 @@ public class DisplayPolicy { final @InsetsType int restorePositionTypes = (Type.statusBars() | Type.navigationBars()) & controlTarget.getRequestedVisibleTypes(); - if (swipeTarget == mNavigationBar + final InsetsSourceProvider sp = swipeTarget.getControllableInsetProvider(); + if (sp != null && sp.getSource().getType() == Type.navigationBars() && (restorePositionTypes & Type.navigationBars()) != 0) { // Don't show status bar when swiping on already visible navigation bar. // But restore the position of navigation bar if it has been moved by the control diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index 6bb77694b8cbd..c694707743f68 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -26,6 +26,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static android.view.WindowInsets.Type.navigationBars; import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; +import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; @@ -46,13 +47,7 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.graphics.PixelFormat; @@ -367,23 +362,24 @@ public class DisplayPolicyTests extends WindowTestsBase { assertEquals(attrs.height - 10, navBarSource.getFrame().height()); } + @SetupWindows(addWindows = { W_ACTIVITY, W_NAVIGATION_BAR }) @Test public void testCanSystemBarsBeShownByUser() { ((TestWindowManagerPolicy) mWm.mPolicy).mIsUserSetupComplete = true; + mAppWindow.mAttrs.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; + mAppWindow.setRequestedVisibleTypes(0, navigationBars()); final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); - final WindowState windowState = mock(WindowState.class); - final InsetsSourceProvider provider = mock(InsetsSourceProvider.class); - final InsetsControlTarget controlTarget = mock(InsetsControlTarget.class); - when(provider.getControlTarget()).thenReturn(controlTarget); - when(windowState.getControllableInsetProvider()).thenReturn(provider); - when(controlTarget.isRequestedVisible(anyInt())).thenReturn(true); + displayPolicy.addWindowLw(mNavBarWindow, mNavBarWindow.mAttrs); + final InsetsSourceProvider navBarProvider = mNavBarWindow.getControllableInsetProvider(); + navBarProvider.updateControlForTarget(mAppWindow, false); + navBarProvider.getSource().setVisible(false); displayPolicy.setCanSystemBarsBeShownByUser(false); - displayPolicy.requestTransientBars(windowState, true); - verify(controlTarget, never()).showInsets(anyInt(), anyBoolean(), any() /* statsToken */); + displayPolicy.requestTransientBars(mNavBarWindow, true); + assertFalse(mDisplayContent.getInsetsPolicy().isTransient(navigationBars())); displayPolicy.setCanSystemBarsBeShownByUser(true); - displayPolicy.requestTransientBars(windowState, true); - verify(controlTarget).showInsets(anyInt(), anyBoolean(), any() /* statsToken */); + displayPolicy.requestTransientBars(mNavBarWindow, true); + assertTrue(mDisplayContent.getInsetsPolicy().isTransient(navigationBars())); } }