From f76ce36997220a482571625fd51274a8e5a11d11 Mon Sep 17 00:00:00 2001 From: Issei Suzuki Date: Tue, 7 Jul 2020 22:23:44 +0200 Subject: [PATCH] Fix bubble shows empty contents after rotating the device. When a virtual display turns on or off, DisplayManagerService notifies it to WindowManagerService via messaging. Since the messaging is handled asynchronously, the virtual display status might be changed again before WindowManagerService gets notified, so WindowManagerService might miss that the virtual display stauts is changed. In order to trigger ITaskStackListner#onSingleTaskDisplayDrawn even when WindowManagerService misses virtual display status change, we prepare an app transition TRANSIT_SHOW_SINGLE_TASK_DISPLAY when moving a task to front. Bug: 158675422 Test: manual. Expand bubble, rotate device and check app transitions. Change-Id: Ib48d4faab8fa0cef88074593b0ae1a3b7615d9c0 --- .../com/android/server/wm/ActivityStack.java | 22 +++++++++++++++---- .../server/wm/RootWindowContainer.java | 3 ++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 8f0de7312ee5a..b65ca2b6ef3ac 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -2440,7 +2440,7 @@ class ActivityStack extends Task { forAllActivities(ActivityRecord::removeLaunchTickRunnable); } - private void updateTransitLocked(int transit, ActivityOptions options) { + private void updateTransitLocked(int transit, ActivityOptions options, boolean forceOverride) { if (options != null) { ActivityRecord r = topRunningActivity(); if (r != null && !r.isState(RESUMED)) { @@ -2449,7 +2449,8 @@ class ActivityStack extends Task { ActivityOptions.abort(options); } } - getDisplay().mDisplayContent.prepareAppTransition(transit, false); + getDisplay().mDisplayContent.prepareAppTransition(transit, false, + 0 /* flags */, forceOverride); } final void moveTaskToFront(Task tr, boolean noAnimation, ActivityOptions options, @@ -2469,8 +2470,17 @@ class ActivityStack extends Task { // nothing to do! if (noAnimation) { ActivityOptions.abort(options); + } else if (isSingleTaskInstance()) { + // When a task is moved front on the display which can only contain one task, start + // a special transition. + // {@link AppTransitionController#handleAppTransitionReady} later picks up the + // transition, and schedules + // {@link ITaskStackListener#onSingleTaskDisplayDrawn} callback which is triggered + // after contents are drawn on the display. + updateTransitLocked(TRANSIT_SHOW_SINGLE_TASK_DISPLAY, options, + true /* forceOverride */); } else { - updateTransitLocked(TRANSIT_TASK_TO_FRONT, options); + updateTransitLocked(TRANSIT_TASK_TO_FRONT, options, false /* forceOverride */); } return; } @@ -2516,9 +2526,13 @@ class ActivityStack extends Task { mStackSupervisor.mNoAnimActivities.add(r); } ActivityOptions.abort(options); + } else if (isSingleTaskInstance()) { + updateTransitLocked(TRANSIT_SHOW_SINGLE_TASK_DISPLAY, options, + true /* forceOverride */); } else { - updateTransitLocked(TRANSIT_TASK_TO_FRONT, options); + updateTransitLocked(TRANSIT_TASK_TO_FRONT, options, false /* forceOverride */); } + // If a new task is moved to the front, then mark the existing top activity as // supporting diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 119b188dfa00c..19aec5aebdccb 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2375,7 +2375,8 @@ class RootWindowContainer extends WindowContainer // triggered after contents are drawn on the display. if (display.isSingleTaskInstance()) { display.mDisplayContent.prepareAppTransition( - TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false); + TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false, + 0 /* flags */, true /* forceOverride*/); } stack.awakeFromSleepingLocked(); if (display.isSingleTaskInstance()) {