Remove platform gesture detectors
diff --git a/sky/services/engine/input_event.mojom b/sky/services/engine/input_event.mojom
index 2784a6a..d590388 100644
--- a/sky/services/engine/input_event.mojom
+++ b/sky/services/engine/input_event.mojom
@@ -11,15 +11,6 @@
   POINTER_DOWN,
   POINTER_MOVE,
   POINTER_UP,
-  GESTURE_FLING_CANCEL,
-  GESTURE_FLING_START,
-  GESTURE_LONG_PRESS,
-  GESTURE_SCROLL_BEGIN,
-  GESTURE_SCROLL_END,
-  GESTURE_SCROLL_UPDATE,
-  GESTURE_SHOW_PRESS,
-  GESTURE_TAP,
-  GESTURE_TAP_DOWN,
   BACK,
 };
 
@@ -47,21 +38,10 @@
   float tilt;
 };
 
-struct GestureData {
-  int32 primary_pointer;
-  float x;
-  float y;
-  float dx;
-  float dy;
-  float velocityX;
-  float velocityY;
-};
-
 // TODO(abarth): Should we have a malloc-free way of creating an input event
 // message? What we have now could stress out the Android Java GC.
 struct InputEvent {
   EventType type;
   int64 time_stamp;
   PointerData? pointer_data;
-  GestureData? gesture_data;
 };
diff --git a/sky/shell/BUILD.gn b/sky/shell/BUILD.gn
index 5582777..57e73b4 100644
--- a/sky/shell/BUILD.gn
+++ b/sky/shell/BUILD.gn
@@ -128,7 +128,6 @@
 
   android_library("java") {
     java_files = [
-      "android/org/domokit/sky/shell/GestureProvider.java",
       "android/org/domokit/sky/shell/PlatformServiceProvider.java",
       "android/org/domokit/sky/shell/PlatformViewAndroid.java",
       "android/org/domokit/sky/shell/ResourceCleaner.java",
diff --git a/sky/shell/android/org/domokit/sky/shell/GestureProvider.java b/sky/shell/android/org/domokit/sky/shell/GestureProvider.java
deleted file mode 100644
index f9e29e9..0000000
--- a/sky/shell/android/org/domokit/sky/shell/GestureProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// 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) {
-        int pointerIndex = event.getActionIndex();
-        GestureData gestureData = new GestureData();
-        gestureData.primaryPointer = event.getPointerId(pointerIndex);
-        gestureData.x = event.getX(pointerIndex);
-        gestureData.y = event.getY(pointerIndex);
-        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) {
-        InputEvent inputEvent = createGestureEvent(event);
-        inputEvent.type = EventType.GESTURE_TAP_DOWN;
-        mListener.onGestureEvent(inputEvent);
-        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) {
-        InputEvent inputEvent = createGestureEvent(event);
-        inputEvent.type = EventType.GESTURE_LONG_PRESS;
-        mListener.onGestureEvent(inputEvent);
-    }
-
-    @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) {
-        InputEvent inputEvent = createGestureEvent(event);
-        inputEvent.type = EventType.GESTURE_SHOW_PRESS;
-        mListener.onGestureEvent(inputEvent);
-    }
-
-    @Override
-    public boolean onSingleTapUp(MotionEvent event) {
-        InputEvent inputEvent = createGestureEvent(event);
-        inputEvent.type = EventType.GESTURE_TAP;
-        mListener.onGestureEvent(inputEvent);
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/sky/shell/android/org/domokit/sky/shell/PlatformViewAndroid.java b/sky/shell/android/org/domokit/sky/shell/PlatformViewAndroid.java
index 76d0a2a..3f1d511 100644
--- a/sky/shell/android/org/domokit/sky/shell/PlatformViewAndroid.java
+++ b/sky/shell/android/org/domokit/sky/shell/PlatformViewAndroid.java
@@ -32,14 +32,12 @@
  * A view containing Sky
  */
 @JNINamespace("sky::shell")
-public class PlatformViewAndroid extends SurfaceView
-        implements GestureProvider.OnGestureListener {
+public class PlatformViewAndroid extends SurfaceView {
     private static final String TAG = "PlatformViewAndroid";
 
     private long mNativePlatformView;
     private SkyEngine.Proxy mSkyEngine;
     private final SurfaceHolder.Callback mSurfaceCallback;
-    private GestureProvider mGestureProvider;
     private final EdgeDims mPadding;
     private final KeyboardServiceState mKeyboardState;
 
@@ -96,8 +94,6 @@
         };
         getHolder().addCallback(mSurfaceCallback);
 
-        mGestureProvider = new GestureProvider(context, this);
-
         // TODO(eseidel): We need per-view services!
         mKeyboardState = new KeyboardServiceState(this);
         KeyboardServiceImpl.setViewState(mKeyboardState);
@@ -184,7 +180,6 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             requestUnbufferedDispatch(event);
         }
-        mGestureProvider.onTouchEvent(event);
 
         // TODO(abarth): Rather than unpacking these events here, we should
         // probably send them in one packet to the engine.
@@ -207,11 +202,6 @@
         return true;
     }
 
