Loading core/java/android/app/WindowConfiguration.java +0 −3 Original line number Diff line number Diff line Loading @@ -796,9 +796,6 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu /** * Returns {@code true} if the windowingMode represents a window in multi-window mode. * I.e. sharing the screen with another activity. * * TODO(b/171672645): This API could be misleading - in 'undefined' mode it's determined by the * parent's mode * @hide */ public static boolean inMultiWindowMode(int windowingMode) { Loading services/core/java/com/android/server/wm/Task.java +12 −7 Original line number Diff line number Diff line Loading @@ -2847,13 +2847,18 @@ class Task extends WindowContainer<WindowContainer> { getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode(windowingMode); } // Do not allow non-resizable non-pinned tasks to be in a multi-window mode - they should // use their parent's windowing mode, or fullscreen. if (!isResizeable() && windowingMode != WINDOWING_MODE_PINNED && WindowConfiguration.inMultiWindowMode(windowingMode)) { windowingMode = WindowConfiguration.inMultiWindowMode(parentWindowingMode) ? WINDOWING_MODE_FULLSCREEN : parentWindowingMode; getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode(windowingMode); // Do not allow non-resizable tasks to be in a multi-window mode, unless it is in pinned // windowing mode or is in size compat freeform mode if (!isResizeable()) { final int candidateWindowingMode = windowingMode != WINDOWING_MODE_UNDEFINED ? windowingMode : parentWindowingMode; if (WindowConfiguration.inMultiWindowMode(candidateWindowingMode) && candidateWindowingMode != WINDOWING_MODE_PINNED && (candidateWindowingMode != WINDOWING_MODE_FREEFORM || !mStackSupervisor.mService.mSizeCompatFreeform)) { getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode( WINDOWING_MODE_FULLSCREEN); } } if (isLeafTask()) { Loading services/tests/wmtests/src/com/android/server/wm/TaskTests.java +37 −0 Original line number Diff line number Diff line Loading @@ -17,11 +17,15 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; Loading @@ -33,6 +37,8 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.clearInvocations; import android.app.WindowConfiguration; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; Loading Loading @@ -220,4 +226,35 @@ public class TaskTests extends WindowTestsBase { assertTrue(activity1.isVisible()); assertTrue(activity2.isVisible()); } @Test public void testResolveNonResizableTaskWindowingMode() { final Task task = createTaskStackOnDisplay(mDisplayContent); Configuration parentConfig = task.getParent().getConfiguration(); parentConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM); doReturn(false).when(task).isResizeable(); WindowConfiguration requestedOverride = task.getRequestedOverrideConfiguration().windowConfiguration; WindowConfiguration resolvedOverride = task.getResolvedOverrideConfiguration().windowConfiguration; // The resolved override windowing mode of a non-resizeable task should be resolved as // fullscreen even as a child of a freeform display. requestedOverride.setWindowingMode(WINDOWING_MODE_UNDEFINED); task.resolveOverrideConfiguration(parentConfig); assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_FULLSCREEN); // The resolved override windowing mode of a non-resizeable task should be resolved as // fullscreen, even when requested as freeform windowing mode requestedOverride.setWindowingMode(WINDOWING_MODE_FREEFORM); task.resolveOverrideConfiguration(parentConfig); assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_FULLSCREEN); // The resolved override windowing mode of a non-resizeable task can be undefined as long // as its parents is not in multi-window mode. parentConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); requestedOverride.setWindowingMode(WINDOWING_MODE_UNDEFINED); task.resolveOverrideConfiguration(parentConfig); assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_UNDEFINED); } } Loading
core/java/android/app/WindowConfiguration.java +0 −3 Original line number Diff line number Diff line Loading @@ -796,9 +796,6 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu /** * Returns {@code true} if the windowingMode represents a window in multi-window mode. * I.e. sharing the screen with another activity. * * TODO(b/171672645): This API could be misleading - in 'undefined' mode it's determined by the * parent's mode * @hide */ public static boolean inMultiWindowMode(int windowingMode) { Loading
services/core/java/com/android/server/wm/Task.java +12 −7 Original line number Diff line number Diff line Loading @@ -2847,13 +2847,18 @@ class Task extends WindowContainer<WindowContainer> { getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode(windowingMode); } // Do not allow non-resizable non-pinned tasks to be in a multi-window mode - they should // use their parent's windowing mode, or fullscreen. if (!isResizeable() && windowingMode != WINDOWING_MODE_PINNED && WindowConfiguration.inMultiWindowMode(windowingMode)) { windowingMode = WindowConfiguration.inMultiWindowMode(parentWindowingMode) ? WINDOWING_MODE_FULLSCREEN : parentWindowingMode; getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode(windowingMode); // Do not allow non-resizable tasks to be in a multi-window mode, unless it is in pinned // windowing mode or is in size compat freeform mode if (!isResizeable()) { final int candidateWindowingMode = windowingMode != WINDOWING_MODE_UNDEFINED ? windowingMode : parentWindowingMode; if (WindowConfiguration.inMultiWindowMode(candidateWindowingMode) && candidateWindowingMode != WINDOWING_MODE_PINNED && (candidateWindowingMode != WINDOWING_MODE_FREEFORM || !mStackSupervisor.mService.mSizeCompatFreeform)) { getResolvedOverrideConfiguration().windowConfiguration.setWindowingMode( WINDOWING_MODE_FULLSCREEN); } } if (isLeafTask()) { Loading
services/tests/wmtests/src/com/android/server/wm/TaskTests.java +37 −0 Original line number Diff line number Diff line Loading @@ -17,11 +17,15 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; Loading @@ -33,6 +37,8 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.clearInvocations; import android.app.WindowConfiguration; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; Loading Loading @@ -220,4 +226,35 @@ public class TaskTests extends WindowTestsBase { assertTrue(activity1.isVisible()); assertTrue(activity2.isVisible()); } @Test public void testResolveNonResizableTaskWindowingMode() { final Task task = createTaskStackOnDisplay(mDisplayContent); Configuration parentConfig = task.getParent().getConfiguration(); parentConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM); doReturn(false).when(task).isResizeable(); WindowConfiguration requestedOverride = task.getRequestedOverrideConfiguration().windowConfiguration; WindowConfiguration resolvedOverride = task.getResolvedOverrideConfiguration().windowConfiguration; // The resolved override windowing mode of a non-resizeable task should be resolved as // fullscreen even as a child of a freeform display. requestedOverride.setWindowingMode(WINDOWING_MODE_UNDEFINED); task.resolveOverrideConfiguration(parentConfig); assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_FULLSCREEN); // The resolved override windowing mode of a non-resizeable task should be resolved as // fullscreen, even when requested as freeform windowing mode requestedOverride.setWindowingMode(WINDOWING_MODE_FREEFORM); task.resolveOverrideConfiguration(parentConfig); assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_FULLSCREEN); // The resolved override windowing mode of a non-resizeable task can be undefined as long // as its parents is not in multi-window mode. parentConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); requestedOverride.setWindowingMode(WINDOWING_MODE_UNDEFINED); task.resolveOverrideConfiguration(parentConfig); assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_UNDEFINED); } }