summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2024-12-10 16:21:12 -0600
committer Riddle Hsu <riddlehsu@google.com> 2024-12-11 14:14:32 +0800
commit275024ae65a00437bcc755eddebf40ce25b6bc6f (patch)
tree198dad86bd5b5d41fd7713a9bb141224eb9a8ce6
parent7ad12f9f1b013c4e651500b3d78299329776070f (diff)
Update visible requested of wallpaper with target
Now if the wallpaper target's visibility is changed, it will request to update wallpaper target. And uses the visible-requested of the current target to update wallpaper's visible-requested. This removes invisible-request in commitVisibleWallpapers because it may make wallpaper invisible unexpectedly with the condition: Wallpaper target is visible but it is not in mParticipants. Bug: 355596979 Bug: 354459548 Flag: com.android.window.flags.ensure_wallpaper_in_transitions Test: WallpaperControllerTests#testWallpaperTokenVisibilityWithTarget Change-Id: I516efc9c4904585d9d7873e568104d4c2b13bfcf
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java7
-rw-r--r--services/core/java/com/android/server/wm/Transition.java20
-rw-r--r--services/core/java/com/android/server/wm/WallpaperController.java7
-rw-r--r--services/core/java/com/android/server/wm/WallpaperWindowToken.java17
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java44
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();