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

Commit e8300a1d authored by Grace Kloba's avatar Grace Kloba
Browse files

Expose smart-zoom, or centerFitRect to native.

Clean up the old centerPluginOnScreen so it can be
used to center fit any rectangle on the screen.

Fix http://b/issue?id=2510670
parent 34ec95de
Loading
Loading
Loading
Loading
+38 −29
Original line number Diff line number Diff line
@@ -535,9 +535,10 @@ public class WebView extends AbsoluteLayout
    static final int SET_ROOT_LAYER_MSG_ID              = 124;
    static final int RETURN_LABEL                       = 125;
    static final int FIND_AGAIN                         = 126;
    static final int CENTER_FIT_RECT                    = 127;

    private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID;
    private static final int LAST_PACKAGE_MSG_ID = FIND_AGAIN;
    private static final int LAST_PACKAGE_MSG_ID = CENTER_FIT_RECT;

    static final String[] HandlerPrivateDebugString = {
        "REMEMBER_PASSWORD", //              = 1;
@@ -578,7 +579,8 @@ public class WebView extends AbsoluteLayout
        "IMMEDIATE_REPAINT_MSG_ID", //       = 123;
        "SET_ROOT_LAYER_MSG_ID", //          = 124;
        "RETURN_LABEL", //                   = 125;
        "FIND_AGAIN" //                      = 126;
        "FIND_AGAIN", //                     = 126;
        "CENTER_FIT_RECT" //                 = 127;
    };

    // If the site doesn't use the viewport meta tag to specify the viewport,
@@ -5737,49 +5739,50 @@ public class WebView extends AbsoluteLayout
    }

    /*
     * Maximize and center the view inside the WebView. If the zoom doesn't need
     * to be changed, do an animated scroll to center it. If the zoom needs to
     * be changed, find the zoom center and do a smooth zoom transition.
     * Maximize and center the rectangle, specified in the document coordinate
     * space, inside the WebView. If the zoom doesn't need to be changed, do an
     * animated scroll to center it. If the zoom needs to be changed, find the
     * zoom center and do a smooth zoom transition.
     */
    private void centerPluginOnScreen(ViewManager.ChildView child) {
    private void centerFitRect(int docX, int docY, int docWidth, int docHeight) {
        int viewWidth = getViewWidth();
        int viewHeight = getViewHeightWithTitle();
        float scale = Math.min((float) viewWidth / child.width,
                (float) viewHeight / child.height);
        float scale = Math.min((float) viewWidth / docWidth, (float) viewHeight
                / docHeight);
        if (scale < mMinZoomScale) {
            scale = mMinZoomScale;
        } else if (scale > mMaxZoomScale) {
            scale = mMaxZoomScale;
        }
        if (Math.abs(scale - mActualScale) < MINIMUM_SCALE_INCREMENT) {
            pinScrollTo(
                    contentToViewX(child.x + child.width / 2) - viewWidth / 2,
                    contentToViewY(child.y + child.height / 2) - viewHeight / 2,
            pinScrollTo(contentToViewX(docX + docWidth / 2) - viewWidth / 2,
                    contentToViewY(docY + docHeight / 2) - viewHeight / 2,
                    true, 0);
        } else {
            int oldScreenX = contentToViewX(child.x) - mScrollX;
            int newPluginX = (int) (child.x * scale);
            int newPluginWidth = (int) (child.width * scale);
            int oldScreenX = contentToViewX(docX) - mScrollX;
            int rectViewX = (int) (docX * scale);
            int rectViewWidth = (int) (docWidth * scale);
            int newMaxWidth = (int) (mContentWidth * scale);
            int newScreenX = (viewWidth - newPluginWidth) / 2;
            int newScreenX = (viewWidth - rectViewWidth) / 2;
            // pin the newX to the WebView
            if (newScreenX > newPluginX) {
                newScreenX = newPluginX;
            } else if (newScreenX > (newMaxWidth - newPluginX - newPluginWidth)) {
                newScreenX = viewWidth - (newMaxWidth - newPluginX);
            if (newScreenX > rectViewX) {
                newScreenX = rectViewX;
            } else if (newScreenX > (newMaxWidth - rectViewX - rectViewWidth)) {
                newScreenX = viewWidth - (newMaxWidth - rectViewX);
            }
            mZoomCenterX = (oldScreenX * scale - newScreenX * mActualScale)
                    / (scale - mActualScale);
            int oldScreenY = contentToViewY(child.y) - mScrollY;
            int newPluginY = (int) (child.y * scale) + getTitleHeight();
            int newPluginHeight = (int) (child.height * scale);
            int newMaxHeight = (int) (mContentHeight * scale) + getTitleHeight();
            int newScreenY = (viewHeight - newPluginHeight) / 2;
            int oldScreenY = contentToViewY(docY) - mScrollY;
            int rectViewY = (int) (docY * scale) + getTitleHeight();
            int rectViewHeight = (int) (docHeight * scale);
            int newMaxHeight = (int) (mContentHeight * scale)
                    + getTitleHeight();
            int newScreenY = (viewHeight - rectViewHeight) / 2;
            // pin the newY to the WebView
            if (newScreenY > newPluginY) {
                newScreenY = newPluginY;
            } else if (newScreenY > (newMaxHeight - newPluginY - newPluginHeight)) {
                newScreenY = viewHeight - (newMaxHeight - newPluginY);
            if (newScreenY > rectViewY) {
                newScreenY = rectViewY;
            } else if (newScreenY > (newMaxHeight - rectViewY - rectViewHeight)) {
                newScreenY = viewHeight - (newMaxHeight - rectViewY);
            }
            mZoomCenterY = (oldScreenY * scale - newScreenY * mActualScale)
                    / (scale - mActualScale);
@@ -5825,7 +5828,7 @@ public class WebView extends AbsoluteLayout
                        true);
            } else {
                mInZoomOverview = false;
                centerPluginOnScreen(plugin);
                centerFitRect(plugin.x, plugin.y, plugin.width, plugin.height);
            }
            return;
        }
@@ -6642,6 +6645,12 @@ public class WebView extends AbsoluteLayout
                    }
                    break;

                case CENTER_FIT_RECT:
                    Rect r = (Rect)msg.obj;
                    mInZoomOverview = false;
                    centerFitRect(r.left, r.top, r.width(), r.height());
                    break;

                default:
                    super.handleMessage(msg);
                    break;
+9 −0
Original line number Diff line number Diff line
@@ -2462,6 +2462,15 @@ final class WebViewCore {
        }
    }

    // called by JNI
    private void centerFitRect(int x, int y, int width, int height) {
        if (mWebView == null) {
            return;
        }
        mWebView.mPrivateHandler.obtainMessage(WebView.CENTER_FIT_RECT,
                new Rect(x, y, x + width, y + height)).sendToTarget();
    }

    private native void nativePause();
    private native void nativeResume();
    private native void nativeFreeMemory();