summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wilsonshih <wilsonshih@google.com> 2020-07-23 16:19:36 +0800
committer wilsonshih <wilsonshih@google.com> 2020-07-30 17:33:06 +0800
commitc3728f6f4596e396019e617e5b4c70d051ea57d7 (patch)
treec1b727c42c5548112b0e3923df97e44166a8d874
parent7a6667d617b7bca5fc4373e8a050e69d2c0ea8a1 (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
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java6
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java12
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java10
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);