Loading src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java +41 −21 Original line number Diff line number Diff line Loading @@ -73,7 +73,10 @@ public class SubscriptionInfoUpdater extends Handler { private static final int EVENT_SIM_IO_ERROR = 6; private static final int EVENT_SIM_UNKNOWN = 7; private static final int EVENT_SIM_RESTRICTED = 8; private static final int EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS = 9; private static final int EVENT_SIM_NOT_READY = 9; private static final int EVENT_SIM_READY = 10; private static final int EVENT_SIM_IMSI = 11; private static final int EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS = 12; private static final String ICCID_STRING_FOR_NO_SIM = ""; /** Loading Loading @@ -125,8 +128,8 @@ public class SubscriptionInfoUpdater extends Handler { mEuiccManager = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE); mPackageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); intentFilter.addAction(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); IntentFilter intentFilter = new IntentFilter( IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mContext.registerReceiver(sReceiver, intentFilter); mCarrierServiceBindHelper = new CarrierServiceBindHelper(mContext); Loading Loading @@ -173,8 +176,7 @@ public class SubscriptionInfoUpdater extends Handler { String action = intent.getAction(); logd("Action: " + action); if (!action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED) && !action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { if (!action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { return; } Loading @@ -182,16 +184,14 @@ public class SubscriptionInfoUpdater extends Handler { SubscriptionManager.INVALID_SIM_SLOT_INDEX); logd("slotIndex: " + slotIndex); if (!SubscriptionManager.isValidSlotIndex(slotIndex)) { logd("ACTION_SIM_STATE_CHANGED contains invalid slotIndex: " + slotIndex); logd("ACTION_INTERNAL_SIM_STATE_CHANGED contains invalid slotIndex: " + slotIndex); return; } String simStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); logd("simStatus: " + simStatus); // TODO: All of the below should be converted to ACTION_INTERNAL_SIM_STATE_CHANGED to // ensure that the SubscriptionInfo is updated before the broadcasts are sent out. if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { if (action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_ABSENT, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_UNKNOWN.equals(simStatus)) { Loading @@ -201,22 +201,17 @@ public class SubscriptionInfoUpdater extends Handler { } else if (IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_RESTRICTED, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_NOT_READY.equals(simStatus)) { // ICC_NOT_READY is a terminal state for an eSIM on the boot profile. At this // phase, the subscription list is accessible. // TODO(b/64216093): Clean up this special case, likely by treating NOT_READY // as equivalent to ABSENT, once the rest of the system can handle it. Currently // this breaks SystemUI which shows a "No SIM" icon. sendEmptyMessage(EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS); } else { logd("Ignoring simStatus: " + simStatus); } } else if (action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(simStatus)) { sendEmptyMessage(EVENT_SIM_NOT_READY); } else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(simStatus)) { String reason = intent.getStringExtra( IccCardConstants.INTENT_KEY_LOCKED_REASON); sendMessage(obtainMessage(EVENT_SIM_LOCKED, slotIndex, -1, reason)); } else if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_LOADED, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_READY, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_IMSI.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_IMSI, slotIndex, -1)); } else { logd("Ignoring simStatus: " + simStatus); } Loading Loading @@ -268,6 +263,7 @@ public class SubscriptionInfoUpdater extends Handler { case EVENT_SIM_UNKNOWN: updateCarrierServices(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_UNKNOWN); broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_UNKNOWN, null); break; case EVENT_SIM_IO_ERROR: Loading @@ -276,8 +272,29 @@ public class SubscriptionInfoUpdater extends Handler { case EVENT_SIM_RESTRICTED: updateCarrierServices(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED); broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED, IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED); break; case EVENT_SIM_READY: broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_READY, null); break; case EVENT_SIM_IMSI: broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_IMSI, null); break; case EVENT_SIM_NOT_READY: broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_NOT_READY, null); // intentional fall through // ICC_NOT_READY is a terminal state for an eSIM on the boot profile. At this // phase, the subscription list is accessible. // TODO(b/64216093): Clean up this special case, likely by treating NOT_READY // as equivalent to ABSENT, once the rest of the system can handle it. Currently // this breaks SystemUI which shows a "No SIM" icon. case EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS: if (updateEmbeddedSubscriptions()) { SubscriptionController.getInstance().notifySubscriptionInfoChanged(); Loading Loading @@ -457,6 +474,7 @@ public class SubscriptionInfoUpdater extends Handler { updateSubscriptionInfoByIccId(); } updateCarrierServices(slotId, IccCardConstants.INTENT_VALUE_ICC_ABSENT); broadcastSimStateChanged(slotId, IccCardConstants.INTENT_VALUE_ICC_ABSENT, null); } private void handleSimError(int slotId) { Loading @@ -468,6 +486,8 @@ public class SubscriptionInfoUpdater extends Handler { updateSubscriptionInfoByIccId(); } updateCarrierServices(slotId, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR); broadcastSimStateChanged(slotId, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR); } /** Loading src/java/com/android/internal/telephony/uicc/IccCardProxy.java +15 −45 Original line number Diff line number Diff line Loading @@ -36,11 +36,9 @@ import com.android.internal.telephony.CommandsInterface.RadioState; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.IntentBroadcaster; import com.android.internal.telephony.MccTable; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState; import com.android.internal.telephony.uicc.IccCardStatus.CardState; Loading Loading @@ -230,11 +228,14 @@ public class IccCardProxy extends Handler implements IccCard { mUiccCard.registerForCarrierPrivilegeRulesLoaded( this, EVENT_CARRIER_PRIVILEGES_LOADED, null); } else { onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); } break; case EVENT_IMSI_READY: broadcastIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_IMSI, null); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_IMSI, null); break; case EVENT_NETWORK_LOCKED: mNetworkLockedRegistrants.notifyRegistrants(); Loading @@ -256,7 +257,9 @@ public class IccCardProxy extends Handler implements IccCard { if (mUiccCard != null) { mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this); } onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); break; default: Loading @@ -265,10 +268,6 @@ public class IccCardProxy extends Handler implements IccCard { } } private void onRecordsLoaded() { broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); } private void updateIccAvailability() { synchronized (mLock) { UiccSlot newSlot = mUiccController.getUiccSlotForPhone(mPhoneId); Loading Loading @@ -418,30 +417,6 @@ public class IccCardProxy extends Handler implements IccCard { } } private void broadcastIccStateChangedIntent(String value, String reason) { synchronized (mLock) { if (mPhoneId == null || !SubscriptionManager.isValidSlotIndex(mPhoneId)) { loge("broadcastIccStateChangedIntent: mPhoneId=" + mPhoneId + " is invalid; Return!!"); return; } Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); // TODO - we'd like this intent to have a single snapshot of all sim state, // but until then this should not use REPLACE_PENDING or we may lose // information // intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId); log("broadcastIccStateChangedIntent intent ACTION_SIM_STATE_CHANGED value=" + value + " reason=" + reason + " for mPhoneId=" + mPhoneId); IntentBroadcaster.getInstance().broadcastStickyIntent(intent, mPhoneId); } } private void broadcastInternalIccStateChangedIntent(String value, String reason) { synchronized (mLock) { if (mPhoneId == null) { Loading @@ -450,13 +425,14 @@ public class IccCardProxy extends Handler implements IccCard { } Intent intent = new Intent(ACTION_INTERNAL_SIM_STATE_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT | Intent.FLAG_RECEIVER_FOREGROUND); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); intent.putExtra(PhoneConstants.PHONE_KEY, mPhoneId); // SubId may not be valid. log("Sending intent ACTION_INTERNAL_SIM_STATE_CHANGED value=" + value log("broadcastInternalIccStateChangedIntent: Sending intent " + "ACTION_INTERNAL_SIM_STATE_CHANGED value = " + value + " for mPhoneId : " + mPhoneId); ActivityManager.broadcastStickyIntent(intent, UserHandle.USER_ALL); } Loading @@ -477,15 +453,8 @@ public class IccCardProxy extends Handler implements IccCard { log("setExternalState: set mPhoneId=" + mPhoneId + " mExternalState=" + mExternalState); mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString()); // For locked states, we should be sending internal broadcast. if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals( getIccStateIntentString(mExternalState))) { broadcastInternalIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } else { broadcastIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } } } Loading Loading @@ -543,6 +512,7 @@ public class IccCardProxy extends Handler implements IccCard { case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR; case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED; //case LOADED: return IccCardConstants.INTENT_VALUE_ICC_LOADED; default: return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN; } } Loading src/java/com/android/internal/telephony/uicc/UiccProfile.java +11 −43 Original line number Diff line number Diff line Loading @@ -51,13 +51,11 @@ import com.android.internal.R; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IntentBroadcaster; import com.android.internal.telephony.MccTable; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.cat.CatService; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; import com.android.internal.telephony.uicc.IccCardStatus.CardState; Loading Loading @@ -270,7 +268,9 @@ public class UiccProfile extends Handler implements IccCard { mUiccCard.registerForCarrierPrivilegeRulesLoaded( this, EVENT_CARRIER_PRIVILEGES_LOADED, null); } else { onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); } break; Loading @@ -295,7 +295,9 @@ public class UiccProfile extends Handler implements IccCard { if (mUiccCard != null) { mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this); } onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); break; default: Loading @@ -304,10 +306,6 @@ public class UiccProfile extends Handler implements IccCard { } } private void onRecordsLoaded() { broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); } private void updateIccAvailability() { synchronized (mLock) { UiccCardApplication newApp; Loading Loading @@ -421,35 +419,11 @@ public class UiccProfile extends Handler implements IccCard { } } private void broadcastIccStateChangedIntent(String value, String reason) { synchronized (mLock) { if (!SubscriptionManager.isValidSlotIndex(mPhoneId)) { loge("broadcastIccStateChangedIntent: mPhoneId=" + mPhoneId + " is invalid; Return!!"); return; } Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); // TODO - we'd like this intent to have a single snapshot of all sim state, // but until then this should not use REPLACE_PENDING or we may lose // information // intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId); log("broadcastIccStateChangedIntent intent ACTION_SIM_STATE_CHANGED value=" + value + " reason=" + reason + " for mPhoneId=" + mPhoneId); IntentBroadcaster.getInstance().broadcastStickyIntent(intent, mPhoneId); } } private void broadcastInternalIccStateChangedIntent(String value, String reason) { synchronized (mLock) { Intent intent = new Intent(ACTION_INTERNAL_SIM_STATE_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT | Intent.FLAG_RECEIVER_FOREGROUND); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); Loading @@ -475,15 +449,8 @@ public class UiccProfile extends Handler implements IccCard { log("setExternalState: set mPhoneId=" + mPhoneId + " mExternalState=" + mExternalState); mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString()); // For locked states, we should be sending internal broadcast. if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals( getIccStateIntentString(mExternalState))) { broadcastInternalIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } else { broadcastIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } } } Loading Loading @@ -545,6 +512,7 @@ public class UiccProfile extends Handler implements IccCard { case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR; case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED; //case LOADED: return IccCardConstants.INTENT_VALUE_ICC_LOADED; default: return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN; } } Loading tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java +4 −4 Original line number Diff line number Diff line Loading @@ -167,7 +167,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { doReturn(Arrays.asList(mSubInfo)).when(mSubscriptionController) .getSubInfoUsingSlotIndexWithCheck(eq(FAKE_SUB_ID_1), anyBoolean(), anyString()); doReturn(new int[]{FAKE_SUB_ID_1}).when(mSubscriptionController).getActiveSubIdList(); Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_ABSENT); mIntent.putExtra(PhoneConstants.PHONE_KEY, FAKE_SUB_ID_1); Loading @@ -189,7 +189,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { @Test @SmallTest public void testSimUnknown() throws Exception { Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_UNKNOWN); mIntent.putExtra(PhoneConstants.PHONE_KEY, FAKE_SUB_ID_1); Loading @@ -209,7 +209,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { @Test @SmallTest public void testSimError() throws Exception { Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR); mIntent.putExtra(PhoneConstants.PHONE_KEY, 0); Loading @@ -228,7 +228,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { @Test @SmallTest public void testWrongSimState() throws Exception { Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_IMSI); mIntent.putExtra(PhoneConstants.PHONE_KEY, 2); Loading Loading
src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java +41 −21 Original line number Diff line number Diff line Loading @@ -73,7 +73,10 @@ public class SubscriptionInfoUpdater extends Handler { private static final int EVENT_SIM_IO_ERROR = 6; private static final int EVENT_SIM_UNKNOWN = 7; private static final int EVENT_SIM_RESTRICTED = 8; private static final int EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS = 9; private static final int EVENT_SIM_NOT_READY = 9; private static final int EVENT_SIM_READY = 10; private static final int EVENT_SIM_IMSI = 11; private static final int EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS = 12; private static final String ICCID_STRING_FOR_NO_SIM = ""; /** Loading Loading @@ -125,8 +128,8 @@ public class SubscriptionInfoUpdater extends Handler { mEuiccManager = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE); mPackageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); intentFilter.addAction(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); IntentFilter intentFilter = new IntentFilter( IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mContext.registerReceiver(sReceiver, intentFilter); mCarrierServiceBindHelper = new CarrierServiceBindHelper(mContext); Loading Loading @@ -173,8 +176,7 @@ public class SubscriptionInfoUpdater extends Handler { String action = intent.getAction(); logd("Action: " + action); if (!action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED) && !action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { if (!action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { return; } Loading @@ -182,16 +184,14 @@ public class SubscriptionInfoUpdater extends Handler { SubscriptionManager.INVALID_SIM_SLOT_INDEX); logd("slotIndex: " + slotIndex); if (!SubscriptionManager.isValidSlotIndex(slotIndex)) { logd("ACTION_SIM_STATE_CHANGED contains invalid slotIndex: " + slotIndex); logd("ACTION_INTERNAL_SIM_STATE_CHANGED contains invalid slotIndex: " + slotIndex); return; } String simStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); logd("simStatus: " + simStatus); // TODO: All of the below should be converted to ACTION_INTERNAL_SIM_STATE_CHANGED to // ensure that the SubscriptionInfo is updated before the broadcasts are sent out. if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { if (action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_ABSENT, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_UNKNOWN.equals(simStatus)) { Loading @@ -201,22 +201,17 @@ public class SubscriptionInfoUpdater extends Handler { } else if (IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_RESTRICTED, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_NOT_READY.equals(simStatus)) { // ICC_NOT_READY is a terminal state for an eSIM on the boot profile. At this // phase, the subscription list is accessible. // TODO(b/64216093): Clean up this special case, likely by treating NOT_READY // as equivalent to ABSENT, once the rest of the system can handle it. Currently // this breaks SystemUI which shows a "No SIM" icon. sendEmptyMessage(EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS); } else { logd("Ignoring simStatus: " + simStatus); } } else if (action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(simStatus)) { sendEmptyMessage(EVENT_SIM_NOT_READY); } else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(simStatus)) { String reason = intent.getStringExtra( IccCardConstants.INTENT_KEY_LOCKED_REASON); sendMessage(obtainMessage(EVENT_SIM_LOCKED, slotIndex, -1, reason)); } else if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_LOADED, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_READY, slotIndex, -1)); } else if (IccCardConstants.INTENT_VALUE_ICC_IMSI.equals(simStatus)) { sendMessage(obtainMessage(EVENT_SIM_IMSI, slotIndex, -1)); } else { logd("Ignoring simStatus: " + simStatus); } Loading Loading @@ -268,6 +263,7 @@ public class SubscriptionInfoUpdater extends Handler { case EVENT_SIM_UNKNOWN: updateCarrierServices(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_UNKNOWN); broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_UNKNOWN, null); break; case EVENT_SIM_IO_ERROR: Loading @@ -276,8 +272,29 @@ public class SubscriptionInfoUpdater extends Handler { case EVENT_SIM_RESTRICTED: updateCarrierServices(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED); broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED, IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED); break; case EVENT_SIM_READY: broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_READY, null); break; case EVENT_SIM_IMSI: broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_IMSI, null); break; case EVENT_SIM_NOT_READY: broadcastSimStateChanged(msg.arg1, IccCardConstants.INTENT_VALUE_ICC_NOT_READY, null); // intentional fall through // ICC_NOT_READY is a terminal state for an eSIM on the boot profile. At this // phase, the subscription list is accessible. // TODO(b/64216093): Clean up this special case, likely by treating NOT_READY // as equivalent to ABSENT, once the rest of the system can handle it. Currently // this breaks SystemUI which shows a "No SIM" icon. case EVENT_REFRESH_EMBEDDED_SUBSCRIPTIONS: if (updateEmbeddedSubscriptions()) { SubscriptionController.getInstance().notifySubscriptionInfoChanged(); Loading Loading @@ -457,6 +474,7 @@ public class SubscriptionInfoUpdater extends Handler { updateSubscriptionInfoByIccId(); } updateCarrierServices(slotId, IccCardConstants.INTENT_VALUE_ICC_ABSENT); broadcastSimStateChanged(slotId, IccCardConstants.INTENT_VALUE_ICC_ABSENT, null); } private void handleSimError(int slotId) { Loading @@ -468,6 +486,8 @@ public class SubscriptionInfoUpdater extends Handler { updateSubscriptionInfoByIccId(); } updateCarrierServices(slotId, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR); broadcastSimStateChanged(slotId, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR); } /** Loading
src/java/com/android/internal/telephony/uicc/IccCardProxy.java +15 −45 Original line number Diff line number Diff line Loading @@ -36,11 +36,9 @@ import com.android.internal.telephony.CommandsInterface.RadioState; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.IntentBroadcaster; import com.android.internal.telephony.MccTable; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState; import com.android.internal.telephony.uicc.IccCardStatus.CardState; Loading Loading @@ -230,11 +228,14 @@ public class IccCardProxy extends Handler implements IccCard { mUiccCard.registerForCarrierPrivilegeRulesLoaded( this, EVENT_CARRIER_PRIVILEGES_LOADED, null); } else { onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); } break; case EVENT_IMSI_READY: broadcastIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_IMSI, null); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_IMSI, null); break; case EVENT_NETWORK_LOCKED: mNetworkLockedRegistrants.notifyRegistrants(); Loading @@ -256,7 +257,9 @@ public class IccCardProxy extends Handler implements IccCard { if (mUiccCard != null) { mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this); } onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); break; default: Loading @@ -265,10 +268,6 @@ public class IccCardProxy extends Handler implements IccCard { } } private void onRecordsLoaded() { broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); } private void updateIccAvailability() { synchronized (mLock) { UiccSlot newSlot = mUiccController.getUiccSlotForPhone(mPhoneId); Loading Loading @@ -418,30 +417,6 @@ public class IccCardProxy extends Handler implements IccCard { } } private void broadcastIccStateChangedIntent(String value, String reason) { synchronized (mLock) { if (mPhoneId == null || !SubscriptionManager.isValidSlotIndex(mPhoneId)) { loge("broadcastIccStateChangedIntent: mPhoneId=" + mPhoneId + " is invalid; Return!!"); return; } Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); // TODO - we'd like this intent to have a single snapshot of all sim state, // but until then this should not use REPLACE_PENDING or we may lose // information // intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId); log("broadcastIccStateChangedIntent intent ACTION_SIM_STATE_CHANGED value=" + value + " reason=" + reason + " for mPhoneId=" + mPhoneId); IntentBroadcaster.getInstance().broadcastStickyIntent(intent, mPhoneId); } } private void broadcastInternalIccStateChangedIntent(String value, String reason) { synchronized (mLock) { if (mPhoneId == null) { Loading @@ -450,13 +425,14 @@ public class IccCardProxy extends Handler implements IccCard { } Intent intent = new Intent(ACTION_INTERNAL_SIM_STATE_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT | Intent.FLAG_RECEIVER_FOREGROUND); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); intent.putExtra(PhoneConstants.PHONE_KEY, mPhoneId); // SubId may not be valid. log("Sending intent ACTION_INTERNAL_SIM_STATE_CHANGED value=" + value log("broadcastInternalIccStateChangedIntent: Sending intent " + "ACTION_INTERNAL_SIM_STATE_CHANGED value = " + value + " for mPhoneId : " + mPhoneId); ActivityManager.broadcastStickyIntent(intent, UserHandle.USER_ALL); } Loading @@ -477,15 +453,8 @@ public class IccCardProxy extends Handler implements IccCard { log("setExternalState: set mPhoneId=" + mPhoneId + " mExternalState=" + mExternalState); mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString()); // For locked states, we should be sending internal broadcast. if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals( getIccStateIntentString(mExternalState))) { broadcastInternalIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } else { broadcastIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } } } Loading Loading @@ -543,6 +512,7 @@ public class IccCardProxy extends Handler implements IccCard { case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR; case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED; //case LOADED: return IccCardConstants.INTENT_VALUE_ICC_LOADED; default: return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN; } } Loading
src/java/com/android/internal/telephony/uicc/UiccProfile.java +11 −43 Original line number Diff line number Diff line Loading @@ -51,13 +51,11 @@ import com.android.internal.R; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IntentBroadcaster; import com.android.internal.telephony.MccTable; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.cat.CatService; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; import com.android.internal.telephony.uicc.IccCardStatus.CardState; Loading Loading @@ -270,7 +268,9 @@ public class UiccProfile extends Handler implements IccCard { mUiccCard.registerForCarrierPrivilegeRulesLoaded( this, EVENT_CARRIER_PRIVILEGES_LOADED, null); } else { onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); } break; Loading @@ -295,7 +295,9 @@ public class UiccProfile extends Handler implements IccCard { if (mUiccCard != null) { mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this); } onRecordsLoaded(); broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); //setExternalState(State.LOADED); break; default: Loading @@ -304,10 +306,6 @@ public class UiccProfile extends Handler implements IccCard { } } private void onRecordsLoaded() { broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); } private void updateIccAvailability() { synchronized (mLock) { UiccCardApplication newApp; Loading Loading @@ -421,35 +419,11 @@ public class UiccProfile extends Handler implements IccCard { } } private void broadcastIccStateChangedIntent(String value, String reason) { synchronized (mLock) { if (!SubscriptionManager.isValidSlotIndex(mPhoneId)) { loge("broadcastIccStateChangedIntent: mPhoneId=" + mPhoneId + " is invalid; Return!!"); return; } Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); // TODO - we'd like this intent to have a single snapshot of all sim state, // but until then this should not use REPLACE_PENDING or we may lose // information // intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId); log("broadcastIccStateChangedIntent intent ACTION_SIM_STATE_CHANGED value=" + value + " reason=" + reason + " for mPhoneId=" + mPhoneId); IntentBroadcaster.getInstance().broadcastStickyIntent(intent, mPhoneId); } } private void broadcastInternalIccStateChangedIntent(String value, String reason) { synchronized (mLock) { Intent intent = new Intent(ACTION_INTERNAL_SIM_STATE_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT | Intent.FLAG_RECEIVER_FOREGROUND); intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); Loading @@ -475,15 +449,8 @@ public class UiccProfile extends Handler implements IccCard { log("setExternalState: set mPhoneId=" + mPhoneId + " mExternalState=" + mExternalState); mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString()); // For locked states, we should be sending internal broadcast. if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals( getIccStateIntentString(mExternalState))) { broadcastInternalIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } else { broadcastIccStateChangedIntent(getIccStateIntentString(mExternalState), getIccStateReason(mExternalState)); } } } Loading Loading @@ -545,6 +512,7 @@ public class UiccProfile extends Handler implements IccCard { case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR; case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED; //case LOADED: return IccCardConstants.INTENT_VALUE_ICC_LOADED; default: return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN; } } Loading
tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java +4 −4 Original line number Diff line number Diff line Loading @@ -167,7 +167,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { doReturn(Arrays.asList(mSubInfo)).when(mSubscriptionController) .getSubInfoUsingSlotIndexWithCheck(eq(FAKE_SUB_ID_1), anyBoolean(), anyString()); doReturn(new int[]{FAKE_SUB_ID_1}).when(mSubscriptionController).getActiveSubIdList(); Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_ABSENT); mIntent.putExtra(PhoneConstants.PHONE_KEY, FAKE_SUB_ID_1); Loading @@ -189,7 +189,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { @Test @SmallTest public void testSimUnknown() throws Exception { Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_UNKNOWN); mIntent.putExtra(PhoneConstants.PHONE_KEY, FAKE_SUB_ID_1); Loading @@ -209,7 +209,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { @Test @SmallTest public void testSimError() throws Exception { Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR); mIntent.putExtra(PhoneConstants.PHONE_KEY, 0); Loading @@ -228,7 +228,7 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { @Test @SmallTest public void testWrongSimState() throws Exception { Intent mIntent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_IMSI); mIntent.putExtra(PhoneConstants.PHONE_KEY, 2); Loading