diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 7bd3565421467..c5a2ecc0b997a 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -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; } @@ -4817,11 +4817,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * this has become invisible. */ private void postApplyAnimation(boolean visible) { - final boolean usingShellTransitions = - mAtmService.getTransitionController().getTransitionPlayer() != null; final boolean delayed = isAnimating(PARENTS | CHILDREN, ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_WINDOW_ANIMATION); - if (!delayed && !usingShellTransitions) { + if (!delayed) { // We aren't delayed anything, but exiting windows rely on the animation finished // callback being called in case the ActivityRecord was pretending to be delayed, // which we might have done because we were in closing/opening apps list. @@ -4840,8 +4838,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // updated. // If we're becoming invisible, update the client visibility if we are not running an // animation. Otherwise, we'll update client visibility in onAnimationFinished. - if (visible || !isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION) - || usingShellTransitions) { + if (visible || !isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION)) { setClientVisible(visible); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index b03a66ca22cad..0409a8c913e77 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -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); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 4ce674b21c6b7..050fd80411fc9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -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;