Merge "Fix incorrect mapping to get subscriptioninfo" into qt-dev
diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java
index 8d1aafc..4b2f50d 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.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 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 @@
         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 @@
     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 @@
         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 a19f022..f38668c 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.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.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 @@
     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 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();
@@ -81,6 +94,14 @@
     }
 
     @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();
         when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA);