summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wilsonshih <wilsonshih@google.com> 2020-07-28 17:45:06 +0800
committer wilsonshih <wilsonshih@google.com> 2020-08-18 23:33:50 +0800
commit21d73a78ea285e7e37186cbd0239d0143dacbfb3 (patch)
treec3c3db763e94d9a75d286f27c8ba56e1d40531f1
parent519293857a62e0883b82d9333408eedc5eaa8be3 (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
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java6
-rw-r--r--services/core/java/com/android/server/wm/UnknownAppVisibilityController.java10
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java12
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);