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

Commit 4552d3e8 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent f2c66dee
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2262,7 +2262,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
            // transitions anyways).
            return wc.getParent().asDisplayContent().getWindowingLayer();
        }
        return wc.getParent().getSurfaceControl();
        return wc.getParentSurfaceControl();
    }

    /**
+11 −0
Original line number Diff line number Diff line
@@ -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;
    }