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 using base::android::AttachCurrentThread; |
| 15 using base::string16; |
| 16 using blink::WebGamepad; |
| 17 using blink::WebGamepads; |
| 18 |
| 19 namespace content { |
| 20 |
| 21 namespace { |
| 22 |
| 23 template <size_t array_length> |
| 24 void CopyJavaStringToWebUCharArray( |
| 25 JNIEnv* env, jstring src, blink::WebUChar* array) { |
| 26 COMPILE_ASSERT(sizeof(string16::value_type) == sizeof(blink::WebUChar), |
| 27 string16_and_WebUChar_are_same_size); |
| 28 string16 data; |
| 29 base::android::ConvertJavaStringToUTF16(env, src, &data); |
| 30 COMPILE_ASSERT(array_length > 0, array_length_at_least_1); |
| 31 const size_t characters_to_copy = std::min(data.size(), array_length - 1); |
| 32 memcpy(array, data.data(), characters_to_copy * sizeof(string16::value_type)); |
| 33 array[characters_to_copy] = 0; |
| 34 } |
| 35 |
| 36 } |
| 37 |
| 38 static void RefreshGamepad( |
| 39 JNIEnv* env, |
| 40 jobject obj, |
| 41 jlong gamepads, |
| 42 jint index, |
| 43 jboolean connected, |
| 44 jstring id, |
| 45 jstring mapping, |
| 46 jlong timestamp, |
| 47 jfloatArray axes, |
| 48 jfloatArray buttons) { |
| 49 WebGamepad& pad = reinterpret_cast<WebGamepads*>(gamepads)->items[index]; |
| 50 pad.connected = connected; |
| 51 if (!connected) |
| 52 return; |
| 53 |
| 54 CopyJavaStringToWebUCharArray<WebGamepad::idLengthCap>(env, id, pad.id); |
| 55 CopyJavaStringToWebUCharArray<WebGamepad::mappingLengthCap>( |
| 56 env, mapping, pad.mapping); |
| 57 |
| 58 pad.timestamp = timestamp; |
| 59 |
| 60 std::vector<float> axes_data; |
| 61 base::android::JavaFloatArrayToFloatVector(env, axes, &axes_data); |
| 62 pad.axesLength = std::min(axes_data.size(), WebGamepad::axesLengthCap); |
| 63 memcpy(pad.axes, axes_data.begin(), pad.axesLength * sizeof(float)); |
| 64 |
| 65 std::vector<float> buttons_data; |
| 66 base::android::JavaFloatArrayToFloatVector(env, buttons, &buttons_data); |
| 67 pad.buttonsLength = |
| 68 std::min(buttons_data.size(), WebGamepad::buttonsLengthCap); |
| 69 for (unsigned i = 0; i < pad.buttonsLength; ++i) { |
| 70 float value = buttons_data[i]; |
| 71 pad.buttons[i].pressed = value; |
| 72 pad.buttons[i].value = value; |
| 73 } |
| 74 } |
| 75 |
| 76 GamepadPlatformDataFetcherAndroid::GamepadPlatformDataFetcherAndroid() { |
| 77 Java_GamepadAdapter_setDataRequested(AttachCurrentThread(), true); |
| 78 } |
| 79 |
| 80 GamepadPlatformDataFetcherAndroid::~GamepadPlatformDataFetcherAndroid() { |
| 81 } |
| 82 |
| 83 void GamepadPlatformDataFetcherAndroid::GetGamepadData( |
| 84 WebGamepads* pads, |
| 85 bool devices_changed_hint) { |
| 86 TRACE_EVENT0("GAMEPAD", "GetGamepadData"); |
| 87 pads->length = WebGamepads::itemsLengthCap; |
| 88 Java_GamepadAdapter_getGamepadData( |
| 89 AttachCurrentThread(), reinterpret_cast<intptr_t>(pads)); |
| 90 } |
| 91 |
| 92 void GamepadPlatformDataFetcherAndroid::PauseHint(bool paused) { |
| 93 Java_GamepadAdapter_setDataRequested(AttachCurrentThread(), !paused); |
| 94 } |
| 95 |
| 96 bool GamepadPlatformDataFetcherAndroid::RegisterGamepadAdapter(JNIEnv* env) { |
| 97 return RegisterNativesImpl(env); |
| 98 } |
| 99 |
| 100 } |
OLD | NEW |