Merge "Force update the surface of opening targets to visible" into main
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index 83ccbdc..13f6a5f 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -1527,6 +1527,12 @@
setLaunchBehind(visibleOpenActivities[i]);
}
}
+ // Force update mLastSurfaceShowing for opening activity and its task.
+ if (mWindowManagerService.mRoot.mTransitionController.isShellTransitionsEnabled()) {
+ for (int i = visibleOpenActivities.length - 1; i >= 0; --i) {
+ WindowContainer.enforceSurfaceVisible(visibleOpenActivities[i]);
+ }
+ }
}
@Nullable Runnable build() {
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index 25b5630f..70775530 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -994,39 +994,18 @@
Slog.e(TAG, "Set visible without transition " + wc + " playing=" + isPlaying
+ " caller=" + caller);
if (!isPlaying) {
- enforceSurfaceVisible(wc);
+ WindowContainer.enforceSurfaceVisible(wc);
return;
}
// Update surface visibility after the playing transitions are finished, so the last
// visibility won't be replaced by the finish transaction of transition.
mStateValidators.add(() -> {
if (wc.isVisibleRequested()) {
- enforceSurfaceVisible(wc);
+ WindowContainer.enforceSurfaceVisible(wc);
}
});
}
- private void enforceSurfaceVisible(WindowContainer<?> wc) {
- if (wc.mSurfaceControl == null) return;
- wc.getSyncTransaction().show(wc.mSurfaceControl);
- final ActivityRecord ar = wc.asActivityRecord();
- if (ar != null) {
- ar.mLastSurfaceShowing = true;
- }
- // Force showing the parents because they may be hidden by previous transition.
- for (WindowContainer<?> p = wc.getParent(); p != null && p != wc.mDisplayContent;
- p = p.getParent()) {
- if (p.mSurfaceControl != null) {
- p.getSyncTransaction().show(p.mSurfaceControl);
- final Task task = p.asTask();
- if (task != null) {
- task.mLastSurfaceShowing = true;
- }
- }
- }
- wc.scheduleAnimation();
- }
-
/**
* Called when the transition has a complete set of participants for its operation. In other
* words, it is when the transition is "ready" but is still waiting for participants to draw.
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 286182e..2d2857a 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -3625,6 +3625,29 @@
return mSurfaceControl.getHeight();
}
+ static void enforceSurfaceVisible(@NonNull WindowContainer<?> wc) {
+ if (wc.mSurfaceControl == null) {
+ return;
+ }
+ wc.getSyncTransaction().show(wc.mSurfaceControl);
+ final ActivityRecord ar = wc.asActivityRecord();
+ if (ar != null) {
+ ar.mLastSurfaceShowing = true;
+ }
+ // Force showing the parents because they may be hidden by previous transition.
+ for (WindowContainer<?> p = wc.getParent(); p != null && p != wc.mDisplayContent;
+ p = p.getParent()) {
+ if (p.mSurfaceControl != null) {
+ p.getSyncTransaction().show(p.mSurfaceControl);
+ final Task task = p.asTask();
+ if (task != null) {
+ task.mLastSurfaceShowing = true;
+ }
+ }
+ }
+ wc.scheduleAnimation();
+ }
+
@CallSuper
void dump(PrintWriter pw, String prefix, boolean dumpAll) {
if (mSurfaceAnimator.isAnimating()) {