1// Copyright 2013 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 "content/browser/renderer_host/input/synthetic_gesture_target_android.h" 6 7#include "content/browser/android/content_view_core_impl.h" 8#include "content/browser/renderer_host/render_widget_host_impl.h" 9#include "jni/TouchEventSynthesizer_jni.h" 10#include "third_party/WebKit/public/web/WebInputEvent.h" 11#include "ui/gfx/android/view_configuration.h" 12#include "ui/gfx/screen.h" 13 14using blink::WebTouchEvent; 15 16namespace content { 17 18SyntheticGestureTargetAndroid::SyntheticGestureTargetAndroid( 19 RenderWidgetHostImpl* host, 20 base::android::ScopedJavaLocalRef<jobject> touch_event_synthesizer) 21 : SyntheticGestureTargetBase(host), 22 touch_event_synthesizer_(touch_event_synthesizer) { 23 DCHECK(!touch_event_synthesizer_.is_null()); 24} 25 26SyntheticGestureTargetAndroid::~SyntheticGestureTargetAndroid() { 27} 28 29bool SyntheticGestureTargetAndroid::RegisterTouchEventSynthesizer(JNIEnv* env) { 30 return RegisterNativesImpl(env); 31} 32 33void SyntheticGestureTargetAndroid::TouchSetPointer( 34 JNIEnv* env, int index, int x, int y, int id) { 35 Java_TouchEventSynthesizer_setPointer(env, touch_event_synthesizer_.obj(), 36 index, x, y, id); 37} 38 39void SyntheticGestureTargetAndroid::TouchInject( 40 JNIEnv* env, Action action, int pointer_count) { 41 Java_TouchEventSynthesizer_inject(env, touch_event_synthesizer_.obj(), 42 static_cast<int>(action), pointer_count); 43} 44 45void SyntheticGestureTargetAndroid::DispatchWebTouchEventToPlatform( 46 const blink::WebTouchEvent& web_touch, const ui::LatencyInfo&) { 47 JNIEnv* env = base::android::AttachCurrentThread(); 48 49 SyntheticGestureTargetAndroid::Action action = 50 SyntheticGestureTargetAndroid::ActionInvalid; 51 switch (web_touch.type) { 52 case blink::WebInputEvent::TouchStart: 53 action = SyntheticGestureTargetAndroid::ActionStart; 54 break; 55 case blink::WebInputEvent::TouchMove: 56 action = SyntheticGestureTargetAndroid::ActionMove; 57 break; 58 case blink::WebInputEvent::TouchCancel: 59 action = SyntheticGestureTargetAndroid::ActionCancel; 60 break; 61 case blink::WebInputEvent::TouchEnd: 62 action = SyntheticGestureTargetAndroid::ActionEnd; 63 break; 64 default: 65 NOTREACHED(); 66 } 67 const unsigned num_touches = web_touch.touchesLength; 68 for (unsigned i = 0; i < num_touches; ++i) { 69 const blink::WebTouchPoint* point = &web_touch.touches[i]; 70 TouchSetPointer(env, i, point->position.x, point->position.y, point->id); 71 } 72 73 TouchInject(env, action, num_touches); 74} 75 76SyntheticGestureParams::GestureSourceType 77SyntheticGestureTargetAndroid::GetDefaultSyntheticGestureSourceType() const { 78 return SyntheticGestureParams::TOUCH_INPUT; 79} 80 81bool SyntheticGestureTargetAndroid::SupportsSyntheticGestureSourceType( 82 SyntheticGestureParams::GestureSourceType gesture_source_type) const { 83 return gesture_source_type == SyntheticGestureParams::TOUCH_INPUT; 84} 85 86int SyntheticGestureTargetAndroid::GetTouchSlopInDips() const { 87 float device_scale_factor = 88 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().device_scale_factor(); 89 return gfx::ViewConfiguration::GetTouchSlopInPixels() / device_scale_factor; 90} 91 92} // namespace content 93