| Index: chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
|
| index 85b635d8a05751d684666212e9e1864308713c2f..807e4fc87a8f7c9c063995f10328955a77568e07 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
|
| @@ -6,14 +6,17 @@ package org.chromium.chrome.browser.preferences.privacy;
|
|
|
| import android.app.Activity;
|
| import android.app.ProgressDialog;
|
| +import android.content.Intent;
|
| import android.os.Bundle;
|
| import android.preference.Preference;
|
| import android.preference.PreferenceFragment;
|
| +import android.support.annotation.Nullable;
|
| import android.widget.ListView;
|
|
|
| import org.chromium.base.VisibleForTesting;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.BrowsingDataType;
|
| +import org.chromium.chrome.browser.ChromeFeatureList;
|
| import org.chromium.chrome.browser.TimePeriod;
|
| import org.chromium.chrome.browser.help.HelpAndFeedback;
|
| import org.chromium.chrome.browser.preferences.ButtonPreference;
|
| @@ -36,10 +39,10 @@ import java.util.EnumSet;
|
| * from which to clear data.
|
| */
|
| public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| - implements PrefServiceBridge.OnClearBrowsingDataListener,
|
| + implements PrefServiceBridge.ImportantSitesCallback,
|
| + PrefServiceBridge.OnClearBrowsingDataListener,
|
| PrefServiceBridge.OtherFormsOfBrowsingHistoryListener,
|
| - Preference.OnPreferenceClickListener,
|
| - Preference.OnPreferenceChangeListener {
|
| + Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener {
|
| /**
|
| * Represents a single item in the dialog.
|
| */
|
| @@ -133,6 +136,12 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| "https://history.google.com/history/?utm_source=chrome_cbd";
|
|
|
| /**
|
| + * Used for the onActivityResult pattern. The value is arbitrary, just to distinguish from other
|
| + * activities that we might be using onActivityResult with as well.
|
| + */
|
| + private static final int IMPORTANT_SITES_DIALOG_CODE = 1;
|
| +
|
| + /**
|
| * The various data types that can be cleared via this screen.
|
| */
|
| public enum DialogOption {
|
| @@ -199,6 +208,16 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| private ProgressDialog mProgressDialog;
|
| private Item[] mItems;
|
|
|
| + // This means the user asked to clear, and now we're waiting until we get our sites back to do
|
| + // the clearing.
|
| + private boolean mWaitingForImportantSitesBeforeClear = false;
|
| + // This is the sorted list of important registerable domains. If null, then we haven't finished
|
| + // fetching them yet.
|
| + private String[] mSortedImportantDomains = null;
|
| + // This is the dialog we show to the user that lets them 'uncheck' (or exclude) the above
|
| + // important domains from being cleared.
|
| + private ConfirmImportantSitesDialogFragment mConfirmImportantSitesDialog;
|
| +
|
| private final EnumSet<DialogOption> getSelectedOptions() {
|
| EnumSet<DialogOption> selected = EnumSet.noneOf(DialogOption.class);
|
| for (Item item : mItems) {
|
| @@ -211,7 +230,8 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| * Requests the browsing data corresponding to the given dialog options to be deleted.
|
| * @param options The dialog options whose corresponding data should be deleted.
|
| */
|
| - private final void clearBrowsingData(EnumSet<DialogOption> options) {
|
| + private final void clearBrowsingData(
|
| + EnumSet<DialogOption> options, @Nullable String[] blacklistedDomains) {
|
| showProgressDialog();
|
|
|
| int[] dataTypes = new int[options.size()];
|
| @@ -224,7 +244,12 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| Object spinnerSelection =
|
| ((SpinnerPreference) findPreference(PREF_TIME_RANGE)).getSelectedOption();
|
| int timePeriod = ((TimePeriodSpinnerOption) spinnerSelection).getTimePeriod();
|
| - PrefServiceBridge.getInstance().clearBrowsingData(this, dataTypes, timePeriod);
|
| + if (blacklistedDomains != null && blacklistedDomains.length != 0) {
|
| + PrefServiceBridge.getInstance().clearBrowsingDataExcludingDomains(
|
| + this, dataTypes, timePeriod, blacklistedDomains);
|
| + } else {
|
| + PrefServiceBridge.getInstance().clearBrowsingData(this, dataTypes, timePeriod);
|
| + }
|
| }
|
|
|
| private void dismissProgressDialog() {
|
| @@ -240,11 +265,12 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| */
|
| private DialogOption[] getDialogOptions() {
|
| return new DialogOption[] {
|
| - DialogOption.CLEAR_HISTORY,
|
| - DialogOption.CLEAR_COOKIES_AND_SITE_DATA,
|
| - DialogOption.CLEAR_CACHE,
|
| - DialogOption.CLEAR_PASSWORDS,
|
| - DialogOption.CLEAR_FORM_DATA};
|
| + DialogOption.CLEAR_HISTORY,
|
| + DialogOption.CLEAR_COOKIES_AND_SITE_DATA,
|
| + DialogOption.CLEAR_CACHE,
|
| + DialogOption.CLEAR_PASSWORDS,
|
| + DialogOption.CLEAR_FORM_DATA
|
| + };
|
| }
|
|
|
| /**
|
| @@ -276,7 +302,7 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| */
|
| private boolean isOptionSelectedByDefault(DialogOption option) {
|
| return PrefServiceBridge.getInstance().getBrowsingDataDeletionPreference(
|
| - option.getDataType());
|
| + option.getDataType());
|
| }
|
|
|
| /**
|
| @@ -305,7 +331,16 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| @Override
|
| public boolean onPreferenceClick(Preference preference) {
|
| if (preference.getKey().equals(PREF_CLEAR_BUTTON)) {
|
| - clearBrowsingData(getSelectedOptions());
|
| + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.IMPORTANT_SITES_IN_CBD)) {
|
| + clearBrowsingData(getSelectedOptions(), null);
|
| + return true;
|
| + }
|
| + // We need to handle the case where the fetch isn't finished yet.
|
| + if (mSortedImportantDomains == null) {
|
| + mWaitingForImportantSitesBeforeClear = true;
|
| + } else {
|
| + maybeShowImportantDialogThenClear();
|
| + }
|
| return true;
|
| }
|
| return false;
|
| @@ -427,6 +462,9 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| getPreferenceScreen().removePreference(google_summary);
|
| general_summary.setSummary(R.string.clear_browsing_data_footnote_site_settings);
|
| }
|
| + if (ChromeFeatureList.isEnabled(ChromeFeatureList.IMPORTANT_SITES_IN_CBD)) {
|
| + PrefServiceBridge.fetchImportantSites(this);
|
| + }
|
| }
|
|
|
| @Override
|
| @@ -462,6 +500,29 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| return mProgressDialog;
|
| }
|
|
|
| + @VisibleForTesting
|
| + ConfirmImportantSitesDialogFragment getImportantSitesDialogFragment() {
|
| + return mConfirmImportantSitesDialog;
|
| + }
|
| +
|
| + /**
|
| + * This method shows the important sites dialog if we're enabled and if we have important
|
| + * origins. If either of those is false, then it'll clear like normal. After the dialog is
|
| + * shown, we correctly clear.
|
| + */
|
| + private void maybeShowImportantDialogThenClear() {
|
| + if (mSortedImportantDomains == null || mSortedImportantDomains.length == 0
|
| + || !ChromeFeatureList.isEnabled(ChromeFeatureList.IMPORTANT_SITES_IN_CBD)) {
|
| + clearBrowsingData(getSelectedOptions(), null);
|
| + return;
|
| + }
|
| + mConfirmImportantSitesDialog =
|
| + ConfirmImportantSitesDialogFragment.newInstance(mSortedImportantDomains);
|
| + mConfirmImportantSitesDialog.setTargetFragment(this, IMPORTANT_SITES_DIALOG_CODE);
|
| + mConfirmImportantSitesDialog.show(
|
| + getFragmentManager(), ConfirmImportantSitesDialogFragment.FRAGMENT_TAG);
|
| + }
|
| +
|
| @Override
|
| public void showNoticeAboutOtherFormsOfBrowsingHistory() {
|
| if (getActivity() == null) return;
|
| @@ -487,4 +548,26 @@ public class ClearBrowsingDataPreferences extends PreferenceFragment
|
| OtherFormsOfHistoryDialogFragment getDialogAboutOtherFormsOfBrowsingHistory() {
|
| return mDialogAboutOtherFormsOfBrowsingHistory;
|
| }
|
| +
|
| + @Override
|
| + public void onImportantRegisterableDomainsReady(String[] domains) {
|
| + mSortedImportantDomains = domains;
|
| + if (!mWaitingForImportantSitesBeforeClear) return;
|
| + mWaitingForImportantSitesBeforeClear = false;
|
| + maybeShowImportantDialogThenClear();
|
| + }
|
| +
|
| + /**
|
| + * This is the callback for the important domain dialog. We should only clear if we get the
|
| + * positive button response.
|
| + */
|
| + @Override
|
| + public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
| + if (requestCode == IMPORTANT_SITES_DIALOG_CODE && resultCode == Activity.RESULT_OK) {
|
| + // Deselected means that the user is excluding the domain from being cleared.
|
| + String[] deselectedDomains = data.getStringArrayExtra(
|
| + ConfirmImportantSitesDialogFragment.DESELECTED_DOMAINS_TAG);
|
| + clearBrowsingData(getSelectedOptions(), deselectedDomains);
|
| + }
|
| + }
|
| }
|
|
|