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