Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2089)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/GenericTouchGesture.java

Issue 62443007: Replace old with new synthetic gesture framework. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Forward declare SyntheticGestureController. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
-}

Powered by Google App Engine
This is Rietveld 408576698