Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 275024ae authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent 7ad12f9f
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -5610,13 +5610,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) {
+1 −19
Original line number Diff line number Diff line
@@ -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) {
+5 −2
Original line number Diff line number Diff line
@@ -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);
+12 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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;
    }
+44 −0
Original line number Diff line number Diff line
@@ -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();