From 9ac6d811773108d3ffb2cfdbf60592782cd20cea Mon Sep 17 00:00:00 2001 From: andychou Date: Thu, 9 May 2019 00:00:23 +0800 Subject: [PATCH] Fix IMEI information can't display without pSIM inserted When no SIM, we can't get active subscription info. So current code will not create TelephonyManager and cause IMEI not retrieved. Create TelephonyManager with default if no subscription info. Bug: 132215720 Test: test with SIM and without SIM to check SIM status UI and atest ImeiInfoDialogControllerTest pass Change-Id: Iaeb932ea66a6bee77136251941cca657984e456f --- .../imei/ImeiInfoDialogController.java | 12 ++++++++++- .../imei/ImeiInfoDialogControllerTest.java | 21 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java index 4b2f50d8702..5c3772bac8d 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java @@ -78,9 +78,12 @@ public class ImeiInfoDialogController { final Context context = dialog.getContext(); mSubscriptionInfo = context.getSystemService(SubscriptionManager.class) .getActiveSubscriptionInfoForSimSlotIndex(slotId); + TelephonyManager tm = context.getSystemService(TelephonyManager.class); if (mSubscriptionInfo != null) { mTelephonyManager = context.getSystemService(TelephonyManager.class) .createForSubscriptionId(mSubscriptionInfo.getSubscriptionId()); + } else if(isValidSlotIndex(slotId, tm)) { + mTelephonyManager = tm; } else { mTelephonyManager = null; } @@ -104,6 +107,7 @@ public class ImeiInfoDialogController { private void updateDialogForCdmaPhone() { final Resources res = mDialog.getContext().getResources(); mDialog.setText(ID_MEID_NUMBER_VALUE, getMeid()); + // MIN needs to read from SIM. So if no SIM, we should not show MIN on UI mDialog.setText(ID_MIN_NUMBER_VALUE, mSubscriptionInfo != null ? mTelephonyManager.getCdmaMin(mSubscriptionInfo.getSubscriptionId()) : ""); @@ -137,7 +141,8 @@ public class ImeiInfoDialogController { @VisibleForTesting String getCdmaPrlVersion() { - return mTelephonyManager.getCdmaPrlVersion(); + // PRL needs to read from SIM. So if no SIM, return empty + return mSubscriptionInfo != null ? mTelephonyManager.getCdmaPrlVersion() : ""; } @VisibleForTesting @@ -150,4 +155,9 @@ public class ImeiInfoDialogController { String getMeid() { return mTelephonyManager.getMeid(mSlotId); } + + @VisibleForTesting + private boolean isValidSlotIndex(int slotIndex, TelephonyManager telephonyManager) { + return slotIndex >= 0 && slotIndex < telephonyManager.getPhoneCount(); + } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java index f38668cc0e6..7ad8d631edf 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java @@ -86,8 +86,8 @@ public class ImeiInfoDialogControllerTest { mController = spy(new ImeiInfoDialogController(mDialog, SLOT_ID)); - doReturn(PRL_VERSION).when(mController).getCdmaPrlVersion(); - doReturn(MEID_NUMBER).when(mController).getMeid(); + when(mTelephonyManager.getCdmaPrlVersion()).thenReturn(PRL_VERSION); + when(mTelephonyManager.getMeid(anyInt())).thenReturn(MEID_NUMBER); when(mTelephonyManager.getCdmaMin(anyInt())).thenReturn(MIN_NUMBER); when(mTelephonyManager.getDeviceSoftwareVersion(anyInt())).thenReturn(IMEI_SV_NUMBER); when(mTelephonyManager.getImei(anyInt())).thenReturn(IMEI_NUMBER); @@ -98,6 +98,7 @@ public class ImeiInfoDialogControllerTest { mController = spy(new ImeiInfoDialogController(mDialog, SLOT_ID + 1)); mController.populateImeiInfo(); + verify(mDialog, never()).setText(anyInt(), any()); } @@ -129,16 +130,30 @@ public class ImeiInfoDialogControllerTest { } @Test - public void populateImeiInfo_cdmaSimDisabled_shouldRemoveImeiInfoAndSetMinToEmpty() { + public void populateImeiInfo_cdmaSimDisabled_shouldRemoveImeiInfoAndSetMinPrlToEmpty() { ReflectionHelpers.setField(mController, "mSubscriptionInfo", null); when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA); mController.populateImeiInfo(); + verify(mDialog).setText(ID_MEID_NUMBER_VALUE, MEID_NUMBER); verify(mDialog).setText(ID_MIN_NUMBER_VALUE, ""); + verify(mDialog).setText(ID_PRL_VERSION_VALUE, ""); verify(mDialog).removeViewFromScreen(ID_GSM_SETTINGS); } + @Test + public void populateImeiInfo_gsmSimDisabled_shouldSetImeiAndRemoveCdmaSettings() { + ReflectionHelpers.setField(mController, "mSubscriptionInfo", null); + when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM); + + mController.populateImeiInfo(); + + verify(mDialog).setText(eq(ID_IMEI_VALUE), any()); + verify(mDialog).setText(eq(ID_IMEI_SV_VALUE), any()); + verify(mDialog).removeViewFromScreen(ID_CDMA_SETTINGS); + } + @Test public void populateImeinfo_gsm_shouldSetImeiAndRemoveCdmaSettings() { when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);