From 851685c401be5a153c55090d69d7408b51667e74 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 23 Nov 2022 21:50:21 +0800 Subject: [PATCH] Request legacy app transition when moveActivityToFront Before, when there is no ActivityEmbedding, the transition is requested later when the previous top Activity is paused to resume the Task top, which works ok. But when there is ActivityEmbedding, the organizer may request WCT that trigger visibility update before a transition is requested, which cause a flicker. When startActivity with FLAG_ACTIVITY_REORDER_TO_FRONT to bring an existing activity to the front, we should call prepareAppTransition early to make sure the following activity visibility change is tracked. Fix: 255701223 Test: verify with FLAG_ACTIVITY_REORDER_TO_FRONT app Change-Id: I65d4ffd1c17d6817c073122447e620a2fbb514a1 --- .../core/java/com/android/server/wm/ActivityStarter.java | 7 +++++++ .../core/java/com/android/server/wm/TaskFragment.java | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index a3554cd32ba22..fea3061390e6a 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -55,7 +55,9 @@ import static android.content.pm.ActivityInfo.launchModeToString; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Process.INVALID_UID; import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_OPEN; +import static android.view.WindowManager.TRANSIT_TO_FRONT; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION; @@ -2398,6 +2400,11 @@ class ActivityStarter { if (actuallyMoved) { // Only record if the activity actually moved. mMovedToTopActivity = act; + if (mNoAnimation) { + act.mDisplayContent.prepareAppTransition(TRANSIT_NONE); + } else { + act.mDisplayContent.prepareAppTransition(TRANSIT_TO_FRONT); + } } act.updateOptionsLocked(mOptions); deliverNewIntent(act, intentGrants); diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 7cac01faf1a0c..e99bf3bf2f96f 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2605,6 +2605,14 @@ class TaskFragment extends WindowContainer { return false; } + @Override + boolean canCustomizeAppTransition() { + // This is only called when the app transition is going to be played by system server. In + // this case, we should allow custom app transition for fullscreen embedded TaskFragment + // just like Activity. + return isEmbedded() && matchParentBounds(); + } + /** Clear {@link #mLastPausedActivity} for all {@link TaskFragment} children */ void clearLastPausedActivity() { forAllTaskFragments(taskFragment -> taskFragment.mLastPausedActivity = null);