filtered_gesture_provider.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright 2014 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#include "ui/events/gesture_detection/filtered_gesture_provider.h"
6
7#include "base/auto_reset.h"
8#include "base/logging.h"
9#include "ui/events/gesture_detection/motion_event.h"
10
11namespace ui {
12
13FilteredGestureProvider::FilteredGestureProvider(
14    const GestureProvider::Config& config,
15    GestureProviderClient* client)
16    : client_(client),
17      gesture_provider_(config, this),
18      gesture_filter_(this),
19      handling_event_(false) {}
20
21bool FilteredGestureProvider::OnTouchEvent(const MotionEvent& event) {
22  DCHECK(!handling_event_);
23  base::AutoReset<bool> handling_event(&handling_event_, true);
24
25  pending_gesture_packet_ = GestureEventDataPacket::FromTouch(event);
26
27  if (!gesture_provider_.OnTouchEvent(event))
28    return false;
29
30  TouchDispositionGestureFilter::PacketResult result =
31      gesture_filter_.OnGesturePacket(pending_gesture_packet_);
32  if (result != TouchDispositionGestureFilter::SUCCESS) {
33    NOTREACHED() << "Invalid touch gesture sequence detected.";
34    return false;
35  }
36
37  return true;
38}
39
40void FilteredGestureProvider::OnTouchEventAck(bool event_consumed) {
41  gesture_filter_.OnTouchEventAck(event_consumed);
42}
43
44void FilteredGestureProvider::ResetGestureDetectors() {
45  gesture_provider_.ResetGestureDetectors();
46}
47
48void FilteredGestureProvider::SetMultiTouchSupportEnabled(bool enabled) {
49  gesture_provider_.SetMultiTouchSupportEnabled(enabled);
50}
51
52void FilteredGestureProvider::SetDoubleTapSupportForPlatformEnabled(
53    bool enabled) {
54  gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled);
55}
56
57void FilteredGestureProvider::SetDoubleTapSupportForPageEnabled(bool enabled) {
58  gesture_provider_.SetDoubleTapSupportForPageEnabled(enabled);
59}
60
61const ui::MotionEvent* FilteredGestureProvider::GetCurrentDownEvent() const {
62  return gesture_provider_.current_down_event();
63}
64
65void FilteredGestureProvider::OnGestureEvent(const GestureEventData& event) {
66  if (handling_event_) {
67    pending_gesture_packet_.Push(event);
68    return;
69  }
70
71  gesture_filter_.OnGesturePacket(
72      GestureEventDataPacket::FromTouchTimeout(event));
73}
74
75void FilteredGestureProvider::ForwardGestureEvent(
76    const GestureEventData& event) {
77  client_->OnGestureEvent(event);
78}
79
80}  // namespace ui
81