OLD | NEW |
---|---|
(Empty) | |
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 "content/browser/gamepad/gamepad_platform_data_fetcher_android.h" | |
6 | |
7 #include "base/android/jni_array.h" | |
8 #include "base/android/jni_string.h" | |
9 #include "base/debug/trace_event.h" | |
10 #include "base/strings/string16.h" | |
11 #include "jni/GamepadAdapter_jni.h" | |
12 #include "third_party/WebKit/public/platform/WebGamepad.h" | |
13 | |
14 namespace content { | |
15 | |
16 namespace { | |
17 | |
18 void CopyJavaStringToWebUCharArray( | |
19 JNIEnv* env, jstring src, blink::WebUChar* array, size_t array_length) { | |
20 COMPILE_ASSERT(sizeof(base::string16::value_type) == sizeof(blink::WebUChar), | |
21 string16_and_WebUChar_are_same_size); | |
22 base::string16 data; | |
23 base::android::ConvertJavaStringToUTF16(env, src, &data); | |
24 CHECK(array_length > 0); | |
25 const size_t bytes_to_copy = std::min(data.size(), array_length - 1); | |
26 memcpy(array, data.data(), bytes_to_copy); | |
27 array[bytes_to_copy] = 0; | |
28 } | |
29 | |
30 } | |
31 | |
32 using base::android::AttachCurrentThread; | |
33 using blink::WebGamepad; | |
34 using blink::WebGamepads; | |
jdduke (slow)
2014/03/07 23:16:39
Please move the using statements above the initial
kbalazs
2014/03/12 00:17:36
Done.
| |
35 | |
36 GamepadPlatformDataFetcherAndroid::GamepadPlatformDataFetcherAndroid() { | |
37 j_gamepad_adapter_.Reset( | |
jdduke (slow)
2014/03/07 23:16:39
If the GamePadAdapter is a singleton in practice,
kbalazs
2014/03/12 00:17:36
Done.
| |
38 Java_GamepadAdapter_attach(AttachCurrentThread(), | |
39 reinterpret_cast<intptr_t>(this))); | |
40 } | |
41 | |
42 GamepadPlatformDataFetcherAndroid::~GamepadPlatformDataFetcherAndroid() { | |
43 } | |
44 | |
45 void GamepadPlatformDataFetcherAndroid::GetGamepadData( | |
46 blink::WebGamepads* pads, | |
47 bool devices_changed_hint) { | |
48 TRACE_EVENT0("GAMEPAD", "GetGamepadData"); | |
49 data_ = pads; | |
50 data_->length = WebGamepads::itemsLengthCap; | |
jdduke (slow)
2014/03/07 23:16:39
Rather than storing |data_| and assuming we'll get
jdduke (slow)
2014/03/07 23:33:27
I see now, you definitely still need attach in som
kbalazs
2014/03/12 00:17:36
Done.
| |
51 Java_GamepadAdapter_getGamepadData( | |
52 AttachCurrentThread(), j_gamepad_adapter_.obj()); | |
53 data_ = NULL; | |
54 } | |
55 | |
56 void GamepadPlatformDataFetcherAndroid::PauseHint(bool paused) { | |
57 Java_GamepadAdapter_setFetched( | |
jdduke (slow)
2014/03/07 23:16:39
Same with the other function, make this a static c
kbalazs
2014/03/12 00:17:36
Done.
| |
58 AttachCurrentThread(), j_gamepad_adapter_.obj(), !paused); | |
59 } | |
60 | |
61 void GamepadPlatformDataFetcherAndroid::RefreshDevice( | |
jdduke (slow)
2014/03/07 23:16:39
This function can be made static (and local to thi
| |
62 JNIEnv* env, | |
63 jobject obj, | |
64 int index, | |
65 bool connected, | |
66 jstring id, | |
67 jstring mapping, | |
68 long timestamp, | |
69 jfloatArray axes, | |
70 jfloatArray buttons) { | |
71 CHECK(data_); | |
72 WebGamepad& pad = data_->items[index]; | |
73 pad.connected = connected; | |
74 if (!connected) | |
75 return; | |
76 CopyJavaStringToWebUCharArray(env, id, pad.id, WebGamepad::idLengthCap); | |
77 CopyJavaStringToWebUCharArray(env, mapping, pad.mapping, | |
78 WebGamepad::mappingLengthCap); | |
79 pad.timestamp = timestamp; | |
80 std::vector<float> axes_data; | |
81 base::android::JavaFloatArrayToFloatVector(env, axes, &axes_data); | |
82 pad.axesLength = std::min(axes_data.size(), WebGamepad::axesLengthCap); | |
83 memcpy(pad.axes, axes_data.begin(), pad.axesLength * sizeof(float)); | |
jdduke (slow)
2014/03/07 23:16:39
Could you add a line space in between each logical
kbalazs
2014/03/12 00:17:36
Done.
| |
84 std::vector<float> buttons_data; | |
85 base::android::JavaFloatArrayToFloatVector(env, buttons, &buttons_data); | |
86 pad.buttonsLength = | |
87 std::min(buttons_data.size(), WebGamepad::buttonsLengthCap); | |
88 for (unsigned i = 0; i < pad.buttonsLength; ++i) { | |
89 float value = buttons_data[i]; | |
90 pad.buttons[i].pressed = value; | |
91 pad.buttons[i].value = value; | |
92 } | |
93 } | |
94 | |
95 bool GamepadPlatformDataFetcherAndroid::RegisterGamepadAdapter(JNIEnv* env) { | |
96 return RegisterNativesImpl(env); | |
97 } | |
98 | |
99 } | |
OLD | NEW |