From 8494acd9abb697fb35d26eaf3d2cbd412238ec63 Mon Sep 17 00:00:00 2001 From: Vali Calinescu Date: Thu, 9 Mar 2023 17:00:24 +0000 Subject: [PATCH] Change TaskInfo topActivityInSizeCompat to look at visibility Right now the TaskInfo is looking for the top activity to be resumed and in size compat mode in order to populate topActivityInSizeCompat. We want to change the "resume" to "visible", which will fix a bug where a paused activity that is in size compat mode does not have a visible restart button. Fix: 271586422 Test: atest WmTests:SizeCompatTests#testTopActivityInSizeCompatMode_pausedAndInSizeCompatMode_returnsTrue Test: atest WmTests:WindowOrganizerTests#testSizeCompatModeChangedOnFirstOrganizedTask Change-Id: I56f643210018201f18830d640e786b4fc3c246c8 --- .../core/java/com/android/server/wm/Task.java | 6 ++++-- .../android/server/wm/SizeCompatTests.java | 19 +++++++++++++++++++ .../server/wm/WindowOrganizerTests.java | 6 +++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index adaaa259e6807..131844138c03c 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3453,8 +3453,10 @@ class Task extends TaskFragment { final boolean isTopActivityResumed = top != null && top.getOrganizedTask() == this && top.isState(RESUMED); - // Whether the direct top activity is in size compat mode on foreground. - info.topActivityInSizeCompat = isTopActivityResumed && top.inSizeCompatMode(); + final boolean isTopActivityVisible = top != null + && top.getOrganizedTask() == this && top.isVisible(); + // Whether the direct top activity is in size compat mode + info.topActivityInSizeCompat = isTopActivityVisible && top.inSizeCompatMode(); if (info.topActivityInSizeCompat && mWmService.mLetterboxConfiguration.isTranslucentLetterboxingEnabled()) { // We hide the restart button in case of transparent activities. diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index d77b6ada268e0..3ab9ea9061282 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -51,6 +51,7 @@ import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANG import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_LETTERBOXED; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE; +import static com.android.server.wm.ActivityRecord.State.PAUSED; import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS; import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityRecord.State.STOPPED; @@ -3884,6 +3885,24 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(mActivity.inSizeCompatMode()); } + @Test + public void testTopActivityInSizeCompatMode_pausedAndInSizeCompatMode_returnsTrue() { + setUpDisplaySizeWithApp(1000, 2500); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + + spyOn(mActivity); + doReturn(mTask).when(mActivity).getOrganizedTask(); + prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); + + rotateDisplay(mActivity.mDisplayContent, ROTATION_90); + mActivity.setState(PAUSED, "test"); + + assertTrue(mActivity.inSizeCompatMode()); + assertEquals(mActivity.getState(), PAUSED); + assertTrue(mActivity.isVisible()); + assertTrue(mTask.getTaskInfo().topActivityInSizeCompat); + } + /** * Tests that all three paths in which aspect ratio logic can be applied yield the same * result, which is that aspect ratio is respected on app bounds. The three paths are diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index fa98537f89092..87c2a9af8c158 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -1485,9 +1485,9 @@ public class WindowOrganizerTests extends WindowTestsBase { assertEquals(rootTask.mTaskId, info.taskId); assertTrue(info.topActivityInSizeCompat); - // Ensure task info show top activity that is not in foreground as not in size compat. + // Ensure task info show top activity that is not visible as not in size compat. clearInvocations(organizer); - doReturn(false).when(activity).isState(RESUMED); + doReturn(false).when(activity).isVisible(); rootTask.onSizeCompatActivityChanged(); mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); verify(organizer).onTaskInfoChanged(infoCaptor.capture()); @@ -1497,7 +1497,7 @@ public class WindowOrganizerTests extends WindowTestsBase { // Ensure task info show non size compat top activity as not in size compat. clearInvocations(organizer); - doReturn(true).when(activity).isState(RESUMED); + doReturn(true).when(activity).isVisible(); doReturn(false).when(activity).inSizeCompatMode(); rootTask.onSizeCompatActivityChanged(); mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents();