Home | History | Annotate | Download | only in input
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_TAP_SUPPRESSION_CONTROLLER_H_
      6 #define CONTENT_BROWSER_RENDERER_HOST_INPUT_TAP_SUPPRESSION_CONTROLLER_H_
      7 
      8 #include "base/time/time.h"
      9 #include "base/timer/timer.h"
     10 #include "content/common/content_export.h"
     11 
     12 namespace content {
     13 
     14 class TapSuppressionControllerClient;
     15 
     16 // The core controller for suppression of taps (touchpad or touchscreen)
     17 // immediately following a GestureFlingCancel event (caused by the same tap).
     18 // Only taps of sufficient speed and within a specified time window after a
     19 // GestureFlingCancel are suppressed.
     20 class CONTENT_EXPORT TapSuppressionController {
     21  public:
     22   explicit TapSuppressionController(TapSuppressionControllerClient* client);
     23   virtual ~TapSuppressionController();
     24 
     25   // Should be called whenever a GestureFlingCancel event is received.
     26   void GestureFlingCancel();
     27 
     28   // Should be called whenever an ACK for a GestureFlingCancel event is
     29   // received. |processed| is true when the GestureFlingCancel actually stopped
     30   // a fling and therefore should suppress the forwarding of the following tap.
     31   void GestureFlingCancelAck(bool processed);
     32 
     33   // Should be called whenever a tap down (touchpad or touchscreen) is received.
     34   // Returns true if the tap down should be deferred. The caller is responsible
     35   // for keeping the event for later release, if needed.
     36   bool ShouldDeferTapDown();
     37 
     38   // Should be called whenever a tap up (touchpad or touchscreen) is received.
     39   // Returns true if the tap up should be suppressed.
     40   bool ShouldSuppressTapUp();
     41 
     42   // Should be called whenever a tap cancel is received. Returns true if the tap
     43   // cancel should be suppressed.
     44   bool ShouldSuppressTapCancel();
     45 
     46  protected:
     47   virtual base::TimeTicks Now();
     48   virtual void StartTapDownTimer(const base::TimeDelta& delay);
     49   virtual void StopTapDownTimer();
     50   void TapDownTimerExpired();
     51 
     52  private:
     53   friend class MockTapSuppressionController;
     54 
     55   enum State {
     56     NOTHING,
     57     GFC_IN_PROGRESS,
     58     TAP_DOWN_STASHED,
     59     LAST_CANCEL_STOPPED_FLING,
     60   };
     61 
     62 
     63   TapSuppressionControllerClient* client_;
     64   base::OneShotTimer<TapSuppressionController> tap_down_timer_;
     65   State state_;
     66 
     67   // TODO(rjkroege): During debugging, the event times did not prove reliable.
     68   // Replace the use of base::TimeTicks with an accurate event time when they
     69   // become available post http://crbug.com/119556.
     70   base::TimeTicks fling_cancel_time_;
     71 
     72   DISALLOW_COPY_AND_ASSIGN(TapSuppressionController);
     73 };
     74 
     75 }  // namespace content
     76 
     77 #endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_TAP_SUPPRESSION_CONTROLLER_H_
     78