summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tiger <tigerhuang@google.com> 2023-02-17 17:37:55 +0800
committer Tiger <tigerhuang@google.com> 2023-02-20 17:28:08 +0800
commita281e3e2376b245daff65b7582c699e0637da984 (patch)
tree2a7b7c554c39722b73ecba1b3d065f4a24adc06d
parente835a95134ffaeb2e2bd4b018b2d2f8fc7908825 (diff)
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
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java28
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 7aeebbc2c585..2b34660d307f 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 6bb77694b8cb..c694707743f6 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()));
}
}