Avoid applying closing animation for invisible activity.
In case an invisible activity requests to become invisible, we don't apply app transition animation on it. We already have a logic to prevent this in ActivityRecord#setVisibility, but it cannot handle the following scenario. 1. Activity is initially invisible. 2. Activity requests to become visible. 3. Activity requests to become invisible (so this override the second step). So this change fills the gap. Test: atest ActivityRecordTests Bug: 184107777 Merged-In: I50a0f3a8ea49beb5c86fff0f6bb8c005db581a6d Change-Id: I50a0f3a8ea49beb5c86fff0f6bb8c005db581a6d
This commit is contained in:
@@ -4568,7 +4568,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;
|
||||
}
|
||||
|
||||
@@ -2699,6 +2699,85 @@ public class ActivityRecordTests extends WindowTestsBase {
|
||||
assertFalse("Starting window should not be present", activity.hasStartingWindow());
|
||||
}
|
||||
|
||||
@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);
|
||||
|
||||
@@ -805,6 +805,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;
|
||||
@@ -930,6 +931,11 @@ class WindowTestsBase extends SystemServiceTestsBase {
|
||||
return this;
|
||||
}
|
||||
|
||||
ActivityBuilder setVisible(boolean visible) {
|
||||
mVisible = visible;
|
||||
return this;
|
||||
}
|
||||
|
||||
ActivityRecord build() {
|
||||
SystemServicesTestRule.checkHoldsLock(mService.mGlobalLock);
|
||||
try {
|
||||
@@ -1012,9 +1018,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;
|
||||
|
||||
Reference in New Issue
Block a user