Merge "Force app to redraw when using bounds change transaction" into rvc-dev

This commit is contained in:
Rob Carr
2020-06-26 17:37:42 +00:00
committed by Android (Google) Code Review
2 changed files with 23 additions and 8 deletions

View File

@@ -4515,6 +4515,7 @@ class Task extends WindowContainer<WindowContainer> {
*/
void setMainWindowSizeChangeTransaction(SurfaceControl.Transaction t) {
setMainWindowSizeChangeTransaction(t, this);
forAllWindows(WindowState::requestRedrawForSync, true);
}
private void setMainWindowSizeChangeTransaction(SurfaceControl.Transaction t, Task origin) {

View File

@@ -339,7 +339,7 @@ class WindowState extends WindowContainer<WindowState> 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<WindowState> 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<WindowState> 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<WindowState> 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<WindowState> implements WindowManagerP
if (!willSync) {
return false;
}
mResizeForBlastSyncReported = false;
requestRedrawForSync();
mLocalSyncId = mBLASTSyncEngine.startSyncSet(this);
addChildrenToSyncSet(mLocalSyncId);
@@ -5884,7 +5885,20 @@ class WindowState extends WindowContainer<WindowState> 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;
}
}