1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_FEATURE_ENGAGEMENT_INTERNAL_ANDROID_TRACKER_IMPL_ANDROID_H_
#define COMPONENTS_FEATURE_ENGAGEMENT_INTERNAL_ANDROID_TRACKER_IMPL_ANDROID_H_
#include <memory>
#include <string>
#include <unordered_map>
#include "base/android/callback_android.h"
#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "base/feature_list.h"
#include "base/memory/raw_ptr.h"
#include "base/supports_user_data.h"
#include "components/feature_engagement/internal/tracker_impl.h"
#include "components/feature_engagement/public/feature_list.h"
#include "components/feature_engagement/public/tracker.h"
namespace feature_engagement {
// JNI bridge between DisplayLockHandleAndroid in Java and C++.
// This class owns the underlying DisplayLockHandle acquired from the backing
// Tracker. Ownership of this class is released to Java, which means Java owners
// MUST call release() before removing their reference to this object.
// This class must be in this header file, since it is used by the generated
// JNI code.
class DisplayLockHandleAndroid {
public:
DisplayLockHandleAndroid(
std::unique_ptr<DisplayLockHandle> display_lock_handle);
DisplayLockHandleAndroid(const DisplayLockHandleAndroid&) = delete;
DisplayLockHandleAndroid& operator=(const DisplayLockHandleAndroid&) = delete;
~DisplayLockHandleAndroid();
// Returns the Java-side of this JNI bridge.
base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
// Deletes |this|.
void Release(JNIEnv* env);
private:
// The DisplayLockHandle that this JNI bridge owns.
std::unique_ptr<DisplayLockHandle> display_lock_handle_;
// The Java-side of this JNI bridge.
base::android::ScopedJavaGlobalRef<jobject> java_obj_;
};
// JNI bridge between TrackerImpl in Java and C++. See the
// public API of Tracker for documentation for all methods.
class TrackerImplAndroid : public base::SupportsUserData::Data {
public:
using FeatureMap = std::unordered_map<std::string, const base::Feature*>;
static TrackerImplAndroid* FromJavaObject(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj);
TrackerImplAndroid(Tracker* tracker, FeatureVector features);
TrackerImplAndroid(const TrackerImplAndroid&) = delete;
TrackerImplAndroid& operator=(const TrackerImplAndroid&) = delete;
~TrackerImplAndroid() override;
base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
Tracker* tracker() { return tracker_; }
// Tracker JNI bridge implementation.
virtual void NotifyEvent(JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jevent);
virtual bool ShouldTriggerHelpUi(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature);
virtual base::android::ScopedJavaLocalRef<jobject>
ShouldTriggerHelpUiWithSnooze(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature);
virtual bool WouldTriggerHelpUi(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature);
virtual bool HasEverTriggered(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature,
const jboolean j_from_window);
virtual jint GetTriggerState(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature);
virtual void Dismissed(JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature);
virtual void DismissedWithSnooze(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature,
const jint snooze_action);
virtual base::android::ScopedJavaLocalRef<jobject> AcquireDisplayLock(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj);
virtual void SetPriorityNotification(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature);
virtual base::android::ScopedJavaLocalRef<jstring>
GetPendingPriorityNotification(JNIEnv* env,
const base::android::JavaRef<jobject>& jobj);
virtual void RegisterPriorityNotificationHandler(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature,
const base::android::JavaRef<jobject>& jcallback);
virtual void UnregisterPriorityNotificationHandler(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jfeature);
virtual bool IsInitialized(JNIEnv* env,
const base::android::JavaRef<jobject>& jobj);
virtual void AddOnInitializedCallback(
JNIEnv* env,
const base::android::JavaRef<jobject>& jobj,
const base::android::JavaParamRef<jobject>& j_callback_obj);
private:
// A map from the feature name to the base::Feature, to ensure that the Java
// version of the API can use the string name. If base::Feature becomes a Java
// class as well, we should remove this mapping.
FeatureMap features_;
// The Tracker this is a JNI bridge for.
raw_ptr<Tracker> tracker_;
// The Java-side of this JNI bridge.
base::android::ScopedJavaGlobalRef<jobject> java_obj_;
};
} // namespace feature_engagement
#endif // COMPONENTS_FEATURE_ENGAGEMENT_INTERNAL_ANDROID_TRACKER_IMPL_ANDROID_H_
|