diff options
3 files changed, 22 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index dd67b3d2c330..f6c4d698b390 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -4114,6 +4114,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Now that the app is going invisible, we can remove it. It will be restarted // if made visible again. removeDeadWindows(); + // If this activity is about to finish/stopped and now becomes invisible, remove it + // from the unknownApp list in case the activity does not want to draw anything, which + // keep the user waiting for the next transition to start. + if (finishing || isState(STOPPED)) { + displayContent.mUnknownAppVisibilityController.appRemovedOrHidden(this); + } } else { if (!appTransition.isTransitionSet() && appTransition.isReady()) { diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 3abc54f8f2eb..a50ba1b43753 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -337,6 +337,11 @@ public class AppTransition implements Dump { mNextAppTransitionFlags |= flags; setLastAppTransition(TRANSIT_UNSET, null, null, null); updateBooster(); + if (isTransitionSet()) { + removeAppTransitionTimeoutCallbacks(); + mHandler.postDelayed(mHandleAppTransitionTimeoutRunnable, + APP_TRANSITION_TIMEOUT_MS); + } } void setLastAppTransition(int transit, ActivityRecord openingApp, ActivityRecord closingApp, @@ -2229,12 +2234,7 @@ public class AppTransition implements Dump { setAppTransition(transit, flags); } } - boolean prepared = prepare(); - if (isTransitionSet()) { - removeAppTransitionTimeoutCallbacks(); - mHandler.postDelayed(mHandleAppTransitionTimeoutRunnable, APP_TRANSITION_TIMEOUT_MS); - } - return prepared; + return prepare(); } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java index e8a4e90b1aa1..75ed928b08a0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java @@ -79,6 +79,16 @@ public class UnknownAppVisibilityControllerTest extends WindowTestsBase { } @Test + public void testRemoveFinishingInvisibleActivityFromUnknown() { + final ActivityRecord activity = WindowTestUtils.createTestActivityRecord(mDisplayContent); + mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(activity); + activity.finishing = true; + activity.mVisibleRequested = true; + activity.setVisibility(false, false); + assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved()); + } + + @Test public void testAppRemoved() { final ActivityRecord activity = WindowTestUtils.createTestActivityRecord(mDisplayContent); mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(activity); |