Commit 69c469cb authored by Boris Sazonov's avatar Boris Sazonov Committed by Commit Bot

[Signin][Android] Replace WipeDataHooks with SignOutCallback

Replaces separate Runnable callback and WipeDataHooks with a single
SignOutCallback.

Bug: 906581
Change-Id: I5f26c98a90eb947de311900eecfcb9be5d6b37cd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1820738
Commit-Queue: Marc Treib <treib@chromium.org>
Auto-Submit: Boris Sazonov <bsazonov@chromium.org>
Reviewed-by: default avatarMarc Treib <treib@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699297}
parent 8961a1e1
...@@ -391,15 +391,15 @@ public class AccountManagementFragment extends PreferenceFragmentCompat ...@@ -391,15 +391,15 @@ public class AccountManagementFragment extends PreferenceFragmentCompat
final DialogFragment clearDataProgressDialog = new ClearDataProgressDialog(); final DialogFragment clearDataProgressDialog = new ClearDataProgressDialog();
IdentityServicesProvider.getSigninManager().signOut( IdentityServicesProvider.getSigninManager().signOut(
SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS, SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS, new SigninManager.SignOutCallback() {
null, new SigninManager.WipeDataHooks() {
@Override @Override
public void preWipeData() { public void preWipeData() {
clearDataProgressDialog.show( clearDataProgressDialog.show(
getFragmentManager(), CLEAR_DATA_PROGRESS_DIALOG_TAG); getFragmentManager(), CLEAR_DATA_PROGRESS_DIALOG_TAG);
} }
@Override @Override
public void postWipeData() { public void signOutComplete() {
if (clearDataProgressDialog.isAdded()) { if (clearDataProgressDialog.isAdded()) {
clearDataProgressDialog.dismissAllowingStateLoss(); clearDataProgressDialog.dismissAllowingStateLoss();
} }
......
...@@ -528,7 +528,8 @@ public class SyncAndServicesPreferences extends PreferenceFragmentCompat ...@@ -528,7 +528,8 @@ public class SyncAndServicesPreferences extends PreferenceFragmentCompat
// TODO(https://crbug.com/873116): Pass the correct reason for the signout. // TODO(https://crbug.com/873116): Pass the correct reason for the signout.
IdentityServicesProvider.getSigninManager().signOut( IdentityServicesProvider.getSigninManager().signOut(
SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS, SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS,
() -> IdentityServicesProvider.getSigninManager().signIn(account, null, null)); () -> IdentityServicesProvider.getSigninManager().signIn(account, null, null),
false);
return; return;
} }
......
...@@ -226,7 +226,7 @@ public class SigninHelper { ...@@ -226,7 +226,7 @@ public class SigninHelper {
// signed-out. // signed-out.
clearNewSignedInAccountName(); clearNewSignedInAccountName();
performResignin(newName); performResignin(newName);
}); }, false);
} }
private void performResignin(String newName) { private void performResignin(String newName) {
......
...@@ -99,18 +99,18 @@ public class SigninManager ...@@ -99,18 +99,18 @@ public class SigninManager
} }
/** /**
* Hooks for wiping data during sign out. * Callbacks for the sign-out flow.
*/ */
public interface WipeDataHooks { public interface SignOutCallback {
/** /**
* Called before data is wiped. * Called before the data wiping is started.
*/ */
void preWipeData(); default void preWipeData() {}
/** /**
* Called after data is wiped. * Called after the data is wiped.
*/ */
void postWipeData(); void signOutComplete();
} }
/** /**
...@@ -171,20 +171,16 @@ public class SigninManager ...@@ -171,20 +171,16 @@ public class SigninManager
* cleared atomically, and all final fields to be set upon initialization. * cleared atomically, and all final fields to be set upon initialization.
*/ */
private static class SignOutState { private static class SignOutState {
final Runnable mCallback; final @Nullable SignOutCallback mSignOutCallback;
final WipeDataHooks mWipeDataHooks;
final boolean mShouldWipeUserData; final boolean mShouldWipeUserData;
/** /**
* @param callback Called after sign-out finishes and all data has been cleared. * @param signOutCallback Hooks to call before/after data wiping phase of sign-out.
* @param wipeDataHooks Hooks to call before/after data wiping phase of sign-out.
* @param shouldWipeUserData Flag to wipe user data as requested by the user and enforced * @param shouldWipeUserData Flag to wipe user data as requested by the user and enforced
* for managed users. * for managed users.
*/ */
SignOutState(@Nullable Runnable callback, @Nullable WipeDataHooks wipeDataHooks, SignOutState(@Nullable SignOutCallback signOutCallback, boolean shouldWipeUserData) {
boolean shouldWipeUserData) { this.mSignOutCallback = signOutCallback;
this.mCallback = callback;
this.mWipeDataHooks = wipeDataHooks;
this.mShouldWipeUserData = shouldWipeUserData; this.mShouldWipeUserData = shouldWipeUserData;
} }
} }
...@@ -587,40 +583,30 @@ public class SigninManager ...@@ -587,40 +583,30 @@ public class SigninManager
} }
/** /**
* Invokes signOut with no callback or wipeDataHooks. * Invokes signOut with no callback.
*/ */
public void signOut(@SignoutReason int signoutSource) { public void signOut(@SignoutReason int signoutSource) {
signOut(signoutSource, null, null, false); signOut(signoutSource, null, false);
} }
/** /**
* Invokes signOut() with no wipeDataHooks. * Signs out of Chrome. This method clears the signed-in username, stops sync and sends out a
*/
public void signOut(@SignoutReason int signoutSource, Runnable callback) {
signOut(signoutSource, callback, null, false);
}
/**
* 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. * sign-out notification on the native side.
* *
* @param signoutSource describes the event driving the signout (e.g. * @param signoutSource describes the event driving the signout (e.g.
* {@link SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS}). * {@link SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS}).
* @param callback Will be invoked after sign-out completes, if not null. * @param signOutCallback Callback to notify about the sign-out progress.
* @param wipeDataHooks Hooks to call before/after data wiping phase of sign-out.
* @param forceWipeUserData Whether user selected to wipe all device data. * @param forceWipeUserData Whether user selected to wipe all device data.
*/ */
public void signOut(@SignoutReason int signoutSource, Runnable callback, public void signOut(@SignoutReason int signoutSource, SignOutCallback signOutCallback,
WipeDataHooks wipeDataHooks, boolean forceWipeUserData) { boolean forceWipeUserData) {
// Only one signOut at a time! // Only one signOut at a time!
assert mSignOutState == null; assert mSignOutState == null;
// Grab the management domain before nativeSignOut() potentially clears it. // Grab the management domain before nativeSignOut() potentially clears it.
String managementDomain = getManagementDomain(); String managementDomain = getManagementDomain();
mSignOutState = new SignOutState( mSignOutState =
callback, wipeDataHooks, forceWipeUserData || managementDomain != null); new SignOutState(signOutCallback, forceWipeUserData || managementDomain != null);
Log.d(TAG, "Signing out, management domain: " + managementDomain); Log.d(TAG, "Signing out, management domain: " + managementDomain);
// User data will be wiped in disableSyncAndWipeData(), called from // User data will be wiped in disableSyncAndWipeData(), called from
...@@ -668,7 +654,7 @@ public class SigninManager ...@@ -668,7 +654,7 @@ public class SigninManager
// native (since otherwise SigninManager.signOut would have created // native (since otherwise SigninManager.signOut would have created
// it). As sign out from native can only happen from policy code, // it). As sign out from native can only happen from policy code,
// the account is managed and the user data must be wiped. // the account is managed and the user data must be wiped.
mSignOutState = new SignOutState(null, null, true); mSignOutState = new SignOutState(null, true);
} }
Log.d(TAG, "On native signout, wipe user data: " + mSignOutState.mShouldWipeUserData); Log.d(TAG, "On native signout, wipe user data: " + mSignOutState.mShouldWipeUserData);
...@@ -676,28 +662,19 @@ public class SigninManager ...@@ -676,28 +662,19 @@ public class SigninManager
// Native sign-out must happen before resetting the account so data is deleted correctly. // Native sign-out must happen before resetting the account so data is deleted correctly.
// http://crbug.com/589028 // http://crbug.com/589028
ChromeSigninController.get().setSignedInAccountName(null); ChromeSigninController.get().setSignedInAccountName(null);
if (mSignOutState.mWipeDataHooks != null) mSignOutState.mWipeDataHooks.preWipeData(); if (mSignOutState.mSignOutCallback != null) mSignOutState.mSignOutCallback.preWipeData();
disableSyncAndWipeData(mSignOutState.mShouldWipeUserData, this::onProfileDataWiped); disableSyncAndWipeData(mSignOutState.mShouldWipeUserData, this::finishSignOut);
mAccountTrackerService.invalidateAccountSeedStatus(true); mAccountTrackerService.invalidateAccountSeedStatus(true);
} }
@VisibleForTesting void finishSignOut() {
protected void onProfileDataWiped() {
// Should be set at start of sign-out flow.
assert mSignOutState != null;
if (mSignOutState.mWipeDataHooks != null) mSignOutState.mWipeDataHooks.postWipeData();
finishSignOut();
}
private void finishSignOut() {
// Should be set at start of sign-out flow. // Should be set at start of sign-out flow.
assert mSignOutState != null; assert mSignOutState != null;
if (mSignOutState.mCallback != null) { SignOutCallback signOutCallback = mSignOutState.mSignOutCallback;
PostTask.postTask(UiThreadTaskTraits.DEFAULT, mSignOutState.mCallback);
}
mSignOutState = null; mSignOutState = null;
if (signOutCallback != null) signOutCallback.signOutComplete();
notifyCallbacksWaitingForOperation(); notifyCallbacksWaitingForOperation();
for (SignInStateObserver observer : mSignInStateObservers) { for (SignInStateObserver observer : mSignInStateObservers) {
......
...@@ -186,12 +186,7 @@ public class SyncTestRule extends ChromeActivityTestRule<ChromeActivity> { ...@@ -186,12 +186,7 @@ public class SyncTestRule extends ChromeActivityTestRule<ChromeActivity> {
final Semaphore s = new Semaphore(0); final Semaphore s = new Semaphore(0);
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
IdentityServicesProvider.getSigninManager().signOut( IdentityServicesProvider.getSigninManager().signOut(
SignoutReason.SIGNOUT_TEST, new Runnable() { SignoutReason.SIGNOUT_TEST, s::release, false);
@Override
public void run() {
s.release();
}
});
}); });
Assert.assertTrue(s.tryAcquire(SyncTestUtil.TIMEOUT_MS, TimeUnit.MILLISECONDS)); Assert.assertTrue(s.tryAcquire(SyncTestUtil.TIMEOUT_MS, TimeUnit.MILLISECONDS));
Assert.assertNull(SigninTestUtil.getCurrentAccount()); Assert.assertNull(SigninTestUtil.getCurrentAccount());
......
...@@ -146,7 +146,7 @@ public class SigninManagerTest { ...@@ -146,7 +146,7 @@ public class SigninManagerTest {
doReturn(null).when(mNativeMock).getManagementDomain(anyLong()); doReturn(null).when(mNativeMock).getManagementDomain(anyLong());
// Trigger the sign out flow // Trigger the sign out flow
mSigninManager.signOut(SignoutReason.SIGNOUT_TEST, null, null, true); mSigninManager.signOut(SignoutReason.SIGNOUT_TEST, null, true);
// PrimaryAccountCleared should be called *before* clearing any account data. // PrimaryAccountCleared should be called *before* clearing any account data.
// http://crbug.com/589028 // http://crbug.com/589028
...@@ -200,7 +200,7 @@ public class SigninManagerTest { ...@@ -200,7 +200,7 @@ public class SigninManagerTest {
mSigninManager.runAfterOperationInProgress(callCount::incrementAndGet); mSigninManager.runAfterOperationInProgress(callCount::incrementAndGet);
assertEquals(0, callCount.get()); assertEquals(0, callCount.get());
mSigninManager.onProfileDataWiped(); mSigninManager.finishSignOut();
assertFalse(mSigninManager.isOperationInProgress()); assertFalse(mSigninManager.isOperationInProgress());
assertEquals(1, callCount.get()); assertEquals(1, callCount.get());
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment