1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/android/preferences/pref_service_bridge.h"
9 #include "base/android/build_info.h"
10 #include "base/android/jni_android.h"
11 #include "base/android/jni_string.h"
12 #include "base/android/jni_weak_ref.h"
13 #include "base/files/file_path.h"
14 #include "base/files/file_util.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/prefs/pref_service.h"
17 #include "base/strings/string_util.h"
18 #include "base/values.h"
19 #include "chrome/browser/browser_process.h"
20 #include "chrome/browser/browsing_data/browsing_data_helper.h"
21 #include "chrome/browser/browsing_data/browsing_data_remover.h"
22 #include "chrome/browser/net/prediction_options.h"
23 #include "chrome/browser/prefs/incognito_mode_prefs.h"
24 #include "chrome/browser/profiles/profile_manager.h"
25 #include "chrome/browser/translate/chrome_translate_client.h"
26 #include "chrome/browser/ui/android/android_about_app_info.h"
27 #include "chrome/common/pref_names.h"
28 #include "chrome/grit/locale_settings.h"
29 #include "components/content_settings/core/browser/host_content_settings_map.h"
30 #include "components/content_settings/core/common/content_settings.h"
31 #include "components/content_settings/core/common/content_settings_pattern.h"
32 #include "components/content_settings/core/common/pref_names.h"
33 #include "components/password_manager/core/common/password_manager_pref_names.h"
34 #include "components/translate/core/browser/translate_prefs.h"
35 #include "components/translate/core/common/translate_pref_names.h"
36 #include "components/version_info/version_info.h"
37 #include "components/web_resource/web_resource_pref_names.h"
38 #include "content/public/browser/browser_thread.h"
39 #include "content/public/browser/user_metrics.h"
40 #include "jni/PrefServiceBridge_jni.h"
41 #include "ui/base/l10n/l10n_util.h"
43 using base::android::AttachCurrentThread
;
44 using base::android::CheckException
;
45 using base::android::ConvertJavaStringToUTF8
;
46 using base::android::ConvertUTF8ToJavaString
;
47 using base::android::ScopedJavaLocalRef
;
48 using base::android::ScopedJavaGlobalRef
;
49 using content::BrowserThread
;
53 enum NetworkPredictionOptions
{
54 NETWORK_PREDICTION_ALWAYS
,
55 NETWORK_PREDICTION_WIFI_ONLY
,
56 NETWORK_PREDICTION_NEVER
,
59 Profile
* GetOriginalProfile() {
60 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
63 bool GetBooleanForContentSetting(ContentSettingsType type
) {
64 HostContentSettingsMap
* content_settings
=
65 GetOriginalProfile()->GetHostContentSettingsMap();
66 switch (content_settings
->GetDefaultContentSetting(type
, NULL
)) {
67 case CONTENT_SETTING_BLOCK
:
69 case CONTENT_SETTING_ALLOW
:
71 case CONTENT_SETTING_ASK
:
77 std::string
GetStringForContentSettingsType(
78 ContentSetting content_setting
) {
79 switch (content_setting
) {
80 case CONTENT_SETTING_BLOCK
:
82 case CONTENT_SETTING_ALLOW
:
84 case CONTENT_SETTING_ASK
:
86 case CONTENT_SETTING_SESSION_ONLY
:
88 case CONTENT_SETTING_DETECT_IMPORTANT_CONTENT
:
90 case CONTENT_SETTING_NUM_SETTINGS
:
91 return "num_settings";
92 case CONTENT_SETTING_DEFAULT
:
98 bool IsContentSettingManaged(ContentSettingsType content_settings_type
) {
100 HostContentSettingsMap
* content_settings
=
101 GetOriginalProfile()->GetHostContentSettingsMap();
102 content_settings
->GetDefaultContentSetting(content_settings_type
, &source
);
103 HostContentSettingsMap::ProviderType provider
=
104 content_settings
->GetProviderTypeFromSource(source
);
105 return provider
== HostContentSettingsMap::POLICY_PROVIDER
;
108 bool IsContentSettingManagedByCustodian(
109 ContentSettingsType content_settings_type
) {
111 HostContentSettingsMap
* content_settings
=
112 GetOriginalProfile()->GetHostContentSettingsMap();
113 content_settings
->GetDefaultContentSetting(content_settings_type
, &source
);
114 HostContentSettingsMap::ProviderType provider
=
115 content_settings
->GetProviderTypeFromSource(source
);
116 return provider
== HostContentSettingsMap::SUPERVISED_PROVIDER
;
119 bool IsContentSettingUserModifiable(ContentSettingsType content_settings_type
) {
121 HostContentSettingsMap
* content_settings
=
122 GetOriginalProfile()->GetHostContentSettingsMap();
123 content_settings
->GetDefaultContentSetting(content_settings_type
, &source
);
124 HostContentSettingsMap::ProviderType provider
=
125 content_settings
->GetProviderTypeFromSource(source
);
126 return provider
>= HostContentSettingsMap::PREF_PROVIDER
;
129 PrefService
* GetPrefService() {
130 return GetOriginalProfile()->GetPrefs();
135 // ----------------------------------------------------------------------------
136 // Native JNI methods
137 // ----------------------------------------------------------------------------
139 static jboolean
IsContentSettingManaged(JNIEnv
* env
, jobject obj
,
140 int content_settings_type
) {
141 return IsContentSettingManaged(
142 static_cast<ContentSettingsType
>(content_settings_type
));
145 static jboolean
IsContentSettingEnabled(JNIEnv
* env
, jobject obj
,
146 int content_settings_type
) {
147 // Before we migrate functions over to this central function, we must verify
148 // that the functionality provided below is correct.
149 DCHECK(content_settings_type
== CONTENT_SETTINGS_TYPE_JAVASCRIPT
||
150 content_settings_type
== CONTENT_SETTINGS_TYPE_IMAGES
||
151 content_settings_type
== CONTENT_SETTINGS_TYPE_POPUPS
);
152 ContentSettingsType type
=
153 static_cast<ContentSettingsType
>(content_settings_type
);
154 if (type
== CONTENT_SETTINGS_TYPE_JAVASCRIPT
||
155 type
== CONTENT_SETTINGS_TYPE_POPUPS
)
156 return GetBooleanForContentSetting(type
);
158 HostContentSettingsMap
* content_settings
=
159 GetOriginalProfile()->GetHostContentSettingsMap();
160 return content_settings
->GetDefaultContentSetting(
161 type
, nullptr) == CONTENT_SETTING_ALLOW
;
164 static void SetContentSettingEnabled(JNIEnv
* env
, jobject obj
,
165 int content_settings_type
, jboolean allow
) {
166 // Before we migrate functions over to this central function, we must verify
167 // that the new category supports ALLOW/BLOCK pairs and, if not, handle them.
168 DCHECK(content_settings_type
== CONTENT_SETTINGS_TYPE_JAVASCRIPT
||
169 content_settings_type
== CONTENT_SETTINGS_TYPE_IMAGES
||
170 content_settings_type
== CONTENT_SETTINGS_TYPE_POPUPS
);
171 HostContentSettingsMap
* host_content_settings_map
=
172 GetOriginalProfile()->GetHostContentSettingsMap();
173 host_content_settings_map
->SetDefaultContentSetting(
174 static_cast<ContentSettingsType
>(content_settings_type
),
175 allow
? CONTENT_SETTING_ALLOW
: CONTENT_SETTING_BLOCK
);
178 static void SetContentSettingForPattern(JNIEnv
* env
, jobject obj
,
179 int content_settings_type
, jstring pattern
, int setting
) {
180 HostContentSettingsMap
* host_content_settings_map
=
181 GetOriginalProfile()->GetHostContentSettingsMap();
182 host_content_settings_map
->SetContentSetting(
183 ContentSettingsPattern::FromString(ConvertJavaStringToUTF8(env
, pattern
)),
184 ContentSettingsPattern::Wildcard(),
185 static_cast<ContentSettingsType
>(content_settings_type
),
187 static_cast<ContentSetting
>(setting
));
190 static void GetContentSettingsExceptions(JNIEnv
* env
, jobject obj
,
191 int content_settings_type
, jobject list
) {
192 HostContentSettingsMap
* host_content_settings_map
=
193 GetOriginalProfile()->GetHostContentSettingsMap();
194 ContentSettingsForOneType entries
;
195 host_content_settings_map
->GetSettingsForOneType(
196 static_cast<ContentSettingsType
>(content_settings_type
), "", &entries
);
197 for (size_t i
= 0; i
< entries
.size(); ++i
) {
198 Java_PrefServiceBridge_addContentSettingExceptionToList(
200 content_settings_type
,
201 ConvertUTF8ToJavaString(
202 env
, entries
[i
].primary_pattern
.ToString()).obj(),
203 ConvertUTF8ToJavaString(
204 env
, GetStringForContentSettingsType(entries
[i
].setting
)).obj(),
205 ConvertUTF8ToJavaString(env
, entries
[i
].source
).obj());
209 static jboolean
GetAcceptCookiesEnabled(JNIEnv
* env
, jobject obj
) {
210 return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_COOKIES
);
213 static jboolean
GetAcceptCookiesManaged(JNIEnv
* env
, jobject obj
) {
214 return IsContentSettingManaged(CONTENT_SETTINGS_TYPE_COOKIES
);
217 static jboolean
GetBlockThirdPartyCookiesEnabled(JNIEnv
* env
, jobject obj
) {
218 return GetPrefService()->GetBoolean(prefs::kBlockThirdPartyCookies
);
221 static jboolean
GetBlockThirdPartyCookiesManaged(JNIEnv
* env
, jobject obj
) {
222 return GetPrefService()->IsManagedPreference(prefs::kBlockThirdPartyCookies
);
225 static jboolean
GetRememberPasswordsEnabled(JNIEnv
* env
, jobject obj
) {
226 return GetPrefService()->GetBoolean(
227 password_manager::prefs::kPasswordManagerSavingEnabled
);
230 static jboolean
GetPasswordManagerAutoSigninEnabled(JNIEnv
* env
, jobject obj
) {
231 return GetPrefService()->GetBoolean(
232 password_manager::prefs::kPasswordManagerAutoSignin
);
235 static jboolean
GetRememberPasswordsManaged(JNIEnv
* env
, jobject obj
) {
236 return GetPrefService()->IsManagedPreference(
237 password_manager::prefs::kPasswordManagerSavingEnabled
);
240 static jboolean
GetPasswordManagerAutoSigninManaged(JNIEnv
* env
, jobject obj
) {
241 return GetPrefService()->IsManagedPreference(
242 password_manager::prefs::kPasswordManagerAutoSignin
);
245 static jboolean
GetDoNotTrackEnabled(JNIEnv
* env
, jobject obj
) {
246 return GetPrefService()->GetBoolean(prefs::kEnableDoNotTrack
);
249 static jint
GetNetworkPredictionOptions(JNIEnv
* env
, jobject obj
) {
250 return GetPrefService()->GetInteger(prefs::kNetworkPredictionOptions
);
253 static jboolean
GetNetworkPredictionManaged(JNIEnv
* env
, jobject obj
) {
254 return GetPrefService()->IsManagedPreference(
255 prefs::kNetworkPredictionOptions
);
258 static jboolean
GetPasswordEchoEnabled(JNIEnv
* env
, jobject obj
) {
259 return GetPrefService()->GetBoolean(prefs::kWebKitPasswordEchoEnabled
);
262 static jboolean
GetPrintingEnabled(JNIEnv
* env
, jobject obj
) {
263 return GetPrefService()->GetBoolean(prefs::kPrintingEnabled
);
266 static jboolean
GetPrintingManaged(JNIEnv
* env
, jobject obj
) {
267 return GetPrefService()->IsManagedPreference(prefs::kPrintingEnabled
);
270 static jboolean
GetTranslateEnabled(JNIEnv
* env
, jobject obj
) {
271 return GetPrefService()->GetBoolean(prefs::kEnableTranslate
);
274 static jboolean
GetTranslateManaged(JNIEnv
* env
, jobject obj
) {
275 return GetPrefService()->IsManagedPreference(prefs::kEnableTranslate
);
278 static jboolean
GetAutoDetectEncodingEnabled(JNIEnv
* env
, jobject obj
) {
279 return GetPrefService()->GetBoolean(prefs::kWebKitUsesUniversalDetector
);
282 static jboolean
GetSearchSuggestEnabled(JNIEnv
* env
, jobject obj
) {
283 return GetPrefService()->GetBoolean(prefs::kSearchSuggestEnabled
);
286 static jboolean
GetSearchSuggestManaged(JNIEnv
* env
, jobject obj
) {
287 return GetPrefService()->IsManagedPreference(prefs::kSearchSuggestEnabled
);
290 static jboolean
GetSafeBrowsingExtendedReportingEnabled(JNIEnv
* env
,
292 return GetPrefService()->GetBoolean(
293 prefs::kSafeBrowsingExtendedReportingEnabled
);
296 static void SetSafeBrowsingExtendedReportingEnabled(JNIEnv
* env
,
299 GetPrefService()->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled
,
303 static jboolean
GetSafeBrowsingExtendedReportingManaged(JNIEnv
* env
,
305 return GetPrefService()->IsManagedPreference(
306 prefs::kSafeBrowsingExtendedReportingEnabled
);
309 static jboolean
GetSafeBrowsingEnabled(JNIEnv
* env
, jobject obj
) {
310 return GetPrefService()->GetBoolean(prefs::kSafeBrowsingEnabled
);
313 static void SetSafeBrowsingEnabled(JNIEnv
* env
, jobject obj
, jboolean enabled
) {
314 GetPrefService()->SetBoolean(prefs::kSafeBrowsingEnabled
, enabled
);
317 static jboolean
GetSafeBrowsingManaged(JNIEnv
* env
, jobject obj
) {
318 return GetPrefService()->IsManagedPreference(prefs::kSafeBrowsingEnabled
);
321 static jboolean
GetProtectedMediaIdentifierEnabled(JNIEnv
* env
, jobject obj
) {
322 return GetBooleanForContentSetting(
323 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER
);
326 static jboolean
GetPushNotificationsEnabled(JNIEnv
* env
, jobject obj
) {
327 return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_NOTIFICATIONS
);
330 static jboolean
GetAllowLocationEnabled(JNIEnv
* env
, jobject obj
) {
331 return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_GEOLOCATION
);
334 static jboolean
GetLocationAllowedByPolicy(JNIEnv
* env
, jobject obj
) {
335 if (!IsContentSettingManaged(CONTENT_SETTINGS_TYPE_GEOLOCATION
))
337 HostContentSettingsMap
* content_settings
=
338 GetOriginalProfile()->GetHostContentSettingsMap();
339 return content_settings
->GetDefaultContentSetting(
340 CONTENT_SETTINGS_TYPE_GEOLOCATION
, nullptr) ==
341 CONTENT_SETTING_ALLOW
;
344 static jboolean
GetAllowLocationUserModifiable(JNIEnv
* env
, jobject obj
) {
345 return IsContentSettingUserModifiable(CONTENT_SETTINGS_TYPE_GEOLOCATION
);
348 static jboolean
GetAllowLocationManagedByCustodian(JNIEnv
* env
, jobject obj
) {
349 return IsContentSettingManagedByCustodian(CONTENT_SETTINGS_TYPE_GEOLOCATION
);
352 static jboolean
GetResolveNavigationErrorEnabled(JNIEnv
* env
, jobject obj
) {
353 return GetPrefService()->GetBoolean(prefs::kAlternateErrorPagesEnabled
);
356 static jboolean
GetResolveNavigationErrorManaged(JNIEnv
* env
, jobject obj
) {
357 return GetPrefService()->IsManagedPreference(
358 prefs::kAlternateErrorPagesEnabled
);
361 static jboolean
GetCrashReportManaged(JNIEnv
* env
, jobject obj
) {
362 return GetPrefService()->IsManagedPreference(
363 prefs::kCrashReportingEnabled
);
366 static jboolean
GetForceGoogleSafeSearch(JNIEnv
* env
, jobject obj
) {
367 return GetPrefService()->GetBoolean(prefs::kForceGoogleSafeSearch
);
370 static jint
GetDefaultSupervisedUserFilteringBehavior(JNIEnv
* env
,
372 return GetPrefService()->GetInteger(
373 prefs::kDefaultSupervisedUserFilteringBehavior
);
376 static jboolean
GetIncognitoModeEnabled(JNIEnv
* env
, jobject obj
) {
377 PrefService
* prefs
= GetPrefService();
378 IncognitoModePrefs::Availability incognito_pref
=
379 IncognitoModePrefs::GetAvailability(prefs
);
380 DCHECK(incognito_pref
== IncognitoModePrefs::ENABLED
||
381 incognito_pref
== IncognitoModePrefs::DISABLED
) <<
382 "Unsupported incognito mode preference: " << incognito_pref
;
383 return incognito_pref
!= IncognitoModePrefs::DISABLED
;
386 static jboolean
GetIncognitoModeManaged(JNIEnv
* env
, jobject obj
) {
387 return GetPrefService()->IsManagedPreference(
388 prefs::kIncognitoModeAvailability
);
391 static jboolean
GetFullscreenManaged(JNIEnv
* env
, jobject obj
) {
392 return IsContentSettingManaged(CONTENT_SETTINGS_TYPE_FULLSCREEN
);
395 static jboolean
GetFullscreenAllowed(JNIEnv
* env
, jobject obj
) {
396 HostContentSettingsMap
* content_settings
=
397 GetOriginalProfile()->GetHostContentSettingsMap();
398 return content_settings
->GetDefaultContentSetting(
399 CONTENT_SETTINGS_TYPE_FULLSCREEN
, NULL
) == CONTENT_SETTING_ALLOW
;
402 static jboolean
GetMetricsReportingEnabled(JNIEnv
* env
, jobject obj
) {
403 PrefService
* local_state
= g_browser_process
->local_state();
404 return local_state
->GetBoolean(prefs::kMetricsReportingEnabled
);
407 static void SetMetricsReportingEnabled(JNIEnv
* env
,
410 PrefService
* local_state
= g_browser_process
->local_state();
411 local_state
->SetBoolean(prefs::kMetricsReportingEnabled
, enabled
);
414 static jboolean
HasSetMetricsReporting(JNIEnv
* env
, jobject obj
) {
415 PrefService
* local_state
= g_browser_process
->local_state();
416 return local_state
->HasPrefPath(prefs::kMetricsReportingEnabled
);
421 // Redirects a BrowsingDataRemover completion callback back into Java.
422 class ClearBrowsingDataObserver
: public BrowsingDataRemover::Observer
{
424 // |obj| is expected to be the object passed into ClearBrowsingData(); e.g. a
426 ClearBrowsingDataObserver(JNIEnv
* env
, jobject obj
)
427 : weak_chrome_native_preferences_(env
, obj
) {
430 void OnBrowsingDataRemoverDone() override
{
431 // Just as a BrowsingDataRemover deletes itself when done, we delete ourself
432 // when done. No need to remove ourself as an observer given the lifetime
433 // of BrowsingDataRemover.
434 scoped_ptr
<ClearBrowsingDataObserver
> auto_delete(this);
436 JNIEnv
* env
= AttachCurrentThread();
437 if (weak_chrome_native_preferences_
.get(env
).is_null())
440 Java_PrefServiceBridge_browsingDataCleared(
441 env
, weak_chrome_native_preferences_
.get(env
).obj());
445 JavaObjectWeakGlobalRef weak_chrome_native_preferences_
;
449 static void ClearBrowsingData(JNIEnv
* env
, jobject obj
, jboolean history
,
450 jboolean cache
, jboolean cookies_and_site_data
, jboolean passwords
,
451 jboolean form_data
) {
452 // BrowsingDataRemover deletes itself.
453 BrowsingDataRemover
* browsing_data_remover
=
454 BrowsingDataRemover::CreateForPeriod(
455 GetOriginalProfile(),
456 static_cast<BrowsingDataRemover::TimePeriod
>(
457 BrowsingDataRemover::EVERYTHING
));
458 browsing_data_remover
->AddObserver(new ClearBrowsingDataObserver(env
, obj
));
462 remove_mask
|= BrowsingDataRemover::REMOVE_HISTORY
;
464 remove_mask
|= BrowsingDataRemover::REMOVE_CACHE
;
465 if (cookies_and_site_data
) {
466 remove_mask
|= BrowsingDataRemover::REMOVE_COOKIES
;
467 remove_mask
|= BrowsingDataRemover::REMOVE_SITE_DATA
;
470 remove_mask
|= BrowsingDataRemover::REMOVE_PASSWORDS
;
472 remove_mask
|= BrowsingDataRemover::REMOVE_FORM_DATA
;
473 browsing_data_remover
->Remove(remove_mask
,
474 BrowsingDataHelper::UNPROTECTED_WEB
);
477 static jboolean
CanDeleteBrowsingHistory(JNIEnv
* env
, jobject obj
) {
478 return GetPrefService()->GetBoolean(prefs::kAllowDeletingBrowserHistory
);
481 static void SetAllowCookiesEnabled(JNIEnv
* env
, jobject obj
, jboolean allow
) {
482 HostContentSettingsMap
* host_content_settings_map
=
483 GetOriginalProfile()->GetHostContentSettingsMap();
484 host_content_settings_map
->SetDefaultContentSetting(
485 CONTENT_SETTINGS_TYPE_COOKIES
,
486 allow
? CONTENT_SETTING_ALLOW
: CONTENT_SETTING_BLOCK
);
489 static void SetBlockThirdPartyCookiesEnabled(JNIEnv
* env
, jobject obj
,
491 GetPrefService()->SetBoolean(prefs::kBlockThirdPartyCookies
, enabled
);
494 static void SetRememberPasswordsEnabled(JNIEnv
* env
, jobject obj
,
496 GetPrefService()->SetBoolean(
497 password_manager::prefs::kPasswordManagerSavingEnabled
, allow
);
500 static void SetPasswordManagerAutoSigninEnabled(JNIEnv
* env
,
503 GetPrefService()->SetBoolean(
504 password_manager::prefs::kPasswordManagerAutoSignin
, enabled
);
507 static void SetProtectedMediaIdentifierEnabled(JNIEnv
* env
,
509 jboolean is_enabled
) {
510 HostContentSettingsMap
* host_content_settings_map
=
511 GetOriginalProfile()->GetHostContentSettingsMap();
512 host_content_settings_map
->SetDefaultContentSetting(
513 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER
,
514 is_enabled
? CONTENT_SETTING_ASK
: CONTENT_SETTING_BLOCK
);
517 static void SetAllowLocationEnabled(JNIEnv
* env
,
519 jboolean is_enabled
) {
520 HostContentSettingsMap
* host_content_settings_map
=
521 GetOriginalProfile()->GetHostContentSettingsMap();
522 host_content_settings_map
->SetDefaultContentSetting(
523 CONTENT_SETTINGS_TYPE_GEOLOCATION
,
524 is_enabled
? CONTENT_SETTING_ASK
: CONTENT_SETTING_BLOCK
);
527 static void SetCameraEnabled(JNIEnv
* env
, jobject obj
, jboolean allow
) {
528 HostContentSettingsMap
* host_content_settings_map
=
529 GetOriginalProfile()->GetHostContentSettingsMap();
530 host_content_settings_map
->SetDefaultContentSetting(
531 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA
,
532 allow
? CONTENT_SETTING_ASK
: CONTENT_SETTING_BLOCK
);
535 static void SetMicEnabled(JNIEnv
* env
, jobject obj
, jboolean allow
) {
536 HostContentSettingsMap
* host_content_settings_map
=
537 GetOriginalProfile()->GetHostContentSettingsMap();
538 host_content_settings_map
->SetDefaultContentSetting(
539 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC
,
540 allow
? CONTENT_SETTING_ASK
: CONTENT_SETTING_BLOCK
);
543 static void SetFullscreenAllowed(JNIEnv
* env
, jobject obj
, jboolean allow
) {
544 HostContentSettingsMap
* host_content_settings_map
=
545 GetOriginalProfile()->GetHostContentSettingsMap();
546 host_content_settings_map
->SetDefaultContentSetting(
547 CONTENT_SETTINGS_TYPE_FULLSCREEN
,
548 allow
? CONTENT_SETTING_ALLOW
: CONTENT_SETTING_ASK
);
551 static void SetPushNotificationsEnabled(JNIEnv
* env
,
554 HostContentSettingsMap
* host_content_settings_map
=
555 GetOriginalProfile()->GetHostContentSettingsMap();
556 host_content_settings_map
->SetDefaultContentSetting(
557 CONTENT_SETTINGS_TYPE_NOTIFICATIONS
,
558 allow
? CONTENT_SETTING_ASK
: CONTENT_SETTING_BLOCK
);
561 static void SetCrashReporting(JNIEnv
* env
, jobject obj
, jboolean reporting
) {
562 PrefService
* local_state
= g_browser_process
->local_state();
563 local_state
->SetBoolean(prefs::kCrashReportingEnabled
, reporting
);
566 static jboolean
CanPredictNetworkActions(JNIEnv
* env
, jobject obj
) {
567 return chrome_browser_net::CanPrefetchAndPrerenderUI(GetPrefService());
570 static void SetDoNotTrackEnabled(JNIEnv
* env
, jobject obj
, jboolean allow
) {
571 GetPrefService()->SetBoolean(prefs::kEnableDoNotTrack
, allow
);
574 static jstring
GetSyncLastAccountName(JNIEnv
* env
, jobject obj
) {
575 return ConvertUTF8ToJavaString(
576 env
, GetPrefService()->GetString(prefs::kGoogleServicesLastUsername
))
580 static void SetTranslateEnabled(JNIEnv
* env
, jobject obj
, jboolean enabled
) {
581 GetPrefService()->SetBoolean(prefs::kEnableTranslate
, enabled
);
584 static void SetAutoDetectEncodingEnabled(JNIEnv
* env
, jobject obj
,
586 content::RecordAction(base::UserMetricsAction("AutoDetectChange"));
587 GetPrefService()->SetBoolean(prefs::kWebKitUsesUniversalDetector
, enabled
);
590 static void ResetTranslateDefaults(JNIEnv
* env
, jobject obj
) {
591 scoped_ptr
<translate::TranslatePrefs
> translate_prefs
=
592 ChromeTranslateClient::CreateTranslatePrefs(GetPrefService());
593 translate_prefs
->ResetToDefaults();
596 static void MigrateJavascriptPreference(JNIEnv
* env
, jobject obj
) {
597 const PrefService::Preference
* javascript_pref
=
598 GetPrefService()->FindPreference(prefs::kWebKitJavascriptEnabled
);
599 DCHECK(javascript_pref
);
601 if (!javascript_pref
->HasUserSetting())
604 bool javascript_enabled
= false;
605 bool retval
= javascript_pref
->GetValue()->GetAsBoolean(&javascript_enabled
);
607 SetContentSettingEnabled(env
, obj
,
608 CONTENT_SETTINGS_TYPE_JAVASCRIPT
, javascript_enabled
);
609 GetPrefService()->ClearPref(prefs::kWebKitJavascriptEnabled
);
612 static void MigrateLocationPreference(JNIEnv
* env
, jobject obj
) {
613 const PrefService::Preference
* pref
=
614 GetPrefService()->FindPreference(prefs::kGeolocationEnabled
);
615 if (!pref
|| !pref
->HasUserSetting())
617 bool location_enabled
= false;
618 bool retval
= pref
->GetValue()->GetAsBoolean(&location_enabled
);
620 // Do a restrictive migration. GetAllowLocationEnabled could be
621 // non-usermodifiable and we don't want to migrate that.
622 if (!location_enabled
)
623 SetAllowLocationEnabled(env
, obj
, false);
624 GetPrefService()->ClearPref(prefs::kGeolocationEnabled
);
627 static void MigrateProtectedMediaPreference(JNIEnv
* env
, jobject obj
) {
628 const PrefService::Preference
* pref
=
629 GetPrefService()->FindPreference(prefs::kProtectedMediaIdentifierEnabled
);
630 if (!pref
|| !pref
->HasUserSetting())
632 bool pmi_enabled
= false;
633 bool retval
= pref
->GetValue()->GetAsBoolean(&pmi_enabled
);
635 // Do a restrictive migration if values disagree.
637 SetProtectedMediaIdentifierEnabled(env
, obj
, false);
638 GetPrefService()->ClearPref(prefs::kProtectedMediaIdentifierEnabled
);
641 static void SetPasswordEchoEnabled(JNIEnv
* env
,
643 jboolean passwordEchoEnabled
) {
644 GetPrefService()->SetBoolean(prefs::kWebKitPasswordEchoEnabled
,
645 passwordEchoEnabled
);
648 static jboolean
GetCameraEnabled(JNIEnv
* env
, jobject obj
) {
649 return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA
);
652 static jboolean
GetCameraUserModifiable(JNIEnv
* env
, jobject obj
) {
653 return IsContentSettingUserModifiable(
654 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA
);
657 static jboolean
GetCameraManagedByCustodian(JNIEnv
* env
, jobject obj
) {
658 return IsContentSettingManagedByCustodian(
659 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA
);
662 static jboolean
GetMicEnabled(JNIEnv
* env
, jobject obj
) {
663 return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC
);
666 static jboolean
GetMicUserModifiable(JNIEnv
* env
, jobject obj
) {
667 return IsContentSettingUserModifiable(
668 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC
);
671 static jboolean
GetMicManagedByCustodian(JNIEnv
* env
, jobject obj
) {
672 return IsContentSettingManagedByCustodian(
673 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC
);
676 static void SetJavaScriptAllowed(JNIEnv
* env
, jobject obj
, jstring pattern
,
678 HostContentSettingsMap
* host_content_settings_map
=
679 GetOriginalProfile()->GetHostContentSettingsMap();
680 host_content_settings_map
->SetContentSetting(
681 ContentSettingsPattern::FromString(ConvertJavaStringToUTF8(env
, pattern
)),
682 ContentSettingsPattern::Wildcard(),
683 CONTENT_SETTINGS_TYPE_JAVASCRIPT
,
685 static_cast<ContentSetting
>(setting
));
688 static void SetPopupException(JNIEnv
* env
, jobject obj
, jstring pattern
,
690 HostContentSettingsMap
* host_content_settings_map
=
691 GetOriginalProfile()->GetHostContentSettingsMap();
692 host_content_settings_map
->SetContentSetting(
693 ContentSettingsPattern::FromString(ConvertJavaStringToUTF8(env
, pattern
)),
694 ContentSettingsPattern::Wildcard(),
695 CONTENT_SETTINGS_TYPE_POPUPS
,
697 static_cast<ContentSetting
>(setting
));
700 static void SetSearchSuggestEnabled(JNIEnv
* env
, jobject obj
,
702 GetPrefService()->SetBoolean(prefs::kSearchSuggestEnabled
, enabled
);
705 static jstring
GetContextualSearchPreference(JNIEnv
* env
, jobject obj
) {
706 return ConvertUTF8ToJavaString(
707 env
, GetPrefService()->GetString(prefs::kContextualSearchEnabled
)).
711 static jboolean
GetContextualSearchPreferenceIsManaged(JNIEnv
* env
,
713 return GetPrefService()->IsManagedPreference(prefs::kContextualSearchEnabled
);
716 static void SetContextualSearchPreference(JNIEnv
* env
, jobject obj
,
718 GetPrefService()->SetString(prefs::kContextualSearchEnabled
,
719 ConvertJavaStringToUTF8(env
, pref
));
722 static void SetNetworkPredictionOptions(JNIEnv
* env
, jobject obj
, int option
) {
723 GetPrefService()->SetInteger(prefs::kNetworkPredictionOptions
, option
);
726 static jboolean
NetworkPredictionEnabledHasUserSetting(JNIEnv
* env
,
728 return GetPrefService()->GetUserPrefValue(
729 prefs::kNetworkPredictionEnabled
) != NULL
;
732 static jboolean
NetworkPredictionOptionsHasUserSetting(JNIEnv
* env
,
734 return GetPrefService()->GetUserPrefValue(
735 prefs::kNetworkPredictionOptions
) != NULL
;
738 static jboolean
GetNetworkPredictionEnabledUserPrefValue(JNIEnv
* env
,
740 const base::Value
* network_prediction_enabled
=
741 GetPrefService()->GetUserPrefValue(prefs::kNetworkPredictionEnabled
);
742 DCHECK(network_prediction_enabled
);
744 DCHECK(network_prediction_enabled
->GetAsBoolean(&value
));
748 static void SetResolveNavigationErrorEnabled(JNIEnv
* env
, jobject obj
,
750 GetPrefService()->SetBoolean(prefs::kAlternateErrorPagesEnabled
, enabled
);
753 static jboolean
GetFirstRunEulaAccepted(JNIEnv
* env
, jobject obj
) {
754 return g_browser_process
->local_state()->GetBoolean(prefs::kEulaAccepted
);
757 static void SetEulaAccepted(JNIEnv
* env
, jobject obj
) {
758 g_browser_process
->local_state()->SetBoolean(prefs::kEulaAccepted
, true);
761 static void ResetAcceptLanguages(JNIEnv
* env
,
763 jstring default_locale
) {
764 std::string
accept_languages(l10n_util::GetStringUTF8(IDS_ACCEPT_LANGUAGES
));
765 std::string
locale_string(ConvertJavaStringToUTF8(env
, default_locale
));
767 PrefServiceBridge::PrependToAcceptLanguagesIfNecessary(locale_string
,
769 GetPrefService()->SetString(prefs::kAcceptLanguages
, accept_languages
);
772 // Sends all information about the different versions to Java.
773 // From browser_about_handler.cc
774 static jobject
GetAboutVersionStrings(JNIEnv
* env
, jobject obj
) {
775 std::string os_version
= version_info::GetOSType();
776 os_version
+= " " + AndroidAboutAppInfo::GetOsInfo();
778 base::android::BuildInfo
* android_build_info
=
779 base::android::BuildInfo::GetInstance();
780 std::string
application(android_build_info
->package_label());
781 application
.append(" ");
782 application
.append(version_info::GetVersionNumber());
784 // OK to release, returning to Java.
785 return Java_PrefServiceBridge_createAboutVersionStrings(
787 ConvertUTF8ToJavaString(env
, application
).obj(),
788 ConvertUTF8ToJavaString(env
, os_version
).obj()).Release();
791 static jstring
GetSupervisedUserCustodianName(JNIEnv
* env
, jobject obj
) {
792 return ConvertUTF8ToJavaString(
793 env
, GetPrefService()->GetString(prefs::kSupervisedUserCustodianName
))
797 static jstring
GetSupervisedUserCustodianEmail(JNIEnv
* env
, jobject obj
) {
798 return ConvertUTF8ToJavaString(
799 env
, GetPrefService()->GetString(prefs::kSupervisedUserCustodianEmail
))
803 static jstring
GetSupervisedUserCustodianProfileImageURL(JNIEnv
* env
,
805 return ConvertUTF8ToJavaString(
807 GetPrefService()->GetString(
808 prefs::kSupervisedUserCustodianProfileImageURL
)).Release();
811 static jstring
GetSupervisedUserSecondCustodianName(JNIEnv
* env
, jobject obj
) {
812 return ConvertUTF8ToJavaString(
814 GetPrefService()->GetString(prefs::kSupervisedUserSecondCustodianName
))
818 static jstring
GetSupervisedUserSecondCustodianEmail(JNIEnv
* env
, jobject obj
) {
819 return ConvertUTF8ToJavaString(
821 GetPrefService()->GetString(prefs::kSupervisedUserSecondCustodianEmail
))
825 static jstring
GetSupervisedUserSecondCustodianProfileImageURL(JNIEnv
* env
,
827 return ConvertUTF8ToJavaString(
829 GetPrefService()->GetString(
830 prefs::kSupervisedUserSecondCustodianProfileImageURL
)).Release();
834 bool PrefServiceBridge::RegisterPrefServiceBridge(JNIEnv
* env
) {
835 return RegisterNativesImpl(env
);
839 void PrefServiceBridge::PrependToAcceptLanguagesIfNecessary(
840 const std::string
& locale
,
841 std::string
* accept_languages
) {
842 if (locale
.size() != 5u || locale
[2] != '_') // not well-formed
845 std::string
language(locale
.substr(0, 2));
846 std::string
region(locale
.substr(3, 2));
848 // Java mostly follows ISO-639-1 and ICU, except for the following three.
849 // See documentation on java.util.Locale constructor for more.
850 if (language
== "iw") {
852 } else if (language
== "ji") {
854 } else if (language
== "in") {
858 std::string
language_region(language
+ "-" + region
);
860 if (accept_languages
->find(language_region
) == std::string::npos
) {
861 std::vector
<std::string
> parts
;
862 parts
.push_back(language_region
);
863 // If language is not in the accept languages list, also add language code.
864 if (accept_languages
->find(language
+ ",") == std::string::npos
&&
865 !std::equal(language
.rbegin(), language
.rend(),
866 accept_languages
->rbegin())) {
867 parts
.push_back(language
);
869 parts
.push_back(*accept_languages
);
870 *accept_languages
= base::JoinString(parts
, ",");
875 std::string
PrefServiceBridge::GetAndroidPermissionForContentSetting(
876 ContentSettingsType content_type
) {
877 JNIEnv
* env
= AttachCurrentThread();
878 base::android::ScopedJavaLocalRef
<jstring
> android_permission
=
879 Java_PrefServiceBridge_getAndroidPermissionForContentSetting(
881 if (android_permission
.is_null())
882 return std::string();
884 return ConvertJavaStringToUTF8(android_permission
);