filtered_gesture_provider.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
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::SetMultiTouchZoomSupportEnabled(
45    bool enabled) {
46  gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled);
47}
48
49void FilteredGestureProvider::SetDoubleTapSupportForPlatformEnabled(
50    bool enabled) {
51  gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled);
52}
53
54void FilteredGestureProvider::SetDoubleTapSupportForPageEnabled(bool enabled) {
55  gesture_provider_.SetDoubleTapSupportForPageEnabled(enabled);
56}
57
58const ui::MotionEvent* FilteredGestureProvider::GetCurrentDownEvent() const {
59  return gesture_provider_.current_down_event();
60}
61
62void FilteredGestureProvider::OnGestureEvent(const GestureEventData& event) {
63  if (handling_event_) {
64    pending_gesture_packet_.Push(event);
65    return;
66  }
67
68  gesture_filter_.OnGesturePacket(
69      GestureEventDataPacket::FromTouchTimeout(event));
70}
71
72void FilteredGestureProvider::ForwardGestureEvent(
73    const GestureEventData& event) {
74  client_->OnGestureEvent(event);
75}
76
77}  // namespace ui
78