Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e3a5940778cef4f453574c9d539cc6b8c15f66d4 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java |
| @@ -0,0 +1,111 @@ |
| +// Copyright 2016 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.sync; |
| + |
| +import android.app.FragmentManager; |
| +import android.content.Context; |
| +import android.preference.Preference; |
| +import android.preference.Preference.OnPreferenceChangeListener; |
| +import android.text.TextUtils; |
| + |
| +import org.chromium.chrome.browser.BrowsingDataType; |
| +import org.chromium.chrome.browser.ChromeBrowserProviderClient; |
| +import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
| +import org.chromium.chrome.browser.preferences.PrefServiceBridge.OnClearBrowsingDataListener; |
| +import org.chromium.chrome.browser.preferences.SyncedAccountPreference; |
| +import org.chromium.chrome.browser.signin.SigninManager; |
| +import org.chromium.chrome.browser.signin.SigninManager.SignInCallback; |
| +import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataFragment; |
| + |
| +/** |
| + * A class that encapsulates the control flow of listeners and callbacks when switching sync |
| + * accounts. |
| + * |
| + * Control flows through the method in this order: |
| + * {@link OnPreferenceChangeListener#onPreferenceChange} |
| + * {@link ConfirmImportSyncDataFragment.Listener#onDialogCompleted} |
| + * {@link OnClearBrowsingDataListener#OnClearBrowsingDataListener} |
| + * (if the user chooses to merge their data, this step is skipped) |
| + * {@link SignInCallback#onSignInComplete} |
| + */ |
| +public class SyncAccountSwitcher |
| + implements OnPreferenceChangeListener, ConfirmImportSyncDataFragment.Listener, |
| + OnClearBrowsingDataListener, SignInCallback { |
| + private static final String TAG = "SyncAccountSwitcher"; |
| + |
| + private static final String CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG = |
| + "confirm_import_sync_data_tag"; |
| + |
| + private static final int[] SYNC_DATA_TYPES = { |
| + BrowsingDataType.HISTORY, |
| + BrowsingDataType.CACHE, |
| + BrowsingDataType.COOKIES, |
| + BrowsingDataType.PASSWORDS, |
| + BrowsingDataType.FORM_DATA |
| + }; |
| + |
| + private final SyncedAccountPreference mSyncedAccountPreference; |
| + private final Context mContext; |
| + private final FragmentManager mFragmentManager; |
| + |
| + private String mNewAccountName; |
| + |
| + public SyncAccountSwitcher(Context c, FragmentManager fm, SyncedAccountPreference pref) { |
| + mSyncedAccountPreference = pref; |
| + mContext = c; |
| + mFragmentManager = fm; |
| + } |
| + |
| + @Override |
| + public boolean onPreferenceChange(Preference p, Object newValue) { |
| + if (newValue == null) return false; |
| + |
| + SyncedAccountPreference preference = (SyncedAccountPreference) p; |
| + mNewAccountName = preference.valueToEntry((String) newValue); |
| + String currentAccount = preference.getEntry().toString(); |
| + |
| + if (TextUtils.equals(mNewAccountName, currentAccount)) return false; |
| + |
| + ConfirmImportSyncDataFragment confirmSync = |
| + ConfirmImportSyncDataFragment.newInstance(currentAccount, mNewAccountName); |
| + confirmSync.setListener(this); |
| + confirmSync.show(mFragmentManager, CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG); |
| + |
| + // Don't update the selected account in the preference. It will be updated by |
| + // the call to mSyncAccountListPreference.update() if everything succeeds. |
| + return false; |
| + } |
| + |
| + @Override |
| + public void onDialogCompleted(boolean mergeData) { |
| + if (!mergeData) { |
| + ChromeBrowserProviderClient.removeAllUserBookmarks(mContext); |
| + PrefServiceBridge.getInstance().clearBrowsingData(this, SYNC_DATA_TYPES); |
|
May
2016/02/17 14:22:11
Don't you still need to sign in the new account at
PEConn
2016/02/17 17:16:48
Yes, but not before the browsing data has been cle
|
| + } else { |
| + signin(); |
| + } |
| + } |
| + |
| + @Override |
| + public void onBrowsingDataCleared() { |
| + signin(); |
| + } |
| + |
| + private void signin() { |
| + assert mNewAccountName != null; |
| + SigninManager.get(mContext).signIn(mNewAccountName, null, this); |
| + } |
| + |
| + @Override |
| + public void onSignInComplete() { |
| + // Update the Preference so it displays the correct account name. |
| + mSyncedAccountPreference.update(); |
| + } |
| + |
| + @Override |
| + public void onSignInAborted() { |
| + assert false : "Should not be able to abort sign in when switching sync accounts."; |
| + } |
| +} |