diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java index 8d1aafc51c4..4b2f50d8702 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java @@ -26,6 +26,7 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.style.TtsSpan; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; @@ -33,10 +34,10 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.telephony.PhoneConstants; import com.android.settings.R; -import java.util.List; - public class ImeiInfoDialogController { + private static final String TAG = "ImeiInfoDialog"; + @VisibleForTesting static final int ID_PRL_VERSION_VALUE = R.id.prl_version_value; private static final int ID_MIN_NUMBER_LABEL = R.id.min_number_label; @@ -75,15 +76,24 @@ public class ImeiInfoDialogController { mDialog = dialog; mSlotId = slotId; final Context context = dialog.getContext(); - mTelephonyManager = (TelephonyManager) context.getSystemService( - Context.TELEPHONY_SERVICE); - mSubscriptionInfo = getSubscriptionInfo(context, slotId); + mSubscriptionInfo = context.getSystemService(SubscriptionManager.class) + .getActiveSubscriptionInfoForSimSlotIndex(slotId); + if (mSubscriptionInfo != null) { + mTelephonyManager = context.getSystemService(TelephonyManager.class) + .createForSubscriptionId(mSubscriptionInfo.getSubscriptionId()); + } else { + mTelephonyManager = null; + } } /** * Sets IMEI/MEID information based on whether the device is CDMA or GSM. */ public void populateImeiInfo() { + if (mTelephonyManager == null) { + Log.w(TAG, "TelephonyManager for this slot is null. Invalid slot? id=" + mSlotId); + return; + } if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) { updateDialogForCdmaPhone(); } else { @@ -94,9 +104,9 @@ public class ImeiInfoDialogController { private void updateDialogForCdmaPhone() { final Resources res = mDialog.getContext().getResources(); mDialog.setText(ID_MEID_NUMBER_VALUE, getMeid()); - mDialog.setText(ID_MIN_NUMBER_VALUE, - mSubscriptionInfo != null ? mTelephonyManager.getCdmaMin( - mSubscriptionInfo.getSubscriptionId()) : ""); + mDialog.setText(ID_MIN_NUMBER_VALUE, mSubscriptionInfo != null + ? mTelephonyManager.getCdmaMin(mSubscriptionInfo.getSubscriptionId()) + : ""); if (res.getBoolean(R.bool.config_msid_enable)) { mDialog.setText(ID_MIN_NUMBER_LABEL, @@ -125,10 +135,6 @@ public class ImeiInfoDialogController { mDialog.removeViewFromScreen(ID_CDMA_SETTINGS); } - private SubscriptionInfo getSubscriptionInfo(Context context, int slotId) { - return SubscriptionManager.from(context).getActiveSubscriptionInfoForSimSlotIndex(slotId); - } - @VisibleForTesting String getCdmaPrlVersion() { return mTelephonyManager.getCdmaPrlVersion(); 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 a19f022d983..f38668cc0e6 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java @@ -28,12 +28,14 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import org.junit.Before; @@ -43,6 +45,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowSubscriptionManager; +import org.robolectric.shadows.ShadowTelephonyManager; import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) @@ -53,6 +58,8 @@ public class ImeiInfoDialogControllerTest { private static final String IMEI_NUMBER = "2341982751254"; private static final String MIN_NUMBER = "123417851315"; private static final String IMEI_SV_NUMBER = "12"; + private static final int SLOT_ID = 0; + private static final int SUB_ID = 0; @Mock private ImeiInfoDialogFragment mDialog; @@ -68,10 +75,16 @@ public class ImeiInfoDialogControllerTest { public void setup() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE); + final ShadowSubscriptionManager ssm = Shadow.extract(mContext.getSystemService( + SubscriptionManager.class)); + ssm.setActiveSubscriptionInfos(mSubscriptionInfo); + when(mSubscriptionInfo.getSubscriptionId()).thenReturn(SUB_ID); + final ShadowTelephonyManager stm = Shadow.extract(mContext.getSystemService( + TelephonyManager.class)); + stm.setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyManager); when(mDialog.getContext()).thenReturn(mContext); - mController = spy(new ImeiInfoDialogController(mDialog, 0 /* phone id */)); - ReflectionHelpers.setField(mController, "mSubscriptionInfo", mSubscriptionInfo); + + mController = spy(new ImeiInfoDialogController(mDialog, SLOT_ID)); doReturn(PRL_VERSION).when(mController).getCdmaPrlVersion(); doReturn(MEID_NUMBER).when(mController).getMeid(); @@ -80,6 +93,14 @@ public class ImeiInfoDialogControllerTest { when(mTelephonyManager.getImei(anyInt())).thenReturn(IMEI_NUMBER); } + @Test + public void populateImeiInfo_invalidSlot_shouldSetNothing() { + mController = spy(new ImeiInfoDialogController(mDialog, SLOT_ID + 1)); + + mController.populateImeiInfo(); + verify(mDialog, never()).setText(anyInt(), any()); + } + @Test public void populateImeiInfo_cdmaLteEnabled_shouldSetMeidAndImeiAndMin() { doReturn(true).when(mController).isCdmaLteEnabled();