From 10949759be81146f4bd5ad0efb06463deb439e38 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Sat, 18 Feb 2023 00:48:15 +0800 Subject: [PATCH] Indicate potential incomplete transition To catch the case such as when an activity is still pausing, and a caller sets transition to ready too early. And then when resuming next activity in the same task, its visibility will be updated without an associated transition. Previously, the visibility will be skipped because the activity is a child of the task in transition participant but itself is not in participants. Bug: 269732484 Test: TransitionTests Change-Id: I9a184b97974f337fb123e11853bea50ace9bf843 --- .../com/android/server/wm/ActivityRecord.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 3545747a67e3f..7757b2d7de49c 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5225,7 +5225,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A Debug.getCallers(6)); // Before setting mVisibleRequested so we can track changes. - mTransitionController.collect(this); + boolean isCollecting = false; + if (mTransitionController.isShellTransitionsEnabled()) { + isCollecting = mTransitionController.isCollecting(); + if (isCollecting) { + mTransitionController.collect(this); + } else { + Slog.e(TAG, "setVisibility=" + visible + " while transition is not collecting " + + this + " caller=" + Debug.getCallers(8)); + } + } onChildVisibilityRequested(visible); @@ -5297,9 +5306,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } // Defer committing visibility until transition starts. - if (inTransition()) { - if (!visible && mTransitionController.inPlayingTransition(this) - && mTransitionController.isCollecting(this)) { + if (isCollecting) { + // It may be occluded by the activity above that calls convertFromTranslucent(). + if (!visible && mTransitionController.inPlayingTransition(this)) { mTransitionChangeFlags |= FLAG_IS_OCCLUDED; } return; @@ -5319,11 +5328,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * Then its visibility will be committed until the transition is ready. */ private boolean deferCommitVisibilityChange(boolean visible) { + if (mTransitionController.isShellTransitionsEnabled()) { + // Shell transition doesn't use opening/closing sets. + return false; + } if (!mDisplayContent.mAppTransition.isTransitionSet()) { - if (mTransitionController.isShellTransitionsEnabled()) { - // Shell transition doesn't use opening/closing sets. - return false; - } // Defer committing visibility for non-home app which is animating by recents. if (isActivityTypeHome() || !isAnimating(PARENTS, ANIMATION_TYPE_RECENTS)) { return false;