Index: components/feature_engagement_tracker/internal/android/feature_engagement_tracker_impl_android.cc |
diff --git a/components/feature_engagement_tracker/internal/android/feature_engagement_tracker_impl_android.cc b/components/feature_engagement_tracker/internal/android/feature_engagement_tracker_impl_android.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..46bd12d134950cac71ef5d6c3258af2caebe4b76 |
--- /dev/null |
+++ b/components/feature_engagement_tracker/internal/android/feature_engagement_tracker_impl_android.cc |
@@ -0,0 +1,121 @@ |
+// Copyright 2017 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 "components/feature_engagement_tracker/internal/android/feature_engagement_tracker_impl_android.h" |
+ |
+#include "base/android/jni_android.h" |
+#include "base/android/jni_string.h" |
+#include "base/android/scoped_java_ref.h" |
+#include "components/feature_engagement_tracker/public/feature_engagement_tracker.h" |
+#include "jni/FeatureEngagementTrackerImpl_jni.h" |
+ |
+namespace feature_engagement_tracker { |
+ |
+namespace { |
+ |
+const char kFeatureEngagementTrackerImplAndroidKey[] = |
+ "feature_engagement_tracker_impl_android"; |
+ |
+FeatureEngagementTrackerImplAndroid* FromFeatureEngagementTrackerImpl( |
+ FeatureEngagementTracker* feature_engagement_tracker) { |
+ FeatureEngagementTrackerImpl* impl = |
+ static_cast<FeatureEngagementTrackerImpl*>(feature_engagement_tracker); |
+ FeatureEngagementTrackerImplAndroid* impl_android = |
+ static_cast<FeatureEngagementTrackerImplAndroid*>( |
+ impl->GetUserData(kFeatureEngagementTrackerImplAndroidKey)); |
+ if (!impl_android) { |
+ impl_android = new FeatureEngagementTrackerImplAndroid(impl); |
+ impl->SetUserData(kFeatureEngagementTrackerImplAndroidKey, impl_android); |
+ } |
+ return impl_android; |
+} |
+ |
+} // namespace |
+ |
+// static |
+bool FeatureEngagementTrackerImplAndroid::RegisterJni(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+// static |
+FeatureEngagementTrackerImplAndroid* |
+FeatureEngagementTrackerImplAndroid::FromJavaObject( |
+ JNIEnv* env, |
+ const base::android::JavaRef<jobject>& jobj) { |
+ return reinterpret_cast<FeatureEngagementTrackerImplAndroid*>( |
+ Java_FeatureEngagementTrackerImpl_getNativePtr(env, jobj)); |
+} |
+ |
+// This function is declared in |
+// //components/feature_engagement_tracker/public/feature_engagement_tracker.h |
+// and should be linked in to any binary using |
+// FeatureEngagementTracker::GetJavaObject. |
+// static |
+base::android::ScopedJavaLocalRef<jobject> |
+FeatureEngagementTracker::GetJavaObject( |
+ FeatureEngagementTracker* feature_engagement_tracker) { |
+ return FromFeatureEngagementTrackerImpl(feature_engagement_tracker) |
+ ->GetJavaObject(); |
+} |
+ |
+FeatureEngagementTrackerImplAndroid::FeatureEngagementTrackerImplAndroid( |
+ FeatureEngagementTrackerImpl* feature_engagement_tracker_impl) |
+ : feature_engagement_tracker_impl_(feature_engagement_tracker_impl) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ |
+ java_obj_.Reset(env, Java_FeatureEngagementTrackerImpl_create( |
+ env, reinterpret_cast<intptr_t>(this)) |
+ .obj()); |
+} |
+ |
+FeatureEngagementTrackerImplAndroid::~FeatureEngagementTrackerImplAndroid() { |
+ Java_FeatureEngagementTrackerImpl_clearNativePtr( |
+ base::android::AttachCurrentThread(), java_obj_); |
+} |
+ |
+base::android::ScopedJavaLocalRef<jobject> |
+FeatureEngagementTrackerImplAndroid::GetJavaObject() { |
+ return base::android::ScopedJavaLocalRef<jobject>(java_obj_); |
+} |
+ |
+void FeatureEngagementTrackerImplAndroid::Event( |
+ JNIEnv* env, |
+ const base::android::JavaRef<jobject>& jobj, |
+ const base::android::JavaParamRef<jstring>& jfeature, |
+ const base::android::JavaParamRef<jstring>& jprecondition) { |
+ std::string feature = ConvertJavaStringToUTF8(env, jfeature); |
+ std::string precondition = ConvertJavaStringToUTF8(env, jprecondition); |
+ feature_engagement_tracker_impl_->Event(feature, precondition); |
+} |
+ |
+void FeatureEngagementTrackerImplAndroid::Used( |
+ JNIEnv* env, |
+ const base::android::JavaRef<jobject>& jobj, |
+ const base::android::JavaParamRef<jstring>& jfeature) { |
+ std::string feature = ConvertJavaStringToUTF8(env, jfeature); |
+ feature_engagement_tracker_impl_->Used(feature); |
+} |
+ |
+bool FeatureEngagementTrackerImplAndroid::Trigger( |
+ JNIEnv* env, |
+ const base::android::JavaRef<jobject>& jobj, |
+ const base::android::JavaParamRef<jstring>& jfeature) { |
+ std::string feature = ConvertJavaStringToUTF8(env, jfeature); |
+ return feature_engagement_tracker_impl_->Trigger(feature); |
+} |
+ |
+void FeatureEngagementTrackerImplAndroid::Dismissed( |
+ JNIEnv* env, |
+ const base::android::JavaRef<jobject>& jobj) { |
+ feature_engagement_tracker_impl_->Dismissed(); |
+} |
+ |
+void FeatureEngagementTrackerImplAndroid::AddOnInitializedCallback( |
+ JNIEnv* env, |
+ const base::android::JavaRef<jobject>& jobj, |
+ const base::android::JavaParamRef<jobject>& j_callback_obj) { |
+ // TODO(nyquist): Implement support for the wrapped base::Callback. |
+} |
+ |
+} // namespace feature_engagement_tracker |