Loading services/core/java/com/android/server/wm/ActivityRecord.java +6 −1 Original line number Diff line number Diff line Loading @@ -5624,13 +5624,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // drawn, they never will be, and we are sad. setClientVisible(true); 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) { Loading services/core/java/com/android/server/wm/Transition.java +1 −19 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -2277,19 +2277,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) { Loading @@ -2297,11 +2284,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) { Loading services/core/java/com/android/server/wm/WallpaperController.java +5 −2 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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); Loading services/core/java/com/android/server/wm/WallpaperWindowToken.java +12 −5 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.util.SparseArray; import com.android.internal.protolog.ProtoLog; import java.io.PrintWriter; import java.util.function.Consumer; /** Loading Loading @@ -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; Loading Loading @@ -285,14 +287,19 @@ class WallpaperWindowToken extends WindowToken { return !mVisibleRequested || !hasVisibleNotDrawnWallpaper(); } @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; } Loading services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +44 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +6 −1 Original line number Diff line number Diff line Loading @@ -5624,13 +5624,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // drawn, they never will be, and we are sad. setClientVisible(true); 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) { Loading
services/core/java/com/android/server/wm/Transition.java +1 −19 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -2277,19 +2277,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) { Loading @@ -2297,11 +2284,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) { Loading
services/core/java/com/android/server/wm/WallpaperController.java +5 −2 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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); Loading
services/core/java/com/android/server/wm/WallpaperWindowToken.java +12 −5 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.util.SparseArray; import com.android.internal.protolog.ProtoLog; import java.io.PrintWriter; import java.util.function.Consumer; /** Loading Loading @@ -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; Loading Loading @@ -285,14 +287,19 @@ class WallpaperWindowToken extends WindowToken { return !mVisibleRequested || !hasVisibleNotDrawnWallpaper(); } @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; } Loading
services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +44 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading