1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/events/gestures/gesture_provider_aura.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/auto_reset.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/logging.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/events/event.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/events/gesture_detection/gesture_config_helper.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/events/gesture_detection/gesture_event_data.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/gestures/gesture_configuration.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace ui { 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GestureProviderAura::GestureProviderAura(GestureProviderAuraClient* client) 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : client_(client), 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) filtered_gesture_provider_(ui::DefaultGestureProviderConfig(), this), 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handling_event_(false) { 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) filtered_gesture_provider_.SetDoubleTapSupportForPlatformEnabled(false); 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GestureProviderAura::~GestureProviderAura() {} 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GestureProviderAura::OnTouchEvent(const TouchEvent& event) { 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int index = pointer_state_.FindPointerIndexOfId(event.touch_id()); 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool pointer_id_is_active = index != -1; 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (event.type() == ET_TOUCH_PRESSED && pointer_id_is_active) { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Ignore touch press events if we already believe the pointer is down. 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (event.type() != ET_TOUCH_PRESSED && !pointer_id_is_active) { 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // We could have an active touch stream transfered to us, resulting in touch 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // move or touch up events without associated touch down events. Ignore 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // them. 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // If this is a touchmove event, and it isn't different from the last 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // event, ignore it. 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (event.type() == ET_TOUCH_MOVED && 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) event.x() == pointer_state_.GetX(index) && 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) event.y() == pointer_state_.GetY(index)) { 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_touch_event_latency_info_ = *event.latency(); 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointer_state_.OnTouch(event); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool result = filtered_gesture_provider_.OnTouchEvent(pointer_state_); 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointer_state_.CleanupRemovedTouchPoints(event); 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return result; 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GestureProviderAura::OnTouchEventAck(bool event_consumed) { 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(pending_gestures_.empty()); 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!handling_event_); 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::AutoReset<bool> handling_event(&handling_event_, true); 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) filtered_gesture_provider_.OnTouchEventAck(event_consumed); 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_touch_event_latency_info_.Clear(); 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GestureProviderAura::OnGestureEvent( 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GestureEventData& gesture) { 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GestureEventDetails details = gesture.details; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch details.set_oldest_touch_id(gesture.motion_event_id); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (gesture.type() == ET_GESTURE_TAP) { 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int tap_count = 1; 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (previous_tap_ && IsConsideredDoubleTap(*previous_tap_, gesture)) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tap_count = 1 + (previous_tap_->details.tap_count() % 3); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) details.set_tap_count(tap_count); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!previous_tap_) 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) previous_tap_.reset(new GestureEventData(gesture)); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *previous_tap_ = gesture; 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) previous_tap_->details = details; 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else if (gesture.type() == ET_GESTURE_TAP_CANCEL) { 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) previous_tap_.reset(); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<ui::GestureEvent> event( 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new ui::GestureEvent(gesture.x, 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gesture.y, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gesture.flags, 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gesture.time - base::TimeTicks(), 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch details)); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::LatencyInfo* gesture_latency = event->latency(); 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gesture_latency->CopyLatencyFrom( 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_touch_event_latency_info_, 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT); 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gesture_latency->CopyLatencyFrom( 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_touch_event_latency_info_, 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::INPUT_EVENT_LATENCY_UI_COMPONENT); 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gesture_latency->CopyLatencyFrom( 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_touch_event_latency_info_, 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::INPUT_EVENT_LATENCY_ACKED_TOUCH_COMPONENT); 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!handling_event_) { 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Dispatching event caused by timer. 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) client_->OnGestureEvent(event.get()); 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Memory managed by ScopedVector pending_gestures_. 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_gestures_.push_back(event.release()); 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ScopedVector<GestureEvent>* GestureProviderAura::GetAndResetPendingGestures() { 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (pending_gestures_.empty()) 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return NULL; 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Caller is responsible for deleting old_pending_gestures. 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ScopedVector<GestureEvent>* old_pending_gestures = 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new ScopedVector<GestureEvent>(); 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) old_pending_gestures->swap(pending_gestures_); 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return old_pending_gestures; 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool GestureProviderAura::IsConsideredDoubleTap( 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GestureEventData& previous_tap, 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GestureEventData& current_tap) const { 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_tap.time - previous_tap.time > 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromMilliseconds( 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GestureConfiguration::max_seconds_between_double_click() * 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1000)) { 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double double_tap_slop_square = 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GestureConfiguration::max_distance_between_taps_for_double_tap(); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double_tap_slop_square *= double_tap_slop_square; 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const float delta_x = previous_tap.x - current_tap.x; 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const float delta_y = previous_tap.y - current_tap.y; 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return (delta_x * delta_x + delta_y * delta_y < double_tap_slop_square); 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace content 139