diff options
Diffstat (limited to 'chromium/components/prefs')
-rw-r--r-- | chromium/components/prefs/BUILD.gn | 8 | ||||
-rw-r--r-- | chromium/components/prefs/android/BUILD.gn | 19 | ||||
-rw-r--r-- | chromium/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java | 105 | ||||
-rw-r--r-- | chromium/components/prefs/android/pref_service_android.cc | 90 | ||||
-rw-r--r-- | chromium/components/prefs/android/pref_service_android.h | 53 | ||||
-rw-r--r-- | chromium/components/prefs/command_line_pref_store.cc | 1 | ||||
-rw-r--r-- | chromium/components/prefs/json_pref_store.cc | 1 | ||||
-rw-r--r-- | chromium/components/prefs/pref_member.cc | 8 | ||||
-rw-r--r-- | chromium/components/prefs/pref_member.h | 2 | ||||
-rw-r--r-- | chromium/components/prefs/pref_service.cc | 26 | ||||
-rw-r--r-- | chromium/components/prefs/pref_service.h | 18 |
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); |