From 09a185dbca250b2030e4ff2d68eed0060fa6ec8f Mon Sep 17 00:00:00 2001 From: Jeremy Goldman Date: Thu, 13 May 2021 11:09:44 +0800 Subject: [PATCH] Store whether the Dialog was previously dismissed The dialog can be dismissed by either the framework automatically (i.e. when the screen is rotated) or when the subscriptions change. If both of these things happen while the class is not deleted, then dismiss() will be called twice and there will be a crash Bug: 184899699 Test: atest -c SettingsUnitTests Change-Id: Ibaef59696feb566664a424f65f806396f02497e8 --- .../android/settings/sim/PreferredSimDialogFragment.java | 6 ++++++ src/com/android/settings/sim/SimDialogFragment.java | 6 ++++++ src/com/android/settings/sim/SimListDialogFragment.java | 8 +++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/sim/PreferredSimDialogFragment.java b/src/com/android/settings/sim/PreferredSimDialogFragment.java index c4a9484f653..7786dd1297b 100644 --- a/src/com/android/settings/sim/PreferredSimDialogFragment.java +++ b/src/com/android/settings/sim/PreferredSimDialogFragment.java @@ -23,6 +23,7 @@ import android.content.DialogInterface; import android.os.Bundle; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -81,7 +82,12 @@ public class PreferredSimDialogFragment extends SimDialogFragment implements } private void updateDialog(AlertDialog dialog) { + Log.d(TAG, "Dialog updated, dismiss status: " + mWasDismissed); + final SubscriptionInfo info = getPreferredSubscription(); + if (mWasDismissed) { + return; + } if (info == null) { dismiss(); return; diff --git a/src/com/android/settings/sim/SimDialogFragment.java b/src/com/android/settings/sim/SimDialogFragment.java index 362fccc75ab..889f0621d81 100644 --- a/src/com/android/settings/sim/SimDialogFragment.java +++ b/src/com/android/settings/sim/SimDialogFragment.java @@ -19,6 +19,7 @@ package com.android.settings.sim; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; +import android.util.Log; import androidx.annotation.NonNull; @@ -34,6 +35,7 @@ public abstract class SimDialogFragment extends InstrumentedDialogFragment imple private static final String KEY_DIALOG_TYPE = "dialog_type"; private SubscriptionsChangeListener mChangeListener; + protected boolean mWasDismissed = false; protected static Bundle initArguments(int dialogType, int titleResId) { final Bundle args = new Bundle(); @@ -53,6 +55,8 @@ public abstract class SimDialogFragment extends InstrumentedDialogFragment imple @Override public void onAttach(Context context) { super.onAttach(context); + Log.d(TAG, "Dialog Attached."); + mWasDismissed = false; mChangeListener = new SubscriptionsChangeListener(context, this); } @@ -70,6 +74,8 @@ public abstract class SimDialogFragment extends InstrumentedDialogFragment imple @Override public void onDismiss(@NonNull DialogInterface dialog) { + Log.d(TAG, "Dialog Dismissed."); + mWasDismissed = true; super.onDismiss(dialog); final SimDialogActivity activity = (SimDialogActivity) getActivity(); if (activity != null && !activity.isFinishing()) { diff --git a/src/com/android/settings/sim/SimListDialogFragment.java b/src/com/android/settings/sim/SimListDialogFragment.java index 2e3cfc7dbb2..2681d7b62bb 100644 --- a/src/com/android/settings/sim/SimListDialogFragment.java +++ b/src/com/android/settings/sim/SimListDialogFragment.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -49,6 +50,7 @@ import java.util.List; */ public class SimListDialogFragment extends SimDialogFragment implements DialogInterface.OnClickListener { + private static final String TAG = "SimListDialogFragment"; protected static final String KEY_INCLUDE_ASK_EVERY_TIME = "include_ask_every_time"; protected SelectSubscriptionAdapter mAdapter; @@ -101,9 +103,13 @@ public class SimListDialogFragment extends SimDialogFragment implements @Override public void updateDialog() { + Log.d(TAG, "Dialog updated, dismiss status: " + mWasDismissed); + List currentSubscriptions = getCurrentSubscriptions(); if (currentSubscriptions == null) { - dismiss(); + if (!mWasDismissed) { + dismiss(); + } return; } if (getArguments().getBoolean(KEY_INCLUDE_ASK_EVERY_TIME)) {