// 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.privacy;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchFieldTrial;
import org.chromium.chrome.browser.help.HelpAndFeedback;
import org.chromium.chrome.browser.physicalweb.PhysicalWeb;
import org.chromium.chrome.browser.precache.PrecacheLauncher;
import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.profiles.Profile;
/**
* Fragment to keep track of the all the privacy related preferences.
*/
public class PrivacyPreferences extends PreferenceFragment
implements OnPreferenceChangeListener {
private static final String PREF_NAVIGATION_ERROR = "navigation_error";
private static final String PREF_SEARCH_SUGGESTIONS = "search_suggestions";
private static final String PREF_SAFE_BROWSING_EXTENDED_REPORTING =
"safe_browsing_extended_reporting";
private static final String PREF_SAFE_BROWSING = "safe_browsing";
private static final String PREF_CONTEXTUAL_SEARCH = "contextual_search";
private static final String PREF_NETWORK_PREDICTIONS = "network_predictions";
private static final String PREF_DO_NOT_TRACK = "do_not_track";
private static final String PREF_USAGE_AND_CRASH_REPORTING = "usage_and_crash_reports";
private static final String PREF_PHYSICAL_WEB = "physical_web";
private ManagedPreferenceDelegate mManagedPreferenceDelegate;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PrivacyPreferencesManager privacyPrefManager = PrivacyPreferencesManager.getInstance();
privacyPrefManager.migrateNetworkPredictionPreferences();
addPreferencesFromResource(R.xml.privacy_preferences);
getActivity().setTitle(R.string.prefs_privacy);
setHasOptionsMenu(true);
mManagedPreferenceDelegate = createManagedPreferenceDelegate();
ChromeBaseCheckBoxPreference networkPredictionPref =
(ChromeBaseCheckBoxPreference) findPreference(PREF_NETWORK_PREDICTIONS);
networkPredictionPref.setChecked(
PrefServiceBridge.getInstance().getNetworkPredictionEnabled());
networkPredictionPref.setOnPreferenceChangeListener(this);
networkPredictionPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
ChromeBaseCheckBoxPreference navigationErrorPref =
(ChromeBaseCheckBoxPreference) findPreference(PREF_NAVIGATION_ERROR);
navigationErrorPref.setOnPreferenceChangeListener(this);
navigationErrorPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
ChromeBaseCheckBoxPreference searchSuggestionsPref =
(ChromeBaseCheckBoxPreference) findPreference(PREF_SEARCH_SUGGESTIONS);
searchSuggestionsPref.setOnPreferenceChangeListener(this);
searchSuggestionsPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
PreferenceScreen preferenceScreen = getPreferenceScreen();
if (!ContextualSearchFieldTrial.isEnabled()) {
preferenceScreen.removePreference(findPreference(PREF_CONTEXTUAL_SEARCH));
}
ChromeBaseCheckBoxPreference safeBrowsingExtendedReportingPref =
(ChromeBaseCheckBoxPreference) findPreference(
PREF_SAFE_BROWSING_EXTENDED_REPORTING);
safeBrowsingExtendedReportingPref.setOnPreferenceChangeListener(this);
safeBrowsingExtendedReportingPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
ChromeBaseCheckBoxPreference safeBrowsingPref =
(ChromeBaseCheckBoxPreference) findPreference(PREF_SAFE_BROWSING);
safeBrowsingPref.setOnPreferenceChangeListener(this);
safeBrowsingPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
if (!PhysicalWeb.featureIsEnabled()) {
preferenceScreen.removePreference(findPreference(PREF_PHYSICAL_WEB));
}
updateSummaries();
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (PREF_SEARCH_SUGGESTIONS.equals(key)) {
PrefServiceBridge.getInstance().setSearchSuggestEnabled((boolean) newValue);
} else if (PREF_SAFE_BROWSING.equals(key)) {
PrefServiceBridge.getInstance().setSafeBrowsingEnabled((boolean) newValue);
} else if (PREF_SAFE_BROWSING_EXTENDED_REPORTING.equals(key)) {
PrefServiceBridge.getInstance().setSafeBrowsingExtendedReportingEnabled(
(boolean) newValue);
} else if (PREF_NETWORK_PREDICTIONS.equals(key)) {
PrefServiceBridge.getInstance().setNetworkPredictionEnabled((boolean) newValue);
PrecacheLauncher.updatePrecachingEnabled(getActivity());
} else if (PREF_NAVIGATION_ERROR.equals(key)) {
PrefServiceBridge.getInstance().setResolveNavigationErrorEnabled((boolean) newValue);
}
return true;
}
@Override
public void onResume() {
super.onResume();
updateSummaries();
}
/**
* Updates the summaries for several preferences.
*/
public void updateSummaries() {
PrefServiceBridge prefServiceBridge = PrefServiceBridge.getInstance();
PrivacyPreferencesManager privacyPrefManager = PrivacyPreferencesManager.getInstance();
CharSequence textOn = getActivity().getResources().getText(R.string.text_on);
CharSequence textOff = getActivity().getResources().getText(R.string.text_off);
CheckBoxPreference navigationErrorPref = (CheckBoxPreference) findPreference(
PREF_NAVIGATION_ERROR);
if (navigationErrorPref != null) {
navigationErrorPref.setChecked(
prefServiceBridge.isResolveNavigationErrorEnabled());
}
CheckBoxPreference searchSuggestionsPref = (CheckBoxPreference) findPreference(
PREF_SEARCH_SUGGESTIONS);
if (searchSuggestionsPref != null) {
searchSuggestionsPref.setChecked(prefServiceBridge.isSearchSuggestEnabled());
}
CheckBoxPreference extendedReportingPref =
(CheckBoxPreference) findPreference(PREF_SAFE_BROWSING_EXTENDED_REPORTING);
if (extendedReportingPref != null) {
extendedReportingPref.setChecked(
prefServiceBridge.isSafeBrowsingExtendedReportingEnabled());
}
CheckBoxPreference safeBrowsingPref =
(CheckBoxPreference) findPreference(PREF_SAFE_BROWSING);
if (safeBrowsingPref != null) {
safeBrowsingPref.setChecked(prefServiceBridge.isSafeBrowsingEnabled());
}
Preference doNotTrackPref = findPreference(PREF_DO_NOT_TRACK);
if (doNotTrackPref != null) {
doNotTrackPref.setSummary(prefServiceBridge.isDoNotTrackEnabled() ? textOn : textOff);
}
Preference contextualPref = findPreference(PREF_CONTEXTUAL_SEARCH);
if (contextualPref != null) {
boolean isContextualSearchEnabled = !prefServiceBridge.isContextualSearchDisabled();
contextualPref.setSummary(isContextualSearchEnabled ? textOn : textOff);
}
Preference physicalWebPref = findPreference(PREF_PHYSICAL_WEB);
if (physicalWebPref != null) {
physicalWebPref.setSummary(privacyPrefManager.isPhysicalWebEnabled()
? textOn : textOff);
}
Preference usageAndCrashPref = findPreference(PREF_USAGE_AND_CRASH_REPORTING);
if (usageAndCrashPref != null) {
usageAndCrashPref.setSummary(
privacyPrefManager.isUsageAndCrashReportingEnabled() ? textOn : textOff);
}
}
private ManagedPreferenceDelegate createManagedPreferenceDelegate() {
return new ManagedPreferenceDelegate() {
@Override
public boolean isPreferenceControlledByPolicy(Preference preference) {
String key = preference.getKey();
PrefServiceBridge prefs = PrefServiceBridge.getInstance();
if (PREF_NAVIGATION_ERROR.equals(key)) {
return prefs.isResolveNavigationErrorManaged();
}
if (PREF_SEARCH_SUGGESTIONS.equals(key)) {
return prefs.isSearchSuggestManaged();
}
if (PREF_SAFE_BROWSING_EXTENDED_REPORTING.equals(key)) {
return prefs.isSafeBrowsingExtendedReportingManaged();
}
if (PREF_SAFE_BROWSING.equals(key)) {
return prefs.isSafeBrowsingManaged();
}
if (PREF_NETWORK_PREDICTIONS.equals(key)) {
return prefs.isNetworkPredictionManaged();
}
return false;
}
};
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
MenuItem help = menu.add(
Menu.NONE, R.id.menu_id_targeted_help, Menu.NONE, R.string.menu_help);
help.setIcon(R.drawable.ic_help_and_feedback);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_id_targeted_help) {
HelpAndFeedback.getInstance(getActivity())
.show(getActivity(), getString(R.string.help_context_privacy),
Profile.getLastUsedProfile(), null);
return true;
}
return false;
}
}