// 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.signin;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R;
/**
* A class to display the dialogs the user may encounter when switching to/from or signing into/out
* of a managed account.
*/
public class ConfirmManagedSyncDataDialog extends DialogFragment
implements DialogInterface.OnClickListener {
/**
* A listener to allow the Dialog to report on the action taken. Either
* {@link Listener#onConfirm} or {@link Listener#onCancel} will be called once.
*/
public interface Listener {
/**
* The user has accepted the dialog.
*/
public void onConfirm();
/**
* The user has cancelled the dialog either through a negative response or by dismissing it.
*/
public void onCancel();
}
@VisibleForTesting
public static final String CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG =
"sync_managed_data_tag";
private static final String KEY_TITLE = "title";
private static final String KEY_DESCRIPTION = "description";
private static final String KEY_POSITIVE_BUTTON = "positiveButton";
private static final String KEY_NEGATIVE_BUTTON = "negativeButton";
private Listener mListener;
private boolean mListenerCalled;
/**
* Create the dialog to show when signing in to a managed account (either through sign in or
* when switching accounts).
* @param callback Callback for result.
* @param fragmentManager FragmentManaged to display the dialog.
* @param resources Resources to load the strings.
* @param domain The domain of the managed account.
*/
public static void showSignInToManagedAccountDialog(Listener callback,
FragmentManager fragmentManager, Resources resources, String domain) {
String title = resources.getString(R.string.sign_in_managed_account);
String positive = resources.getString(R.string.policy_dialog_proceed);
String negative = resources.getString(R.string.cancel);
String desc = resources.getString(R.string.sign_in_managed_account_description, domain);
showNewInstance(title, desc, positive, negative, fragmentManager, callback);
}
/**
* Create the dialog to show when signing out of a managed account (but not switching from a
* managed account).
* @param callback Callback for result.
* @param fragmentManager FragmentManaged to display the dialog.
* @param resources Resources to load the strings.
* @param domain The domain of the managed account.
*/
public static void showSignOutFromManagedAccountDialog(Listener callback,
FragmentManager fragmentManager, Resources resources, String domain) {
String title = resources.getString(R.string.sign_out_managed_account);
String positive = resources.getString(R.string.accept_and_sign_out);
String negative = resources.getString(R.string.cancel);
String desc = resources.getString(R.string.sign_out_managed_account_description, domain);
showNewInstance(title, desc, positive, negative, fragmentManager, callback);
}
/**
* Create the dialog to show when switching from a managed account.
* @param callback Callback for result.
* @param fragmentManager FragmentManaged to display the dialog.
* @param resources Resources to load the strings.
* @param domain The domain of the managed account.
* @param oldAccount The old account email address.
* @param newAccount The new account email address.
*/
public static void showSwitchFromManagedAccountDialog(Listener callback,
FragmentManager fragmentManager, Resources resources, String domain, String oldAccount,
String newAccount) {
String title = resources.getString(R.string.sign_out_managed_account);
String positive = resources.getString(R.string.accept_and_switch_accounts);
String negative = resources.getString(R.string.cancel);
String desc = resources.getString(R.string.switch_from_managed_account_description,
oldAccount, newAccount, domain);
showNewInstance(title, desc, positive, negative, fragmentManager, callback);
}
private static void showNewInstance(String title, String description, String positiveButton,
String negativeButton, FragmentManager fragmentManager, Listener callback) {
ConfirmManagedSyncDataDialog confirmSync =
newInstance(title, description, positiveButton, negativeButton);
confirmSync.setListener(callback);
confirmSync.show(fragmentManager, CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG);
}
private static ConfirmManagedSyncDataDialog newInstance(String title, String description,
String positiveButton, String negativeButton) {
ConfirmManagedSyncDataDialog fragment = new ConfirmManagedSyncDataDialog();
Bundle args = new Bundle();
args.putString(KEY_TITLE, title);
args.putString(KEY_DESCRIPTION, description);
args.putString(KEY_POSITIVE_BUTTON, positiveButton);
args.putString(KEY_NEGATIVE_BUTTON, negativeButton);
fragment.setArguments(args);
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String title = getArguments().getString(KEY_TITLE);
String description = getArguments().getString(KEY_DESCRIPTION);
String positiveButton = getArguments().getString(KEY_POSITIVE_BUTTON);
String negativeButton = getArguments().getString(KEY_NEGATIVE_BUTTON);
return new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme)
.setTitle(title)
.setMessage(description)
.setPositiveButton(positiveButton, this)
.setNegativeButton(negativeButton, this)
.create();
}
private void setListener(Listener listener) {
assert mListener == null;
mListener = listener;
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == AlertDialog.BUTTON_POSITIVE) {
mListener.onConfirm();
} else {
assert which == AlertDialog.BUTTON_NEGATIVE;
mListener.onCancel();
}
mListenerCalled = true;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (!mListenerCalled) {
mListener.onCancel();
}
}
}