-    @Override
-    public void onGestureEvent(InputEvent event) {
-        mSkyEngine.onInputEvent(event);
-    }
-
     private void attach() {
         Core core = CoreImpl.getInstance();
         Pair<SkyEngine.Proxy, InterfaceRequest<SkyEngine>> result =
diff --git a/sky/shell/ios/sky_surface.mm b/sky/shell/ios/sky_surface.mm
index a0c78d6..9264ebb 100644
--- a/sky/shell/ios/sky_surface.mm
+++ b/sky/shell/ios/sky_surface.mm
@@ -43,23 +43,6 @@
   return base::TimeDelta::FromSecondsD(interval).InMilliseconds();
 }
 
-static sky::InputEventPtr BasicInputEventFromRecognizer(
-    sky::EventType type,
-    UIGestureRecognizer* recognizer) {
-  auto input = sky::InputEvent::New();
-  input->type = type;
-  input->time_stamp = InputEventTimestampFromNSTimeInterval(
-      CACurrentMediaTime());
-
-  input->gesture_data = sky::GestureData::New();
-
-  CGPoint windowCoordinates = [recognizer locationInView:recognizer.view];
-  const CGFloat scale = [UIScreen mainScreen].scale;
-  input->gesture_data->x = windowCoordinates.x * scale;
-  input->gesture_data->y = windowCoordinates.y * scale;
-  return input.Pass();
-}
-
 @implementation SkySurface {
   BOOL _platformViewInitialized;
   CGPoint _lastScrollTranslation;
@@ -77,7 +60,6 @@
   if (self) {
     _shell_view.reset(shellView);
     self.multipleTouchEnabled = YES;
-    [self installGestureRecognizers];
   }
   return self;
 }
@@ -260,119 +242,6 @@
   [self dispatchTouches:touches phase:UITouchPhaseCancelled];
 }
 
