1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/prefs/android/pref_change_registrar_android.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/functional/bind.h"
10 #include "components/prefs/android/pref_service_android.h"
11
12 // Must come after all headers that specialize FromJniType() / ToJniType().
13 #include "components/prefs/android/jni_headers/PrefChangeRegistrar_jni.h"
14
15 using base::android::AttachCurrentThread;
16 using base::android::ConvertJavaStringToUTF8;
17 using base::android::ConvertUTF8ToJavaString;
18
PrefChangeRegistrarAndroid(JNIEnv * env,const JavaParamRef<jobject> & obj,PrefService * prefs)19 PrefChangeRegistrarAndroid::PrefChangeRegistrarAndroid(
20 JNIEnv* env,
21 const JavaParamRef<jobject>& obj,
22 PrefService* prefs) {
23 pref_change_registrar_.Init(prefs);
24 pref_change_registrar_jobject_.Reset(env, obj);
25 }
26
27 PrefChangeRegistrarAndroid::~PrefChangeRegistrarAndroid() = default;
28
Destroy(JNIEnv *,const JavaParamRef<jobject> &)29 void PrefChangeRegistrarAndroid::Destroy(JNIEnv*,
30 const JavaParamRef<jobject>&) {
31 delete this;
32 }
33
Add(JNIEnv * env,const JavaParamRef<jobject> & obj,const JavaParamRef<jstring> & j_preference)34 void PrefChangeRegistrarAndroid::Add(
35 JNIEnv* env,
36 const JavaParamRef<jobject>& obj,
37 const JavaParamRef<jstring>& j_preference) {
38 std::string preference =
39 base::android::ConvertJavaStringToUTF8(env, j_preference);
40 pref_change_registrar_.Add(
41 preference,
42 base::BindRepeating(&PrefChangeRegistrarAndroid::OnPreferenceChange,
43 base::Unretained(this), preference));
44 }
45
Remove(JNIEnv * env,const JavaParamRef<jobject> & obj,const JavaParamRef<jstring> & j_preference)46 void PrefChangeRegistrarAndroid::Remove(
47 JNIEnv* env,
48 const JavaParamRef<jobject>& obj,
49 const JavaParamRef<jstring>& j_preference) {
50 pref_change_registrar_.Remove(
51 base::android::ConvertJavaStringToUTF8(env, j_preference));
52 }
53
OnPreferenceChange(std::string preference)54 void PrefChangeRegistrarAndroid::OnPreferenceChange(std::string preference) {
55 JNIEnv* env = AttachCurrentThread();
56 Java_PrefChangeRegistrar_onPreferenceChange(
57 env, pref_change_registrar_jobject_,
58 base::android::ConvertUTF8ToJavaString(env, preference));
59 }
60
JNI_PrefChangeRegistrar_Init(JNIEnv * env,const JavaParamRef<jobject> & obj,PrefService * prefs)61 jlong JNI_PrefChangeRegistrar_Init(JNIEnv* env,
62 const JavaParamRef<jobject>& obj,
63 PrefService* prefs) {
64 return reinterpret_cast<intptr_t>(
65 new PrefChangeRegistrarAndroid(env, obj, prefs));
66 }
67