Commit 0477a308 authored by Boris Sazonov's avatar Boris Sazonov Committed by Commit Bot

[Signin] Don't call ConfirmSyncDataStateMachine callback on destruction

This CL fixes a crash on older versions of Android that happens when
ConfirmSyncDataStateMachine.cancel invokes a cancellation callback and
this callback ends up accessing the activity that is being destroyed.
This CL addresses the issue by suppressing the cancellation callback
when ConfirmSyncDataStateMachine is cancelled because of activity
destruction.

Bug: 806138
Change-Id: I55ac2e749d417fddddb3727a6781ecf58c519d1b
Reviewed-on: https://chromium-review.googlesource.com/895590Reviewed-by: default avatarBernhard Bauer <bauerb@chromium.org>
Commit-Queue: Boris Sazonov <bsazonov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#533662}
parent 776e6073
......@@ -321,7 +321,7 @@ public class AccountSigninView extends FrameLayout {
@Override
protected void onDetachedFromWindow() {
if (mConfirmSyncDataStateMachine != null) {
mConfirmSyncDataStateMachine.cancel(false /* dismissDialogs */);
mConfirmSyncDataStateMachine.cancel(/* isBeingDestroyed = */ true);
mConfirmSyncDataStateMachine = null;
}
mProfileDataCache.removeObserver(mProfileDataCacheObserver);
......@@ -434,7 +434,7 @@ public class AccountSigninView extends FrameLayout {
if (selectedAccountChanged && mConfirmSyncDataStateMachine != null) {
// Any dialogs that may have been showing are now invalid (they were created
// for the previously selected account).
mConfirmSyncDataStateMachine.cancel(true /* dismissDialogs */);
mConfirmSyncDataStateMachine.cancel(/* isBeingDestroyed = */ false);
mConfirmSyncDataStateMachine = null;
}
......
......@@ -112,17 +112,18 @@ public class ConfirmSyncDataStateMachine
/**
* Cancels this state machine, dismissing any dialogs being shown.
* @param dismissDialogs whether all shown dialogs should dismissed. Should be false if
* enclosing activity is being destroyed (all dialogs will be dismissed anyway).
* @param isBeingDestroyed whether state machine is being cancelled because enclosing UI object
* is being destroyed. This state machine will not invoke callbacks or dismiss dialogs
* if isBeingDestroyed is true.
*/
public void cancel(boolean dismissDialogs) {
public void cancel(boolean isBeingDestroyed) {
ThreadUtils.assertOnUiThread();
cancelTimeout();
mState = DONE;
mCallback.onCancel();
if (!dismissDialogs) return;
if (isBeingDestroyed) return;
mCallback.onCancel();
mDelegate.dismissAllDialogs();
dismissDialog(ConfirmImportSyncDataDialog.CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG);
dismissDialog(ConfirmManagedSyncDataDialog.CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG);
......@@ -272,7 +273,7 @@ public class ConfirmSyncDataStateMachine
// ConfirmImportSyncDataDialog.Listener & ConfirmManagedSyncDataDialog.Listener implementation.
@Override
public void onCancel() {
cancel(true);
cancel(false);
}
}
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