summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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();