-#pragma mark - Gesture Recognizers
-
--(void) installGestureRecognizers {
-  // For:
-  //   GESTURE_FLING_CANCEL
-  //   GESTURE_FLING_START
-  UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]
-    initWithTarget:self action:@selector(onFling:)];
-  swipe.cancelsTouchesInView = NO;
-  [self addGestureRecognizer: swipe];
-  [swipe release];
-
-  // For:
-  //   GESTURE_LONG_PRESS
-  //   GESTURE_SHOW_PRESS
-  UILongPressGestureRecognizer *longPress =
-    [[UILongPressGestureRecognizer alloc]
-      initWithTarget:self action:@selector(onLongPress:)];
-  longPress.cancelsTouchesInView = NO;
-  [self addGestureRecognizer: longPress];
-  [longPress release];
-
-  // For:
-  //   GESTURE_SCROLL_BEGIN
-  //   GESTURE_SCROLL_END
-  //   GESTURE_SCROLL_UPDATE
-  UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]
-    initWithTarget:self action:@selector(onScroll:)];
-  pan.cancelsTouchesInView = NO;
-  [self addGestureRecognizer: pan];
-  [pan release];
-
-  // For:
-  //   GESTURE_TAP
-  //   GESTURE_TAP_DOWN
-  UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
-    initWithTarget:self action:@selector(onTap:)];
-  tap.cancelsTouchesInView = NO;
-  [self addGestureRecognizer: tap];
-  [tap release];
-}
-
--(void) onFling:(UISwipeGestureRecognizer *) recognizer {
-  // Swipes are discrete gestures already. So there is no equivalent to a cancel
-  if (recognizer.state != UIGestureRecognizerStateEnded) {
-    return;
-  }
-
-  auto input = BasicInputEventFromRecognizer(
-    sky::EVENT_TYPE_GESTURE_FLING_START, recognizer);
-  _sky_engine->OnInputEvent(input.Pass());
-}
-
--(void) onLongPress:(UILongPressGestureRecognizer *) recognizer {
-  if (recognizer.state != UIGestureRecognizerStateEnded) {
-    return;
-  }
-
-  auto input = BasicInputEventFromRecognizer(sky::EVENT_TYPE_GESTURE_LONG_PRESS,
-                                             recognizer);
-  _sky_engine->OnInputEvent(input.Pass());
-}
-
--(void) onScroll:(UIPanGestureRecognizer *) recognizer {
-  sky::EventType type = sky::EVENT_TYPE_UNKNOWN;
-  switch (recognizer.state) {
-    case UIGestureRecognizerStateBegan:
-      _lastScrollTranslation = CGPointZero;
-      type = sky::EVENT_TYPE_GESTURE_SCROLL_BEGIN;
-      break;
-    case UIGestureRecognizerStateChanged:
-      type = sky::EVENT_TYPE_GESTURE_SCROLL_UPDATE;
-      break;
-    case UIGestureRecognizerStateEnded:
-    case UIGestureRecognizerStateCancelled:
-    case UIGestureRecognizerStateFailed:
-      type = sky::EVENT_TYPE_GESTURE_SCROLL_END;
-      break;
-    default:
-      break;
-  }
-
-  if (type == sky::EVENT_TYPE_UNKNOWN) {
-    return;
-  }
-
-  auto input = BasicInputEventFromRecognizer(type, recognizer);
-  auto scale = [UIScreen mainScreen].scale;
-  auto translation = [recognizer translationInView: self];
-  auto velocity = [recognizer velocityInView: self];
-
-  input->gesture_data->dx = (translation.x - _lastScrollTranslation.x) * scale;
-  input->gesture_data->dy =  (translation.y - _lastScrollTranslation.y) * scale;
-
-  _lastScrollTranslation = translation;
-
-  input->gesture_data->velocityX = velocity.x * scale;
-  input->gesture_data->velocityY =  velocity.y * scale;
-
-  _sky_engine->OnInputEvent(input.Pass());
-}
-
--(void) onTap:(UITapGestureRecognizer *) recognizer {
-
-  if (recognizer.state != UIGestureRecognizerStateEnded) {
-    return;
-  }
-
-  auto input = BasicInputEventFromRecognizer(sky::EVENT_TYPE_GESTURE_TAP,
-                                             recognizer);
-  _sky_engine->OnInputEvent(input.Pass());
-}
-
 #pragma mark - Misc.
 
 + (Class)layerClass {
diff --git a/sky/shell/ui/input_event_converter.cc b/sky/shell/ui/input_event_converter.cc
index 1e81bb1..b8ed475 100644
--- a/sky/shell/ui/input_event_converter.cc
+++ b/sky/shell/ui/input_event_converter.cc
@@ -49,61 +49,6 @@
   return web_event.Pass();
 }
 
