From a2402aba8338e4c8514ab79012be6687895c9b01 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Tue, 15 Jun 2021 19:23:45 +0800 Subject: [PATCH] [Settings] Prevent crash from abnormal behavior. - The problem is user remove SIM when stop in ApnSettings page, and do unexpected operation. - To figure out this problem, listen SIM absent event and make activity finish at this moment. Bug: 189909956 Test: Manual test. Change-Id: I179c708debcbc31ba9a93e4e434ae810051f5004 --- .../settings/network/apn/ApnSettings.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/network/apn/ApnSettings.java b/src/com/android/settings/network/apn/ApnSettings.java index 02d9b3d1f35..4df2e5ee38c 100755 --- a/src/com/android/settings/network/apn/ApnSettings.java +++ b/src/com/android/settings/network/apn/ApnSettings.java @@ -88,6 +88,13 @@ public class ApnSettings extends RestrictedSettingsFragment Telephony.Carriers.EDITED_STATUS, }; + /** Copied from {@code com.android.internal.telephony.TelephonyIntents} */ + private static final String ACTION_SIM_STATE_CHANGED = + "android.intent.action.SIM_STATE_CHANGED"; + /** Copied from {@code com.android.internal.telephony.IccCardConstants} */ + public static final String INTENT_KEY_ICC_STATE = "ss"; + public static final String INTENT_VALUE_ICC_ABSENT = "ABSENT"; + private static final int ID_INDEX = 0; private static final int NAME_INDEX = 1; private static final int APN_INDEX = 2; @@ -151,7 +158,16 @@ public class ApnSettings extends RestrictedSettingsFragment private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals( + String action = intent.getAction(); + if (ACTION_SIM_STATE_CHANGED.equals(action) + && intent.getStringExtra(INTENT_KEY_ICC_STATE) + .equals(INTENT_VALUE_ICC_ABSENT)) { + final SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); + if (sm != null && !sm.isActiveSubscriptionId(mSubId)) { + Log.d(TAG, "Due to SIM absent, closes APN settings page"); + finish(); + } + } else if (intent.getAction().equals( TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED)) { if (mRestoreDefaultApnMode) { return; @@ -201,8 +217,9 @@ public class ApnSettings extends RestrictedSettingsFragment mSubId = activity.getIntent().getIntExtra(SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); mPhoneId = SubscriptionUtil.getPhoneId(activity, mSubId); - mIntentFilter = new IntentFilter( - TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED); + mIntentFilter = new IntentFilter(); + mIntentFilter.addAction(TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED); + mIntentFilter.addAction(ACTION_SIM_STATE_CHANGED); setIfOnlyAvailableForAdmins(true);