Loading services/core/java/com/android/server/wm/DisplayPolicy.java +11 −4 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.L 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; Loading Loading @@ -2515,10 +2516,16 @@ public class DisplayPolicy { defaultTaskDisplayArea.getRootTask(task -> task.isVisible() && task.getTopLeafTask().getAdjacentTask() != null) != null; final boolean freeformRootTaskVisible = defaultTaskDisplayArea.isRootTaskVisible(WINDOWING_MODE_FREEFORM); getInsetsPolicy().updateSystemBars(win, adjacentTasksVisible, freeformRootTaskVisible); 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, enableFullyImmersiveInDesktop() ? inNonFullscreenFreeformMode : freeformRootTaskVisible); final boolean topAppHidesStatusBar = topAppHidesSystemBar(Type.statusBars()); if (getStatusBar() != null) { Loading services/core/java/com/android/server/wm/InsetsPolicy.java +3 −2 Original line number Diff line number Diff line Loading @@ -628,8 +628,9 @@ class InsetsPolicy { 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() Loading services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +36 −0 Original line number Diff line number Diff line Loading @@ -41,7 +41,10 @@ import static org.mockito.Mockito.clearInvocations; 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; Loading @@ -52,6 +55,7 @@ import android.view.WindowInsets; 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; Loading Loading @@ -95,6 +99,7 @@ public class InsetsPolicyTest extends WindowTestsBase { } @Test @DisableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) public void testControlsForDispatch_freeformTaskVisible() { addStatusBar(); addNavigationBar(); Loading @@ -107,6 +112,37 @@ public class InsetsPolicyTest extends WindowTestsBase { assertNull(controls); } @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(); Loading Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +11 −4 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.L 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; Loading Loading @@ -2515,10 +2516,16 @@ public class DisplayPolicy { defaultTaskDisplayArea.getRootTask(task -> task.isVisible() && task.getTopLeafTask().getAdjacentTask() != null) != null; final boolean freeformRootTaskVisible = defaultTaskDisplayArea.isRootTaskVisible(WINDOWING_MODE_FREEFORM); getInsetsPolicy().updateSystemBars(win, adjacentTasksVisible, freeformRootTaskVisible); 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, enableFullyImmersiveInDesktop() ? inNonFullscreenFreeformMode : freeformRootTaskVisible); final boolean topAppHidesStatusBar = topAppHidesSystemBar(Type.statusBars()); if (getStatusBar() != null) { Loading
services/core/java/com/android/server/wm/InsetsPolicy.java +3 −2 Original line number Diff line number Diff line Loading @@ -628,8 +628,9 @@ class InsetsPolicy { 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() Loading
services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +36 −0 Original line number Diff line number Diff line Loading @@ -41,7 +41,10 @@ import static org.mockito.Mockito.clearInvocations; 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; Loading @@ -52,6 +55,7 @@ import android.view.WindowInsets; 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; Loading Loading @@ -95,6 +99,7 @@ public class InsetsPolicyTest extends WindowTestsBase { } @Test @DisableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) public void testControlsForDispatch_freeformTaskVisible() { addStatusBar(); addNavigationBar(); Loading @@ -107,6 +112,37 @@ public class InsetsPolicyTest extends WindowTestsBase { assertNull(controls); } @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(); Loading