diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index a7b1209421636..748244e1a5c24 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4515,6 +4515,7 @@ class Task extends WindowContainer { */ void setMainWindowSizeChangeTransaction(SurfaceControl.Transaction t) { setMainWindowSizeChangeTransaction(t, this); + forAllWindows(WindowState::requestRedrawForSync, true); } private void setMainWindowSizeChangeTransaction(SurfaceControl.Transaction t, Task origin) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 708abe28c8064..f1acee5031d87 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -339,7 +339,7 @@ class WindowState extends WindowContainer implements WindowManagerP private boolean mDragResizing; private boolean mDragResizingChangeReported = true; private int mResizeMode; - private boolean mResizeForBlastSyncReported; + private boolean mRedrawForSyncReported; /** * Special mode that is intended only for the rounded corner overlay: during rotation @@ -1402,7 +1402,7 @@ class WindowState extends WindowContainer implements WindowManagerP || configChanged || dragResizingChanged || mReportOrientationChanged - || requestResizeForBlastSync()) { + || shouldSendRedrawForSync()) { ProtoLog.v(WM_DEBUG_RESIZE, "Resize reasons for w=%s: %s surfaceResized=%b configChanged=%b " + "dragResizingChanged=%b reportOrientationChanged=%b", @@ -3564,7 +3564,6 @@ class WindowState extends WindowContainer implements WindowManagerP mReportOrientationChanged = false; mDragResizingChangeReported = true; mWinAnimator.mSurfaceResized = false; - mResizeForBlastSyncReported = true; mWindowFrames.resetInsetsChanged(); final Rect frame = mWindowFrames.mCompatFrame; @@ -3572,11 +3571,13 @@ class WindowState extends WindowContainer implements WindowManagerP final Rect visibleInsets = mWindowFrames.mLastVisibleInsets; final Rect stableInsets = mWindowFrames.mLastStableInsets; final MergedConfiguration mergedConfiguration = mLastReportedConfiguration; - final boolean reportDraw = mWinAnimator.mDrawState == DRAW_PENDING || useBLASTSync(); - final boolean forceRelayout = reportOrientation || isDragResizeChanged(); + final boolean reportDraw = mWinAnimator.mDrawState == DRAW_PENDING || useBLASTSync() || !mRedrawForSyncReported; + final boolean forceRelayout = reportOrientation || isDragResizeChanged() || !mRedrawForSyncReported; final int displayId = getDisplayId(); final DisplayCutout displayCutout = getWmDisplayCutout().getDisplayCutout(); + mRedrawForSyncReported = true; + try { mClient.resized(frame, contentInsets, visibleInsets, stableInsets, reportDraw, mergedConfiguration, getBackdropFrame(frame), forceRelayout, @@ -5823,7 +5824,7 @@ class WindowState extends WindowContainer implements WindowManagerP if (!willSync) { return false; } - mResizeForBlastSyncReported = false; + requestRedrawForSync(); mLocalSyncId = mBLASTSyncEngine.startSyncSet(this); addChildrenToSyncSet(mLocalSyncId); @@ -5884,7 +5885,20 @@ class WindowState extends WindowContainer implements WindowManagerP notifyBlastSyncTransaction(); } - private boolean requestResizeForBlastSync() { - return useBLASTSync() && !mResizeForBlastSyncReported; + /** + * When using the two WindowOrganizer sync-primitives (BoundsChangeTransaction, BLASTSync) + * it can be a little difficult to predict whether your change will actually trigger redrawing + * on the client side. To ease the burden on shell developers, we force send MSG_RESIZED + * for Windows involved in these Syncs + */ + private boolean shouldSendRedrawForSync() { + final Task task = getTask(); + if (task != null && task.getMainWindowSizeChangeTransaction() != null) + return !mRedrawForSyncReported; + return useBLASTSync() && !mRedrawForSyncReported; + } + + void requestRedrawForSync() { + mRedrawForSyncReported = false; } }