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
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user