Index: content/browser/gamepad/gamepad_platform_data_fetcher_android.cc |
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_android.cc b/content/browser/gamepad/gamepad_platform_data_fetcher_android.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..09f789cf4add436c271e412c0119ec55f1e27236 |
--- /dev/null |
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_android.cc |
@@ -0,0 +1,84 @@ |
+// Copyright (c) 2012 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 "content/browser/gamepad/gamepad_platform_data_fetcher_android.h" |
+ |
+#include "base/debug/trace_event.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "jni/GamepadAdapter_jni.h" |
+#include "third_party/WebKit/public/platform/WebGamepad.h" |
+ |
+namespace content { |
+ |
+using base::android::AttachCurrentThread; |
+using blink::WebGamepad; |
+using blink::WebGamepads; |
+ |
+GamepadPlatformDataFetcherAndroid::GamepadPlatformDataFetcherAndroid() { |
+ j_gamepad_adapter_ = |
+ Java_GamepadAdapter_attach(AttachCurrentThread(), |
+ reinterpret_cast<intptr_t>(this)); |
+} |
+ |
+GamepadPlatformDataFetcherAndroid::~GamepadPlatformDataFetcherAndroid() { |
+} |
+ |
+void GamepadPlatformDataFetcherAndroid::GetGamepadData( |
+ blink::WebGamepads* pads, |
+ bool devices_changed_hint) { |
+ TRACE_EVENT0("GAMEPAD", "GetGamepadData"); |
+ data_ = pads; |
+ data_->length = WebGamepads::itemsLengthCap; |
+ Java_GamepadAdapter_getGamepadData(AttachCurrentThread(), |
+ j_gamepad_adapter_.obj()); |
+ data_ = NULL; |
+} |
+ |
+void GamepadPlatformDataFetcherAndroid::PauseHint(bool paused) { |
+ Java_GamepadAdapter_setActive( |
+ AttachCurrentThread(), j_gamepad_adapter_.obj(), !paused); |
+} |
+ |
+void GamepadPlatformDataFetcherAndroid::RefreshDevice( |
+ JNIEnv* env, |
+ jobject obj, |
+ int index, |
+ bool connected, |
+ jstring id, |
+ long timestamp, |
+ jfloatArray axes, |
+ jfloatArray buttons) { |
+ CHECK(data_); |
+ WebGamepad& pad = data_->items[index]; |
+ pad.connected = connected; |
+ if (!connected) |
+ return; |
+ jsize id_length = env->GetStringLength(id); |
+ const jchar* id_utf16 = env->GetStringChars(id, 0); |
+ COMPILE_ASSERT(sizeof(jchar) == sizeof(blink::WebUChar), |
+ jchar_and_WebUChar_are_same_size); |
+ const size_t bytes_to_copy = |
+ std::min(id_length * sizeof(jchar), WebGamepad::idLengthCap); |
+ memcpy(pad.id, id_utf16, bytes_to_copy); |
+ pad.id[bytes_to_copy] = 0; |
+ env->ReleaseStringChars(id, id_utf16); |
+ |
+ pad.timestamp = timestamp; |
+ pad.axesLength = std::min(env->GetArrayLength(axes), |
+ static_cast<int>(WebGamepad::axesLengthCap)); |
+ jfloat* raw_axes = env->GetFloatArrayElements(axes, 0); |
+ memcpy(pad.axes, raw_axes, pad.axesLength * sizeof(float)); |
+ env->ReleaseFloatArrayElements(axes, raw_axes, 0); |
+ pad.buttonsLength = std::min(env->GetArrayLength(buttons), |
+ static_cast<int>(WebGamepad::buttonsLengthCap)); |
+ jfloat* raw_buttons = env->GetFloatArrayElements(buttons, 0); |
+ memcpy(pad.buttons, raw_buttons, pad.buttonsLength * sizeof(float)); |
bajones
2014/03/01 00:04:03
You'll need to rebase this code, the buttons are n
|
+ env->ReleaseFloatArrayElements(buttons, raw_buttons, 0); |
+} |
+ |
+bool GamepadPlatformDataFetcherAndroid::RegisterGamepadAdapter(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+} |