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.
5 #include "content/browser/renderer_host/input/synthetic_gesture_target_android.h"
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"
14 using blink::WebTouchEvent
;
18 SyntheticGestureTargetAndroid::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());
26 SyntheticGestureTargetAndroid::~SyntheticGestureTargetAndroid() {
29 bool SyntheticGestureTargetAndroid::RegisterTouchEventSynthesizer(JNIEnv
* env
) {
30 return RegisterNativesImpl(env
);
33 void SyntheticGestureTargetAndroid::TouchSetPointer(
34 JNIEnv
* env
, int index
, int x
, int y
, int id
) {
35 TRACE_EVENT0("input", "SyntheticGestureTargetAndroid::TouchSetPointer");
36 Java_TouchEventSynthesizer_setPointer(env
, touch_event_synthesizer_
.obj(),
40 void SyntheticGestureTargetAndroid::TouchInject(
41 JNIEnv
* env
, Action action
, int pointer_count
, int64 time_in_ms
) {
42 TRACE_EVENT0("input", "SyntheticGestureTargetAndroid::TouchInject");
43 Java_TouchEventSynthesizer_inject(env
, touch_event_synthesizer_
.obj(),
44 static_cast<int>(action
), pointer_count
,
48 void SyntheticGestureTargetAndroid::DispatchWebTouchEventToPlatform(
49 const blink::WebTouchEvent
& web_touch
, const ui::LatencyInfo
&) {
50 JNIEnv
* env
= base::android::AttachCurrentThread();
52 SyntheticGestureTargetAndroid::Action action
=
53 SyntheticGestureTargetAndroid::ActionInvalid
;
54 switch (web_touch
.type
) {
55 case blink::WebInputEvent::TouchStart
:
56 action
= SyntheticGestureTargetAndroid::ActionStart
;
58 case blink::WebInputEvent::TouchMove
:
59 action
= SyntheticGestureTargetAndroid::ActionMove
;
61 case blink::WebInputEvent::TouchCancel
:
62 action
= SyntheticGestureTargetAndroid::ActionCancel
;
64 case blink::WebInputEvent::TouchEnd
:
65 action
= SyntheticGestureTargetAndroid::ActionEnd
;
70 const unsigned num_touches
= web_touch
.touchesLength
;
71 for (unsigned i
= 0; i
< num_touches
; ++i
) {
72 const blink::WebTouchPoint
* point
= &web_touch
.touches
[i
];
73 TouchSetPointer(env
, i
, point
->position
.x
, point
->position
.y
, point
->id
);
76 TouchInject(env
, action
, num_touches
,
77 static_cast<int64
>(web_touch
.timeStampSeconds
* 1000.0));
80 void SyntheticGestureTargetAndroid::DispatchWebMouseWheelEventToPlatform(
81 const blink::WebMouseWheelEvent
& web_wheel
, const ui::LatencyInfo
&) {
85 void SyntheticGestureTargetAndroid::DispatchWebMouseEventToPlatform(
86 const blink::WebMouseEvent
& web_mouse
, const ui::LatencyInfo
&) {
90 SyntheticGestureParams::GestureSourceType
91 SyntheticGestureTargetAndroid::GetDefaultSyntheticGestureSourceType() const {
92 return SyntheticGestureParams::TOUCH_INPUT
;
95 int SyntheticGestureTargetAndroid::GetTouchSlopInDips() const {
96 float device_scale_factor
=
97 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().device_scale_factor();
98 return gfx::ViewConfiguration::GetTouchSlopInPixels() / device_scale_factor
;
101 } // namespace content