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

Commit 7b46c191 authored by mincheli's avatar mincheli
Browse files

Make mirror view able to move close to the screen edges

Because magnification mirror view has transparent border,
the mirror view unable to move close to the screen edges visually.
So we use setTranslationX and setTranslationY to adjust the
location of mirror view to achieve it.

Bug: 146402201
Bug: 148356962
Test: adb shell settings put secure window_magnification 1
Change-Id: I1491ad8113faaa1a559df776f8c6920935dea505
parent 3677e44f
Loading
Loading
Loading
Loading
+36 −3
Original line number Original line Diff line number Diff line
@@ -87,6 +87,7 @@ public class WindowMagnificationController implements View.OnTouchListener, Surf
    private SurfaceView mMirrorSurfaceView;
    private SurfaceView mMirrorSurfaceView;
    private int mMirrorSurfaceMargin;
    private int mMirrorSurfaceMargin;
    private int mBorderDragSize;
    private int mBorderDragSize;
    private int mOuterBorderSize;
    private View mOverlayView;
    private View mOverlayView;
    // The boundary of magnification frame.
    // The boundary of magnification frame.
    private final Rect mMagnificationFrameBoundary = new Rect();
    private final Rect mMagnificationFrameBoundary = new Rect();
@@ -118,6 +119,8 @@ public class WindowMagnificationController implements View.OnTouchListener, Surf
                R.dimen.magnification_mirror_surface_margin);
                R.dimen.magnification_mirror_surface_margin);
        mBorderDragSize = mResources.getDimensionPixelSize(
        mBorderDragSize = mResources.getDimensionPixelSize(
                R.dimen.magnification_border_drag_size);
                R.dimen.magnification_border_drag_size);
        mOuterBorderSize = mResources.getDimensionPixelSize(
                R.dimen.magnification_outer_border_margin);
    }
    }


    /**
    /**
@@ -357,7 +360,7 @@ public class WindowMagnificationController implements View.OnTouchListener, Surf
    }
    }


    /**
    /**
     * Modifies the placement of the mirrored content.
     * Modifies the placement of the mirrored content when the position of mMirrorView is updated.
     */
     */
    private void modifyWindowMagnification(SurfaceControl.Transaction t) {
    private void modifyWindowMagnification(SurfaceControl.Transaction t) {
        Rect sourceBounds = getSourceBounds(mMagnificationFrame, mScale);
        Rect sourceBounds = getSourceBounds(mMagnificationFrame, mScale);
@@ -365,13 +368,43 @@ public class WindowMagnificationController implements View.OnTouchListener, Surf
        // ViewRootImpl's position will change
        // ViewRootImpl's position will change
        mTmpRect.set(0, 0, mMagnificationFrame.width(), mMagnificationFrame.height());
        mTmpRect.set(0, 0, mMagnificationFrame.width(), mMagnificationFrame.height());


        updateMirrorViewLayout();

        t.setGeometry(mMirrorSurface, sourceBounds, mTmpRect, Surface.ROTATION_0);
    }

    /**
     * Updates the layout params of MirrorView and translates MirrorView position when the view is
     * moved close to the screen edges.
     */
    private void updateMirrorViewLayout() {
        WindowManager.LayoutParams params =
        WindowManager.LayoutParams params =
                (WindowManager.LayoutParams) mMirrorView.getLayoutParams();
                (WindowManager.LayoutParams) mMirrorView.getLayoutParams();
        params.x = mMagnificationFrame.left;
        params.x = mMagnificationFrame.left;
        params.y = mMagnificationFrame.top;
        params.y = mMagnificationFrame.top;
        // Translates MirrorView position to make MirrorSurfaceView that is inside MirrorView
        // able to move close to the screen edges.
        final int maxMirrorViewX = mDisplaySize.x - mMirrorView.getWidth();
        final int maxMirrorViewY = mDisplaySize.y - mMirrorView.getHeight();
        final float translationX;
        final float translationY;
        if (params.x < 0) {
            translationX = Math.max(params.x, -mOuterBorderSize);
        } else if (params.x > maxMirrorViewX) {
            translationX = Math.min(params.x - maxMirrorViewX, mOuterBorderSize);
        } else {
            translationX = 0;
        }
        if (params.y < 0) {
            translationY = Math.max(params.y, -mOuterBorderSize);
        } else if (params.y > maxMirrorViewY) {
            translationY = Math.min(params.y - maxMirrorViewY, mOuterBorderSize);
        } else {
            translationY = 0;
        }
        mMirrorView.setTranslationX(translationX);
        mMirrorView.setTranslationY(translationY);
        mWm.updateViewLayout(mMirrorView, params);
        mWm.updateViewLayout(mMirrorView, params);

        t.setGeometry(mMirrorSurface, sourceBounds, mTmpRect, Surface.ROTATION_0);
    }
    }


    @Override
    @Override