Avoid changing z-order of overlay layer after resizing display

The WindowToken of cutout/rounded corner overlay will be collected
in transition for sync drawing, so buildFinishTransaction will
put the restore operations in finishTransaction.

But previously the finishTransaction will always reparent the token
to the parent in window hierarchy, which doesn't consider the
override operation while creating the surface (makeSurface).

Then after the first display resize transition, the overlay
becomes flickering in next display resize because it is occluded by
the screenshot layer which has a higher z-order without including
the overlay.

Bug: 288726181
Test: Change screen resolution in Settings.
      The cutout won't have a small flickering
      (disappear in a frame).
Change-Id: Ibee8c5b8daffdaf38f4f0ce9351dd085929ccb45
This commit is contained in:
Riddle Hsu
2023-07-03 10:13:05 +00:00
parent f2c66dee85
commit 4552d3e896
2 changed files with 12 additions and 1 deletions

View File

@@ -2262,7 +2262,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
// transitions anyways).
return wc.getParent().asDisplayContent().getWindowingLayer();
}
return wc.getParent().getSurfaceControl();
return wc.getParentSurfaceControl();
}
/**

View File

@@ -388,12 +388,23 @@ class WindowToken extends WindowContainer<WindowState> {
@Override
SurfaceControl.Builder makeSurface() {
final SurfaceControl.Builder builder = super.makeSurface();
// The overlay may use COLOR_MODE_A8 that needs to be at the top of the display to avoid
// additional memory usage, see b/235601833. Note that getParentSurfaceControl() must use
// the same parent.
if (mRoundedCornerOverlay) {
builder.setParent(null);
}
return builder;
}
@Override
public SurfaceControl getParentSurfaceControl() {
if (mRoundedCornerOverlay) {
return null;
}
return super.getParentSurfaceControl();
}
boolean isClientVisible() {
return mClientVisible;
}