Re-register for IccStatus changes on SIM_STATE_CHANGED.
Anything that relies on Phone.getIccCard() needs to re-query the
card on SIM_STATE_CHANGED as in the absence of a SIM a dummy
object is returned from Phone.
Test: manual (verified from logs that re-registration is done
with real IccCard object after SIM state changed)
Bug: 116190181
Change-Id: I11221e2109d650be96b7e5d582310f01a199a50d
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index a5cd06b..3d82e74 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -598,14 +598,22 @@
airplaneMode = AIRPLANE_ON;
}
handleAirplaneModeChange(context, airplaneMode);
- } else if ((action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) &&
- (mPUKEntryActivity != null)) {
- // if an attempt to un-PUK-lock the device was made, while we're
- // receiving this state change notification, notify the handler.
- // NOTE: This is ONLY triggered if an attempt to un-PUK-lock has
- // been attempted.
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_SIM_STATE_CHANGED,
- intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)));
+ } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
+ // re-register as it may be a new IccCard
+ int phoneId = intent.getIntExtra(PhoneConstants.PHONE_KEY,
+ SubscriptionManager.INVALID_PHONE_INDEX);
+ if (SubscriptionManager.isValidPhoneId(phoneId)) {
+ PhoneUtils.unregisterIccStatus(mHandler, phoneId);
+ PhoneUtils.registerIccStatus(mHandler, EVENT_SIM_NETWORK_LOCKED, phoneId);
+ }
+ if (mPUKEntryActivity != null) {
+ // if an attempt to un-PUK-lock the device was made, while we're
+ // receiving this state change notification, notify the handler.
+ // NOTE: This is ONLY triggered if an attempt to un-PUK-lock has
+ // been attempted.
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_SIM_STATE_CHANGED,
+ intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)));
+ }
} else if (action.equals(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) {
String newPhone = intent.getStringExtra(PhoneConstants.PHONE_NAME_KEY);
Log.d(LOG_TAG, "Radio technology switched. Now " + newPhone + " is active.");
diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index c1bd1b6..6f1f0a6 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -19,7 +19,6 @@
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
-import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
@@ -1284,6 +1283,34 @@
}
/**
+ * Register ICC status for all phones.
+ */
+ static final void registerIccStatus(Handler handler, int event, int phoneId) {
+ Phone[] phones = PhoneFactory.getPhones();
+ IccCard sim = phones[phoneId].getIccCard();
+ if (sim != null) {
+ if (VDBG) {
+ Log.v(LOG_TAG, "register for ICC status, phone " + phones[phoneId].getPhoneId());
+ }
+ sim.registerForNetworkLocked(handler, event, phones[phoneId]);
+ }
+ }
+
+ /**
+ * Unregister ICC status for a specific phone.
+ */
+ static final void unregisterIccStatus(Handler handler, int phoneId) {
+ Phone[] phones = PhoneFactory.getPhones();
+ IccCard sim = phones[phoneId].getIccCard();
+ if (sim != null) {
+ if (VDBG) {
+ Log.v(LOG_TAG, "unregister for ICC status, phone " + phones[phoneId].getPhoneId());
+ }
+ sim.unregisterForNetworkLocked(handler);
+ }
+ }
+
+ /**
* Set the radio power on/off state for all phones.
*
* @param enabled true means on, false means off.