1 // Copyright 2020 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_service_android.h"
6
7 #include <string>
8
9 #include "components/prefs/android/jni_headers/PrefService_jni.h"
10 #include "components/prefs/pref_service.h"
11 #include "components/prefs/prefs_export.h"
12
13 using base::android::JavaParamRef;
14 using base::android::JavaRef;
15 using base::android::ScopedJavaLocalRef;
16 using jni_zero::AttachCurrentThread;
17
18 namespace jni_zero {
19
20 template <>
FromJniType(JNIEnv * env,const JavaRef<jobject> & obj)21 COMPONENTS_PREFS_EXPORT PrefService* FromJniType<PrefService*, jobject>(
22 JNIEnv* env,
23 const JavaRef<jobject>& obj) {
24 return PrefServiceAndroid::FromPrefServiceAndroid(obj);
25 }
26
27 } // namespace jni_zero
28
PrefServiceAndroid(PrefService * pref_service)29 PrefServiceAndroid::PrefServiceAndroid(PrefService* pref_service)
30 : pref_service_(pref_service) {}
31
~PrefServiceAndroid()32 PrefServiceAndroid::~PrefServiceAndroid() {
33 if (java_ref_) {
34 Java_PrefService_clearNativePtr(AttachCurrentThread(), java_ref_);
35 java_ref_.Reset();
36 }
37 }
38
39 // static
FromPrefServiceAndroid(const JavaRef<jobject> & obj)40 PrefService* PrefServiceAndroid::FromPrefServiceAndroid(
41 const JavaRef<jobject>& obj) {
42 if (obj.is_null()) {
43 return nullptr;
44 }
45
46 PrefServiceAndroid* pref_service_android =
47 reinterpret_cast<PrefServiceAndroid*>(
48 Java_PrefService_getNativePointer(AttachCurrentThread(), obj));
49 if (!pref_service_android) {
50 return nullptr;
51 }
52 return pref_service_android->pref_service_;
53 }
54
GetJavaObject()55 ScopedJavaLocalRef<jobject> PrefServiceAndroid::GetJavaObject() {
56 JNIEnv* env = AttachCurrentThread();
57 if (!java_ref_) {
58 java_ref_.Reset(
59 Java_PrefService_create(env, reinterpret_cast<intptr_t>(this)));
60 }
61 return ScopedJavaLocalRef<jobject>(java_ref_);
62 }
63
ClearPref(JNIEnv * env,const JavaParamRef<jstring> & j_preference)64 void PrefServiceAndroid::ClearPref(JNIEnv* env,
65 const JavaParamRef<jstring>& j_preference) {
66 pref_service_->ClearPref(
67 base::android::ConvertJavaStringToUTF8(env, j_preference));
68 }
69
HasPrefPath(JNIEnv * env,const base::android::JavaParamRef<jstring> & j_preference)70 jboolean PrefServiceAndroid::HasPrefPath(
71 JNIEnv* env,
72 const base::android::JavaParamRef<jstring>& j_preference) {
73 return pref_service_->HasPrefPath(
74 base::android::ConvertJavaStringToUTF8(env, j_preference));
75 }
76
GetBoolean(JNIEnv * env,const JavaParamRef<jstring> & j_preference)77 jboolean PrefServiceAndroid::GetBoolean(
78 JNIEnv* env,
79 const JavaParamRef<jstring>& j_preference) {
80 return pref_service_->GetBoolean(
81 base::android::ConvertJavaStringToUTF8(env, j_preference));
82 }
83
SetBoolean(JNIEnv * env,const JavaParamRef<jstring> & j_preference,const jboolean j_value)84 void PrefServiceAndroid::SetBoolean(JNIEnv* env,
85 const JavaParamRef<jstring>& j_preference,
86 const jboolean j_value) {
87 pref_service_->SetBoolean(
88 base::android::ConvertJavaStringToUTF8(env, j_preference), j_value);
89 }
90
GetInteger(JNIEnv * env,const JavaParamRef<jstring> & j_preference)91 jint PrefServiceAndroid::GetInteger(JNIEnv* env,
92 const JavaParamRef<jstring>& j_preference) {
93 return pref_service_->GetInteger(
94 base::android::ConvertJavaStringToUTF8(env, j_preference));
95 }
96
SetInteger(JNIEnv * env,const JavaParamRef<jstring> & j_preference,const jint j_value)97 void PrefServiceAndroid::SetInteger(JNIEnv* env,
98 const JavaParamRef<jstring>& j_preference,
99 const jint j_value) {
100 pref_service_->SetInteger(
101 base::android::ConvertJavaStringToUTF8(env, j_preference), j_value);
102 }
103
GetDouble(JNIEnv * env,const JavaParamRef<jstring> & j_preference)104 jdouble PrefServiceAndroid::GetDouble(
105 JNIEnv* env,
106 const JavaParamRef<jstring>& j_preference) {
107 return pref_service_->GetDouble(
108 base::android::ConvertJavaStringToUTF8(env, j_preference));
109 }
110
SetDouble(JNIEnv * env,const JavaParamRef<jstring> & j_preference,const jdouble j_value)111 void PrefServiceAndroid::SetDouble(JNIEnv* env,
112 const JavaParamRef<jstring>& j_preference,
113 const jdouble j_value) {
114 pref_service_->SetDouble(
115 base::android::ConvertJavaStringToUTF8(env, j_preference), j_value);
116 }
117
GetString(JNIEnv * env,const JavaParamRef<jstring> & j_preference)118 ScopedJavaLocalRef<jstring> PrefServiceAndroid::GetString(
119 JNIEnv* env,
120 const JavaParamRef<jstring>& j_preference) {
121 return base::android::ConvertUTF8ToJavaString(
122 env, pref_service_->GetString(
123 base::android::ConvertJavaStringToUTF8(env, j_preference)));
124 }
125
SetString(JNIEnv * env,const JavaParamRef<jstring> & j_preference,const base::android::JavaParamRef<jstring> & j_value)126 void PrefServiceAndroid::SetString(
127 JNIEnv* env,
128 const JavaParamRef<jstring>& j_preference,
129 const base::android::JavaParamRef<jstring>& j_value) {
130 pref_service_->SetString(
131 base::android::ConvertJavaStringToUTF8(env, j_preference),
132 base::android::ConvertJavaStringToUTF8(env, j_value));
133 }
134
IsManagedPreference(JNIEnv * env,const JavaParamRef<jstring> & j_preference)135 jboolean PrefServiceAndroid::IsManagedPreference(
136 JNIEnv* env,
137 const JavaParamRef<jstring>& j_preference) {
138 return pref_service_->IsManagedPreference(
139 base::android::ConvertJavaStringToUTF8(env, j_preference));
140 }
141
IsDefaultValuePreference(JNIEnv * env,const base::android::JavaParamRef<jstring> & j_preference)142 jboolean PrefServiceAndroid::IsDefaultValuePreference(
143 JNIEnv* env,
144 const base::android::JavaParamRef<jstring>& j_preference) {
145 const PrefService::Preference* pref = pref_service_->FindPreference(
146 base::android::ConvertJavaStringToUTF8(env, j_preference));
147 return pref && pref->IsDefaultValue();
148 }
149