diff options
| author | 2020-07-28 17:45:06 +0800 | |
|---|---|---|
| committer | 2020-08-18 23:33:50 +0800 | |
| commit | 21d73a78ea285e7e37186cbd0239d0143dacbfb3 (patch) | |
| tree | c3c3db763e94d9a75d286f27c8ba56e1d40531f1 | |
| parent | 519293857a62e0883b82d9333408eedc5eaa8be3 (diff) | |
Fixes start new showWhenLocked activity will stuck on DreamActivity.
1. Update the isTopNonPinnedStack when check visibility for next
activity, otherwise even when DreamActivity is finishing but still on
top, there would still though next activity is not top non-pinned
stack.
2. If we start next activity while isDreaming, we will set
launchTaskBehind for the next activity, which will cause the new
activity stay in unknown apps because client will go through onStart ->
onResume -> onPaused directly, in this case ATMS will receive relayout
before activityResumed. To prevent the app transition hanging there, go
to waiting for relayout directly if we know that activity was set
launchTaskBehind.
Bug: 162190413
Test: atest PinnedStackTests ActivityLifecyclePipTests
Test: atest UnknownAppVisibilityControllerTest
Test: Set crediential and alarm, enable dream, wait to see that alarm
activity should unlock DreamActivity before transition timeout.
Change-Id: I8ef5c5e0424c925fdaccda6baff496302a0ff3ba
4 files changed, 25 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 64fa6ca590d2..cdfab7555f65 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -4664,7 +4664,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // case where this is the top activity in a pinned stack. final boolean isTop = this == stack.getTopNonFinishingActivity(); final boolean isTopNotPinnedStack = stack.isAttached() - && stack.getDisplayArea().isTopNotPinnedStack(stack); + && stack.getDisplayArea().isTopNotFinishNotPinnedStack(stack); final boolean visibleIgnoringDisplayStatus = stack.checkKeyguardVisibility(this, visibleIgnoringKeyguard, isTop && isTopNotPinnedStack); diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 32511108836e..6550167683a0 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1489,9 +1489,13 @@ final class TaskDisplayArea extends DisplayArea<Task> { return stack == getTopStack(); } - boolean isTopNotPinnedStack(Task stack) { + boolean isTopNotFinishNotPinnedStack(Task stack) { for (int i = getStackCount() - 1; i >= 0; --i) { final Task current = getStackAt(i); + final ActivityRecord topAct = current.getTopNonFinishingActivity(); + if (topAct == null) { + continue; + } if (!current.inPinnedWindowingMode()) { return current == stack; } diff --git a/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java b/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java index 61e9e5082d17..5e81e4008680 100644 --- a/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java +++ b/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java @@ -24,8 +24,6 @@ import android.annotation.NonNull; import android.util.ArrayMap; import android.util.Slog; -import com.android.server.wm.WindowManagerService.H; - import java.io.PrintWriter; /** @@ -102,7 +100,13 @@ class UnknownAppVisibilityController { if (DEBUG_UNKNOWN_APP_VISIBILITY) { Slog.d(TAG, "App launched activity=" + activity); } - mUnknownApps.put(activity, UNKNOWN_STATE_WAITING_RESUME); + // If the activity was started with launchTaskBehind, the lifecycle will goes to paused + // directly, and the process will pass onResume, so we don't need to waiting resume for it. + if (!activity.mLaunchTaskBehind) { + mUnknownApps.put(activity, UNKNOWN_STATE_WAITING_RESUME); + } else { + mUnknownApps.put(activity, UNKNOWN_STATE_WAITING_RELAYOUT); + } } /** 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 6ed762283524..78dfd407ff4e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java @@ -55,6 +55,18 @@ public class UnknownAppVisibilityControllerTest extends WindowTestsBase { } @Test + public void testSkipResume() { + final ActivityRecord activity = createTestActivityRecord(mDisplayContent); + activity.mLaunchTaskBehind = true; + mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(activity); + mDisplayContent.mUnknownAppVisibilityController.notifyRelayouted(activity); + + // Make sure our handler processed the message. + waitHandlerIdle(mWm.mH); + assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved()); + } + + @Test public void testMultiple() { final ActivityRecord activity1 = createTestActivityRecord(mDisplayContent); final ActivityRecord activity2 = createTestActivityRecord(mDisplayContent); |