| // Copyright 2014 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 "chrome/browser/android/preferences/pref_service_bridge.h" |
| |
| #include <jni.h> |
| #include <stddef.h> |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/android/build_info.h" |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_array.h" |
| #include "base/android/jni_string.h" |
| #include "base/android/jni_weak_ref.h" |
| #include "base/feature_list.h" |
| #include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/scoped_observer.h" |
| #include "base/strings/string_util.h" |
| #include "base/values.h" |
| #include "chrome/browser/android/preferences/important_sites_util.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/browsing_data/browsing_data_counter_utils.h" |
| #include "chrome/browser/browsing_data/browsing_data_filter_builder.h" |
| #include "chrome/browser/browsing_data/browsing_data_helper.h" |
| #include "chrome/browser/browsing_data/browsing_data_remover.h" |
| #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" |
| #include "chrome/browser/browsing_data/registrable_domain_filter_builder.h" |
| #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| #include "chrome/browser/history/web_history_service_factory.h" |
| #include "chrome/browser/net/prediction_options.h" |
| #include "chrome/browser/prefs/incognito_mode_prefs.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/sync/profile_sync_service_factory.h" |
| #include "chrome/browser/translate/chrome_translate_client.h" |
| #include "chrome/browser/ui/android/android_about_app_info.h" |
| #include "chrome/common/channel_info.h" |
| #include "chrome/common/chrome_features.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/grit/locale_settings.h" |
| #include "components/browser_sync/browser/profile_sync_service.h" |
| #include "components/browsing_data/core/browsing_data_utils.h" |
| #include "components/browsing_data/core/pref_names.h" |
| #include "components/browsing_data_ui/history_notice_utils.h" |
| #include "components/content_settings/core/browser/host_content_settings_map.h" |
| #include "components/content_settings/core/common/content_settings.h" |
| #include "components/content_settings/core/common/content_settings_pattern.h" |
| #include "components/content_settings/core/common/pref_names.h" |
| #include "components/metrics/metrics_pref_names.h" |
| #include "components/password_manager/core/common/password_manager_pref_names.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/signin/core/common/signin_pref_names.h" |
| #include "components/strings/grit/components_locale_settings.h" |
| #include "components/translate/core/browser/translate_prefs.h" |
| #include "components/translate/core/common/translate_pref_names.h" |
| #include "components/version_info/version_info.h" |
| #include "components/web_resource/web_resource_pref_names.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "jni/PrefServiceBridge_jni.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| using base::android::AttachCurrentThread; |
| using base::android::CheckException; |
| using base::android::ConvertJavaStringToUTF8; |
| using base::android::ConvertUTF8ToJavaString; |
| using base::android::ScopedJavaLocalRef; |
| using base::android::ScopedJavaGlobalRef; |
| using content::BrowserThread; |
| |
| namespace { |
| |
| const size_t kMaxImportantSites = 5; |
| |
| Profile* GetOriginalProfile() { |
| return ProfileManager::GetActiveUserProfile()->GetOriginalProfile(); |
| } |
| |
| bool GetBooleanForContentSetting(ContentSettingsType type) { |
| HostContentSettingsMap* content_settings = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| switch (content_settings->GetDefaultContentSetting(type, NULL)) { |
| case CONTENT_SETTING_BLOCK: |
| return false; |
| case CONTENT_SETTING_ALLOW: |
| case CONTENT_SETTING_ASK: |
| default: |
| return true; |
| } |
| } |
| |
| bool IsContentSettingManaged(ContentSettingsType content_settings_type) { |
| std::string source; |
| HostContentSettingsMap* content_settings = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| content_settings->GetDefaultContentSetting(content_settings_type, &source); |
| HostContentSettingsMap::ProviderType provider = |
| content_settings->GetProviderTypeFromSource(source); |
| return provider == HostContentSettingsMap::POLICY_PROVIDER; |
| } |
| |
| bool IsContentSettingManagedByCustodian( |
| ContentSettingsType content_settings_type) { |
| std::string source; |
| HostContentSettingsMap* content_settings = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| content_settings->GetDefaultContentSetting(content_settings_type, &source); |
| HostContentSettingsMap::ProviderType provider = |
| content_settings->GetProviderTypeFromSource(source); |
| return provider == HostContentSettingsMap::SUPERVISED_PROVIDER; |
| } |
| |
| bool IsContentSettingUserModifiable(ContentSettingsType content_settings_type) { |
| std::string source; |
| HostContentSettingsMap* content_settings = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| content_settings->GetDefaultContentSetting(content_settings_type, &source); |
| HostContentSettingsMap::ProviderType provider = |
| content_settings->GetProviderTypeFromSource(source); |
| return provider >= HostContentSettingsMap::PREF_PROVIDER; |
| } |
| |
| PrefService* GetPrefService() { |
| return GetOriginalProfile()->GetPrefs(); |
| } |
| |
| } // namespace |
| |
| // ---------------------------------------------------------------------------- |
| // Native JNI methods |
| // ---------------------------------------------------------------------------- |
| |
| static jboolean IsContentSettingManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| int content_settings_type) { |
| return IsContentSettingManaged( |
| static_cast<ContentSettingsType>(content_settings_type)); |
| } |
| |
| static jboolean IsContentSettingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| int content_settings_type) { |
| // Before we migrate functions over to this central function, we must verify |
| // that the functionality provided below is correct. |
| DCHECK(content_settings_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT || |
| content_settings_type == CONTENT_SETTINGS_TYPE_POPUPS); |
| ContentSettingsType type = |
| static_cast<ContentSettingsType>(content_settings_type); |
| return GetBooleanForContentSetting(type); |
| } |
| |
| static void SetContentSettingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| int content_settings_type, |
| jboolean allow) { |
| // Before we migrate functions over to this central function, we must verify |
| // that the new category supports ALLOW/BLOCK pairs and, if not, handle them. |
| DCHECK(content_settings_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT || |
| content_settings_type == CONTENT_SETTINGS_TYPE_POPUPS); |
| |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| static_cast<ContentSettingsType>(content_settings_type), |
| allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetContentSettingForPattern(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| int content_settings_type, |
| const JavaParamRef<jstring>& pattern, |
| int setting) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetContentSettingCustomScope( |
| ContentSettingsPattern::FromString(ConvertJavaStringToUTF8(env, pattern)), |
| ContentSettingsPattern::Wildcard(), |
| static_cast<ContentSettingsType>(content_settings_type), std::string(), |
| static_cast<ContentSetting>(setting)); |
| } |
| |
| static void GetContentSettingsExceptions(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| int content_settings_type, |
| const JavaParamRef<jobject>& list) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| ContentSettingsForOneType entries; |
| host_content_settings_map->GetSettingsForOneType( |
| static_cast<ContentSettingsType>(content_settings_type), "", &entries); |
| for (size_t i = 0; i < entries.size(); ++i) { |
| Java_PrefServiceBridge_addContentSettingExceptionToList( |
| env, list, |
| content_settings_type, |
| ConvertUTF8ToJavaString( |
| env, entries[i].primary_pattern.ToString()).obj(), |
| entries[i].setting, |
| ConvertUTF8ToJavaString(env, entries[i].source).obj()); |
| } |
| } |
| |
| static jboolean GetAcceptCookiesEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_COOKIES); |
| } |
| |
| static jboolean GetAcceptCookiesManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingManaged(CONTENT_SETTINGS_TYPE_COOKIES); |
| } |
| |
| static jboolean GetAutoplayEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_AUTOPLAY); |
| } |
| |
| static jboolean GetBackgroundSyncEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC); |
| } |
| |
| static jboolean GetBlockThirdPartyCookiesEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kBlockThirdPartyCookies); |
| } |
| |
| static jboolean GetBlockThirdPartyCookiesManaged( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference(prefs::kBlockThirdPartyCookies); |
| } |
| |
| static jboolean GetRememberPasswordsEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean( |
| password_manager::prefs::kPasswordManagerSavingEnabled); |
| } |
| |
| static jboolean GetPasswordManagerAutoSigninEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean( |
| password_manager::prefs::kCredentialsEnableAutosignin); |
| } |
| |
| static jboolean GetRememberPasswordsManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference( |
| password_manager::prefs::kPasswordManagerSavingEnabled); |
| } |
| |
| static jboolean GetPasswordManagerAutoSigninManaged( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference( |
| password_manager::prefs::kCredentialsEnableAutosignin); |
| } |
| |
| static jboolean GetDoNotTrackEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kEnableDoNotTrack); |
| } |
| |
| static jboolean GetNetworkPredictionEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetInteger(prefs::kNetworkPredictionOptions) |
| != chrome_browser_net::NETWORK_PREDICTION_NEVER; |
| } |
| |
| static jboolean GetNetworkPredictionManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference( |
| prefs::kNetworkPredictionOptions); |
| } |
| |
| static jboolean GetPasswordEchoEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kWebKitPasswordEchoEnabled); |
| } |
| |
| static jboolean GetPrintingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kPrintingEnabled); |
| } |
| |
| static jboolean GetPrintingManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference(prefs::kPrintingEnabled); |
| } |
| |
| static jboolean GetTranslateEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kEnableTranslate); |
| } |
| |
| static jboolean GetTranslateManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference(prefs::kEnableTranslate); |
| } |
| |
| static jboolean GetSearchSuggestEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kSearchSuggestEnabled); |
| } |
| |
| static jboolean GetSearchSuggestManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference(prefs::kSearchSuggestEnabled); |
| } |
| |
| static jboolean GetSafeBrowsingExtendedReportingEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean( |
| prefs::kSafeBrowsingExtendedReportingEnabled); |
| } |
| |
| static void SetSafeBrowsingExtendedReportingEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, |
| enabled); |
| } |
| |
| static jboolean GetSafeBrowsingExtendedReportingManaged( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference( |
| prefs::kSafeBrowsingExtendedReportingEnabled); |
| } |
| |
| static jboolean GetSafeBrowsingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kSafeBrowsingEnabled); |
| } |
| |
| static void SetSafeBrowsingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean(prefs::kSafeBrowsingEnabled, enabled); |
| } |
| |
| static jboolean GetSafeBrowsingManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference(prefs::kSafeBrowsingEnabled); |
| } |
| |
| static jboolean GetProtectedMediaIdentifierEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting( |
| CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER); |
| } |
| |
| static jboolean GetNotificationsEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_NOTIFICATIONS); |
| } |
| |
| static jboolean GetNotificationsVibrateEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kNotificationsVibrateEnabled); |
| } |
| |
| static jboolean GetAllowLocationEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_GEOLOCATION); |
| } |
| |
| static jboolean GetLocationAllowedByPolicy(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| if (!IsContentSettingManaged(CONTENT_SETTINGS_TYPE_GEOLOCATION)) |
| return false; |
| HostContentSettingsMap* content_settings = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| return content_settings->GetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_GEOLOCATION, nullptr) == |
| CONTENT_SETTING_ALLOW; |
| } |
| |
| static jboolean GetAllowLocationUserModifiable( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingUserModifiable(CONTENT_SETTINGS_TYPE_GEOLOCATION); |
| } |
| |
| static jboolean GetAllowLocationManagedByCustodian( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingManagedByCustodian(CONTENT_SETTINGS_TYPE_GEOLOCATION); |
| } |
| |
| static jboolean GetResolveNavigationErrorEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kAlternateErrorPagesEnabled); |
| } |
| |
| static jboolean GetResolveNavigationErrorManaged( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference( |
| prefs::kAlternateErrorPagesEnabled); |
| } |
| |
| static jboolean GetCrashReportManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference( |
| prefs::kCrashReportingEnabled); |
| } |
| |
| static jboolean GetSupervisedUserSafeSitesEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kSupervisedUserSafeSites); |
| } |
| |
| static jint GetDefaultSupervisedUserFilteringBehavior( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetInteger( |
| prefs::kDefaultSupervisedUserFilteringBehavior); |
| } |
| |
| static jboolean GetIncognitoModeEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| PrefService* prefs = GetPrefService(); |
| IncognitoModePrefs::Availability incognito_pref = |
| IncognitoModePrefs::GetAvailability(prefs); |
| DCHECK(incognito_pref == IncognitoModePrefs::ENABLED || |
| incognito_pref == IncognitoModePrefs::DISABLED) << |
| "Unsupported incognito mode preference: " << incognito_pref; |
| return incognito_pref != IncognitoModePrefs::DISABLED; |
| } |
| |
| static jboolean GetIncognitoModeManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference( |
| prefs::kIncognitoModeAvailability); |
| } |
| |
| static jboolean GetFullscreenManaged(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingManaged(CONTENT_SETTINGS_TYPE_FULLSCREEN); |
| } |
| |
| static jboolean GetFullscreenAllowed(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| // In the simplified fullscreen case, fullscreen is always allowed. |
| // TODO(mgiuca): Remove this pref once all data associated with it is deleted |
| // (https://crbug.com/591896). |
| if (base::FeatureList::IsEnabled(features::kSimplifiedFullscreenUI)) |
| return true; |
| |
| HostContentSettingsMap* content_settings = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| return content_settings->GetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_FULLSCREEN, NULL) == CONTENT_SETTING_ALLOW; |
| } |
| |
| static jboolean GetMetricsReportingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| PrefService* local_state = g_browser_process->local_state(); |
| return local_state->GetBoolean(metrics::prefs::kMetricsReportingEnabled); |
| } |
| |
| static void SetMetricsReportingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| PrefService* local_state = g_browser_process->local_state(); |
| local_state->SetBoolean(metrics::prefs::kMetricsReportingEnabled, enabled); |
| } |
| |
| static jboolean HasSetMetricsReporting(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| PrefService* local_state = g_browser_process->local_state(); |
| return local_state->HasPrefPath(metrics::prefs::kMetricsReportingEnabled); |
| } |
| |
| static void SetClickedUpdateMenuItem(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean clicked) { |
| GetPrefService()->SetBoolean(prefs::kClickedUpdateMenuItem, clicked); |
| } |
| |
| static jboolean GetClickedUpdateMenuItem(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kClickedUpdateMenuItem); |
| } |
| |
| static void SetLatestVersionWhenClickedUpdateMenuItem( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| const JavaParamRef<jstring>& version) { |
| GetPrefService()->SetString( |
| prefs::kLatestVersionWhenClickedUpdateMenuItem, |
| ConvertJavaStringToUTF8(env, version)); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetLatestVersionWhenClickedUpdateMenuItem( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString( |
| prefs::kLatestVersionWhenClickedUpdateMenuItem)); |
| } |
| |
| namespace { |
| |
| // Redirects a BrowsingDataRemover completion callback back into Java. |
| class ClearBrowsingDataObserver : public BrowsingDataRemover::Observer { |
| public: |
| // |obj| is expected to be the object passed into ClearBrowsingData(); e.g. a |
| // ChromePreference. |
| ClearBrowsingDataObserver(JNIEnv* env, |
| jobject obj, |
| BrowsingDataRemover* browsing_data_remover) |
| : weak_chrome_native_preferences_(env, obj), observer_(this) { |
| observer_.Add(browsing_data_remover); |
| } |
| |
| void OnBrowsingDataRemoverDone() override { |
| // We delete ourselves when done. |
| std::unique_ptr<ClearBrowsingDataObserver> auto_delete(this); |
| |
| JNIEnv* env = AttachCurrentThread(); |
| if (weak_chrome_native_preferences_.get(env).is_null()) |
| return; |
| |
| Java_PrefServiceBridge_browsingDataCleared( |
| env, weak_chrome_native_preferences_.get(env).obj()); |
| } |
| |
| private: |
| JavaObjectWeakGlobalRef weak_chrome_native_preferences_; |
| ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> observer_; |
| }; |
| |
| } // namespace |
| |
| static jboolean GetBrowsingDataDeletionPreference( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jint data_type) { |
| DCHECK_GE(data_type, 0); |
| DCHECK_LT(data_type, browsing_data::NUM_TYPES); |
| |
| // If there is no corresponding preference for this |data_type|, pretend |
| // that it's set to false. |
| // TODO(msramek): Consider defining native-side preferences for all Java UI |
| // data types for consistency. |
| std::string pref; |
| if (!GetDeletionPreferenceFromDataType( |
| static_cast<browsing_data::BrowsingDataType>(data_type), &pref)) { |
| return false; |
| } |
| |
| return GetOriginalProfile()->GetPrefs()->GetBoolean(pref); |
| } |
| |
| static void SetBrowsingDataDeletionPreference( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jint data_type, |
| jboolean value) { |
| DCHECK_GE(data_type, 0); |
| DCHECK_LT(data_type, browsing_data::NUM_TYPES); |
| |
| std::string pref; |
| if (!GetDeletionPreferenceFromDataType( |
| static_cast<browsing_data::BrowsingDataType>(data_type), &pref)) { |
| return; |
| } |
| |
| GetOriginalProfile()->GetPrefs()->SetBoolean(pref, value); |
| } |
| |
| static jint GetBrowsingDataDeletionTimePeriod( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetInteger(browsing_data::prefs::kDeleteTimePeriod); |
| } |
| |
| static void SetBrowsingDataDeletionTimePeriod( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jint time_period) { |
| DCHECK_GE(time_period, 0); |
| DCHECK_LE(time_period, browsing_data::TIME_PERIOD_LAST); |
| GetPrefService()->SetInteger(browsing_data::prefs::kDeleteTimePeriod, |
| time_period); |
| } |
| |
| static void ClearBrowsingData( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| const JavaParamRef<jintArray>& data_types, |
| jint time_period, |
| const JavaParamRef<jobjectArray>& jexcluding_domains) { |
| BrowsingDataRemover* browsing_data_remover = |
| BrowsingDataRemoverFactory::GetForBrowserContext(GetOriginalProfile()); |
| // ClearBrowsingDataObserver deletes itself when |browsing_data_remover| is |
| // done. |
| new ClearBrowsingDataObserver(env, obj, browsing_data_remover); |
| |
| std::vector<int> data_types_vector; |
| base::android::JavaIntArrayToIntVector(env, data_types, &data_types_vector); |
| |
| int remove_mask = 0; |
| for (const int data_type : data_types_vector) { |
| switch (static_cast<browsing_data::BrowsingDataType>(data_type)) { |
| case browsing_data::HISTORY: |
| remove_mask |= BrowsingDataRemover::REMOVE_HISTORY; |
| break; |
| case browsing_data::CACHE: |
| remove_mask |= BrowsingDataRemover::REMOVE_CACHE; |
| break; |
| case browsing_data::COOKIES: |
| remove_mask |= BrowsingDataRemover::REMOVE_COOKIES; |
| remove_mask |= BrowsingDataRemover::REMOVE_SITE_DATA; |
| break; |
| case browsing_data::PASSWORDS: |
| remove_mask |= BrowsingDataRemover::REMOVE_PASSWORDS; |
| break; |
| case browsing_data::FORM_DATA: |
| remove_mask |= BrowsingDataRemover::REMOVE_FORM_DATA; |
| break; |
| case browsing_data::BOOKMARKS: |
| // Bookmarks are deleted separately on the Java side. |
| NOTREACHED(); |
| break; |
| case browsing_data::NUM_TYPES: |
| NOTREACHED(); |
| } |
| } |
| std::vector<std::string> excluding_domains; |
| base::android::AppendJavaStringArrayToStringVector( |
| env, jexcluding_domains.obj(), &excluding_domains); |
| RegistrableDomainFilterBuilder filter_builder( |
| BrowsingDataFilterBuilder::BLACKLIST); |
| for (const std::string& domain : excluding_domains) { |
| filter_builder.AddRegisterableDomain(domain); |
| } |
| |
| if (!excluding_domains.empty()) { |
| ImportantSitesUtil::RecordMetricsForBlacklistedSites(GetOriginalProfile(), |
| excluding_domains); |
| } |
| |
| browsing_data_remover->RemoveWithFilter( |
| BrowsingDataRemover::Period( |
| static_cast<browsing_data::TimePeriod>(time_period)), |
| remove_mask, BrowsingDataHelper::UNPROTECTED_WEB, filter_builder); |
| } |
| |
| static jboolean CanDeleteBrowsingHistory(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetBoolean(prefs::kAllowDeletingBrowserHistory); |
| } |
| |
| static void FetchImportantSites(JNIEnv* env, |
| const JavaParamRef<jclass>& clazz, |
| const JavaParamRef<jobject>& java_callback) { |
| std::vector<GURL> example_origins; |
| std::vector<std::string> important_domains = |
| ImportantSitesUtil::GetImportantRegisterableDomains( |
| GetOriginalProfile(), kMaxImportantSites, &example_origins); |
| ScopedJavaLocalRef<jobjectArray> java_domains = |
| base::android::ToJavaArrayOfStrings(env, important_domains); |
| |
| // We reuse the important domains vector to convert example origins to |
| // strings. |
| important_domains.resize(example_origins.size()); |
| std::transform(example_origins.begin(), example_origins.end(), |
| important_domains.begin(), |
| [](const GURL& origin) { return origin.spec(); }); |
| ScopedJavaLocalRef<jobjectArray> java_origins = |
| base::android::ToJavaArrayOfStrings(env, important_domains); |
| |
| Java_ImportantSitesCallback_onImportantRegisterableDomainsReady( |
| env, java_callback.obj(), java_domains.obj(), java_origins.obj()); |
| } |
| |
| // This value should not change during a sessions, as it's used for UMA metrics. |
| static jint GetMaxImportantSites(JNIEnv* env, |
| const JavaParamRef<jclass>& clazz) { |
| return kMaxImportantSites; |
| } |
| |
| static void MarkOriginAsImportantForTesting( |
| JNIEnv* env, |
| const JavaParamRef<jclass>& clazz, |
| const JavaParamRef<jstring>& jorigin) { |
| GURL origin(base::android::ConvertJavaStringToUTF8(jorigin)); |
| CHECK(origin.is_valid()); |
| ImportantSitesUtil::MarkOriginAsImportantForTesting(GetOriginalProfile(), |
| origin); |
| } |
| |
| static void ShowNoticeAboutOtherFormsOfBrowsingHistory( |
| ScopedJavaGlobalRef<jobject>* listener, |
| bool show) { |
| JNIEnv* env = AttachCurrentThread(); |
| UMA_HISTOGRAM_BOOLEAN( |
| "History.ClearBrowsingData.HistoryNoticeShownInFooterWhenUpdated", show); |
| if (!show) |
| return; |
| Java_OtherFormsOfBrowsingHistoryListener_showNoticeAboutOtherFormsOfBrowsingHistory( |
| env, listener->obj()); |
| } |
| |
| static void EnableDialogAboutOtherFormsOfBrowsingHistory( |
| ScopedJavaGlobalRef<jobject>* listener, |
| bool enabled) { |
| JNIEnv* env = AttachCurrentThread(); |
| if (!enabled) |
| return; |
| Java_OtherFormsOfBrowsingHistoryListener_enableDialogAboutOtherFormsOfBrowsingHistory( |
| env, listener->obj()); |
| } |
| |
| static void RequestInfoAboutOtherFormsOfBrowsingHistory( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| const JavaParamRef<jobject>& listener) { |
| // The permanent notice in the footer. |
| browsing_data_ui::ShouldShowNoticeAboutOtherFormsOfBrowsingHistory( |
| ProfileSyncServiceFactory::GetForProfile(GetOriginalProfile()), |
| WebHistoryServiceFactory::GetForProfile(GetOriginalProfile()), |
| base::Bind(&ShowNoticeAboutOtherFormsOfBrowsingHistory, |
| base::Owned(new ScopedJavaGlobalRef<jobject>(env, listener)))); |
| |
| // The one-time notice in the dialog. |
| browsing_data_ui::ShouldPopupDialogAboutOtherFormsOfBrowsingHistory( |
| ProfileSyncServiceFactory::GetForProfile(GetOriginalProfile()), |
| WebHistoryServiceFactory::GetForProfile(GetOriginalProfile()), |
| chrome::GetChannel(), |
| base::Bind(&EnableDialogAboutOtherFormsOfBrowsingHistory, |
| base::Owned(new ScopedJavaGlobalRef<jobject>(env, listener)))); |
| } |
| |
| static void SetAutoplayEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_AUTOPLAY, |
| allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetAllowCookiesEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_COOKIES, |
| allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetBackgroundSyncEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC, |
| allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetBlockThirdPartyCookiesEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean(prefs::kBlockThirdPartyCookies, enabled); |
| } |
| |
| static void SetRememberPasswordsEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| GetPrefService()->SetBoolean( |
| password_manager::prefs::kPasswordManagerSavingEnabled, allow); |
| } |
| |
| static void SetPasswordManagerAutoSigninEnabled( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean( |
| password_manager::prefs::kCredentialsEnableAutosignin, enabled); |
| } |
| |
| static void SetProtectedMediaIdentifierEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean is_enabled) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, |
| is_enabled ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetAllowLocationEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean is_enabled) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_GEOLOCATION, |
| is_enabled ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetCameraEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, |
| allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetMicEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, |
| allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetFullscreenAllowed(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_FULLSCREEN, |
| allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_ASK); |
| } |
| |
| static void SetNotificationsEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| HostContentSettingsMap* host_content_settings_map = |
| HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()); |
| host_content_settings_map->SetDefaultContentSetting( |
| CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
| allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK); |
| } |
| |
| static void SetNotificationsVibrateEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean(prefs::kNotificationsVibrateEnabled, enabled); |
| } |
| |
| static void SetCrashReportingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean reporting) { |
| PrefService* local_state = g_browser_process->local_state(); |
| local_state->SetBoolean(prefs::kCrashReportingEnabled, reporting); |
| } |
| |
| static jboolean IsCrashReportingEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| PrefService* local_state = g_browser_process->local_state(); |
| return local_state->GetBoolean(prefs::kCrashReportingEnabled); |
| } |
| |
| static jboolean CanPrefetchAndPrerender(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return chrome_browser_net::CanPrefetchAndPrerenderUI(GetPrefService()) == |
| chrome_browser_net::NetworkPredictionStatus::ENABLED; |
| } |
| |
| static void SetDoNotTrackEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean allow) { |
| GetPrefService()->SetBoolean(prefs::kEnableDoNotTrack, allow); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetSyncLastAccountId( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString(prefs::kGoogleServicesLastAccountId)); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetSyncLastAccountName( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString(prefs::kGoogleServicesLastUsername)); |
| } |
| |
| static void SetTranslateEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean(prefs::kEnableTranslate, enabled); |
| } |
| |
| static void ResetTranslateDefaults(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| std::unique_ptr<translate::TranslatePrefs> translate_prefs = |
| ChromeTranslateClient::CreateTranslatePrefs(GetPrefService()); |
| translate_prefs->ResetToDefaults(); |
| } |
| |
| static void MigrateJavascriptPreference(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| const PrefService::Preference* javascript_pref = |
| GetPrefService()->FindPreference(prefs::kWebKitJavascriptEnabled); |
| DCHECK(javascript_pref); |
| |
| if (!javascript_pref->HasUserSetting()) |
| return; |
| |
| bool javascript_enabled = false; |
| bool retval = javascript_pref->GetValue()->GetAsBoolean(&javascript_enabled); |
| DCHECK(retval); |
| SetContentSettingEnabled(env, obj, |
| CONTENT_SETTINGS_TYPE_JAVASCRIPT, javascript_enabled); |
| GetPrefService()->ClearPref(prefs::kWebKitJavascriptEnabled); |
| } |
| |
| static void SetPasswordEchoEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean passwordEchoEnabled) { |
| GetPrefService()->SetBoolean(prefs::kWebKitPasswordEchoEnabled, |
| passwordEchoEnabled); |
| } |
| |
| static jboolean GetCameraEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); |
| } |
| |
| static jboolean GetCameraUserModifiable(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingUserModifiable( |
| CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); |
| } |
| |
| static jboolean GetCameraManagedByCustodian(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingManagedByCustodian( |
| CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); |
| } |
| |
| static jboolean GetMicEnabled(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); |
| } |
| |
| static jboolean GetMicUserModifiable(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingUserModifiable( |
| CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); |
| } |
| |
| static jboolean GetMicManagedByCustodian(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return IsContentSettingManagedByCustodian( |
| CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); |
| } |
| |
| static void SetSearchSuggestEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean(prefs::kSearchSuggestEnabled, enabled); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetContextualSearchPreference( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString(prefs::kContextualSearchEnabled)); |
| } |
| |
| static jboolean GetContextualSearchPreferenceIsManaged( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->IsManagedPreference(prefs::kContextualSearchEnabled); |
| } |
| |
| static void SetContextualSearchPreference(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| const JavaParamRef<jstring>& pref) { |
| GetPrefService()->SetString(prefs::kContextualSearchEnabled, |
| ConvertJavaStringToUTF8(env, pref)); |
| } |
| |
| static void SetNetworkPredictionEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetInteger( |
| prefs::kNetworkPredictionOptions, |
| enabled ? chrome_browser_net::NETWORK_PREDICTION_WIFI_ONLY |
| : chrome_browser_net::NETWORK_PREDICTION_NEVER); |
| } |
| |
| static jboolean ObsoleteNetworkPredictionEnabledHasUserSetting( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetUserPrefValue( |
| prefs::kNetworkPredictionEnabled) != NULL; |
| } |
| |
| static jboolean ObsoleteNetworkPredictionOptionsHasUserSetting( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return GetPrefService()->GetUserPrefValue( |
| prefs::kNetworkPredictionOptions) != NULL; |
| } |
| |
| static jboolean ObsoleteGetNetworkPredictionEnabledUserPrefValue( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| const base::Value* network_prediction_enabled = |
| GetPrefService()->GetUserPrefValue(prefs::kNetworkPredictionEnabled); |
| DCHECK(network_prediction_enabled); |
| bool value = false; |
| DCHECK(network_prediction_enabled->GetAsBoolean(&value)); |
| return value; |
| } |
| |
| static void SetResolveNavigationErrorEnabled(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean enabled) { |
| GetPrefService()->SetBoolean(prefs::kAlternateErrorPagesEnabled, enabled); |
| } |
| |
| static jboolean GetFirstRunEulaAccepted(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return g_browser_process->local_state()->GetBoolean(prefs::kEulaAccepted); |
| } |
| |
| static void SetEulaAccepted(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| g_browser_process->local_state()->SetBoolean(prefs::kEulaAccepted, true); |
| } |
| |
| static void ResetAcceptLanguages(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| const JavaParamRef<jstring>& default_locale) { |
| std::string accept_languages(l10n_util::GetStringUTF8(IDS_ACCEPT_LANGUAGES)); |
| std::string locale_string(ConvertJavaStringToUTF8(env, default_locale)); |
| |
| PrefServiceBridge::PrependToAcceptLanguagesIfNecessary(locale_string, |
| &accept_languages); |
| GetPrefService()->SetString(prefs::kAcceptLanguages, accept_languages); |
| } |
| |
| // Sends all information about the different versions to Java. |
| // From browser_about_handler.cc |
| static ScopedJavaLocalRef<jobject> GetAboutVersionStrings( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| std::string os_version = version_info::GetOSType(); |
| os_version += " " + AndroidAboutAppInfo::GetOsInfo(); |
| |
| base::android::BuildInfo* android_build_info = |
| base::android::BuildInfo::GetInstance(); |
| std::string application(android_build_info->package_label()); |
| application.append(" "); |
| application.append(version_info::GetVersionNumber()); |
| |
| return Java_PrefServiceBridge_createAboutVersionStrings( |
| env, ConvertUTF8ToJavaString(env, application).obj(), |
| ConvertUTF8ToJavaString(env, os_version).obj()); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetSupervisedUserCustodianName( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString(prefs::kSupervisedUserCustodianName)); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetSupervisedUserCustodianEmail( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString(prefs::kSupervisedUserCustodianEmail)); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetSupervisedUserCustodianProfileImageURL( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString( |
| prefs::kSupervisedUserCustodianProfileImageURL)); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetSupervisedUserSecondCustodianName( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, |
| GetPrefService()->GetString(prefs::kSupervisedUserSecondCustodianName)); |
| } |
| |
| static ScopedJavaLocalRef<jstring> GetSupervisedUserSecondCustodianEmail( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, |
| GetPrefService()->GetString(prefs::kSupervisedUserSecondCustodianEmail)); |
| } |
| |
| static ScopedJavaLocalRef<jstring> |
| GetSupervisedUserSecondCustodianProfileImageURL( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| return ConvertUTF8ToJavaString( |
| env, GetPrefService()->GetString( |
| prefs::kSupervisedUserSecondCustodianProfileImageURL)); |
| } |
| |
| // static |
| bool PrefServiceBridge::RegisterPrefServiceBridge(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |
| |
| // static |
| // This logic should be kept in sync with prependToAcceptLanguagesIfNecessary in |
| // chrome/android/java/src/org/chromium/chrome/browser/ |
| // physicalweb/PwsClientImpl.java |
| void PrefServiceBridge::PrependToAcceptLanguagesIfNecessary( |
| const std::string& locale, |
| std::string* accept_languages) { |
| if (locale.size() != 5u || locale[2] != '_') // not well-formed |
| return; |
| |
| std::string language(locale.substr(0, 2)); |
| std::string region(locale.substr(3, 2)); |
| |
| // Java mostly follows ISO-639-1 and ICU, except for the following three. |
| // See documentation on java.util.Locale constructor for more. |
| if (language == "iw") { |
| language = "he"; |
| } else if (language == "ji") { |
| language = "yi"; |
| } else if (language == "in") { |
| language = "id"; |
| } |
| |
| std::string language_region(language + "-" + region); |
| |
| if (accept_languages->find(language_region) == std::string::npos) { |
| std::vector<std::string> parts; |
| parts.push_back(language_region); |
| // If language is not in the accept languages list, also add language code. |
| // This will work with the IDS_ACCEPT_LANGUAGE localized strings bundled |
| // with Chrome but may fail on arbitrary lists of language tags due to |
| // differences in case and whitespace. |
| if (accept_languages->find(language + ",") == std::string::npos && |
| !std::equal(language.rbegin(), language.rend(), |
| accept_languages->rbegin())) { |
| parts.push_back(language); |
| } |
| parts.push_back(*accept_languages); |
| *accept_languages = base::JoinString(parts, ","); |
| } |
| } |
| |
| // static |
| std::string PrefServiceBridge::GetAndroidPermissionForContentSetting( |
| ContentSettingsType content_type) { |
| JNIEnv* env = AttachCurrentThread(); |
| base::android::ScopedJavaLocalRef<jstring> android_permission = |
| Java_PrefServiceBridge_getAndroidPermissionForContentSetting( |
| env, content_type); |
| if (android_permission.is_null()) |
| return std::string(); |
| |
| return ConvertJavaStringToUTF8(android_permission); |
| } |
| |
| static void SetSupervisedUserId(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| const JavaParamRef<jstring>& pref) { |
| GetPrefService()->SetString(prefs::kSupervisedUserId, |
| ConvertJavaStringToUTF8(env, pref)); |
| } |