summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaxbogue <maxbogue@chromium.org>2015-12-16 11:06:51 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-16 19:07:59 +0000
commit7c686c2811572f9169a69fa74b4309432ccbfb3c (patch)
tree09d5a128ac53478df8ea40380dcc13b232239d10
parent004c7b4707e8f57bb9d5668812f7826b484f0893 (diff)
downloadchromium_src-7c686c2811572f9169a69fa74b4309432ccbfb3c.zip
chromium_src-7c686c2811572f9169a69fa74b4309432ccbfb3c.tar.gz
chromium_src-7c686c2811572f9169a69fa74b4309432ccbfb3c.tar.bz2
[Signin] Move ClearDataProgressDialog out of SigninManager.
This change is part of componentizing SigninManager, as it removes the dependence on org.chromium.chrome.R. It also removes a piece of member state from SigninManager, mClearDataProgressDialog, and passes the hooks object through native instead. BUG=567975 Review URL: https://codereview.chromium.org/1514943003 Cr-Commit-Position: refs/heads/master@{#365581}
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java2
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java44
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java4
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java90
-rw-r--r--chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java2
-rw-r--r--chrome/browser/android/signin/signin_manager_android.cc20
-rw-r--r--chrome/browser/android/signin/signin_manager_android.h6
7 files changed, 102 insertions, 66 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java
index 224bcd4..9c0ce2d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java
@@ -81,7 +81,7 @@ public class GoogleServicesManager implements ApplicationStateListener {
SigninManager signinManager = SigninManager.get(mContext);
if (!mChromeSigninController.isSignedIn() && signinManager.isSignedInOnNative()) {
Log.w(TAG, "Signed in state got out of sync, forcing native sign out");
- signinManager.signOut(null, null);
+ signinManager.signOut();
}
// Initialize sync.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java
index 77ddd04..998453b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java
@@ -7,6 +7,9 @@ package org.chromium.chrome.browser.signin;
import android.accounts.Account;
import android.annotation.TargetApi;
import android.app.Activity;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -74,6 +77,7 @@ public class AccountManagementFragment extends PreferenceFragment
SyncStateChangedListener, SignInStateObserver {
public static final String SIGN_OUT_DIALOG_TAG = "sign_out_dialog_tag";
+ private static final String CLEAR_DATA_PROGRESS_DIALOG_TAG = "clear_data_progress";
/**
* The key for an integer value in
@@ -478,13 +482,51 @@ public class AccountManagementFragment extends PreferenceFragment
// SignOutDialogListener implementation:
+ /**
+ * This class must be public and static. Otherwise an exception will be thrown when Android
+ * recreates the fragment (e.g. after a configuration change).
+ */
+ public static class ClearDataProgressDialog extends DialogFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // Don't allow the dialog to be recreated by Android, since it wouldn't ever be
+ // dismissed after recreation.
+ if (savedInstanceState != null) dismiss();
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ setCancelable(false);
+ ProgressDialog dialog = new ProgressDialog(getActivity());
+ dialog.setTitle(getString(R.string.wiping_profile_data_title));
+ dialog.setMessage(getString(R.string.wiping_profile_data_message));
+ dialog.setIndeterminate(true);
+ return dialog;
+ }
+ }
+
@Override
public void onSignOutClicked() {
// In case the user reached this fragment without being signed in, we guard the sign out so
// we do not hit a native crash.
if (!ChromeSigninController.get(getActivity()).isSignedIn()) return;
- SigninManager.get(getActivity()).signOut(getActivity(), null);
+ final Activity activity = getActivity();
+ final DialogFragment clearDataProgressDialog = new ClearDataProgressDialog();
+ SigninManager.get(activity).signOut(null, new SigninManager.WipeDataHooks() {
+ @Override
+ public void preWipeData() {
+ clearDataProgressDialog.show(
+ activity.getFragmentManager(), CLEAR_DATA_PROGRESS_DIALOG_TAG);
+ }
+ @Override
+ public void postWipeData() {
+ if (clearDataProgressDialog.isAdded()) {
+ clearDataProgressDialog.dismissAllowingStateLoss();
+ }
+ }
+ });
AccountManagementScreenHelper.logEvent(
ProfileAccountManagementMetrics.SIGNOUT_SIGNOUT,
mGaiaServiceType);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java
index e3fbd34..6ec5687 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java
@@ -193,7 +193,7 @@ public class SigninHelper {
protected void onPostExecute(Void result) {
String renamedAccount = getNewSignedInAccountName(mContext);
if (renamedAccount == null) {
- mSigninManager.signOut(null, null);
+ mSigninManager.signOut();
} else {
validateAccountSettings(true);
}
@@ -241,7 +241,7 @@ public class SigninHelper {
// TODO(acleung): Deal with passphrase or just prompt user to re-enter it?
// Perform a sign-out with a callback to sign-in again.
- mSigninManager.signOut(null, new Runnable() {
+ mSigninManager.signOut(new Runnable() {
@Override
public void run() {
// Clear the shared perf only after signOut is successful.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
index 97026a5..ff08ec7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -6,12 +6,8 @@ package org.chromium.chrome.browser.signin;
import android.accounts.Account;
import android.app.Activity;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
-import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AlertDialog;
@@ -22,7 +18,6 @@ import org.chromium.base.Log;
import org.chromium.base.ObserverList;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.CalledByNative;
-import org.chromium.chrome.R;
import org.chromium.chrome.browser.notifications.GoogleServicesNotificationController;
import org.chromium.chrome.browser.sync.ProfileSyncService;
import org.chromium.sync.AndroidSyncSettings;
@@ -61,8 +56,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
/** Enable sync immediately. */
public static final int SIGNIN_SYNC_IMMEDIATELY = 1;
- private static final String CLEAR_DATA_PROGRESS_DIALOG_TAG = "clear_data_progress";
-
private static final String TAG = "SigninManager";
private static SigninManager sSigninManager;
@@ -88,7 +81,6 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
private SignInFlowObserver mSignInFlowObserver;
private boolean mPassive = false;
- private DialogFragment mClearDataProgressDialog;
private Runnable mSignOutCallback;
private ConfirmManagedSigninFragment mPolicyConfirmationDialog;
@@ -141,6 +133,21 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
}
/**
+ * Hooks for wiping data during sign out.
+ */
+ public interface WipeDataHooks {
+ /**
+ * Called before data is wiped.
+ */
+ public void preWipeData();
+
+ /**
+ * Called after data is wiped.
+ */
+ public void postWipeData();
+ }
+
+ /**
* A helper method for retrieving the application-wide SigninManager.
* <p/>
* Can only be accessed on the main thread.
@@ -408,17 +415,29 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
}
/**
+ * Invokes signOut with no callback or wipeDataHooks.
+ */
+ public void signOut() {
+ signOut(null, null);
+ }
+
+ /**
+ * Invokes signOut() with no wipeDataHooks.
+ */
+ public void signOut(Runnable callback) {
+ signOut(callback, null);
+ }
+
+ /**
* Signs out of Chrome.
* <p/>
* This method clears the signed-in username, stops sync and sends out a
* sign-out notification on the native side.
*
- * @param activity If not null then a progress dialog is shown over the activity until signout
- * completes, in case the account had management enabled. The activity must be valid until the
- * callback is invoked.
* @param callback Will be invoked after signout completes, if not null.
+ * @param wipeDataHooks Hooks to call during data wiping in case the account is managed.
*/
- public void signOut(Activity activity, Runnable callback) {
+ public void signOut(Runnable callback, WipeDataHooks wipeDataHooks) {
mSignOutCallback = callback;
boolean wipeData = getManagementDomain() != null;
@@ -433,7 +452,7 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
nativeSignOut(mNativeSigninManagerAndroid);
if (wipeData) {
- wipeProfileData(activity);
+ wipeProfileData(wipeDataHooks);
} else {
onSignOutDone();
}
@@ -464,14 +483,10 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
notifySignInAllowedChanged();
}
- private void wipeProfileData(Activity activity) {
- if (activity != null) {
- mClearDataProgressDialog = new ClearDataProgressDialog();
- mClearDataProgressDialog.show(activity.getFragmentManager(),
- CLEAR_DATA_PROGRESS_DIALOG_TAG);
- }
+ private void wipeProfileData(WipeDataHooks hooks) {
+ if (hooks != null) hooks.preWipeData();
// This will call back to onProfileDataWiped().
- nativeWipeProfileData(mNativeSigninManagerAndroid);
+ nativeWipeProfileData(mNativeSigninManagerAndroid, hooks);
}
/**
@@ -528,38 +543,9 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
});
}
- /**
- * This class must be public and static. Otherwise an exception will be thrown when Android
- * recreates the fragment (e.g. after a configuration change).
- */
- public static class ClearDataProgressDialog extends DialogFragment {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- if (savedInstanceState != null) {
- // Don't allow the dialog to be recreated by Android, since it wouldn't ever
- // be dismissed after recreation.
- dismiss();
- }
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- setCancelable(false);
- ProgressDialog dialog = new ProgressDialog(getActivity());
- dialog.setTitle(getString(R.string.wiping_profile_data_title));
- dialog.setMessage(getString(R.string.wiping_profile_data_message));
- dialog.setIndeterminate(true);
- return dialog;
- }
- }
-
@CalledByNative
- private void onProfileDataWiped() {
- if (mClearDataProgressDialog != null && mClearDataProgressDialog.isAdded()) {
- mClearDataProgressDialog.dismissAllowingStateLoss();
- }
- mClearDataProgressDialog = null;
+ private void onProfileDataWiped(WipeDataHooks hooks) {
+ if (hooks != null) hooks.postWipeData();
onSignOutDone();
}
@@ -613,7 +599,7 @@ public class SigninManager implements AccountTrackerService.OnSystemAccountsSeed
private native void nativeOnSignInCompleted(long nativeSigninManagerAndroid, String username);
private native void nativeSignOut(long nativeSigninManagerAndroid);
private native String nativeGetManagementDomain(long nativeSigninManagerAndroid);
- private native void nativeWipeProfileData(long nativeSigninManagerAndroid);
+ private native void nativeWipeProfileData(long nativeSigninManagerAndroid, WipeDataHooks hooks);
private native void nativeClearLastSignedInUser(long nativeSigninManagerAndroid);
private native void nativeLogInSignedInUser(long nativeSigninManagerAndroid);
private native boolean nativeIsSignedInOnNative(long nativeSigninManagerAndroid);
diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java
index afcc711..919e585 100644
--- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java
+++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java
@@ -179,7 +179,7 @@ public class SyncTestBase extends ChromeActivityTestCaseBase<ChromeActivity> {
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
- SigninManager.get(mContext).signOut(getActivity(), new Runnable() {
+ SigninManager.get(mContext).signOut(new Runnable() {
@Override
public void run() {
s.release();
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc
index f7368c3..54da285 100644
--- a/chrome/browser/android/signin/signin_manager_android.cc
+++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -181,13 +181,17 @@ SigninManagerAndroid::GetManagementDomain(JNIEnv* env,
return domain;
}
-void SigninManagerAndroid::WipeProfileData(JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
+void SigninManagerAndroid::WipeProfileData(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& obj,
+ const JavaParamRef<jobject>& callback) {
+ base::android::ScopedJavaGlobalRef<jobject> java_callback;
+ java_callback.Reset(env, callback);
+
// The ProfileDataRemover deletes itself once done.
new ProfileDataRemover(
- profile_,
- base::Bind(&SigninManagerAndroid::OnBrowsingDataRemoverDone,
- weak_factory_.GetWeakPtr()));
+ profile_, base::Bind(&SigninManagerAndroid::OnBrowsingDataRemoverDone,
+ weak_factory_.GetWeakPtr(), java_callback));
}
#if defined(ENABLE_CONFIGURATION_POLICY)
@@ -222,7 +226,8 @@ void SigninManagerAndroid::OnPolicyFetchDone(bool success) {
#endif
-void SigninManagerAndroid::OnBrowsingDataRemoverDone() {
+void SigninManagerAndroid::OnBrowsingDataRemoverDone(
+ const base::android::ScopedJavaGlobalRef<jobject>& callback) {
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile_);
model->RemoveAllUserBookmarks();
@@ -231,7 +236,8 @@ void SigninManagerAndroid::OnBrowsingDataRemoverDone() {
ClearLastSignedInUser();
Java_SigninManager_onProfileDataWiped(base::android::AttachCurrentThread(),
- java_signin_manager_.obj());
+ java_signin_manager_.obj(),
+ callback.obj());
}
void SigninManagerAndroid::ClearLastSignedInUser(
diff --git a/chrome/browser/android/signin/signin_manager_android.h b/chrome/browser/android/signin/signin_manager_android.h
index beb5879..dc4a13b 100644
--- a/chrome/browser/android/signin/signin_manager_android.h
+++ b/chrome/browser/android/signin/signin_manager_android.h
@@ -57,7 +57,8 @@ class SigninManagerAndroid {
const base::android::JavaParamRef<jobject>& obj);
void WipeProfileData(JNIEnv* env,
- const base::android::JavaParamRef<jobject>& obj);
+ const base::android::JavaParamRef<jobject>& obj,
+ const base::android::JavaParamRef<jobject>& hooks);
void LogInSignedInUser(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
@@ -81,7 +82,8 @@ class SigninManagerAndroid {
void OnPolicyFetchDone(bool success);
#endif
- void OnBrowsingDataRemoverDone();
+ void OnBrowsingDataRemoverDone(
+ const base::android::ScopedJavaGlobalRef<jobject>& callback);
void ClearLastSignedInUser();