diff options
9 files changed, 51 insertions, 17 deletions
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 01cc9d82d56d..76705dcdd3d2 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -308,12 +308,18 @@ public class TaskInfo { public boolean isSleeping; /** - * Whether the top activity fillsParent() is false + * Whether the top activity fillsParent() is false. * @hide */ public boolean isTopActivityTransparent; /** + * Whether fillsParent() is false for every activity in the tasks stack. + * @hide + */ + public boolean isActivityStackTransparent; + + /** * The last non-fullscreen bounds the task was launched in or resized to. * @hide */ @@ -489,6 +495,7 @@ public class TaskInfo { && parentTaskId == that.parentTaskId && Objects.equals(topActivity, that.topActivity) && isTopActivityTransparent == that.isTopActivityTransparent + && isActivityStackTransparent == that.isActivityStackTransparent && Objects.equals(lastNonFullscreenBounds, that.lastNonFullscreenBounds) && Objects.equals(capturedLink, that.capturedLink) && capturedLinkTimestamp == that.capturedLinkTimestamp @@ -567,6 +574,7 @@ public class TaskInfo { mTopActivityLocusId = source.readTypedObject(LocusId.CREATOR); displayAreaFeatureId = source.readInt(); isTopActivityTransparent = source.readBoolean(); + isActivityStackTransparent = source.readBoolean(); lastNonFullscreenBounds = source.readTypedObject(Rect.CREATOR); capturedLink = source.readTypedObject(Uri.CREATOR); capturedLinkTimestamp = source.readLong(); @@ -623,6 +631,7 @@ public class TaskInfo { dest.writeTypedObject(mTopActivityLocusId, flags); dest.writeInt(displayAreaFeatureId); dest.writeBoolean(isTopActivityTransparent); + dest.writeBoolean(isActivityStackTransparent); dest.writeTypedObject(lastNonFullscreenBounds, flags); dest.writeTypedObject(capturedLink, flags); dest.writeLong(capturedLinkTimestamp); @@ -668,6 +677,7 @@ public class TaskInfo { + " locusId=" + mTopActivityLocusId + " displayAreaFeatureId=" + displayAreaFeatureId + " isTopActivityTransparent=" + isTopActivityTransparent + + " isActivityStackTransparent=" + isActivityStackTransparent + " lastNonFullscreenBounds=" + lastNonFullscreenBounds + " capturedLink=" + capturedLink + " capturedLinkTimestamp=" + capturedLinkTimestamp diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/AppCompatUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/AppCompatUtils.kt index 62d5098f2a27..bc56637b2a1e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/AppCompatUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/AppCompatUtils.kt @@ -30,7 +30,7 @@ import com.android.internal.R * desktop windowing environment. */ fun isTopActivityExemptFromDesktopWindowing(context: Context, task: TaskInfo) = - (isSystemUiTask(context, task) || (task.isTopActivityTransparent && task.numActivities == 1)) + (isSystemUiTask(context, task) || (task.numActivities > 0 && task.isActivityStackTransparent)) && !task.isTopActivityNoDisplay private fun isSystemUiTask(context: Context, task: TaskInfo): Boolean { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java index 310c2d725c09..ec3fe95f7bef 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java @@ -54,6 +54,7 @@ public final class TestRunningTaskInfoBuilder { private final Point mPositionInParent = new Point(); private boolean mIsVisible = false; private boolean mIsTopActivityTransparent = false; + private boolean mIsActivityStackTransparent = false; private int mNumActivities = 1; private long mLastActiveTime; @@ -158,6 +159,12 @@ public final class TestRunningTaskInfoBuilder { return this; } + public TestRunningTaskInfoBuilder setActivityStackTransparent( + boolean isActivityStackTransparent) { + mIsActivityStackTransparent = isActivityStackTransparent; + return this; + } + public TestRunningTaskInfoBuilder setNumActivities(int numActivities) { mNumActivities = numActivities; return this; @@ -187,6 +194,7 @@ public final class TestRunningTaskInfoBuilder { info.positionInParent = mPositionInParent; info.isVisible = mIsVisible; info.isTopActivityTransparent = mIsTopActivityTransparent; + info.isActivityStackTransparent = mIsActivityStackTransparent; info.numActivities = mNumActivities; info.lastActiveTime = mLastActiveTime; info.userId = mUserId; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/AppCompatUtilsTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/AppCompatUtilsTest.kt index 1d390007d470..d52fd4fdf6c7 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/AppCompatUtilsTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/AppCompatUtilsTest.kt @@ -37,35 +37,46 @@ import org.junit.runner.RunWith @SmallTest class AppCompatUtilsTest : ShellTestCase() { @Test - fun testIsTopActivityExemptFromDesktopWindowing_topActivityTransparent() { + fun testIsTopActivityExemptFromDesktopWindowing_onlyTransparentActivitiesInStack() { assertTrue(isTopActivityExemptFromDesktopWindowing(mContext, createFreeformTask(/* displayId */ 0) .apply { - isTopActivityTransparent = true - numActivities = 1 + isActivityStackTransparent = true isTopActivityNoDisplay = false + numActivities = 1 })) } @Test - fun testIsTopActivityExemptFromDesktopWindowing_topActivityTransparent_multipleActivities() { + fun testIsTopActivityExemptFromDesktopWindowing_noActivitiesInStack() { assertFalse(isTopActivityExemptFromDesktopWindowing(mContext, createFreeformTask(/* displayId */ 0) .apply { - isTopActivityTransparent = true - numActivities = 2 + isActivityStackTransparent = true isTopActivityNoDisplay = false + numActivities = 0 })) } @Test - fun testIsTopActivityExemptFromDesktopWindowing_topActivityTransparent_notDisplayed() { + fun testIsTopActivityExemptFromDesktopWindowing_nonTransparentActivitiesInStack() { assertFalse(isTopActivityExemptFromDesktopWindowing(mContext, createFreeformTask(/* displayId */ 0) .apply { - isTopActivityTransparent = true + isActivityStackTransparent = false + isTopActivityNoDisplay = false numActivities = 1 + })) + } + + @Test + fun testIsTopActivityExemptFromDesktopWindowing_transparentActivityStack_notDisplayed() { + assertFalse(isTopActivityExemptFromDesktopWindowing(mContext, + createFreeformTask(/* displayId */ 0) + .apply { + isActivityStackTransparent = true isTopActivityNoDisplay = true + numActivities = 1 })) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index c10434aa6d6f..f4255880608e 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -1151,7 +1151,7 @@ class DesktopTasksControllerTest : ShellTestCase() { fun moveRunningTaskToDesktop_topActivityTranslucentWithoutDisplay_taskIsMovedToDesktop() { val task = setUpFullscreenTask().apply { - isTopActivityTransparent = true + isActivityStackTransparent = true isTopActivityNoDisplay = true numActivities = 1 } @@ -1167,7 +1167,7 @@ class DesktopTasksControllerTest : ShellTestCase() { fun moveRunningTaskToDesktop_topActivityTranslucentWithDisplay_doesNothing() { val task = setUpFullscreenTask().apply { - isTopActivityTransparent = true + isActivityStackTransparent = true isTopActivityNoDisplay = false numActivities = 1 } @@ -2260,7 +2260,7 @@ class DesktopTasksControllerTest : ShellTestCase() { val task = setUpFullscreenTask().apply { - isTopActivityTransparent = true + isActivityStackTransparent = true isTopActivityNoDisplay = true numActivities = 1 } @@ -2278,7 +2278,7 @@ class DesktopTasksControllerTest : ShellTestCase() { val task = setUpFreeformTask().apply { - isTopActivityTransparent = true + isActivityStackTransparent = true isTopActivityNoDisplay = false numActivities = 1 } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt index 866d1b3880b0..aee8821a63f6 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt @@ -73,10 +73,10 @@ object DesktopTestHelpers { .setLastActiveTime(100) .build() - /** Create a new System Modal task, i.e. a task with a single transparent activity. */ + /** Create a new System Modal task, i.e. a task with only transparent activities. */ fun createSystemModalTask(displayId: Int = DEFAULT_DISPLAY): RunningTaskInfo = createFullscreenTaskBuilder(displayId) - .setTopActivityTransparent(true) + .setActivityStackTransparent(true) .setNumActivities(1) .build() } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt index b9d7bbf567b7..c33005e7cfcc 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt @@ -43,6 +43,10 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +/** + * Tests for {@link SystemModalsTransitionHandler} + * Usage: atest WMShellUnitTests:SystemModalsTransitionHandlerTest + */ @SmallTest @RunWith(AndroidTestingRunner::class) class SystemModalsTransitionHandlerTest : ShellTestCase() { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index a4e3af47edaa..117c85e322ad 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -278,7 +278,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) fun testDecorationIsNotCreatedForTopTranslucentActivities() { val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN).apply { - isTopActivityTransparent = true + isActivityStackTransparent = true isTopActivityNoDisplay = false numActivities = 1 } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index f090ef1b72e9..4ed120631bd5 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3425,6 +3425,7 @@ class Task extends TaskFragment { info.isTopActivityNoDisplay = top != null && top.isNoDisplay(); info.isSleeping = shouldSleepActivities(); info.isTopActivityTransparent = top != null && !top.fillsParent(); + info.isActivityStackTransparent = !topTask.forAllActivities(r -> (r.occludesParent())); info.lastNonFullscreenBounds = topTask.mLastNonFullscreenBounds; final WindowState windowState = top != null ? top.findMainWindow(/* includeStartingApp= */ false) : null; |