Merge "Avoid applying closing animation for invisible activity."

This commit is contained in:
Issei Suzuki
2021-06-18 10:22:30 +00:00
committed by Android (Google) Code Review
3 changed files with 90 additions and 4 deletions

View File

@@ -4714,7 +4714,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (visible) {
displayContent.mOpeningApps.add(this);
mEnteringAnimation = true;
} else {
} else if (mVisible) {
displayContent.mClosingApps.add(this);
mEnteringAnimation = false;
}

View File

@@ -2732,6 +2732,85 @@ public class ActivityRecordTests extends WindowTestsBase {
> activity.getConfiguration().windowConfiguration.getAppBounds().height());
}
@Test
public void testSetVisibility_visibleToVisible() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
.setCreateTask(true).build();
// By default, activity is visible.
assertTrue(activity.isVisible());
assertTrue(activity.mVisibleRequested);
assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
// Request the activity to be visible. Although the activity is already visible, app
// transition animation should be applied on this activity. This might be unnecessary, but
// until we verify no logic relies on this behavior, we'll keep this as is.
activity.setVisibility(true);
assertTrue(activity.isVisible());
assertTrue(activity.mVisibleRequested);
assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
}
@Test
public void testSetVisibility_visibleToInvisible() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
.setCreateTask(true).build();
// By default, activity is visible.
assertTrue(activity.isVisible());
assertTrue(activity.mVisibleRequested);
assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
// Request the activity to be invisible. Since the visibility changes, app transition
// animation should be applied on this activity.
activity.setVisibility(false);
assertTrue(activity.isVisible());
assertFalse(activity.mVisibleRequested);
assertFalse(activity.mDisplayContent.mOpeningApps.contains(activity));
assertTrue(activity.mDisplayContent.mClosingApps.contains(activity));
}
@Test
public void testSetVisibility_invisibleToVisible() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
.setCreateTask(true).setVisible(false).build();
// Activiby is invisible. However ATMS requests it to become visible, since this is a top
// activity.
assertFalse(activity.isVisible());
assertTrue(activity.mVisibleRequested);
assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
// Request the activity to be visible. Since the visibility changes, app transition
// animation should be applied on this activity.
activity.setVisibility(true);
assertFalse(activity.isVisible());
assertTrue(activity.mVisibleRequested);
assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
}
@Test
public void testSetVisibility_invisibleToInvisible() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
.setCreateTask(true).setVisible(false).build();
// Activiby is invisible. However ATMS requests it to become visible, since this is a top
// activity.
assertFalse(activity.isVisible());
assertTrue(activity.mVisibleRequested);
assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
// Request the activity to be invisible. Since the activity is already invisible, no app
// transition should be applied on this activity.
activity.setVisibility(false);
assertFalse(activity.isVisible());
assertFalse(activity.mVisibleRequested);
assertFalse(activity.mDisplayContent.mOpeningApps.contains(activity));
assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
}
private void assertHasStartingWindow(ActivityRecord atoken) {
assertNotNull(atoken.mStartingSurface);
assertNotNull(atoken.mStartingData);

View File

@@ -861,6 +861,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
private Bundle mIntentExtras;
private boolean mOnTop = false;
private ActivityInfo.WindowLayout mWindowLayout;
private boolean mVisible = true;
ActivityBuilder(ActivityTaskManagerService service) {
mService = service;
@@ -986,6 +987,11 @@ class WindowTestsBase extends SystemServiceTestsBase {
return this;
}
ActivityBuilder setVisible(boolean visible) {
mVisible = visible;
return this;
}
ActivityRecord build() {
SystemServicesTestRule.checkHoldsLock(mService.mGlobalLock);
try {
@@ -1068,9 +1074,10 @@ class WindowTestsBase extends SystemServiceTestsBase {
// root tasks (e.g. home root task).
mTask.moveToFront("createActivity");
}
// Make visible by default...
activity.mVisibleRequested = true;
activity.setVisible(true);
if (mVisible) {
activity.mVisibleRequested = true;
activity.setVisible(true);
}
}
final WindowProcessController wpc;