diff options
5 files changed, 68 insertions, 27 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 3467f947ece4..75b062f59c43 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5610,13 +5610,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // drawn, they never will be, and we are sad. setClientVisible(true); - requestUpdateWallpaperIfNeeded(); + if (!mWmService.mFlags.mEnsureWallpaperInTransitions) { + requestUpdateWallpaperIfNeeded(); + } ProtoLog.v(WM_DEBUG_ADD_REMOVE, "No longer Stopped: %s", this); mAppStopped = false; transferStartingWindowFromHiddenAboveTokenIfNeeded(); } + if (mWmService.mFlags.mEnsureWallpaperInTransitions) { + requestUpdateWallpaperIfNeeded(); + } // Defer committing visibility until transition starts. if (isCollecting) { diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 1fc609b7d03a..5f3a6cdd9e3b 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1439,7 +1439,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } } } - if (wt == null) continue; + if (wt == null || !wt.isVisible()) continue; final WindowState target = wt.mDisplayContent.mWallpaperController.getWallpaperTarget(); final boolean isTargetInvisible = target == null || !target.mToken.isVisible(); final boolean isWallpaperVisibleAtEnd = @@ -2271,19 +2271,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } } - /** - - * Wallpaper will set itself as target if it wants to keep itself visible without a target. - */ - private static boolean wallpaperIsOwnTarget(WallpaperWindowToken wallpaper) { - final WindowState target = - wallpaper.getDisplayContent().mWallpaperController.getWallpaperTarget(); - return target != null && target.isDescendantOf(wallpaper); - } - - /** - * Reset waitingToshow for all wallpapers, and commit the visibility of the visible ones - */ private void commitVisibleWallpapers(SurfaceControl.Transaction t) { boolean showWallpaper = shouldWallpaperBeVisible(); for (int i = mParticipants.size() - 1; i >= 0; --i) { @@ -2291,11 +2278,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { if (wallpaper != null) { if (!wallpaper.isVisible() && wallpaper.isVisibleRequested()) { wallpaper.commitVisibility(showWallpaper); - } else if (wallpaper.mWmService.mFlags.mEnsureWallpaperInTransitions - && wallpaper.isVisible() - && !showWallpaper && !wallpaper.getDisplayContent().isKeyguardLocked() - && !wallpaperIsOwnTarget(wallpaper)) { - wallpaper.setVisibleRequested(false); } if (showWallpaper && wallpaper.isVisibleRequested()) { for (int j = wallpaper.mChildren.size() - 1; j >= 0; --j) { diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 7565b5d9fd4e..c1ef208d1d4d 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -895,7 +895,11 @@ class WallpaperController { } } - updateWallpaperTokens(visible, mDisplayContent.isKeyguardLocked()); + boolean visibleRequested = visible; + if (mDisplayContent.mWmService.mFlags.mEnsureWallpaperInTransitions) { + visibleRequested = mWallpaperTarget != null && mWallpaperTarget.isVisibleRequested(); + } + updateWallpaperTokens(visibleRequested, mDisplayContent.isKeyguardLocked()); ProtoLog.v(WM_DEBUG_WALLPAPER, "Wallpaper at display %d - visibility: %b, keyguardLocked: %b", @@ -1104,7 +1108,6 @@ class WallpaperController { for (int i = mWallpaperTokens.size() - 1; i >= 0; i--) { final WallpaperWindowToken t = mWallpaperTokens.get(i); pw.print(prefix); pw.println("token " + t + ":"); - pw.print(prefix); pw.print(" canShowWhenLocked="); pw.println(t.canShowWhenLocked()); dumpValue(pw, prefix, "mWallpaperX", t.mWallpaperX); dumpValue(pw, prefix, "mWallpaperY", t.mWallpaperY); dumpValue(pw, prefix, "mWallpaperXStep", t.mWallpaperXStep); diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java index 2c926fcae26a..0ecd0251ca94 100644 --- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java +++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java @@ -33,6 +33,7 @@ import android.util.SparseArray; import com.android.internal.protolog.ProtoLog; +import java.io.PrintWriter; import java.util.function.Consumer; /** @@ -103,6 +104,7 @@ class WallpaperWindowToken extends WindowToken { return; } mShowWhenLocked = showWhenLocked; + stringName = null; // Move the window token to the front (private) or back (showWhenLocked). This is possible // because the DisplayArea underneath TaskDisplayArea only contains TYPE_WALLPAPER windows. final int position = showWhenLocked ? POSITION_BOTTOM : POSITION_TOP; @@ -286,13 +288,18 @@ class WallpaperWindowToken extends WindowToken { } @Override + void dump(PrintWriter pw, String prefix, boolean dumpAll) { + super.dump(pw, prefix, dumpAll); + pw.print(prefix); pw.print("visibleRequested="); pw.print(mVisibleRequested); + pw.print(" visible="); pw.println(isVisible()); + } + + @Override public String toString() { if (stringName == null) { - StringBuilder sb = new StringBuilder(); - sb.append("WallpaperWindowToken{"); - sb.append(Integer.toHexString(System.identityHashCode(this))); - sb.append(" token="); sb.append(token); sb.append('}'); - stringName = sb.toString(); + stringName = "WallpaperWindowToken{" + + Integer.toHexString(System.identityHashCode(this)) + + " showWhenLocked=" + mShowWhenLocked + '}'; } return stringName; } diff --git a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java index 9602ae29604f..eb89a9fb20c5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java @@ -31,6 +31,7 @@ import static android.view.WindowManager.TRANSIT_OPEN; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.window.flags.Flags.multiCrop; import static com.google.common.truth.Truth.assertThat; @@ -412,6 +413,49 @@ public class WallpaperControllerTests extends WindowTestsBase { assertFalse(token.isVisible()); } + @Test + public void testWallpaperTokenVisibilityWithTarget() { + mSetFlagsRule.enableFlags( + com.android.window.flags.Flags.FLAG_ENSURE_WALLPAPER_IN_TRANSITIONS); + final DisplayContent dc = mDisplayContent; + final WindowState wallpaperWindow = createWallpaperWindow(dc); + final WallpaperWindowToken wallpaperToken = wallpaperWindow.mToken.asWallpaperToken(); + final WindowState wallpaperTarget = createWallpaperTargetWindow(dc); + dc.mWallpaperController.adjustWallpaperWindows(); + assertEquals(wallpaperTarget, dc.mWallpaperController.getWallpaperTarget()); + assertTrue(wallpaperToken.isVisibleRequested()); + assertTrue(wallpaperToken.isVisible()); + + registerTestTransitionPlayer(); + // Assume that another activity is opening and occludes the wallpaper target activity. + Transition transition = dc.mTransitionController.createTransition(TRANSIT_OPEN); + transition.start(); + wallpaperTarget.mActivityRecord.setVisibility(false); + assertTrue(wallpaperToken.inTransition()); + waitUntilHandlersIdle(); + assertFalse("Invisible requested with target", wallpaperToken.isVisibleRequested()); + assertTrue(wallpaperToken.isVisible()); + + transition.onTransactionReady(transition.getSyncId(), mTransaction); + dc.mTransitionController.finishTransition(ActionChain.testFinish(transition)); + assertFalse(wallpaperToken.isVisibleRequested()); + assertFalse("Commit wallpaper to invisible", wallpaperToken.isVisible()); + assertTrue((dc.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0); + dc.pendingLayoutChanges = 0; + dc.mWallpaperController.adjustWallpaperWindows(); + assertNull(dc.mWallpaperController.getWallpaperTarget()); + + // Assume that top activity is closing and the wallpaper target activity becomes visible. + transition = dc.mTransitionController.createTransition(TRANSIT_CLOSE); + transition.start(); + wallpaperTarget.mActivityRecord.setVisibility(true); + assertTrue((dc.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0); + dc.mWallpaperController.adjustWallpaperWindows(); + assertTrue(wallpaperToken.inTransition()); + assertTrue("Visible requested with target", wallpaperToken.isVisibleRequested()); + assertEquals(wallpaperTarget, dc.mWallpaperController.getWallpaperTarget()); + } + private static void prepareSmallerSecondDisplay(DisplayContent dc, int width, int height) { spyOn(dc.mWmService); DisplayInfo firstDisplay = dc.getDisplayInfo(); |