From 7e8322f251e6d2b3e3951f5a55b1c6b69d6843f7 Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Sat, 27 Sep 2014 12:32:29 +0200 Subject: android: add ZoomConstraints (Fennec import) Change-Id: I7bb840f74675a2e23fd7ee45aad4d48a705e567e --- .../src/java/org/libreoffice/LOKitThread.java | 4 +- .../org/libreoffice/LibreOfficeMainActivity.java | 3 +- .../java/org/mozilla/gecko/ZoomConstraints.java | 46 ++++++++++++++++++++++ .../org/mozilla/gecko/gfx/LayerController.java | 44 +++++---------------- .../org/mozilla/gecko/gfx/ViewportMetrics.java | 26 +++++------- .../org/mozilla/gecko/ui/PanZoomController.java | 29 ++++++++------ .../mozilla/gecko/ui/SubdocumentScrollHelper.java | 16 +------- 7 files changed, 89 insertions(+), 79 deletions(-) create mode 100644 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ZoomConstraints.java diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java index 429355625329..349de7b4a679 100644 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java +++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java @@ -3,6 +3,7 @@ package org.libreoffice; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.RectF; +import android.util.DisplayMetrics; import android.util.Log; import org.mozilla.gecko.gfx.GeckoLayerClient; @@ -28,7 +29,8 @@ public class LOKitThread extends Thread { int pageHeight = mTileProvider.getPageHeight(); RectF rect = new RectF(0, 0, pageWidth, pageHeight); - mViewportMetrics = new ViewportMetrics(); + DisplayMetrics displayMetrics = LibreOfficeMainActivity.mAppContext.getResources().getDisplayMetrics(); + mViewportMetrics = new ViewportMetrics(displayMetrics); mViewportMetrics.setPageRect(rect, rect); GeckoLayerClient layerClient = mApplication.getLayerClient(); diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java index 810ff26046ac..b6b892a5e8f1 100644 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java +++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LibreOfficeMainActivity.java @@ -13,6 +13,7 @@ import android.widget.AdapterView; import android.widget.ListView; import android.widget.RelativeLayout; +import org.mozilla.gecko.ZoomConstraints; import org.mozilla.gecko.gfx.GeckoLayerClient; import org.mozilla.gecko.gfx.LayerController; @@ -118,7 +119,7 @@ public class LibreOfficeMainActivity extends Activity { } mLayerController = new LayerController(this); - mLayerController.setAllowZoom(true); + mLayerController.setZoomConstraints(new ZoomConstraints(true)); mLayerClient = new GeckoLayerClient(this); mLayerController.setLayerClient(mLayerClient); mGeckoLayout.addView(mLayerController.getView(), 0); diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ZoomConstraints.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ZoomConstraints.java new file mode 100644 index 000000000000..40d1817c9301 --- /dev/null +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ZoomConstraints.java @@ -0,0 +1,46 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko; + +import org.json.JSONException; +import org.json.JSONObject; + +public final class ZoomConstraints { + private final boolean mAllowZoom; + private final float mDefaultZoom; + private final float mMinZoom; + private final float mMaxZoom; + + public ZoomConstraints(boolean allowZoom) { + mAllowZoom = allowZoom; + mDefaultZoom = 0.0f; + mMinZoom = 0.0f; + mMaxZoom = 0.0f; + } + + ZoomConstraints(JSONObject message) throws JSONException { + mAllowZoom = message.getBoolean("allowZoom"); + mDefaultZoom = (float)message.getDouble("defaultZoom"); + mMinZoom = (float)message.getDouble("minZoom"); + mMaxZoom = (float)message.getDouble("maxZoom"); + } + + public final boolean getAllowZoom() { + return mAllowZoom; + } + + public final float getDefaultZoom() { + return mDefaultZoom; + } + + public final float getMinZoom() { + return mMinZoom; + } + + public final float getMaxZoom() { + return mMaxZoom; + } +} diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerController.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerController.java index 8a39b82c259f..694b17da0814 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerController.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerController.java @@ -12,8 +12,10 @@ import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.PointF; import android.graphics.RectF; +import android.util.DisplayMetrics; import android.view.GestureDetector; +import org.mozilla.gecko.ZoomConstraints; import org.mozilla.gecko.ui.PanZoomController; import org.mozilla.gecko.ui.SimpleScaleGestureDetector; @@ -56,21 +58,19 @@ public class LayerController { private int mCheckerboardColor = Color.WHITE; private boolean mCheckerboardShouldShowChecks; - private boolean mAllowZoom; - private float mDefaultZoom; - private float mMinZoom; - private float mMaxZoom; + private ZoomConstraints mZoomConstraints; private boolean mForceRedraw; public LayerController(Context context) { mContext = context; - mForceRedraw = true; - mViewportMetrics = new ImmutableViewportMetrics(new ViewportMetrics()); + DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); + mViewportMetrics = new ImmutableViewportMetrics(new ViewportMetrics(displayMetrics)); mPanZoomController = new PanZoomController(this); mView = new LayerView(context, this); mCheckerboardShouldShowChecks = true; + mZoomConstraints = new ZoomConstraints(false); } public void setRoot(Layer layer) { mRootLayer = layer; } @@ -307,35 +307,11 @@ public class LayerController { mView.requestRender(); } - public void setAllowZoom(final boolean aValue) { - mAllowZoom = aValue; - } - - public boolean getAllowZoom() { - return mAllowZoom; - } - - public void setDefaultZoom(float aValue) { - mDefaultZoom = aValue; - } - - public float getDefaultZoom() { - return mDefaultZoom; - } - - public void setMinZoom(float aValue) { - mMinZoom = aValue; - } - - public float getMinZoom() { - return mMinZoom; - } - - public void setMaxZoom(float aValue) { - mMaxZoom = aValue; + public void setZoomConstraints(ZoomConstraints constraints) { + mZoomConstraints = constraints; } - public float getMaxZoom() { - return mMaxZoom; + public ZoomConstraints getZoomConstraints() { + return mZoomConstraints; } } diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ViewportMetrics.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ViewportMetrics.java index f7b84bfaa28d..789bb0bff0b5 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ViewportMetrics.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ViewportMetrics.java @@ -11,7 +11,6 @@ import android.util.DisplayMetrics; import org.json.JSONException; import org.json.JSONObject; -import org.libreoffice.LibreOfficeMainActivity; import org.mozilla.gecko.util.FloatUtils; /** @@ -26,10 +25,7 @@ public class ViewportMetrics { private RectF mViewportRect; private float mZoomFactor; - public ViewportMetrics() { - DisplayMetrics metrics = new DisplayMetrics(); - LibreOfficeMainActivity.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(metrics); - + public ViewportMetrics(DisplayMetrics metrics) { mPageRect = new RectF(0, 0, metrics.widthPixels, metrics.heightPixels); mCssPageRect = new RectF(0, 0, metrics.widthPixels, metrics.heightPixels); mViewportRect = new RectF(0, 0, metrics.widthPixels, metrics.heightPixels); @@ -59,20 +55,19 @@ public class ViewportMetrics { mZoomFactor = viewport.zoomFactor; } - public ViewportMetrics(JSONObject json) throws JSONException { float x = (float)json.getDouble("x"); float y = (float)json.getDouble("y"); float width = (float)json.getDouble("width"); float height = (float)json.getDouble("height"); - float pageLeft = 0.0f; - float pageTop = 0.0f; - float pageRight = (float)json.getDouble("pageWidth"); - float pageBottom = (float)json.getDouble("pageHeight"); - float cssPageLeft = 0.0f; - float cssPageTop = 0.0f; - float cssPageRight = (float)json.getDouble("cssPageWidth"); - float cssPageBottom = (float)json.getDouble("cssPageHeight"); + float pageLeft = (float)json.getDouble("pageLeft"); + float pageTop = (float)json.getDouble("pageTop"); + float pageRight = (float)json.getDouble("pageRight"); + float pageBottom = (float)json.getDouble("pageBottom"); + float cssPageLeft = (float)json.getDouble("cssPageLeft"); + float cssPageTop = (float)json.getDouble("cssPageTop"); + float cssPageRight = (float)json.getDouble("cssPageRight"); + float cssPageBottom = (float)json.getDouble("cssPageBottom"); float zoom = (float)json.getDouble("zoom"); mPageRect = new RectF(pageLeft, pageTop, pageRight, pageBottom); @@ -178,7 +173,7 @@ public class ViewportMetrics { * page size, the offset, and the zoom factor. */ public ViewportMetrics interpolate(ViewportMetrics to, float t) { - ViewportMetrics result = new ViewportMetrics(); + ViewportMetrics result = new ViewportMetrics(this); result.mPageRect = RectUtils.interpolate(mPageRect, to.mPageRect, t); result.mCssPageRect = RectUtils.interpolate(mCssPageRect, to.mCssPageRect, t); result.mZoomFactor = FloatUtils.interpolate(mZoomFactor, to.mZoomFactor, t); @@ -227,4 +222,3 @@ public class ViewportMetrics { return buff.toString(); } } - diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java index 243fa75d2129..7adc1bde6c6b 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java @@ -14,6 +14,7 @@ import android.view.MotionEvent; import org.libreoffice.LOKitShell; import org.libreoffice.LibreOfficeMainActivity; +import org.mozilla.gecko.ZoomConstraints; import org.mozilla.gecko.gfx.ImmutableViewportMetrics; import org.mozilla.gecko.gfx.LayerController; import org.mozilla.gecko.gfx.ViewportMetrics; @@ -111,7 +112,7 @@ public class PanZoomController public PanZoomController(LayerController controller) { mController = controller; - mSubscroller = new SubdocumentScrollHelper(this); + mSubscroller = new SubdocumentScrollHelper(); mX = new AxisX(mSubscroller); mY = new AxisY(mSubscroller); @@ -705,14 +706,16 @@ public class PanZoomController float minZoomFactor = 0.0f; float maxZoomFactor = MAX_ZOOM; - if (mController.getMinZoom() > 0) - minZoomFactor = mController.getMinZoom(); - if (mController.getMaxZoom() > 0) - maxZoomFactor = mController.getMaxZoom(); + ZoomConstraints constraints = mController.getZoomConstraints(); - if (!mController.getAllowZoom()) { + if (constraints.getMinZoom() > 0) + minZoomFactor = constraints.getMinZoom(); + if (constraints.getMaxZoom() > 0) + maxZoomFactor = constraints.getMaxZoom(); + + if (!constraints.getAllowZoom()) { // If allowZoom is false, clamp to the default zoom level. - maxZoomFactor = minZoomFactor = mController.getDefaultZoom(); + maxZoomFactor = minZoomFactor = constraints.getDefaultZoom(); } // Ensure minZoomFactor keeps the page at least as big as the viewport. @@ -782,7 +785,7 @@ public class PanZoomController if (mState == PanZoomState.ANIMATED_ZOOM) return false; - if (!mController.getAllowZoom()) + if (!mController.getZoomConstraints().getAllowZoom()) return false; setState(PanZoomState.PINCHING); @@ -820,10 +823,12 @@ public class PanZoomController float minZoomFactor = 0.0f; float maxZoomFactor = MAX_ZOOM; - if (mController.getMinZoom() > 0) - minZoomFactor = mController.getMinZoom(); - if (mController.getMaxZoom() > 0) - maxZoomFactor = mController.getMaxZoom(); + ZoomConstraints constraints = mController.getZoomConstraints(); + + if (constraints.getMinZoom() > 0) + minZoomFactor = constraints.getMinZoom(); + if (constraints.getMaxZoom() > 0) + maxZoomFactor = constraints.getMaxZoom(); if (newZoomFactor < minZoomFactor) { // apply resistance when zooming past minZoomFactor, diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/SubdocumentScrollHelper.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/SubdocumentScrollHelper.java index 0e74456896ec..86f92d35f19d 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/SubdocumentScrollHelper.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/SubdocumentScrollHelper.java @@ -7,15 +7,10 @@ package org.mozilla.gecko.ui; import android.graphics.PointF; import android.os.Handler; -import android.util.Log; - -import org.json.JSONException; -import org.json.JSONObject; class SubdocumentScrollHelper { private static final String LOGTAG = "GeckoSubdocumentScrollHelper"; - private final PanZoomController mPanZoomController; private final Handler mUiHandler; /* This is the amount of displacement we have accepted but not yet sent to JS; this is @@ -38,8 +33,7 @@ class SubdocumentScrollHelper { * the subdocument; we use this to decide when we have reached the end of the subdocument. */ private boolean mScrollSucceeded; - SubdocumentScrollHelper(PanZoomController controller) { - mPanZoomController = controller; + SubdocumentScrollHelper() { // mUiHandler will be bound to the UI thread since that's where this constructor runs mUiHandler = new Handler(); mPendingDisplacement = new PointF(); @@ -60,14 +54,6 @@ class SubdocumentScrollHelper { return true; } - JSONObject json = new JSONObject(); - try { - json.put("x", displacement.x); - json.put("y", displacement.y); - } catch (JSONException e) { - Log.e(LOGTAG, "Error forming subwindow scroll message: ", e); - } - mOverrideScrollAck = false; mOverrideScrollPending = false; // clear the |mPendingDisplacement| after serializing |displacement| to -- cgit v1.2.3