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

Commit f752c800 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Fix Magnifier position updates

When the magnifier content moves relative to the parent surface,
it will call setPosition on the content surface control. This conflicts
with position updates called by the BlastBufferQueue adapter
causing a flicker on screen. Fix this by providing a wrapper surface
to BlastBufferQueue adapater to send buffer updates.

Fixes: 186072574
Test: Select text and see magnifier surface does not flicker or move
around

Change-Id: Idfcc06a5d90f400f69e5cbe91008a0cb59fd4646
parent 692496d9
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -939,6 +939,7 @@ public final class Magnifier {
        // The surface we allocate for the magnifier content + shadow.
        private final SurfaceSession mSurfaceSession;
        private final SurfaceControl mSurfaceControl;
        private final SurfaceControl mBbqSurfaceControl;
        private final BLASTBufferQueue mBBQ;
        private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
        private final Surface mSurface;
@@ -1008,11 +1009,19 @@ public final class Magnifier {
            mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
                    .setName("magnifier surface")
                    .setFlags(SurfaceControl.HIDDEN)
                    .setBLASTLayer()
                    .setContainerLayer()
                    .setParent(parentSurfaceControl)
                    .setCallsite("InternalPopupWindow")
                    .build();
            mBBQ = new BLASTBufferQueue("magnifier surface", mSurfaceControl,
            mBbqSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
                    .setName("magnifier surface bbq wrapper")
                    .setHidden(false)
                    .setBLASTLayer()
                    .setParent(mSurfaceControl)
                    .setCallsite("InternalPopupWindow")
                    .build();

            mBBQ = new BLASTBufferQueue("magnifier surface", mBbqSurfaceControl,
                surfaceWidth, surfaceHeight, PixelFormat.TRANSLUCENT);
            mSurface = mBBQ.createSurface();

@@ -1073,7 +1082,7 @@ public final class Magnifier {
            }
            if (mContentHeight < contentHeight) {
                // Grows the surface height as necessary.
                mBBQ.update(mSurfaceControl, mContentWidth, contentHeight,
                mBBQ.update(mBbqSurfaceControl, mContentWidth, contentHeight,
                    PixelFormat.TRANSLUCENT);
                mRenderer.setSurface(mSurface);

@@ -1270,7 +1279,10 @@ public final class Magnifier {
            mRenderer.destroy();
            mSurface.destroy();
            mBBQ.destroy();
            new SurfaceControl.Transaction().remove(mSurfaceControl).apply();
            new SurfaceControl.Transaction()
                    .remove(mSurfaceControl)
                    .remove(mBbqSurfaceControl)
                    .apply();
            mSurfaceSession.kill();
            mHandler.removeCallbacks(mMagnifierUpdater);
            if (mBitmap != null) {