| // Copyright 2015 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 "base/android/jni_string.h" |
| #include "base/bind.h" |
| #include "base/callback.h" |
| #include "base/metrics/user_metrics.h" |
| #include "jni/RecordUserAction_jni.h" |
| |
| namespace { |
| |
| struct ActionCallbackWrapper { |
| base::ActionCallback action_callback; |
| }; |
| |
| } // namespace |
| |
| namespace base { |
| namespace android { |
| |
| static void JNI_RecordUserAction_RecordUserAction( |
| JNIEnv* env, |
| const JavaParamRef<jclass>& clazz, |
| const JavaParamRef<jstring>& j_action) { |
| RecordComputedAction(ConvertJavaStringToUTF8(env, j_action)); |
| } |
| |
| static void OnActionRecorded(const JavaRef<jobject>& callback, |
| const std::string& action) { |
| JNIEnv* env = AttachCurrentThread(); |
| Java_UserActionCallback_onActionRecorded( |
| env, callback, ConvertUTF8ToJavaString(env, action)); |
| } |
| |
| static jlong JNI_RecordUserAction_AddActionCallbackForTesting( |
| JNIEnv* env, |
| const JavaParamRef<jclass>& clazz, |
| const JavaParamRef<jobject>& callback) { |
| // Create a wrapper for the ActionCallback, so it can life on the heap until |
| // RemoveActionCallbackForTesting() is called. |
| auto* wrapper = new ActionCallbackWrapper{base::Bind( |
| &OnActionRecorded, ScopedJavaGlobalRef<jobject>(env, callback))}; |
| base::AddActionCallback(wrapper->action_callback); |
| return reinterpret_cast<intptr_t>(wrapper); |
| } |
| |
| static void JNI_RecordUserAction_RemoveActionCallbackForTesting( |
| JNIEnv* env, |
| const JavaParamRef<jclass>& clazz, |
| jlong callback_id) { |
| DCHECK(callback_id); |
| auto* wrapper = reinterpret_cast<ActionCallbackWrapper*>(callback_id); |
| base::RemoveActionCallback(wrapper->action_callback); |
| delete wrapper; |
| } |
| |
| } // namespace android |
| } // namespace base |