Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3903)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java

Issue 2772203004: Add progress and timeout dialogs for getting account management policy (Closed)
Patch Set: Updated strings and addressed comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
index b545e8177948046899b54b1c531bbdddd8b97f3c..35de37b5be96f6a90426e6cbbbe4b0c2e4cf578a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
@@ -8,11 +8,12 @@ import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
+import android.os.Handler;
import android.support.annotation.IntDef;
import android.text.TextUtils;
import org.chromium.base.Callback;
-import org.chromium.base.Promise;
+import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.signin.ConfirmImportSyncDataDialog.ImportSyncType;
import java.lang.annotation.Retention;
@@ -25,12 +26,13 @@ import java.lang.annotation.RetentionPolicy;
*
* This class progresses along the following state machine:
*
- * E----\ G--\
- * ^ | ^ |
- * | | | v
- * A->B->C->D-+->F->H
- * | |
- * \-------/
+ * E-----\ G--\
+ * ^ | ^ |
+ * | v | v
+ * A->B->C->D->+->F->H
+ * | ^
+ * v |
+ * \--------/
*
* Where:
* A - Start
@@ -48,29 +50,31 @@ import java.lang.annotation.RetentionPolicy;
*/
public class ConfirmSyncDataStateMachine
implements ConfirmImportSyncDataDialog.Listener, ConfirmManagedSyncDataDialog.Listener {
-
- @IntDef({
- BEFORE_OLD_ACCOUNT_DIALOG, BEFORE_NEW_ACCOUNT_DIALOG,
- AFTER_NEW_ACCOUNT_DIALOG, DONE
- })
@Retention(RetentionPolicy.SOURCE)
+ @IntDef({BEFORE_OLD_ACCOUNT_DIALOG, BEFORE_NEW_ACCOUNT_DIALOG, AFTER_NEW_ACCOUNT_DIALOG, DONE})
private @interface State {}
private static final int BEFORE_OLD_ACCOUNT_DIALOG = 0; // Start of state B.
private static final int BEFORE_NEW_ACCOUNT_DIALOG = 1; // Start of state F.
private static final int AFTER_NEW_ACCOUNT_DIALOG = 2; // Start of state H.
private static final int DONE = 4;
- private boolean mWipeData;
@State private int mState = BEFORE_OLD_ACCOUNT_DIALOG;
+ private static final int ACCOUNT_CHECK_TIMEOUT_MS = 30000;
+
private final ConfirmImportSyncDataDialog.Listener mCallback;
private final String mOldAccountName;
private final String mNewAccountName;
private final boolean mCurrentlyManaged;
- private final Promise<Boolean> mNewAccountManaged = new Promise<>();
private final FragmentManager mFragmentManager;
private final Context mContext;
private final ImportSyncType mImportSyncType;
+ private final ConfirmSyncDataStateMachineDelegate mDelegate;
+ private final Handler mHandler = new Handler();
+
+ private boolean mWipeData;
+ private Boolean mNewAccountManaged;
+ private Runnable mCheckTimeoutRunnable;
/**
* Run this state machine, displaying the appropriate dialogs.
@@ -113,6 +117,8 @@ public class ConfirmSyncDataStateMachine
private ConfirmSyncDataStateMachine(String oldAccountName, String newAccountName,
ImportSyncType importSyncType, FragmentManager fragmentManager, Context context,
ConfirmImportSyncDataDialog.Listener callback) {
+ ThreadUtils.assertOnUiThread();
+
mOldAccountName = oldAccountName;
mNewAccountName = newAccountName;
mImportSyncType = importSyncType;
@@ -122,8 +128,11 @@ public class ConfirmSyncDataStateMachine
mCurrentlyManaged = SigninManager.get(context).getManagementDomain() != null;
- // This check isn't needed right now, but can take a few seconds, so we kick it off early.
- SigninManager.isUserManaged(mNewAccountName, mNewAccountManaged.fulfillmentCallback());
+ mDelegate = new ConfirmSyncDataStateMachineDelegate(mContext);
+
+ // New account management status isn't needed right now, but fetching it
+ // can take a few seconds, so we kick it off early.
+ requestNewAccountManagementStatus();
}
/**
@@ -162,23 +171,13 @@ public class ConfirmSyncDataStateMachine
break;
case BEFORE_NEW_ACCOUNT_DIALOG:
mState = AFTER_NEW_ACCOUNT_DIALOG;
-
- mNewAccountManaged.then(new Callback<Boolean>() {
- @Override
- public void onResult(Boolean newAccountManaged) {
- if (newAccountManaged) {
- // Show 'logging into managed account' dialog
- // This will call back into onConfirm on success.
- ConfirmManagedSyncDataDialog.showSignInToManagedAccountDialog(
- ConfirmSyncDataStateMachine.this,
- mFragmentManager, mContext.getResources(),
- SigninManager.extractDomainName(mNewAccountName));
- } else {
- progress();
- }
- }
- });
-
+ if (mNewAccountManaged != null) {
+ // No need to show dialog if account management status is already known
+ handleNewAccountManagementStatus();
+ } else {
+ showProgressDialog();
+ scheduleTimeout();
+ }
break;
case AFTER_NEW_ACCOUNT_DIALOG:
mState = DONE;
@@ -189,6 +188,90 @@ public class ConfirmSyncDataStateMachine
}
}
+ private void requestNewAccountManagementStatus() {
+ SigninManager.isUserManaged(mNewAccountName, new Callback<Boolean>() {
+ @Override
+ public void onResult(Boolean result) {
+ setIsNewAccountManaged(result);
+ }
+ });
+ }
+
+ private void setIsNewAccountManaged(Boolean isManaged) {
+ assert isManaged != null;
+ mNewAccountManaged = isManaged;
+ if (mState == AFTER_NEW_ACCOUNT_DIALOG) {
+ cancelTimeout();
+ handleNewAccountManagementStatus();
+ }
+ }
+
+ private void handleNewAccountManagementStatus() {
+ assert mNewAccountManaged != null;
+ assert mState == AFTER_NEW_ACCOUNT_DIALOG;
+
+ mDelegate.dismissAllDialogs();
+
+ if (mNewAccountManaged) {
+ // Show 'logging into managed account' dialog
+ // This will call back into onConfirm on success.
+ ConfirmManagedSyncDataDialog.showSignInToManagedAccountDialog(
+ ConfirmSyncDataStateMachine.this, mFragmentManager, mContext.getResources(),
+ SigninManager.extractDomainName(mNewAccountName));
+ } else {
+ progress();
+ }
+ }
+
+ private void showProgressDialog() {
+ mDelegate.showFetchManagementPolicyProgressDialog(
+ new ConfirmSyncDataStateMachineDelegate.ProgressDialogListener() {
+ @Override
+ public void onCancel() {
+ ConfirmSyncDataStateMachine.this.onCancel();
+ }
+ });
+ }
+
+ private void scheduleTimeout() {
+ if (mCheckTimeoutRunnable == null) {
+ mCheckTimeoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ checkTimeout();
+ }
+ };
+ }
+ mHandler.postDelayed(mCheckTimeoutRunnable, ACCOUNT_CHECK_TIMEOUT_MS);
+ }
+
+ private void cancelTimeout() {
+ if (mCheckTimeoutRunnable == null) {
+ return;
+ }
+ mHandler.removeCallbacks(mCheckTimeoutRunnable);
+ mCheckTimeoutRunnable = null;
+ }
+
+ private void checkTimeout() {
+ assert mState == AFTER_NEW_ACCOUNT_DIALOG;
+ assert mNewAccountManaged == null;
+
+ mDelegate.showFetchManagementPolicyTimeoutDialog(
+ new ConfirmSyncDataStateMachineDelegate.TimeoutDialogListener() {
+ @Override
+ public void onCancel() {
+ ConfirmSyncDataStateMachine.this.onCancel();
+ }
+
+ @Override
+ public void onRetry() {
+ requestNewAccountManagementStatus();
+ scheduleTimeout();
+ }
+ });
+ }
+
// ConfirmImportSyncDataDialog.Listener implementation.
@Override
public void onConfirm(boolean wipeData) {
@@ -205,6 +288,9 @@ public class ConfirmSyncDataStateMachine
// ConfirmImportSyncDataDialog.Listener & ConfirmManagedSyncDataDialog.Listener implementation.
@Override
public void onCancel() {
+ cancelTimeout();
+ mDelegate.dismissAllDialogs();
+
mState = DONE;
mCallback.onCancel();
}

Powered by Google App Engine
This is Rietveld 408576698