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

Commit 424f6685 authored by Mitsuru Oshima's avatar Mitsuru Oshima
Browse files

* Revert the change that I introduced while refactroing in SurfaceView#dispatchTouchEvent

* Don't scale back the event if the canvas is used in SurfaceView.
parent ae1ba650
Loading
Loading
Loading
Loading
+27 −16
Original line number Original line Diff line number Diff line
@@ -141,6 +141,13 @@ public class SurfaceView extends View {
    final Rect mSurfaceFrame = new Rect();
    final Rect mSurfaceFrame = new Rect();
    private Translator mTranslator;
    private Translator mTranslator;
    
    
    // A flag to indicate that the Canvas has to be scaled
    private boolean mScaleCanvas = false;
    // A flag to indicate that the Canvas is in use and being scaled.
    // This may remain to be false even if mScaleCanvas is true if the applicatio
    // does not use the canvas (such as GLSurfaceView, VideoView).
    private boolean mCanvasScaled = false;
    
    public SurfaceView(Context context) {
    public SurfaceView(Context context) {
        super(context);
        super(context);
        setWillNotDraw(true);
        setWillNotDraw(true);
@@ -254,18 +261,21 @@ public class SurfaceView extends View {


    @Override
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
    public boolean dispatchTouchEvent(MotionEvent event) {
        // SurfaceView uses pre-scaled size unless fixed size is requested. This hook
        if (mTranslator == null || mCanvasScaled) {
        // scales the event back to the pre-scaled coordinates for such surface.
            // Use the event as is if no scaling is required, or the surface's canvas
        if (mScaled) {
            // is scaled too.
            return super.dispatchTouchEvent(event);
        } else {
            // The surface is in native size, so we need to scale the event
            // back to native location.
            MotionEvent scaledBack = MotionEvent.obtain(event);
            MotionEvent scaledBack = MotionEvent.obtain(event);
            mTranslator.translateEventInScreenToAppWindow(event);
            // scale back to original
            scaledBack.scale(mTranslator.applicationScale);
            try {
            try {
                return super.dispatchTouchEvent(scaledBack);
                return super.dispatchTouchEvent(scaledBack);
            } finally {
            } finally {
                scaledBack.recycle();
                scaledBack.recycle();
            }
            }
        } else {
            return super.dispatchTouchEvent(event);
        }
        }
    }
    }


@@ -291,8 +301,6 @@ public class SurfaceView extends View {
        mWindowType = type;
        mWindowType = type;
    }
    }


    boolean mScaled = false;
    
    private void updateWindow(boolean force) {
    private void updateWindow(boolean force) {
        if (!mHaveFrame) {
        if (!mHaveFrame) {
            return;
            return;
@@ -312,14 +320,15 @@ public class SurfaceView extends View {
        int myHeight = mRequestedHeight;
        int myHeight = mRequestedHeight;
        if (myHeight <= 0) myHeight = getHeight();
        if (myHeight <= 0) myHeight = getHeight();


        // Use original size if the app specified the size of the view,
        // Use requested size if the app specified the size of the view
        // and let the flinger to scale up.
        // and let the flinger to scale up. Otherwise, use the native size
        // (* appScale) and assume the application can handle it.
        if (mRequestedWidth <= 0 && mTranslator != null) {
        if (mRequestedWidth <= 0 && mTranslator != null) {
            myWidth = (int) (myWidth * appScale + 0.5f);
            myWidth = (int) (myWidth * appScale + 0.5f);
            myHeight = (int) (myHeight * appScale + 0.5f);
            myHeight = (int) (myHeight * appScale + 0.5f);
            mScaled = true;
            mScaleCanvas = true;
        } else {
        } else {
            mScaled = false;
            mScaleCanvas = false;
        }
        }


        getLocationInWindow(mLocation);
        getLocationInWindow(mLocation);
@@ -641,7 +650,9 @@ public class SurfaceView extends View {
            if (localLOGV) Log.i(TAG, "Returned canvas: " + c);
            if (localLOGV) Log.i(TAG, "Returned canvas: " + c);
            if (c != null) {
            if (c != null) {
                mLastLockTime = SystemClock.uptimeMillis();
                mLastLockTime = SystemClock.uptimeMillis();
                if (mScaled) {
                if (mScaleCanvas) {
                    // When the canvas is scaled, don't scale back the event's location.
                    mCanvasScaled = true;
                    mSaveCount = c.save();
                    mSaveCount = c.save();
                    mTranslator.translateCanvas(c);
                    mTranslator.translateCanvas(c);
                }
                }
@@ -667,7 +678,7 @@ public class SurfaceView extends View {
        }
        }


        public void unlockCanvasAndPost(Canvas canvas) {
        public void unlockCanvasAndPost(Canvas canvas) {
            if (mScaled) {
            if (mCanvasScaled) {
                canvas.restoreToCount(mSaveCount);
                canvas.restoreToCount(mSaveCount);
            }
            }
            mSurface.unlockCanvasAndPost(canvas);
            mSurface.unlockCanvasAndPost(canvas);