Merge "Do not force-show system bars in desktop's full immersive mode" into main
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index c062f5a..04a625b 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -79,6 +79,7 @@
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+import static com.android.window.flags.Flags.enableFullyImmersiveInDesktop;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -2515,10 +2516,16 @@
defaultTaskDisplayArea.getRootTask(task -> task.isVisible()
&& task.getTopLeafTask().getAdjacentTask() != null)
!= null;
- final boolean freeformRootTaskVisible =
- defaultTaskDisplayArea.isRootTaskVisible(WINDOWING_MODE_FREEFORM);
+ final Task topFreeformTask = defaultTaskDisplayArea
+ .getTopRootTaskInWindowingMode(WINDOWING_MODE_FREEFORM);
+ final boolean freeformRootTaskVisible = topFreeformTask != null
+ && topFreeformTask.isVisible();
+ final boolean inNonFullscreenFreeformMode = freeformRootTaskVisible
+ && !topFreeformTask.getBounds().equals(mDisplayContent.getBounds());
- getInsetsPolicy().updateSystemBars(win, adjacentTasksVisible, freeformRootTaskVisible);
+ getInsetsPolicy().updateSystemBars(win, adjacentTasksVisible,
+ enableFullyImmersiveInDesktop()
+ ? inNonFullscreenFreeformMode : freeformRootTaskVisible);
final boolean topAppHidesStatusBar = topAppHidesSystemBar(Type.statusBars());
if (getStatusBar() != null) {
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index 61b13a8..24a6f118 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -628,8 +628,9 @@
return (mForcedShowingTypes & types) == types;
}
- void updateSystemBars(WindowState win, boolean inSplitScreenMode, boolean inFreeformMode) {
- mForcedShowingTypes = (inSplitScreenMode || inFreeformMode)
+ void updateSystemBars(WindowState win, boolean inSplitScreenMode,
+ boolean inNonFullscreenFreeformMode) {
+ mForcedShowingTypes = (inSplitScreenMode || inNonFullscreenFreeformMode)
? (Type.statusBars() | Type.navigationBars())
: forceShowingNavigationBars(win)
? Type.navigationBars()
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
index b26c267..d2cf03d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -41,7 +41,10 @@
import static org.mockito.Mockito.verify;
import android.app.StatusBarManager;
+import android.graphics.Rect;
import android.os.Binder;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.view.InsetsFrameProvider;
import android.view.InsetsSource;
@@ -52,6 +55,7 @@
import androidx.test.filters.SmallTest;
import com.android.server.statusbar.StatusBarManagerInternal;
+import com.android.window.flags.Flags;
import org.junit.Before;
import org.junit.Test;
@@ -95,6 +99,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
public void testControlsForDispatch_freeformTaskVisible() {
addStatusBar();
addNavigationBar();
@@ -108,6 +113,37 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+ public void testControlsForDispatch_fullscreenFreeformTaskVisible() {
+ addStatusBar();
+ addNavigationBar();
+
+ final WindowState win = createWindow(null, WINDOWING_MODE_FREEFORM,
+ ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app");
+ win.setBounds(new Rect());
+ final InsetsSourceControl[] controls = addWindowAndGetControlsForDispatch(win);
+
+ // The freeform (w/fullscreen bounds) app window can control both system bars.
+ assertNotNull(controls);
+ assertEquals(2, controls.length);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP)
+ public void testControlsForDispatch_nonFullscreenFreeformTaskVisible() {
+ addStatusBar();
+ addNavigationBar();
+
+ final WindowState win = createWindow(null, WINDOWING_MODE_FREEFORM,
+ ACTIVITY_TYPE_STANDARD, TYPE_APPLICATION, mDisplayContent, "app");
+ win.getTask().setBounds(new Rect(1, 1, 10, 10));
+ final InsetsSourceControl[] controls = addWindowAndGetControlsForDispatch(win);
+
+ // The freeform (but not fullscreen bounds) app window must not control any system bars.
+ assertNull(controls);
+ }
+
+ @Test
public void testControlsForDispatch_forceStatusBarVisible() {
addStatusBar().mAttrs.forciblyShownTypes |= statusBars();
addNavigationBar();