summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kazuki Takise <takise@google.com> 2025-03-18 15:26:10 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-18 15:26:10 -0700
commit03880ac3804c323509126ba1f234b22e8375ff3e (patch)
treeb5f0a387b424d6164ccecec4bcc699f75987c9e0
parentbaadb88bc4a48b9075c7f59f4ade060493d4bd05 (diff)
parent97ec86e906899e5af6d71dc9b2b530608ea48813 (diff)
Merge "Fix NPE in adding/removing presentation" into main
-rw-r--r--services/core/java/com/android/server/wm/TransitionController.java7
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java18
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java18
3 files changed, 32 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index 51c3da098020..02b53b0106b8 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -512,9 +512,14 @@ class TransitionController {
return false;
}
+ /** Returns {@code true} if the display contains a collecting transition. */
+ boolean isCollectingTransitionOnDisplay(@NonNull DisplayContent dc) {
+ return mCollectingTransition != null && mCollectingTransition.isOnDisplay(dc);
+ }
+
/** Returns {@code true} if the display contains a running or pending transition. */
boolean isTransitionOnDisplay(@NonNull DisplayContent dc) {
- if (mCollectingTransition != null && mCollectingTransition.isOnDisplay(dc)) {
+ if (isCollectingTransitionOnDisplay(dc)) {
return true;
}
for (int i = mWaitingTransitions.size() - 1; i >= 0; --i) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index a9bb690d4e53..3ccbc868377e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1845,9 +1845,12 @@ public class WindowManagerService extends IWindowManager.Stub
// Only a presentation window needs a transition because its visibility affets the
// lifecycle of apps below (b/390481865).
if (enablePresentationForConnectedDisplays() && win.isPresentation()) {
- Transition transition = null;
+ final boolean wasTransitionOnDisplay =
+ win.mTransitionController.isCollectingTransitionOnDisplay(displayContent);
+ Transition newlyCreatedTransition = null;
if (!win.mTransitionController.isCollecting()) {
- transition = win.mTransitionController.createAndStartCollecting(TRANSIT_OPEN);
+ newlyCreatedTransition =
+ win.mTransitionController.createAndStartCollecting(TRANSIT_OPEN);
}
win.mTransitionController.collect(win.mToken);
res |= addWindowInner(win, displayPolicy, activity, displayContent, outInsetsState,
@@ -1856,9 +1859,14 @@ public class WindowManagerService extends IWindowManager.Stub
// A presentation hides all activities behind on the same display.
win.mDisplayContent.ensureActivitiesVisible(/*starting=*/ null,
/*notifyClients=*/ true);
- win.mTransitionController.getCollectingTransition().setReady(win.mToken, true);
- if (transition != null) {
- win.mTransitionController.requestStartTransition(transition, null,
+ if (!wasTransitionOnDisplay && win.mTransitionController
+ .isCollectingTransitionOnDisplay(displayContent)) {
+ // Set the display ready only when the display gets added to the collecting
+ // transition in this operation.
+ win.mTransitionController.setReady(win.mToken);
+ }
+ if (newlyCreatedTransition != null) {
+ win.mTransitionController.requestStartTransition(newlyCreatedTransition, null,
null /* remoteTransition */, null /* displayChange */);
}
} else {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 22ddd5f39b24..d43aba0d218d 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2365,9 +2365,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// Only a presentation window needs a transition because its visibility affets the
// lifecycle of apps below (b/390481865).
if (enablePresentationForConnectedDisplays() && isPresentation()) {
- Transition transition = null;
+ final boolean wasTransitionOnDisplay =
+ mTransitionController.isCollectingTransitionOnDisplay(displayContent);
+ Transition newlyCreatedTransition = null;
if (!mTransitionController.isCollecting()) {
- transition = mTransitionController.createAndStartCollecting(TRANSIT_CLOSE);
+ newlyCreatedTransition =
+ mTransitionController.createAndStartCollecting(TRANSIT_CLOSE);
}
mTransitionController.collect(mToken);
mAnimatingExit = true;
@@ -2376,9 +2379,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// A presentation hides all activities behind on the same display.
mDisplayContent.ensureActivitiesVisible(/*starting=*/ null,
/*notifyClients=*/ true);
- mTransitionController.getCollectingTransition().setReady(mToken, true);
- if (transition != null) {
- mTransitionController.requestStartTransition(transition, null,
+ if (!wasTransitionOnDisplay && mTransitionController
+ .isCollectingTransitionOnDisplay(displayContent)) {
+ // Set the display ready only when the display gets added to the collecting
+ // transition in this operation.
+ mTransitionController.setReady(mToken);
+ }
+ if (newlyCreatedTransition != null) {
+ mTransitionController.requestStartTransition(newlyCreatedTransition, null,
null /* remoteTransition */, null /* displayChange */);
}
} else {