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

Commit cbd03b17 authored by Jack Yu's avatar Jack Yu
Browse files

Fixed inactive pSIM not shown in settings

When the device is configured in e+e mode, the user
does not have a chance to enable the inserted pSIM
from Settings.

Fixed by inserting the subscription from the inactive
SIM.

Fix: 271386059
Test: atest SubscriptionManagerServiceTest
Test: Manually enabled e+e and inserted a physical SIM
Change-Id: I36126c16cbe21b7288ee7974b3ccf826c9393f0f
parent 5f5987ea
Loading
Loading
Loading
Loading
+27 −10
Original line number Diff line number Diff line
@@ -1019,7 +1019,12 @@ public class SubscriptionManagerService extends ISub.Stub {
            builder.setDisplayName(displayName);
        }

        return mSubscriptionDatabaseManager.insertSubscriptionInfo(builder.build());
        int subId = mSubscriptionDatabaseManager.insertSubscriptionInfo(builder.build());
        logl("insertSubscriptionInfo: Inserted a new subscription. subId=" + subId
                + ", slotIndex=" + slotIndex + ", iccId=" + SubscriptionInfo.getPrintableId(iccId)
                + ", displayName=" + displayName + ", type="
                + SubscriptionManager.subscriptionTypeToString(subscriptionType));
        return subId;
    }

    /**
@@ -1362,8 +1367,6 @@ public class SubscriptionManagerService extends ISub.Stub {
                    // This is a new SIM card. Insert a new record.
                    subId = insertSubscriptionInfo(iccId, phoneId, null,
                            SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM);
                    logl("updateSubscription: Inserted a new subscription. subId=" + subId
                            + ", phoneId=" + phoneId);
                } else {
                    subId = subInfo.getSubscriptionId();
                    log("updateSubscription: Found existing subscription. subId= " + subId
@@ -3818,14 +3821,15 @@ public class SubscriptionManagerService extends ISub.Stub {
     * Called when SIM becomes inactive.
     *
     * @param slotIndex The logical SIM slot index.
     * @param iccId iccId of the SIM in inactivate slot
     * @param iccId iccId of the SIM in inactivate slot.
     */
    public void updateSimStateForInactivePort(int slotIndex, String iccId) {
    public void updateSimStateForInactivePort(int slotIndex, @NonNull String iccId) {
        mHandler.post(() -> {
            logl("updateSimStateForInactivePort: slotIndex=" + slotIndex);
            logl("updateSimStateForInactivePort: slotIndex=" + slotIndex + ", iccId="
                    + SubscriptionInfo.getPrintableId(iccId));
            if (mSlotIndexToSubId.containsKey(slotIndex)) {
                // Re-enable the UICC application , so it will be in enabled state when it becomes
                // active again. (pre-U behavior)
                // active again. (Pre-U behavior)
                mSubscriptionDatabaseManager.setUiccApplicationsEnabled(
                        mSlotIndexToSubId.get(slotIndex), true);
                updateSubscription(slotIndex);
@@ -3835,12 +3839,25 @@ public class SubscriptionManagerService extends ISub.Stub {
                // hence update the portIndex. (Pre-U behavior)
                SubscriptionInfoInternal subInfo = mSubscriptionDatabaseManager
                        .getSubscriptionInfoInternalByIccId(IccUtils.stripTrailingFs(iccId));
                int subId;
                if (subInfo != null) {
                    mSubscriptionDatabaseManager.setPortIndex(subInfo.getSubscriptionId(),
                            getPortIndex(iccId));
                    subId = subInfo.getSubscriptionId();
                    log("updateSimStateForInactivePort: Found existing subscription. subId="
                            + subId);
                } else {
                    // If iccId is new, add a subscription record in the database so it can be
                    // activated later. (Pre-U behavior)
                    subId = insertSubscriptionInfo(IccUtils.stripTrailingFs(iccId),
                            SubscriptionManager.INVALID_SIM_SLOT_INDEX,
                            mContext.getResources().getString(R.string.default_card_name),
                            SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM);
                    log("updateSimStateForInactivePort: Insert a new subscription for inactive SIM."
                            + " subId=" + subId);
                }
                if (SubscriptionManager.isValidSubscriptionId(subId)) {
                    mSubscriptionDatabaseManager.setPortIndex(subId, getPortIndex(iccId));
                }
            }

        });
    }

+2 −1
Original line number Diff line number Diff line
@@ -790,7 +790,8 @@ public class UiccController extends Handler {
                        IccCardConstants.State.ABSENT.toString());
            }

            SubscriptionManagerService.getInstance().updateSimStateForInactivePort(phoneId, iccId);
            SubscriptionManagerService.getInstance().updateSimStateForInactivePort(phoneId,
                    TextUtils.emptyIfNull(iccId));
        });
    }

+2 −0
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ import java.util.concurrent.Executor;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class SubscriptionDatabaseManagerTest extends TelephonyTest {

    static final String FAKE_DEFAULT_CARD_NAME = "CARD NAME";
    static final String FAKE_ICCID1 = "123456";
    static final String FAKE_ICCID2 = "456789";
    static final String FAKE_PHONE_NUMBER1 = "6502530000";
+22 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.internal.telephony.subscription.SubscriptionDatabaseMa
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_CONTACT1;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_CONTACT2;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_COUNTRY_CODE2;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_DEFAULT_CARD_NAME;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_EHPLMNS1;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_HPLMNS1;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_ICCID1;
@@ -166,6 +167,7 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        doReturn(2).when(mTelephonyManager).getActiveModemCount();
        doReturn(2).when(mTelephonyManager).getSupportedModemCount();
        doReturn(mUiccProfile).when(mPhone2).getIccCard();
        doReturn(new UiccSlot[]{mUiccSlot}).when(mUiccController).getUiccSlots();

        mContextFixture.putBooleanResource(com.android.internal.R.bool
                .config_subscription_database_async_update, true);
@@ -1793,7 +1795,6 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
    public void testUserUnlockUpdateEmbeddedSubscriptions() {
        doReturn(true).when(mUiccSlot).isEuicc();
        doReturn(1).when(mUiccController).convertToPublicCardId(FAKE_ICCID1);
        doReturn(new UiccSlot[]{mUiccSlot}).when(mUiccController).getUiccSlots();
        doReturn(TelephonyManager.INVALID_PORT_INDEX).when(mUiccSlot)
                .getPortIndexFromIccId(anyString());

@@ -2176,6 +2177,26 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        assertThat(subInfo.areUiccApplicationsEnabled()).isTrue();
    }

    @Test
    public void testInactiveSimInserted() {
        mContextFixture.putResource(com.android.internal.R.string.default_card_name,
                FAKE_DEFAULT_CARD_NAME);

        doReturn(0).when(mUiccSlot).getPortIndexFromIccId(eq(FAKE_ICCID1));

        mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
        mSubscriptionManagerServiceUT.updateSimStateForInactivePort(-1, FAKE_ICCID1);
        processAllMessages();

        // Make sure the inactive SIM's information was inserted.
        SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT
                .getSubscriptionInfoInternal(1);
        assertThat(subInfo.getSimSlotIndex()).isEqualTo(SubscriptionManager.INVALID_SIM_SLOT_INDEX);
        assertThat(subInfo.getIccId()).isEqualTo(FAKE_ICCID1);
        assertThat(subInfo.getDisplayName()).isEqualTo(FAKE_DEFAULT_CARD_NAME);
        assertThat(subInfo.getPortIndex()).isEqualTo(0);
    }

    @Test
    public void testRestoreAllSimSpecificSettingsFromBackup() {
        assertThrows(SecurityException.class, ()