diff options
author | maxbogue <maxbogue@chromium.org> | 2015-12-16 11:06:51 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-16 19:07:59 +0000 |
commit | 7c686c2811572f9169a69fa74b4309432ccbfb3c (patch) | |
tree | 09d5a128ac53478df8ea40380dcc13b232239d10 | |
parent | 004c7b4707e8f57bb9d5668812f7826b484f0893 (diff) | |
download | chromium_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}
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(); |