File: tracker_impl_android.h

package info (click to toggle)
chromium 139.0.7258.138-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 6,120,676 kB
  • sloc: cpp: 35,100,869; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (149 lines) | stat: -rw-r--r-- 5,897 bytes parent folder | download | duplicates (6)
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_