1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/filtered_gesture_provider.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/auto_reset.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/motion_event.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ui {
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)FilteredGestureProvider::FilteredGestureProvider(
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const GestureProvider::Config& config,
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GestureProviderClient* client)
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : client_(client),
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture_provider_(config, this),
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture_filter_(this),
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      handling_event_(false) {}
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool FilteredGestureProvider::OnTouchEvent(const MotionEvent& event) {
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!handling_event_);
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::AutoReset<bool> handling_event(&handling_event_, true);
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  pending_gesture_packet_ = GestureEventDataPacket::FromTouch(event);
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!gesture_provider_.OnTouchEvent(event))
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TouchDispositionGestureFilter::PacketResult result =
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture_filter_.OnGesturePacket(pending_gesture_packet_);
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (result != TouchDispositionGestureFilter::SUCCESS) {
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED() << "Invalid touch gesture sequence detected.";
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FilteredGestureProvider::OnTouchEventAck(bool event_consumed) {
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture_filter_.OnTouchEventAck(event_consumed);
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid FilteredGestureProvider::SetMultiTouchZoomSupportEnabled(
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool enabled) {
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled);
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FilteredGestureProvider::SetDoubleTapSupportForPlatformEnabled(
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool enabled) {
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled);
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FilteredGestureProvider::SetDoubleTapSupportForPageEnabled(bool enabled) {
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture_provider_.SetDoubleTapSupportForPageEnabled(enabled);
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const ui::MotionEvent* FilteredGestureProvider::GetCurrentDownEvent() const {
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return gesture_provider_.current_down_event();
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FilteredGestureProvider::OnGestureEvent(const GestureEventData& event) {
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (handling_event_) {
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    pending_gesture_packet_.Push(event);
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture_filter_.OnGesturePacket(
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GestureEventDataPacket::FromTouchTimeout(event));
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FilteredGestureProvider::ForwardGestureEvent(
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const GestureEventData& event) {
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  client_->OnGestureEvent(event);
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace ui
78