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

Commit b75951a6 authored by Riddle Hsu's avatar Riddle Hsu Committed by Android (Google) Code Review
Browse files

Merge "Update visible requested of wallpaper with target" into main

parents 81f387f4 275024ae
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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) {
+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 =
@@ -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) {
@@ -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) {
+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();