Index: sky/shell/org/domokit/sky/shell/GestureProvider.java |
diff --git a/sky/shell/org/domokit/sky/shell/GestureProvider.java b/sky/shell/org/domokit/sky/shell/GestureProvider.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..af286e9670af1a8de099d908a18899903ee90d6c |
--- /dev/null |
+++ b/sky/shell/org/domokit/sky/shell/GestureProvider.java |
@@ -0,0 +1,126 @@ |
+// Copyright 2016 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.domokit.sky.shell; |
+ |
+import android.content.Context; |
+import android.view.GestureDetector; |
+import android.view.MotionEvent; |
+ |
+import org.chromium.mojom.sky.EventType; |
+import org.chromium.mojom.sky.GestureData; |
+import org.chromium.mojom.sky.InputEvent; |
+ |
+/** |
+ * Knows how to drive a GestureDetector to turn MotionEvents into Sky's |
+ * InputEvents. Seems like this should not be needed. That there must exist |
+ * some Android class to do most of this work for us? |
+ */ |
+public class GestureProvider implements GestureDetector.OnGestureListener { |
+ private static final String TAG = "GestureProvider"; |
+ |
+ /** |
+ * Callback interface |
+ */ |
+ public interface OnGestureListener { |
+ void onGestureEvent(InputEvent e); |
+ } |
+ |
+ private OnGestureListener mListener; |
+ private GestureDetector mDetector; |
+ private boolean mScrolling; |
+ private boolean mFlinging; |
+ |
+ public GestureProvider(Context context, OnGestureListener listener) { |
+ mListener = listener; |
+ mDetector = new GestureDetector(context, this); |
+ } |
+ |
+ private InputEvent createGestureEvent(MotionEvent event) { |
+ GestureData gestureData = new GestureData(); |
+ gestureData.x = event.getX(); |
+ gestureData.y = event.getY(); |
+ InputEvent inputEvent = new InputEvent(); |
+ inputEvent.timeStamp = event.getEventTime(); |
+ inputEvent.gestureData = gestureData; |
+ return inputEvent; |
+ } |
+ |
+ public void onTouchEvent(MotionEvent event) { |
+ // TODO(eseidel): I am not confident that these stops are correct. |
+ int maskedAction = event.getActionMasked(); |
+ if (mScrolling && maskedAction == MotionEvent.ACTION_UP) { |
+ mScrolling = false; |
+ InputEvent inputEvent = createGestureEvent(event); |
+ inputEvent.type = EventType.GESTURE_SCROLL_END; |
+ mListener.onGestureEvent(inputEvent); |
+ } |
+ |
+ if (mFlinging && maskedAction == MotionEvent.ACTION_DOWN) { |
+ mFlinging = false; |
+ InputEvent inputEvent = createGestureEvent(event); |
+ inputEvent.type = EventType.GESTURE_FLING_CANCEL; |
+ mListener.onGestureEvent(inputEvent); |
+ } |
+ |
+ mDetector.onTouchEvent(event); |
+ } |
+ |
+ @Override |
+ public boolean onDown(MotionEvent event) { |
+ return true; |
+ } |
+ |
+ @Override |
+ public boolean onFling(MotionEvent e1, MotionEvent e2, |
+ float velocityX, float velocityY) { |
+ |
+ mFlinging = true; |
+ |
+ // Use the first event as a scroll start (for the target hit-test) |
+ InputEvent inputEvent = createGestureEvent(e1); |
+ inputEvent.gestureData.velocityX = velocityX; |
+ inputEvent.gestureData.velocityY = velocityY; |
+ inputEvent.type = EventType.GESTURE_FLING_START; |
+ |
+ mListener.onGestureEvent(inputEvent); |
+ |
+ return true; |
+ } |
+ |
+ @Override |
+ public void onLongPress(MotionEvent event) { |
+ } |
+ |
+ @Override |
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, |
+ float distanceY) { |
+ // Use the first event as a scroll start (for the target hit-test) |
+ InputEvent inputEvent = createGestureEvent(e1); |
+ inputEvent.gestureData.dx = distanceX; |
+ inputEvent.gestureData.dy = -distanceY; |
+ |
+ // If we haven't started scrolling, send a scroll_begin. |
+ if (!mScrolling) { |
+ mScrolling = true; |
+ inputEvent.type = EventType.GESTURE_SCROLL_BEGIN; |
+ mListener.onGestureEvent(inputEvent); |
+ } |
+ |
+ inputEvent.type = EventType.GESTURE_SCROLL_UPDATE; |
+ mListener.onGestureEvent(inputEvent); |
+ return true; |
+ } |
+ |
+ @Override |
+ public void onShowPress(MotionEvent event) { |
+ } |
+ |
+ @Override |
+ public boolean onSingleTapUp(MotionEvent event) { |
+ return true; |
+ } |
+ |
+ |
+} |