summaryrefslogtreecommitdiff
path: root/chromium/components/prefs
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/prefs')
-rw-r--r--chromium/components/prefs/BUILD.gn8
-rw-r--r--chromium/components/prefs/android/BUILD.gn19
-rw-r--r--chromium/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java105
-rw-r--r--chromium/components/prefs/android/pref_service_android.cc90
-rw-r--r--chromium/components/prefs/android/pref_service_android.h53
-rw-r--r--chromium/components/prefs/command_line_pref_store.cc1
-rw-r--r--chromium/components/prefs/json_pref_store.cc1
-rw-r--r--chromium/components/prefs/pref_member.cc8
-rw-r--r--chromium/components/prefs/pref_member.h2
-rw-r--r--chromium/components/prefs/pref_service.cc26
-rw-r--r--chromium/components/prefs/pref_service.h18
11 files changed, 320 insertions, 11 deletions
diff --git a/chromium/components/prefs/BUILD.gn b/chromium/components/prefs/BUILD.gn
index f460a6a73cf..a3394e2f33e 100644
--- a/chromium/components/prefs/BUILD.gn
+++ b/chromium/components/prefs/BUILD.gn
@@ -54,6 +54,14 @@ component("prefs") {
"//base",
"//base/util/values:values_util",
]
+
+ if (is_android) {
+ sources += [
+ "android/pref_service_android.cc",
+ "android/pref_service_android.h",
+ ]
+ deps += [ "android:jni_headers" ]
+ }
}
static_library("test_support") {
diff --git a/chromium/components/prefs/android/BUILD.gn b/chromium/components/prefs/android/BUILD.gn
new file mode 100644
index 00000000000..2aa2728dc22
--- /dev/null
+++ b/chromium/components/prefs/android/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright 2020 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.
+
+import("//build/config/android/rules.gni")
+
+generate_jni("jni_headers") {
+ sources = [ "java/src/org/chromium/components/prefs/PrefService.java" ]
+}
+
+android_library("java") {
+ sources = [ "java/src/org/chromium/components/prefs/PrefService.java" ]
+ deps = [
+ "//base:base_java",
+ "//base:jni_java",
+ "//third_party/android_deps:androidx_annotation_annotation_java",
+ ]
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+}
diff --git a/chromium/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java b/chromium/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java
new file mode 100644
index 00000000000..64f1d05b393
--- /dev/null
+++ b/chromium/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java
@@ -0,0 +1,105 @@
+// Copyright 2020 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.
+
+package org.chromium.components.prefs;
+
+import androidx.annotation.NonNull;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
+
+/** PrefService provides read and write access to native PrefService. */
+public class PrefService {
+ private long mNativePrefServiceAndroid;
+
+ @CalledByNative
+ private static PrefService create(long nativePrefServiceAndroid) {
+ return new PrefService(nativePrefServiceAndroid);
+ }
+
+ @CalledByNative
+ private void clearNativePtr() {
+ mNativePrefServiceAndroid = 0;
+ }
+
+ private PrefService(long nativePrefServiceAndroid) {
+ mNativePrefServiceAndroid = nativePrefServiceAndroid;
+ }
+
+ /**
+ * @param preference The name of the preference.
+ */
+ public void clearPref(@NonNull String preference) {
+ PrefServiceJni.get().clearPref(mNativePrefServiceAndroid, preference);
+ }
+
+ /**
+ * @param preference The name of the preference.
+ * @return Whether the specified preference is enabled.
+ */
+ public boolean getBoolean(@NonNull String preference) {
+ return PrefServiceJni.get().getBoolean(mNativePrefServiceAndroid, preference);
+ }
+
+ /**
+ * @param preference The name of the preference.
+ * @param value The value the specified preference will be set to.
+ */
+ public void setBoolean(@NonNull String preference, boolean value) {
+ PrefServiceJni.get().setBoolean(mNativePrefServiceAndroid, preference, value);
+ }
+
+ /**
+ * @param preference The name of the preference.
+ * @return value The value of the specified preference.
+ */
+ public int getInteger(@NonNull String preference) {
+ return PrefServiceJni.get().getInteger(mNativePrefServiceAndroid, preference);
+ }
+
+ /**
+ * @param preference The name of the preference.
+ * @param value The value the specified preference will be set to.
+ */
+ public void setInteger(@NonNull String preference, int value) {
+ PrefServiceJni.get().setInteger(mNativePrefServiceAndroid, preference, value);
+ }
+
+ /**
+ * @param preference The name of the preference.
+ * @return value The value of the specified preference.
+ */
+ @NonNull
+ public String getString(@NonNull String preference) {
+ return PrefServiceJni.get().getString(mNativePrefServiceAndroid, preference);
+ }
+
+ /**
+ * @param preference The name of the preference.
+ * @param value The value the specified preference will be set to.
+ */
+ public void setString(@NonNull String preference, @NonNull String value) {
+ PrefServiceJni.get().setString(mNativePrefServiceAndroid, preference, value);
+ }
+
+ /**
+ * @param preference The name of the preference.
+ * @return Whether the specified preference is managed.
+ */
+ public boolean isManagedPreference(@NonNull String preference) {
+ return PrefServiceJni.get().isManagedPreference(mNativePrefServiceAndroid, preference);
+ }
+
+ @NativeMethods
+ interface Natives {
+ void clearPref(long nativePrefServiceAndroid, String preference);
+ boolean getBoolean(long nativePrefServiceAndroid, String preference);
+ void setBoolean(long nativePrefServiceAndroid, String preference, boolean value);
+ int getInteger(long nativePrefServiceAndroid, String preference);
+ void setInteger(long nativePrefServiceAndroid, String preference, int value);
+ String getString(long nativePrefServiceAndroid, String preference);
+ void setString(long nativePrefServiceAndroid, String preference, String value);
+ boolean isManagedPreference(long nativePrefServiceAndroid, String preference);
+ }
+}
diff --git a/chromium/components/prefs/android/pref_service_android.cc b/chromium/components/prefs/android/pref_service_android.cc
new file mode 100644
index 00000000000..93758b62ecf
--- /dev/null
+++ b/chromium/components/prefs/android/pref_service_android.cc
@@ -0,0 +1,90 @@
+// Copyright 2020 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/prefs/android/pref_service_android.h"
+
+#include <string>
+
+#include "components/prefs/android/jni_headers/PrefService_jni.h"
+#include "components/prefs/pref_service.h"
+
+using base::android::JavaParamRef;
+using base::android::ScopedJavaLocalRef;
+
+PrefServiceAndroid::PrefServiceAndroid(PrefService* pref_service)
+ : pref_service_(pref_service) {}
+
+PrefServiceAndroid::~PrefServiceAndroid() {
+ if (java_ref_) {
+ Java_PrefService_clearNativePtr(base::android::AttachCurrentThread(),
+ java_ref_);
+ java_ref_.Reset();
+ }
+}
+
+ScopedJavaLocalRef<jobject> PrefServiceAndroid::GetJavaObject() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ if (!java_ref_) {
+ java_ref_.Reset(
+ Java_PrefService_create(env, reinterpret_cast<intptr_t>(this)));
+ }
+ return ScopedJavaLocalRef<jobject>(java_ref_);
+}
+
+void PrefServiceAndroid::ClearPref(JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference) {
+ pref_service_->ClearPref(
+ base::android::ConvertJavaStringToUTF8(env, j_preference));
+}
+
+jboolean PrefServiceAndroid::GetBoolean(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference) {
+ return pref_service_->GetBoolean(
+ base::android::ConvertJavaStringToUTF8(env, j_preference));
+}
+
+void PrefServiceAndroid::SetBoolean(JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference,
+ const jboolean j_value) {
+ pref_service_->SetBoolean(
+ base::android::ConvertJavaStringToUTF8(env, j_preference), j_value);
+}
+
+jint PrefServiceAndroid::GetInteger(JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference) {
+ return pref_service_->GetInteger(
+ base::android::ConvertJavaStringToUTF8(env, j_preference));
+}
+
+void PrefServiceAndroid::SetInteger(JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference,
+ const jint j_value) {
+ pref_service_->SetInteger(
+ base::android::ConvertJavaStringToUTF8(env, j_preference), j_value);
+}
+
+ScopedJavaLocalRef<jstring> PrefServiceAndroid::GetString(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference) {
+ return base::android::ConvertUTF8ToJavaString(
+ env, pref_service_->GetString(
+ base::android::ConvertJavaStringToUTF8(env, j_preference)));
+}
+
+void PrefServiceAndroid::SetString(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference,
+ const base::android::JavaParamRef<jstring>& j_value) {
+ pref_service_->SetString(
+ base::android::ConvertJavaStringToUTF8(env, j_preference),
+ base::android::ConvertJavaStringToUTF8(env, j_value));
+}
+
+jboolean PrefServiceAndroid::IsManagedPreference(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_preference) {
+ return pref_service_->IsManagedPreference(
+ base::android::ConvertJavaStringToUTF8(env, j_preference));
+}
diff --git a/chromium/components/prefs/android/pref_service_android.h b/chromium/components/prefs/android/pref_service_android.h
new file mode 100644
index 00000000000..ba2e3646aab
--- /dev/null
+++ b/chromium/components/prefs/android/pref_service_android.h
@@ -0,0 +1,53 @@
+// Copyright 2020 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.
+
+#ifndef COMPONENTS_PREFS_ANDROID_PREF_SERVICE_ANDROID_H_
+#define COMPONENTS_PREFS_ANDROID_PREF_SERVICE_ANDROID_H_
+
+#include <jni.h>
+
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+
+class PrefService;
+
+// The native side of the PrefServiceAndroid is created and destroyed by the
+// Java.
+class PrefServiceAndroid {
+ public:
+ explicit PrefServiceAndroid(PrefService* pref_service);
+ PrefServiceAndroid(const PrefServiceAndroid& other) = delete;
+ PrefServiceAndroid& operator=(const PrefServiceAndroid& other) = delete;
+ ~PrefServiceAndroid();
+
+ base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
+
+ void ClearPref(JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference);
+ jboolean GetBoolean(JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference);
+ void SetBoolean(JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference,
+ const jboolean j_value);
+ jint GetInteger(JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference);
+ void SetInteger(JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference,
+ const jint j_value);
+ base::android::ScopedJavaLocalRef<jstring> GetString(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference);
+ void SetString(JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference,
+ const base::android::JavaParamRef<jstring>& j_value);
+ jboolean IsManagedPreference(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& j_preference);
+
+ private:
+ PrefService* pref_service_;
+ base::android::ScopedJavaGlobalRef<jobject> java_ref_;
+};
+
+#endif // COMPONENTS_PREFS_ANDROID_PREF_SERVICE_ANDROID_H_
diff --git a/chromium/components/prefs/command_line_pref_store.cc b/chromium/components/prefs/command_line_pref_store.cc
index 79fc10c042a..87435dc5ec5 100644
--- a/chromium/components/prefs/command_line_pref_store.cc
+++ b/chromium/components/prefs/command_line_pref_store.cc
@@ -8,6 +8,7 @@
#include <string>
#include "base/files/file_path.h"
+#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
CommandLinePrefStore::CommandLinePrefStore(
diff --git a/chromium/components/prefs/json_pref_store.cc b/chromium/components/prefs/json_pref_store.cc
index 73c56594005..13fe6131fce 100644
--- a/chromium/components/prefs/json_pref_store.cc
+++ b/chromium/components/prefs/json_pref_store.cc
@@ -16,6 +16,7 @@
#include "base/files/file_util.h"
#include "base/json/json_file_value_serializer.h"
#include "base/json/json_string_value_serializer.h"
+#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/metrics/histogram.h"
diff --git a/chromium/components/prefs/pref_member.cc b/chromium/components/prefs/pref_member.cc
index 4051e5cbb24..a53394f6ff8 100644
--- a/chromium/components/prefs/pref_member.cc
+++ b/chromium/components/prefs/pref_member.cc
@@ -10,7 +10,7 @@
#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/value_conversions.h"
+#include "base/util/values/values_util.h"
#include "components/prefs/pref_service.h"
using base::SequencedTaskRunner;
@@ -200,7 +200,11 @@ template <>
bool PrefMember<base::FilePath>::Internal::UpdateValueInternal(
const base::Value& value)
const {
- return base::GetValueAsFilePath(value, &value_);
+ base::Optional<base::FilePath> path = util::ValueToFilePath(value);
+ if (!path)
+ return false;
+ value_ = *path;
+ return true;
}
template <>
diff --git a/chromium/components/prefs/pref_member.h b/chromium/components/prefs/pref_member.h
index 6f242739985..43569c5367f 100644
--- a/chromium/components/prefs/pref_member.h
+++ b/chromium/components/prefs/pref_member.h
@@ -29,8 +29,8 @@
#include "base/bind.h"
#include "base/callback_forward.h"
+#include "base/check.h"
#include "base/files/file_path.h"
-#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.h"
diff --git a/chromium/components/prefs/pref_service.cc b/chromium/components/prefs/pref_service.cc
index ba16dd4311a..5da0e2bcda1 100644
--- a/chromium/components/prefs/pref_service.cc
+++ b/chromium/components/prefs/pref_service.cc
@@ -23,12 +23,15 @@
#include "base/strings/string_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/util/values/values_util.h"
-#include "base/value_conversions.h"
#include "build/build_config.h"
#include "components/prefs/default_pref_store.h"
#include "components/prefs/pref_notifier_impl.h"
#include "components/prefs/pref_registry.h"
+#if defined(OS_ANDROID)
+#include "components/prefs/android/pref_service_android.h"
+#endif
+
namespace {
class ReadErrorHandler : public PersistentPrefStore::ReadErrorDelegate {
@@ -206,14 +209,12 @@ std::string PrefService::GetString(const std::string& path) const {
base::FilePath PrefService::GetFilePath(const std::string& path) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- base::FilePath result;
-
const base::Value* value = GetPreferenceValueChecked(path);
if (!value)
- return base::FilePath(result);
- bool rv = base::GetValueAsFilePath(*value, &result);
- DCHECK(rv);
- return result;
+ return base::FilePath();
+ base::Optional<base::FilePath> result = util::ValueToFilePath(*value);
+ DCHECK(result);
+ return *result;
}
bool PrefService::HasPrefPath(const std::string& path) const {
@@ -470,6 +471,15 @@ void PrefService::RemovePrefObserverAllPrefs(PrefObserver* obs) {
pref_notifier_->RemovePrefObserverAllPrefs(obs);
}
+#if defined(OS_ANDROID)
+base::android::ScopedJavaLocalRef<jobject> PrefService::GetJavaObject() {
+ if (!pref_service_android_) {
+ pref_service_android_ = std::make_unique<PrefServiceAndroid>(this);
+ }
+ return pref_service_android_->GetJavaObject();
+}
+#endif
+
void PrefService::Set(const std::string& path, const base::Value& value) {
SetUserPrefValue(path, value.Clone());
}
@@ -492,7 +502,7 @@ void PrefService::SetString(const std::string& path, const std::string& value) {
void PrefService::SetFilePath(const std::string& path,
const base::FilePath& value) {
- SetUserPrefValue(path, base::CreateFilePathValue(value));
+ SetUserPrefValue(path, util::FilePathToValue(value));
}
void PrefService::SetInt64(const std::string& path, int64_t value) {
diff --git a/chromium/components/prefs/pref_service.h b/chromium/components/prefs/pref_service.h
index 2824a316a39..e77baccae7f 100644
--- a/chromium/components/prefs/pref_service.h
+++ b/chromium/components/prefs/pref_service.h
@@ -27,15 +27,23 @@
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "base/values.h"
+#include "build/build_config.h"
#include "components/prefs/persistent_pref_store.h"
#include "components/prefs/pref_value_store.h"
#include "components/prefs/prefs_export.h"
+#if defined(OS_ANDROID)
+#include "base/android/scoped_java_ref.h"
+#endif
+
class PrefNotifier;
class PrefNotifierImpl;
class PrefObserver;
class PrefRegistry;
class PrefStore;
+#if defined(OS_ANDROID)
+class PrefServiceAndroid;
+#endif
namespace base {
class FilePath;
@@ -370,6 +378,10 @@ class COMPONENTS_PREFS_EXPORT PrefService {
void AddPrefObserverAllPrefs(PrefObserver* obs);
void RemovePrefObserverAllPrefs(PrefObserver* obs);
+#if defined(OS_ANDROID)
+ base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
+#endif
+
protected:
// The PrefNotifier handles registering and notifying preference observers.
// It is created and owned by this PrefService. Subclasses may access it for
@@ -462,6 +474,12 @@ class COMPONENTS_PREFS_EXPORT PrefService {
// of registered preferences are.
mutable PreferenceMap prefs_map_;
+#if defined(OS_ANDROID)
+ // Manage and fetch the java object that wraps this PrefService on
+ // android.
+ std::unique_ptr<PrefServiceAndroid> pref_service_android_;
+#endif
+
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(PrefService);