From 6a80c8282d5dcb3749573baa2f3769204859307a Mon Sep 17 00:00:00 2001 From: yueg Date: Tue, 5 Sep 2017 11:31:47 -0700 Subject: Fix bubble crash when dismiss audio route selector dialog. When AudioRouteSelectorDialogFragment tries to call onAudioRouteSelectorDismiss() on its parent AudioRouteSelectorActivity, the parent might already finish, which causes NPE. We should make sure the fragment is dismissed and removed before the activity finished. We do it when activity onPause because we don't expect it to resume. Test: AudioRouteSelectorDialogFragmentTest PiperOrigin-RevId: 167607068 Change-Id: Ifd2efcc92eb45262da2c6441bfac8119799d78f2 --- .../android/incallui/AudioRouteSelectorActivity.java | 18 +++++++++++++++++- .../audioroute/AudioRouteSelectorDialogFragment.java | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'java') diff --git a/java/com/android/incallui/AudioRouteSelectorActivity.java b/java/com/android/incallui/AudioRouteSelectorActivity.java index dfd4d1abf..f0ae79bc2 100644 --- a/java/com/android/incallui/AudioRouteSelectorActivity.java +++ b/java/com/android/incallui/AudioRouteSelectorActivity.java @@ -32,7 +32,7 @@ public class AudioRouteSelectorActivity extends FragmentActivity protected void onCreate(@Nullable Bundle bundle) { super.onCreate(bundle); AudioRouteSelectorDialogFragment.newInstance(AudioModeProvider.getInstance().getAudioState()) - .show(getSupportFragmentManager(), null); + .show(getSupportFragmentManager(), AudioRouteSelectorDialogFragment.TAG); } @Override @@ -44,4 +44,20 @@ public class AudioRouteSelectorActivity extends FragmentActivity public void onAudioRouteSelectorDismiss() { finish(); } + + @Override + protected void onPause() { + super.onPause(); + AudioRouteSelectorDialogFragment audioRouteSelectorDialogFragment = + (AudioRouteSelectorDialogFragment) + getSupportFragmentManager().findFragmentByTag(AudioRouteSelectorDialogFragment.TAG); + // If Android back button is pressed, the fragment is dismissed and removed. If home button is + // pressed, we have to manually dismiss the fragment here. The fragment is also removed when + // dismissed. + if (audioRouteSelectorDialogFragment != null) { + audioRouteSelectorDialogFragment.dismiss(); + } + // We don't expect the activity to resume + finish(); + } } diff --git a/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java b/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java index c7a9d6332..860d2d282 100644 --- a/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java +++ b/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java @@ -37,6 +37,7 @@ import com.android.dialer.common.LogUtil; /** Shows picker for audio routes */ public class AudioRouteSelectorDialogFragment extends BottomSheetDialogFragment { + public static final String TAG = "AudioRouteSelectorDialogFragment"; private static final String ARG_AUDIO_STATE = "audio_state"; /** Called when an audio route is picked */ -- cgit v1.2.3