Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f61db6e9 authored by Fan Zhang's avatar Fan Zhang
Browse files

Fix incorrect mapping to get subscriptioninfo

getActiveSubscriptionInfoList() returns a list of active subscription.
It doesn't 1:1 mapping with slotId. So it is not correct to use slotId
as index to get subscriptioninfo from list.
Use framework interface getActiveSubscriptionInfoForSimSlotIndex() to
get subscriptioninfo per slotid instead.

Fixes: 129038597
Test: robotest
Change-Id: If4277c425e6145e0e3ba716551d0dce46cdb61ab
parent 8c16ef29
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -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();
+24 −3
Original line number Diff line number Diff line
@@ -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();