-scoped_ptr<blink::WebInputEvent> BuildWebGestureEvent(
-    const InputEventPtr& event, float device_pixel_ratio) {
-  scoped_ptr<blink::WebGestureEvent> web_event(new blink::WebGestureEvent);
-
-  web_event->timeStampMS = event->time_stamp;
-
-  switch (event->type) {
-    case EVENT_TYPE_GESTURE_SCROLL_BEGIN:
-      web_event->type = blink::WebInputEvent::GestureScrollBegin;
-      break;
-    case EVENT_TYPE_GESTURE_SCROLL_END:
-      web_event->type = blink::WebInputEvent::GestureScrollEnd;
-      break;
-    case EVENT_TYPE_GESTURE_SCROLL_UPDATE:
-      web_event->type = blink::WebInputEvent::GestureScrollUpdate;
-      web_event->data.scrollUpdate.deltaX =
-          event->gesture_data->dx / device_pixel_ratio;
-      web_event->data.scrollUpdate.deltaY =
-          event->gesture_data->dy / device_pixel_ratio;
-      break;
-    case EVENT_TYPE_GESTURE_FLING_START:
-      web_event->type = blink::WebInputEvent::GestureFlingStart;
-      web_event->data.flingStart.velocityX =
-          event->gesture_data->velocityX / device_pixel_ratio;
-      web_event->data.flingStart.velocityY =
-          event->gesture_data->velocityY / device_pixel_ratio;
-      break;
-    case EVENT_TYPE_GESTURE_FLING_CANCEL:
-      web_event->type = blink::WebInputEvent::GestureFlingCancel;
-      break;
-    case EVENT_TYPE_GESTURE_LONG_PRESS:
-      web_event->type = blink::WebInputEvent::GestureLongPress;
-      break;
-    case EVENT_TYPE_GESTURE_SHOW_PRESS:
-      web_event->type = blink::WebInputEvent::GestureShowPress;
-      break;
-    case EVENT_TYPE_GESTURE_TAP:
-      web_event->type = blink::WebInputEvent::GestureTap;
-      break;
-    case EVENT_TYPE_GESTURE_TAP_DOWN:
-      web_event->type = blink::WebInputEvent::GestureTapDown;
-      break;
-    default:
-      break;
-  }
-
-  if (event->gesture_data) {
-    web_event->primaryPointer = event->gesture_data->primary_pointer;
-    web_event->x = event->gesture_data->x / device_pixel_ratio;
-    web_event->y = event->gesture_data->y / device_pixel_ratio;
-  }
-
-  return web_event.Pass();
-}
-
 scoped_ptr<blink::WebInputEvent> BuildWebBackEvent(const InputEventPtr& event) {
   scoped_ptr<blink::WebInputEvent> web_event(blink::WebInputEvent::create());
   web_event->type = blink::WebInputEvent::Back;
@@ -120,16 +65,6 @@
     case EVENT_TYPE_POINTER_MOVE:
     case EVENT_TYPE_POINTER_CANCEL:
       return BuildWebPointerEvent(event, device_pixel_ratio);
-    case EVENT_TYPE_GESTURE_FLING_CANCEL:
-    case EVENT_TYPE_GESTURE_FLING_START:
-    case EVENT_TYPE_GESTURE_LONG_PRESS:
-    case EVENT_TYPE_GESTURE_SCROLL_BEGIN:
-    case EVENT_TYPE_GESTURE_SCROLL_END:
-    case EVENT_TYPE_GESTURE_SCROLL_UPDATE:
-    case EVENT_TYPE_GESTURE_SHOW_PRESS:
-    case EVENT_TYPE_GESTURE_TAP:
-    case EVENT_TYPE_GESTURE_TAP_DOWN:
-      return BuildWebGestureEvent(event, device_pixel_ratio);
     case EVENT_TYPE_BACK:
       return BuildWebBackEvent(event);
     case EVENT_TYPE_UNKNOWN: