Kaydet (Commit) 7e8322f2 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

android: add ZoomConstraints (Fennec import)

Change-Id: I7bb840f74675a2e23fd7ee45aad4d48a705e567e
üst 89d40803
......@@ -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();
......
......@@ -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);
......
/* -*- 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;
}
}
......@@ -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;
}
}
......@@ -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();
}
}
......@@ -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,
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment