Index: content/public/android/java/src/org/chromium/content/browser/GenericTouchGesture.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/GenericTouchGesture.java b/content/public/android/java/src/org/chromium/content/browser/GenericTouchGesture.java |
deleted file mode 100644 |
index c381da66124d4d66d2796c62a65f59331500a927..0000000000000000000000000000000000000000 |
--- a/content/public/android/java/src/org/chromium/content/browser/GenericTouchGesture.java |
+++ /dev/null |
@@ -1,296 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.content.browser; |
- |
-import android.animation.TimeAnimator; |
-import android.animation.TimeAnimator.TimeListener; |
-import android.os.Build; |
-import android.os.Handler; |
-import android.os.SystemClock; |
-import android.view.MotionEvent; |
-import android.view.MotionEvent.PointerProperties; |
-import android.view.MotionEvent.PointerCoords; |
-import android.view.ViewConfiguration; |
- |
-import org.chromium.base.CalledByNative; |
-import org.chromium.base.JNINamespace; |
-import org.chromium.base.ThreadUtils; |
- |
-/** |
- * Provides a Java-side implementation for simulating touch gestures, |
- * such as scroll or pinch. |
- */ |
-@JNINamespace("content") |
-public class GenericTouchGesture { |
- private final ContentViewCore mContentViewCore; |
- |
- private final Handler mHandler = new Handler(ThreadUtils.getUiThreadLooper()); |
- |
- private TimeAnimator mTimeAnimator; |
- |
- private int mNativePtr; |
- private long mDownTime; |
- private long mStartTime; |
- |
- private final byte STATE_INITIAL = 0; |
- private final byte STATE_MOVING = 1; |
- private final byte STATE_PENDING_UP = 2; |
- private final byte STATE_FINAL = 3; |
- private byte state = STATE_INITIAL; |
- |
- private static class TouchPointer { |
- private final float mStartX; |
- private final float mStartY; |
- private final float mDeltaX; |
- private final float mDeltaY; |
- private final float mStepX; |
- private final float mStepY; |
- |
- private PointerProperties mProperties; |
- private PointerCoords mCoords; |
- |
- |
- // Class representing a single pointer being moved over the screen. |
- TouchPointer(int startX, int startY, int deltaX, int deltaY, |
- int id, float scale, int scaledTouchSlop) { |
- mStartX = startX * scale; |
- mStartY = startY * scale; |
- |
- float scaledDeltaX = deltaX * scale; |
- float scaledDeltaY = deltaY * scale; |
- |
- if (scaledDeltaX != 0 || scaledDeltaY != 0) { |
- // The touch handler only considers a pointer as moving once |
- // it's been moved by more than scaledTouchSlop pixels. We |
- // thus increase the delta distance so the move is actually |
- // registered as covering the specified distance. |
- float distance = (float)Math.sqrt(scaledDeltaX * scaledDeltaX + |
- scaledDeltaY * scaledDeltaY); |
- mDeltaX = scaledDeltaX * (1 + scaledTouchSlop / distance); |
- mDeltaY = scaledDeltaY * (1 + scaledTouchSlop / distance); |
- } |
- else { |
- mDeltaX = scaledDeltaX; |
- mDeltaY = scaledDeltaY; |
- } |
- |
- if (deltaX != 0 || deltaY != 0) { |
- mStepX = mDeltaX / Math.abs(mDeltaX + mDeltaY); |
- mStepY = mDeltaY / Math.abs(mDeltaX + mDeltaY); |
- } else { |
- mStepX = 0; |
- mStepY = 0; |
- } |
- |
- mProperties = new PointerProperties(); |
- mProperties.id = id; |
- mProperties.toolType = MotionEvent.TOOL_TYPE_FINGER; |
- |
- mCoords = new PointerCoords(); |
- mCoords.x = mStartX; |
- mCoords.y = mStartY; |
- mCoords.pressure = 1.0f; |
- } |
- |
- PointerProperties getProperties() { |
- return mProperties; |
- } |
- |
- PointerCoords getCoords() { |
- return mCoords; |
- } |
- |
- float getCurrentX() { |
- return mCoords.x; |
- } |
- |
- float getCurrentY() { |
- return mCoords.y; |
- } |
- |
- void moveBy(float delta) { |
- mCoords.x += mStepX * delta; |
- mCoords.y += mStepY * delta; |
- } |
- |
- boolean hasArrived() { |
- return Math.abs(mCoords.x - mStartX) >= Math.abs(mDeltaX) && |
- Math.abs(mCoords.y - mStartY) >= Math.abs(mDeltaY); |
- } |
- } |
- |
- private TouchPointer[] mPointers; |
- private final PointerProperties[] mPointerProperties; |
- private final PointerCoords[] mPointerCoords; |
- |
- |
- GenericTouchGesture(ContentViewCore contentViewCore, |
- int startX, int startY, int deltaX, int deltaY) { |
- mContentViewCore = contentViewCore; |
- |
- float scale = mContentViewCore.getRenderCoordinates().getDeviceScaleFactor(); |
- int scaledTouchSlop = getScaledTouchSlop(); |
- |
- mPointers = new TouchPointer[1]; |
- mPointers[0] = new TouchPointer(startX, startY, deltaX, deltaY, 0, |
- scale, scaledTouchSlop); |
- |
- mPointerProperties = new PointerProperties[1]; |
- mPointerProperties[0] = mPointers[0].getProperties(); |
- |
- mPointerCoords = new PointerCoords[1]; |
- mPointerCoords[0] = mPointers[0].getCoords(); |
- } |
- |
- GenericTouchGesture(ContentViewCore contentViewCore, |
- int startX0, int startY0, int deltaX0, int deltaY0, |
- int startX1, int startY1, int deltaX1, int deltaY1) { |
- mContentViewCore = contentViewCore; |
- |
- float scale = mContentViewCore.getRenderCoordinates().getDeviceScaleFactor(); |
- int scaledTouchSlop = getScaledTouchSlop(); |
- |
- mPointers = new TouchPointer[2]; |
- mPointers[0] = new TouchPointer(startX0, startY0, deltaX0, deltaY0, 0, |
- scale, scaledTouchSlop); |
- mPointers[1] = new TouchPointer(startX1, startY1, deltaX1, deltaY1, 1, |
- scale, scaledTouchSlop); |
- |
- mPointerProperties = new PointerProperties[2]; |
- mPointerProperties[0] = mPointers[0].getProperties(); |
- mPointerProperties[1] = mPointers[1].getProperties(); |
- |
- mPointerCoords = new PointerCoords[2]; |
- mPointerCoords[0] = mPointers[0].getCoords(); |
- mPointerCoords[1] = mPointers[1].getCoords(); |
- } |
- |
- private int getScaledTouchSlop() { |
- return ViewConfiguration.get(mContentViewCore.getContext()).getScaledTouchSlop(); |
- } |
- |
- @CalledByNative |
- void start(int nativePtr) { |
- assert mNativePtr == 0; |
- mNativePtr = nativePtr; |
- mStartTime = SystemClock.uptimeMillis(); |
- |
- Runnable runnable = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) ? |
- createJBRunnable() : createPreJBRunnable(); |
- mHandler.post(runnable); |
- } |
- |
- boolean sendEvent(long time) { |
- switch (state) { |
- case STATE_INITIAL: { |
- mDownTime = time; |
- |
- // Touch the first pointer down. This initiates the gesture. |
- MotionEvent event = MotionEvent.obtain(mDownTime, time, |
- MotionEvent.ACTION_DOWN, |
- mPointers[0].getCurrentX(), mPointers[0].getCurrentY(), 0); |
- mContentViewCore.onTouchEvent(event); |
- event.recycle(); |
- |
- // If there are more pointers, touch them down too. |
- if (mPointers.length > 1) { |
- event = MotionEvent.obtain(mDownTime, time, |
- MotionEvent.ACTION_POINTER_DOWN, |
- mPointers.length, mPointerProperties, mPointerCoords, |
- 0, 0, 1, 1, 0, 0, 0, 0); |
- mContentViewCore.onTouchEvent(event); |
- event.recycle(); |
- } |
- state = STATE_MOVING; |
- break; |
- } |
- case STATE_MOVING: { |
- float delta = nativeGetDelta( |
- mNativePtr, mContentViewCore.getRenderCoordinates().getDeviceScaleFactor()); |
- if (delta != 0) { |
- for (TouchPointer pointer : mPointers) { |
- pointer.moveBy((float)delta); |
- } |
- MotionEvent event = MotionEvent.obtain(mDownTime, time, |
- MotionEvent.ACTION_MOVE, |
- mPointers.length, mPointerProperties, mPointerCoords, |
- 0, 0, 1, 1, 0, 0, 0, 0); |
- mContentViewCore.onTouchEvent(event); |
- event.recycle(); |
- } |
- if (havePointersArrived()) |
- state = STATE_PENDING_UP; |
- break; |
- } |
- case STATE_PENDING_UP: { |
- // If there are more than one pointers, lift them up first. |
- if (mPointers.length > 1) { |
- MotionEvent event = MotionEvent.obtain(mDownTime, time, |
- MotionEvent.ACTION_POINTER_UP, |
- mPointers.length, mPointerProperties, mPointerCoords, |
- 0, 0, 1, 1, 0, 0, 0, 0); |
- mContentViewCore.onTouchEvent(event); |
- event.recycle(); |
- } |
- |
- // Finally, lift the first pointer up to finish the gesture. |
- MotionEvent event = MotionEvent.obtain(mDownTime, time, |
- MotionEvent.ACTION_UP, |
- mPointers[0].getCurrentX(), mPointers[0].getCurrentY(), 0); |
- mContentViewCore.onTouchEvent(event); |
- event.recycle(); |
- |
- nativeSetHasFinished(mNativePtr); |
- state = STATE_FINAL; |
- break; |
- } |
- } |
- return state != STATE_FINAL; |
- } |
- |
- private boolean havePointersArrived() { |
- boolean arrived = true; |
- for (TouchPointer pointer : mPointers) { |
- arrived = arrived && pointer.hasArrived(); |
- } |
- return arrived; |
- } |
- |
- private Runnable createJBRunnable() { |
- // On JB, we rely on TimeAnimator to send events tied with vsync. |
- return new Runnable() { |
- @Override |
- public void run() { |
- mTimeAnimator = new TimeAnimator(); |
- mTimeAnimator.setTimeListener(new TimeListener() { |
- @Override |
- public void onTimeUpdate(TimeAnimator animation, long totalTime, |
- long deltaTime) { |
- if (!sendEvent(mStartTime + totalTime)) { |
- mTimeAnimator.end(); |
- } |
- } |
- }); |
- mTimeAnimator.start(); |
- } |
- }; |
- } |
- |
- private Runnable createPreJBRunnable() { |
- // Pre-JB there's no TimeAnimator, so we keep posting messages. |
- return new Runnable() { |
- @Override |
- public void run() { |
- if (sendEvent(SystemClock.uptimeMillis())) { |
- mHandler.post(this); |
- } |
- } |
- }; |
- } |
- |
- private native float nativeGetDelta( |
- int nativeGenericTouchGestureAndroid, float scale); |
- private native void nativeSetHasFinished(int nativeGenericTouchGestureAndroid); |
-} |