android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java | 16 --- android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelection.java | 2 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelectionHandle.java | 45 +++++++--- 3 files changed, 39 insertions(+), 24 deletions(-)
New commits: commit f087bd4c2e5cf393439cece75466aa8afac3c36d Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> Date: Mon Mar 2 15:17:35 2015 +0900 android: account for handle repositioning, limit update to 50ms Text handles are usually shown under the current selection or cursor position. Previously this was done in InvalidationHandler, now the TextSelectionHandle takes this into account just before drawing. The reason is that the repositioning needs to be taken into account when the handle moves to reposition the coordinates back to original position. In addition to that, the number of times the move handle update event is send is now limited to 50ms to reduce stress for the device (less in queue, less messages via LOKit). This also makes the handle more fluid and jump around less. Change-Id: Idc401375c82b3eeac66328d98c80bf3cb7b675ea diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java index 1f3b39b..8efc6f4 100644 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java +++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java @@ -119,16 +119,6 @@ public class InvalidationHandler { } /** - * From input rectangle, create a new rectangle which positions under the input rectangle. - * - * @param rectangle - input rectangle - * @return new rectangle positioned under the input rectangle - */ - private RectF createRectangleUnderSelection(RectF rectangle) { - return new RectF(rectangle.centerX(), rectangle.bottom, rectangle.centerX(), rectangle.bottom); - } - - /** * Handles the tile invalidation message * * @param payload @@ -149,7 +139,7 @@ public class InvalidationHandler { RectF cursorRectangle = convertPayloadToRectangle(payload); if (cursorRectangle != null) { if (mState == OverlayState.CURSOR) { - mTextSelection.positionHandle(TextSelectionHandle.HandleType.MIDDLE, createRectangleUnderSelection(cursorRectangle)); + mTextSelection.positionHandle(TextSelectionHandle.HandleType.MIDDLE, cursorRectangle); mTextSelection.showHandle(TextSelectionHandle.HandleType.MIDDLE); mTextSelection.hideHandle(TextSelectionHandle.HandleType.START); mTextSelection.hideHandle(TextSelectionHandle.HandleType.END); @@ -170,7 +160,7 @@ public class InvalidationHandler { } RectF selectionRectangle = convertPayloadToRectangle(payload); if (selectionRectangle != null) { - mTextSelection.positionHandle(TextSelectionHandle.HandleType.START, createRectangleUnderSelection(selectionRectangle)); + mTextSelection.positionHandle(TextSelectionHandle.HandleType.START, selectionRectangle); mTextSelection.showHandle(TextSelectionHandle.HandleType.START); mTextSelection.hideHandle(TextSelectionHandle.HandleType.MIDDLE); mState = OverlayState.SELECTION; @@ -188,7 +178,7 @@ public class InvalidationHandler { } RectF selectionRect = convertPayloadToRectangle(payload); if (selectionRect != null) { - mTextSelection.positionHandle(TextSelectionHandle.HandleType.END, createRectangleUnderSelection(selectionRect)); + mTextSelection.positionHandle(TextSelectionHandle.HandleType.END, selectionRect); mTextSelection.showHandle(TextSelectionHandle.HandleType.END); mTextSelection.hideHandle(TextSelectionHandle.HandleType.MIDDLE); mState = OverlayState.SELECTION; diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelection.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelection.java index 2f05e4f..94f9b90 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelection.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelection.java @@ -108,7 +108,7 @@ public class TextSelection extends Layer { LOKitShell.getMainHandler().post(new Runnable() { public void run() { TextSelectionHandle handle = getHandle(handleType); - handle.positionFromGecko((int) position.left, (int) position.top, false); + handle.positionFromGecko(position, false); } }); } diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelectionHandle.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelectionHandle.java index 0bd1486..61f5355 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelectionHandle.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/TextSelectionHandle.java @@ -7,6 +7,7 @@ package org.mozilla.gecko; import android.content.Context; import android.content.res.TypedArray; import android.graphics.PointF; +import android.graphics.RectF; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; @@ -22,6 +23,10 @@ import org.mozilla.gecko.gfx.LayerView; public class TextSelectionHandle extends ImageView implements View.OnTouchListener { private static final String LOGTAG = TextSelectionHandle.class.getSimpleName(); + private long mLastTime = 0; + + // Minimum time lapsed between 2 handle updates + private static final long MINIMUM_HANDLE_UPDATE_TIME = 50 * 1000000; public enum HandleType { START, MIDDLE, END }; @@ -33,7 +38,8 @@ public class TextSelectionHandle extends ImageView implements View.OnTouchListen private int mLeft; private int mTop; private boolean mIsRTL; - private PointF mGeckoPoint; + private PointF mPoint; + private PointF mReposition; private int mTouchStartX; private int mTouchStartY; @@ -49,15 +55,16 @@ public class TextSelectionHandle extends ImageView implements View.OnTouchListen TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextSelectionHandle); int handleType = a.getInt(R.styleable.TextSelectionHandle_handleType, 0x01); - if (handleType == 0x01) + if (handleType == 0x01) { mHandleType = HandleType.START; - else if (handleType == 0x02) + } else if (handleType == 0x02) { mHandleType = HandleType.MIDDLE; - else + } else if (handleType == 0x03) { mHandleType = HandleType.END; + } mIsRTL = false; - mGeckoPoint = new PointF(0.0f, 0.0f); + mPoint = new PointF(0.0f, 0.0f); mWidth = getResources().getDimensionPixelSize(R.dimen.text_selection_handle_width); mHeight = getResources().getDimensionPixelSize(R.dimen.text_selection_handle_height); @@ -77,7 +84,11 @@ public class TextSelectionHandle extends ImageView implements View.OnTouchListen break; } case MotionEvent.ACTION_MOVE: { - move(event.getX(), event.getY()); + long currentTime = System.nanoTime(); + if (currentTime - mLastTime > MINIMUM_HANDLE_UPDATE_TIME) { + mLastTime = currentTime; + move(event.getX(), event.getY()); + } break; } } @@ -99,18 +110,32 @@ public class TextSelectionHandle extends ImageView implements View.OnTouchListen PointF documentPoint = new PointF(left, newTop); documentPoint = layerView.getLayerClient().convertViewPointToLayerPoint(documentPoint); + documentPoint.x += mReposition.x; + documentPoint.y += mReposition.y; LOKitShell.sendChangeHandlePositionEvent(mHandleType, documentPoint); } - void positionFromGecko(int left, int top, boolean rtl) { + /** + * Calculate the position just under (and centered horizontally) rectangle from the input rectangle. + * + * @param rectangle - input rectangle + * @return position just under the selection + */ + private PointF positionUnderSelection(RectF rectangle) { + return new PointF(rectangle.centerX(), rectangle.bottom); + } + + void positionFromGecko(RectF position, boolean rtl) { LayerView layerView = LOKitShell.getLayerView(); if (layerView == null) { Log.e(LOGTAG, "Can't position handle because layerView is null"); return; } - mGeckoPoint = new PointF((float) left, (float) top); + mPoint = positionUnderSelection(position); + mReposition = new PointF(position.left - mPoint.x, position.top - mPoint.y); + if (mIsRTL != rtl) { mIsRTL = rtl; setImageLevel(mIsRTL ? IMAGE_LEVEL_RTL : IMAGE_LEVEL_LTR); @@ -121,8 +146,8 @@ public class TextSelectionHandle extends ImageView implements View.OnTouchListen } void repositionWithViewport(float x, float y, float zoom) { - PointF viewPoint = new PointF((mGeckoPoint.x * zoom) - x, - (mGeckoPoint.y * zoom) - y); + PointF viewPoint = new PointF(mPoint.x * zoom - x, + mPoint.y * zoom - y); mLeft = Math.round(viewPoint.x) - (int) adjustLeftForHandle(); mTop = Math.round(viewPoint.y);
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits