Index: base/android/record_user_action.cc |
diff --git a/base/android/record_user_action.cc b/base/android/record_user_action.cc |
index 1452341d82399d67464ca961f6314527b50ea430..e375f8efb463d2ba19035decf86f1f74546827a4 100644 |
--- a/base/android/record_user_action.cc |
+++ b/base/android/record_user_action.cc |
@@ -5,9 +5,19 @@ |
#include "base/android/record_user_action.h" |
#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 { |
@@ -17,6 +27,34 @@ static void RecordUserAction(JNIEnv* env, |
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 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 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; |
+} |
+ |
// Register native methods |
bool RegisterRecordUserAction(JNIEnv* env) { |
return RegisterNativesImpl(env); |