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
This commit is contained in:
Vali Calinescu
2023-03-09 17:00:24 +00:00
parent 82c8b4e3d0
commit 8494acd9ab
3 changed files with 26 additions and 5 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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();