| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromecast/browser/cast_content_gesture_handler.h" |
| |
| #include "chromecast/base/chromecast_switches.h" |
| |
| namespace chromecast { |
| namespace shell { |
| |
| namespace { |
| constexpr int kDefaultBackGestureHorizontalThreshold = 80; |
| } // namespace |
| |
| CastContentGestureHandler::CastContentGestureHandler( |
| CastContentWindow::Delegate* delegate, |
| bool enable_top_drag_gesture) |
| : priority_(Priority::NONE), |
| enable_top_drag_gesture_(enable_top_drag_gesture), |
| back_horizontal_threshold_( |
| GetSwitchValueInt(switches::kBackGestureHorizontalThreshold, |
| kDefaultBackGestureHorizontalThreshold)), |
| delegate_(delegate) { |
| DCHECK(delegate_); |
| } |
| |
| CastContentGestureHandler::CastContentGestureHandler( |
| CastContentWindow::Delegate* delegate) |
| : CastContentGestureHandler( |
| delegate, |
| GetSwitchValueBoolean(switches::kEnableTopDragGesture, false)) {} |
| |
| void CastContentGestureHandler::SetPriority( |
| CastGestureHandler::Priority priority) { |
| priority_ = priority; |
| } |
| |
| CastGestureHandler::Priority CastContentGestureHandler::GetPriority() { |
| return priority_; |
| } |
| |
| bool CastContentGestureHandler::CanHandleSwipe( |
| CastSideSwipeOrigin swipe_origin) { |
| return delegate_->CanHandleGesture(GestureForSwipeOrigin(swipe_origin)); |
| } |
| |
| GestureType CastContentGestureHandler::GestureForSwipeOrigin( |
| CastSideSwipeOrigin swipe_origin) { |
| switch (swipe_origin) { |
| case CastSideSwipeOrigin::LEFT: |
| return GestureType::GO_BACK; |
| case CastSideSwipeOrigin::TOP: |
| return enable_top_drag_gesture_ ? GestureType::TOP_DRAG |
| : GestureType::NO_GESTURE; |
| case CastSideSwipeOrigin::RIGHT: |
| return GestureType::RIGHT_DRAG; |
| default: |
| return GestureType::NO_GESTURE; |
| } |
| } |
| |
| void CastContentGestureHandler::HandleSideSwipe( |
| CastSideSwipeEvent event, |
| CastSideSwipeOrigin swipe_origin, |
| const gfx::Point& touch_location) { |
| if (!CanHandleSwipe(swipe_origin)) { |
| return; |
| } |
| |
| GestureType gesture_type = GestureForSwipeOrigin(swipe_origin); |
| |
| switch (event) { |
| case CastSideSwipeEvent::BEGIN: |
| current_swipe_time_ = base::ElapsedTimer(); |
| if (gesture_type == GestureType::GO_BACK) { |
| VLOG(1) << "back swipe gesture begin"; |
| } |
| break; |
| case CastSideSwipeEvent::CONTINUE: |
| VLOG(1) << "swipe gesture continue, elapsed time: " |
| << current_swipe_time_.Elapsed().InMilliseconds() << "ms"; |
| delegate_->GestureProgress(gesture_type, touch_location); |
| break; |
| case CastSideSwipeEvent::END: |
| VLOG(1) << "swipe end, elapsed time: " |
| << current_swipe_time_.Elapsed().InMilliseconds() << "ms"; |
| // If it's a back gesture, we have special handling to check for the |
| // horizontal threshold. If the finger has lifted before the horizontal |
| // gesture, cancel the back gesture and do not consume it. |
| if (gesture_type == GestureType::GO_BACK && |
| touch_location.x() < back_horizontal_threshold_) { |
| VLOG(1) << "swipe gesture cancelled"; |
| delegate_->CancelGesture(GestureType::GO_BACK, touch_location); |
| return; |
| } |
| delegate_->ConsumeGesture(gesture_type); |
| VLOG(1) << "gesture complete, elapsed time: " |
| << current_swipe_time_.Elapsed().InMilliseconds() << "ms"; |
| break; |
| } |
| } |
| |
| void CastContentGestureHandler::HandleTapDownGesture( |
| const gfx::Point& touch_location) { |
| if (!delegate_->CanHandleGesture(GestureType::TAP_DOWN)) { |
| return; |
| } |
| delegate_->ConsumeGesture(GestureType::TAP_DOWN); |
| } |
| |
| void CastContentGestureHandler::HandleTapGesture( |
| const gfx::Point& touch_location) { |
| if (!delegate_->CanHandleGesture(GestureType::TAP)) { |
| return; |
| } |
| delegate_->ConsumeGesture(GestureType::TAP); |
| } |
| |
| } // namespace shell |
| } // namespace chromecast |