| Index: chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
|
| index 2e655d14b8b951db14fcc34a7fd4667a6bcacff7..c9017d3796e1ac966cc9a8fb4dfeca91fa3fb63a 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
|
| @@ -4,25 +4,36 @@
|
|
|
| package org.chromium.chrome.browser.preferences;
|
|
|
| -import android.content.Intent;
|
| +import android.app.DialogFragment;
|
| +import android.app.FragmentManager;
|
| +import android.content.Context;
|
| import android.os.Bundle;
|
| import android.os.Handler;
|
| import android.preference.Preference;
|
| import android.preference.Preference.OnPreferenceClickListener;
|
| import android.preference.PreferenceFragment;
|
|
|
| +import org.chromium.base.Callback;
|
| +import org.chromium.base.VisibleForTesting;
|
| +import org.chromium.base.metrics.RecordUserAction;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.PasswordUIView;
|
| import org.chromium.chrome.browser.autofill.PersonalDataManager;
|
| import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
|
| import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
|
| import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferences;
|
| -import org.chromium.chrome.browser.signin.AccountSigninActivity;
|
| +import org.chromium.chrome.browser.signin.AccountAdder;
|
| +import org.chromium.chrome.browser.signin.AddGoogleAccountDialogFragment;
|
| +import org.chromium.chrome.browser.signin.AddGoogleAccountDialogFragment.AddGoogleAccountListener;
|
| import org.chromium.chrome.browser.signin.SigninAccessPoint;
|
| import org.chromium.chrome.browser.signin.SigninManager;
|
| import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
|
| +import org.chromium.chrome.browser.sync.ui.ChooseAccountFragment;
|
| import org.chromium.chrome.browser.util.FeatureUtilities;
|
| +import org.chromium.sync.signin.AccountManagerHelper;
|
| import org.chromium.sync.signin.ChromeSigninController;
|
| +
|
| +import java.util.List;
|
|
|
| /**
|
| * The main settings screen, shown when the user first opens Settings.
|
| @@ -87,21 +98,13 @@
|
| mSignInPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
| @Override
|
| public boolean onPreferenceClick(Preference preference) {
|
| - if (ChromeSigninController.get(getActivity()).isSignedIn()) return false;
|
| - if (!SigninManager.get(getActivity()).isSignInAllowed()) {
|
| - if (SigninManager.get(getActivity()).isSigninDisabledByPolicy()) {
|
| - ManagedPreferencesUtils.showManagedByAdministratorToast(getActivity());
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - mSignInPreference.setEnabled(false);
|
| - SigninManager.logSigninStartAccessPoint(SigninAccessPoint.SETTINGS);
|
| - startActivity(new Intent(getActivity(), AccountSigninActivity.class));
|
| - return true;
|
| - }
|
| - });
|
| - mSignInPreference.setEnabled(true);
|
| + if (!ChromeSigninController.get(getActivity()).isSignedIn()) {
|
| + displayAccountPicker();
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| + });
|
|
|
| Preference documentMode = findPreference(PREF_DOCUMENT_MODE);
|
| if (FeatureUtilities.isDocumentModeEligible(getActivity())) {
|
| @@ -162,6 +165,80 @@
|
| }
|
| }
|
|
|
| + private void displayAccountPicker() {
|
| + displayAccountPicker(new Callback<DialogFragment>() {
|
| + @Override
|
| + public void onResult(DialogFragment fragment) {}
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Displays the account picker or the add account dialog and signs the user in.
|
| + *
|
| + * @param callback Called with the fragment that was shown, or null. Used for testing.
|
| + */
|
| + @VisibleForTesting
|
| + public void displayAccountPicker(final Callback<DialogFragment> callback) {
|
| + Context context = getActivity();
|
| + if (context == null) {
|
| + postCallback(callback, null);
|
| + return;
|
| + }
|
| +
|
| + if (!SigninManager.get(context).isSignInAllowed()) {
|
| + if (SigninManager.get(context).isSigninDisabledByPolicy()) {
|
| + ManagedPreferencesUtils.showManagedByAdministratorToast(context);
|
| + }
|
| + postCallback(callback, null);
|
| + return;
|
| + }
|
| +
|
| + AccountManagerHelper.get(context).getGoogleAccountNames(new Callback<List<String>>() {
|
| + @Override
|
| + public void onResult(List<String> accountNames) {
|
| + FragmentManager fragmentManager = getFragmentManager();
|
| + if (fragmentManager == null) {
|
| + // Preferences were closed since the click happened; abort.
|
| + callback.onResult(null);
|
| + return;
|
| + }
|
| +
|
| + if (!accountNames.isEmpty()) {
|
| + if (fragmentManager.findFragmentByTag(ACCOUNT_PICKER_DIALOG_TAG) != null) {
|
| + callback.onResult(null);
|
| + } else {
|
| + ChooseAccountFragment chooserFragment =
|
| + new ChooseAccountFragment(accountNames);
|
| + chooserFragment.show(fragmentManager, ACCOUNT_PICKER_DIALOG_TAG);
|
| + callback.onResult(chooserFragment);
|
| + SigninManager.logSigninStartAccessPoint(SigninAccessPoint.SETTINGS);
|
| + }
|
| + } else {
|
| + AddGoogleAccountDialogFragment dialog = new AddGoogleAccountDialogFragment();
|
| + dialog.setListener(new AddGoogleAccountListener() {
|
| + @Override
|
| + public void onAddAccountClicked() {
|
| + RecordUserAction.record("Signin_AddAccountToDevice");
|
| + AccountAdder.getInstance().addAccount(
|
| + MainPreferences.this, AccountAdder.ADD_ACCOUNT_RESULT);
|
| + }
|
| + });
|
| + dialog.show(fragmentManager, null);
|
| + callback.onResult(dialog);
|
| + }
|
| + }
|
| + });
|
| + }
|
| +
|
| + private <V> void postCallback(final Callback<V> callback, final V result) {
|
| + new Handler().post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + callback.onResult(result);
|
| + }
|
| + });
|
| + }
|
| +
|
| // SignInStateObserver
|
|
|
| @Override
|
|
|