diff options
| author | 2020-07-23 16:19:36 +0800 | |
|---|---|---|
| committer | 2020-07-30 17:33:06 +0800 | |
| commit | c3728f6f4596e396019e617e5b4c70d051ea57d7 (patch) | |
| tree | c1b727c42c5548112b0e3923df97e44166a8d874 | |
| parent | 7a6667d617b7bca5fc4373e8a050e69d2c0ea8a1 (diff) | |
Fixes the invisible unknownApps blocking keyguard transition.
An activity can be added into unknownAppVisibility controller if it
does not declared as noDisplay and it was started before keyguard
unlocked.
If that activity start another activity and finish itself immediately,
the app transition controller will stuck in the status because
unknownApp is not resolved.
And before the keyguard transition been executed, if anything trigger
to prepare new app transition, we will reset the 5 seconds timeout
even if the keyguard transition didn't been overwrite, which extends
original timeout.
To fix this issue, we should remove the activity from unknown apps
once it must become invisible.
Also we don't need to reset app transition timeout if
prepareAppTransition doesn't apply new transition.
Fixes: 161499433
Test: atest AppTransitionTests KeyguardTransitionTests
KeyguardLockedTests UnknownAppVisibilityControllerTest
Change-Id: Ia9aed128fa44f3677e8a420aa9e81aac983bf9a2
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); |