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

Commit 4fb6cb28 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Report pending change to wallpaper when being visible

Configuration change will make mLastConfigReportedToClient true.
But if the window is invisible, updateResizingWindowIfNeeded may
be skipped by isGoneForLayout. So if it becomes visible later,
request a traversal to dispatch the change and then the client
window (wallpaper) can redraw with the latest state.

Fix: 261988495
Test: WallpaperControllerTests#testWallpaperReportConfigChange
Change-Id: I7f43811ac6d0582e9b904ad3cad7d98e1605877a
parent 9f724554
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4577,7 +4577,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP

    void requestUpdateWallpaperIfNeeded() {
        final DisplayContent dc = getDisplayContent();
        if (dc != null && hasWallpaper()) {
        if (dc != null && ((mIsWallpaper && !mLastConfigReportedToClient) || hasWallpaper())) {
            dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
            dc.setLayoutNeeded();
            mWmService.mWindowPlacerLocked.requestTraversal();
+25 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.util.MergedConfiguration;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
import android.view.Gravity;
@@ -61,6 +62,7 @@ import android.view.RoundedCorners;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.ClientWindowFrames;

import androidx.test.filters.SmallTest;

@@ -337,6 +339,29 @@ public class WallpaperControllerTests extends WindowTestsBase {
        assertEquals(appWin, mDisplayContent.mWallpaperController.getWallpaperTarget());
    }

    @Test
    public void testWallpaperReportConfigChange() {
        final WindowState wallpaperWindow = createWallpaperWindow(mDisplayContent);
        createWallpaperTargetWindow(mDisplayContent);
        final WallpaperWindowToken wallpaperToken = wallpaperWindow.mToken.asWallpaperToken();
        makeWindowVisible(wallpaperWindow);
        wallpaperWindow.mLayoutSeq = mDisplayContent.mLayoutSeq;
        // Assume the token was invisible and the latest config was reported.
        wallpaperToken.commitVisibility(false);
        wallpaperWindow.fillClientWindowFramesAndConfiguration(new ClientWindowFrames(),
                new MergedConfiguration(), true /* useLatestConfig */, false /* relayoutVisible */);
        assertTrue(wallpaperWindow.isLastConfigReportedToClient());

        final Rect bounds = wallpaperToken.getBounds();
        wallpaperToken.setBounds(new Rect(0, 0, bounds.width() / 2, bounds.height() / 2));
        assertFalse(wallpaperWindow.isLastConfigReportedToClient());
        // If there is a pending config change when changing to visible, it should tell the client
        // to redraw by WindowState#reportResized.
        wallpaperToken.commitVisibility(true);
        waitUntilHandlersIdle();
        assertTrue(wallpaperWindow.isLastConfigReportedToClient());
    }

    @Test
    public void testWallpaperTokenVisibility() {
        final DisplayContent dc = mWm.mRoot.getDefaultDisplay();