Index: chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentPreferences.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentPreferences.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5b2e6bdd471648963d7d231de2b16d5fedae7322 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentPreferences.java |
@@ -0,0 +1,217 @@ |
+// Copyright 2015 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.chrome.browser.preferences.website; |
+ |
+import android.os.Build; |
+import android.os.Bundle; |
+import android.preference.Preference; |
+import android.preference.Preference.OnPreferenceChangeListener; |
+import android.preference.Preference.OnPreferenceClickListener; |
+import android.preference.PreferenceFragment; |
+ |
+import org.chromium.base.CommandLine; |
+import org.chromium.chrome.ChromeSwitches; |
+import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.ContentSettingsType; |
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference; |
+import org.chromium.chrome.browser.preferences.LocationSettings; |
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate; |
+import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
+ |
+import java.util.ArrayList; |
+import java.util.List; |
+ |
+/** |
+ * The fragment displayed on Settings -> Content settings. |
+ */ |
+public class ContentPreferences extends PreferenceFragment |
+ implements OnPreferenceChangeListener, OnPreferenceClickListener { |
+ // The keys for each category shown on the Content Settings page. |
+ static final String ALL_SITES_KEY = "website_settings"; |
+ static final String COOKIES_KEY = "cookies"; |
+ static final String LOCATION_KEY = "device_location"; |
+ static final String CAMERA_AND_MIC_KEY = "use_camera_or_mic"; |
+ static final String JAVASCRIPT_KEY = "enable_javascript"; |
+ static final String BLOCK_POPUPS_KEY = "block_popups"; |
+ static final String PUSH_NOTIFICATIONS_KEY = "push_notifications"; |
+ static final String POPUPS_KEY = "popups"; |
+ static final String PROTECTED_CONTENT_KEY = "protected_content"; |
+ static final String TRANSLATE_KEY = "translate"; |
+ static final String STORAGE_KEY = "use_storage"; |
+ |
+ private ManagedPreferenceDelegate mManagedPreferenceDelegate; |
+ |
+ @Override |
+ public void onCreate(Bundle savedInstanceState) { |
+ super.onCreate(savedInstanceState); |
+ addPreferencesFromResource(R.xml.content_preferences); |
+ getActivity().setTitle(R.string.prefs_content_settings); |
+ |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { |
+ getPreferenceScreen().removePreference(findPreference(PROTECTED_CONTENT_KEY)); |
+ } |
+ |
+ if (!pushNotificationsSupported()) { |
+ getPreferenceScreen().removePreference(findPreference(PUSH_NOTIFICATIONS_KEY)); |
+ } |
+ |
+ // Set up the checkbox preferences. |
+ List<String> checkBoxPreferences = new ArrayList<String>(); |
+ checkBoxPreferences.add(JAVASCRIPT_KEY); |
+ |
+ for (String prefName : checkBoxPreferences) { |
+ Preference p = findPreference(prefName); |
+ p.setOnPreferenceChangeListener(this); |
+ } |
+ |
+ mManagedPreferenceDelegate = createManagedPreferenceDelegate(); |
+ |
+ updatePreferenceStates(); |
+ } |
+ |
+ private int keyToContentSettingsType(String key) { |
+ if (COOKIES_KEY.equals(key)) { |
+ return ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES; |
+ } else if (LOCATION_KEY.equals(key)) { |
+ return ContentSettingsType.CONTENT_SETTINGS_TYPE_GEOLOCATION; |
+ } else if (CAMERA_AND_MIC_KEY.equals(key)) { |
+ return ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM; |
+ } else if (PUSH_NOTIFICATIONS_KEY.equals(key)) { |
+ return ContentSettingsType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS; |
+ } else if (POPUPS_KEY.equals(key)) { |
+ return ContentSettingsType.CONTENT_SETTINGS_TYPE_POPUPS; |
+ } else if (PROTECTED_CONTENT_KEY.equals(key)) { |
+ return ContentSettingsType.CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER; |
+ } |
+ return -1; |
+ } |
+ |
+ /** |
+ * Returns whether Push Notifications (Push Messaging) is supported. |
+ */ |
+ public static boolean pushNotificationsSupported() { |
+ return CommandLine.getInstance().hasSwitch( |
+ ChromeSwitches.EXPERIMENTAL_WEB_PLAFTORM_FEATURES); |
+ } |
+ |
+ private void updatePreferenceStates() { |
+ PrefServiceBridge prefServiceBridge = PrefServiceBridge.getInstance(); |
+ |
+ // Translate preference. |
+ Preference translatePref = findPreference(TRANSLATE_KEY); |
+ if (translatePref != null) { |
+ setTranslateStateSummary(translatePref); |
+ } |
+ |
+ // JavaScript preference. |
+ ChromeBaseCheckBoxPreference javascriptPref = |
+ (ChromeBaseCheckBoxPreference) findPreference(JAVASCRIPT_KEY); |
+ javascriptPref.setChecked(prefServiceBridge.javaScriptEnabled()); |
+ javascriptPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate); |
+ |
+ // Preferences that navigate to Website Settings. |
+ List<String> websitePrefs = new ArrayList<String>(); |
+ websitePrefs.add(LOCATION_KEY); |
+ if (Build.VERSION.SDK_INT >= 19) { |
+ websitePrefs.add(PROTECTED_CONTENT_KEY); |
+ } |
+ websitePrefs.add(COOKIES_KEY); |
+ websitePrefs.add(CAMERA_AND_MIC_KEY); |
+ if (pushNotificationsSupported()) { |
+ websitePrefs.add(PUSH_NOTIFICATIONS_KEY); |
+ } |
+ websitePrefs.add(POPUPS_KEY); |
+ // Initialize the summary and icon for all preferences that have an |
+ // associated content settings entry. |
+ for (String prefName : websitePrefs) { |
+ Preference p = findPreference(prefName); |
+ int type = keyToContentSettingsType(prefName); |
+ Website.PermissionDataEntry entry = |
+ Website.PermissionDataEntry.getPermissionDataEntry(type); |
+ boolean checked = false; |
+ if (LOCATION_KEY.equals(p.getKey())) { |
+ checked = LocationSettings.areAllLocationSettingsEnabled(); |
+ } else if (CAMERA_AND_MIC_KEY.equals(prefName)) { |
+ checked = PrefServiceBridge.getInstance().isCameraMicEnabled(); |
+ } else if (PROTECTED_CONTENT_KEY.equals(prefName)) { |
+ checked = PrefServiceBridge.getInstance().isProtectedMediaIdentifierEnabled(); |
+ } else if (COOKIES_KEY.equals(prefName)) { |
+ checked = PrefServiceBridge.getInstance().isAcceptCookiesEnabled(); |
+ } else if (PUSH_NOTIFICATIONS_KEY.equals(prefName)) { |
+ checked = PrefServiceBridge.getInstance().isPushNotificationsEnabled(); |
+ } else if (POPUPS_KEY.equals(prefName)) { |
+ checked = PrefServiceBridge.getInstance().popupsEnabled(); |
+ } |
+ p.setTitle(entry.titleResourceId); |
+ if (COOKIES_KEY.equals(prefName) && checked |
+ && prefServiceBridge.isBlockThirdPartyCookiesEnabled()) { |
+ p.setSummary(R.string.website_settings_category_allowed_except_third_party); |
+ } else { |
+ p.setSummary(checked |
+ ? entry.contentSettingToResourceIdForCategory(entry.defaultEnabledValue) |
+ : entry.contentSettingToResourceIdForCategory(entry.defaultDisabledValue)); |
+ } |
+ p.setIcon(entry.iconResourceId); |
+ p.setOnPreferenceClickListener(this); |
+ } |
+ |
+ Preference p = findPreference(ALL_SITES_KEY); |
+ p.setOnPreferenceClickListener(this); |
+ // TODO(finnur): Re-move this for Storage once it can be moved to the 'Usage' menu. |
+ p = findPreference(STORAGE_KEY); |
+ p.setOnPreferenceClickListener(this); |
+ } |
+ |
+ @Override |
+ public void onResume() { |
+ super.onResume(); |
+ updatePreferenceStates(); |
+ } |
+ |
+ // OnPreferenceClickListener: |
+ |
+ @Override |
+ public boolean onPreferenceClick(Preference preference) { |
+ if (!ALL_SITES_KEY.equals(preference.getKey())) { |
+ preference.getExtras().putString( |
+ WebsitePreferences.EXTRA_CATEGORY, preference.getKey()); |
+ } |
+ preference.getExtras().putString(WebsitePreferences.EXTRA_TITLE, |
+ preference.getTitle().toString()); |
+ return false; |
+ } |
+ |
+ // OnPreferenceChangeListener: |
+ |
+ @Override |
+ public boolean onPreferenceChange(Preference preference, Object newValue) { |
+ if (!preference.isEnabled()) return false; |
+ |
+ String key = preference.getKey(); |
+ if (JAVASCRIPT_KEY.equals(key)) { |
+ PrefServiceBridge.getInstance().setJavaScriptEnabled((boolean) newValue); |
+ } |
+ return true; |
+ } |
+ |
+ private void setTranslateStateSummary(Preference translatePref) { |
+ boolean translateEnabled = PrefServiceBridge.getInstance().isTranslateEnabled(); |
+ translatePref.setSummary(translateEnabled |
+ ? R.string.website_settings_category_ask |
+ : R.string.website_settings_category_blocked); |
+ } |
+ |
+ private ManagedPreferenceDelegate createManagedPreferenceDelegate() { |
+ return new ManagedPreferenceDelegate() { |
+ @Override |
+ public boolean isPreferenceControlledByPolicy(Preference preference) { |
+ if (JAVASCRIPT_KEY.equals(preference.getKey())) { |
+ return PrefServiceBridge.getInstance().javaScriptManaged(); |
+ } |
+ return false; |
+ } |
+ }; |
+ } |
+} |