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

Commit 0f5293f4 authored by Thomas Nguyen's avatar Thomas Nguyen
Browse files

Validate PLMNs and services from entitlement and carrier config

Bug: 331987081
Test: SatelliteManagerTestOnMockService SatelliteControllerTest NtnCapabilityResolverTest SatelliteServiceUtilsTest
Manual test by forcefully make device attach to satellite network, call/sms/mms with live network

Change-Id: I7c35fdb929cbf8a608aa957bd10a99ec7a34eadd
parent 473f734d
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -39,9 +39,13 @@ public class NtnCapabilityResolver {
     */
    public static void resolveNtnCapability(
            @NonNull NetworkRegistrationInfo networkRegistrationInfo, int subId) {
        String registeredPlmn = networkRegistrationInfo.getRegisteredPlmn();
        if (TextUtils.isEmpty(registeredPlmn)) {
            return;
        }

        SatelliteController satelliteController = SatelliteController.getInstance();
        List<String> satellitePlmnList = satelliteController.getSatellitePlmnsForCarrier(subId);
        String registeredPlmn = networkRegistrationInfo.getRegisteredPlmn();
        for (String satellitePlmn : satellitePlmnList) {
            if (TextUtils.equals(satellitePlmn, registeredPlmn)) {
                logd("Registered to satellite PLMN " + satellitePlmn);
+49 −18
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
import com.android.internal.telephony.satellite.metrics.ProvisionMetricsStats;
import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.internal.util.FunctionalUtils;

import java.util.ArrayList;
@@ -2756,9 +2757,10 @@ public class SatelliteController extends Handler {
     * @param callback           callback for accept
     */
    public void onSatelliteEntitlementStatusUpdated(int subId, boolean entitlementEnabled,
            List<String> allowedPlmnList, List<String> barredPlmnList,
            @Nullable List<String> allowedPlmnList, @Nullable List<String> barredPlmnList,
            @Nullable IIntegerConsumer callback) {
        if (!mFeatureFlags.carrierEnabledSatelliteFlag()) {
            logd("onSatelliteEntitlementStatusUpdated: carrierEnabledSatelliteFlag is not enabled");
            return;
        }

@@ -2770,10 +2772,16 @@ public class SatelliteController extends Handler {
                }
            };
        }
        if (allowedPlmnList == null) {
            allowedPlmnList = new ArrayList<>();
        }
        if (barredPlmnList == null) {
            barredPlmnList = new ArrayList<>();
        }
        logd("onSatelliteEntitlementStatusUpdated subId=" + subId + ", entitlementEnabled="
                + entitlementEnabled + ", allowedPlmnList=" + (Objects.equals(null, allowedPlmnList)
                ? "" : allowedPlmnList + ", barredPlmnList=" + (Objects.equals(null,
                barredPlmnList) ? "" : barredPlmnList + "")));
                + entitlementEnabled + ", allowedPlmnList=["
                + String.join(",", allowedPlmnList) + "]" + ", barredPlmnList=["
                + String.join(",", barredPlmnList) + "]");

        synchronized (mSupportedSatelliteServicesLock) {
            if (mSatelliteEntitlementStatusPerCarrier.get(subId, false) != entitlementEnabled) {
@@ -2786,13 +2794,18 @@ public class SatelliteController extends Handler {
                    loge("onSatelliteEntitlementStatusUpdated: setSubscriptionProperty, e=" + e);
                }
            }
            mMergedPlmnListPerCarrier.remove(subId);

            if (isValidPlmnList(allowedPlmnList) && isValidPlmnList(barredPlmnList)) {
                mMergedPlmnListPerCarrier.remove(subId);
                mEntitlementPlmnListPerCarrier.put(subId, allowedPlmnList);
                mEntitlementBarredPlmnListPerCarrier.put(subId, barredPlmnList);
                updatePlmnListPerCarrier(subId);
                configureSatellitePlmnForCarrier(subId);
                mSubscriptionManagerService.setSatelliteEntitlementPlmnList(subId, allowedPlmnList);
            } else {
                loge("onSatelliteEntitlementStatusUpdated: either invalid allowedPlmnList "
                        + "or invalid barredPlmnList");
            }

            if (mSatelliteEntitlementStatusPerCarrier.get(subId, false)) {
                removeAttachRestrictionForCarrier(subId,
@@ -2804,6 +2817,20 @@ public class SatelliteController extends Handler {
        }
    }

    /**
     * A list of PLMNs is considered valid if either the list is empty or all PLMNs in the list
     * are valid.
     */
    private boolean isValidPlmnList(@NonNull List<String> plmnList) {
        for (String plmn : plmnList) {
            if (!TelephonyUtils.isValidPlmn(plmn)) {
                loge("Invalid PLMN = " + plmn);
                return false;
            }
        }
        return true;
    }

    /**
     * If we have not successfully queried the satellite modem for its satellite service support,
     * we will retry the query one more time. Otherwise, we will return the cached result.
@@ -3420,17 +3447,19 @@ public class SatelliteController extends Handler {
     * Otherwise, If the carrierPlmnList exist then used it.
     */
    private void updatePlmnListPerCarrier(int subId) {
        logd("updatePlmnListPerCarrier: subId=" + subId);
        synchronized (mSupportedSatelliteServicesLock) {
            List<String> carrierPlmnList, entitlementPlmnList;
            if (getConfigForSubId(subId).getBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL,
                    false)) {
                entitlementPlmnList = mEntitlementPlmnListPerCarrier.get(subId,
                        new ArrayList<>()).stream().toList();
                logd("updatePlmnListPerCarrier: entitlementPlmnList=" + entitlementPlmnList
                logd("updatePlmnListPerCarrier: entitlementPlmnList="
                        + String.join(",", entitlementPlmnList)
                        + " size=" + entitlementPlmnList.size());
                if (!entitlementPlmnList.isEmpty()) {
                    mMergedPlmnListPerCarrier.put(subId, entitlementPlmnList);
                    logd("update it using entitlementPlmnList=" + entitlementPlmnList);
                    logd("mMergedPlmnListPerCarrier is updated by Entitlement");
                    return;
                }
            }
@@ -3441,7 +3470,8 @@ public class SatelliteController extends Handler {
                int carrierId = tm.createForSubscriptionId(subId).getSimCarrierId();
                List<String> plmnList = satelliteConfig.getAllSatellitePlmnsForCarrier(carrierId);
                if (!plmnList.isEmpty()) {
                    logd("mMergedPlmnListPerCarrier is updated by ConfigUpdater : " + plmnList);
                    logd("mMergedPlmnListPerCarrier is updated by ConfigUpdater : "
                            + String.join(",", plmnList));
                    mMergedPlmnListPerCarrier.put(subId, plmnList);
                    return;
                }
@@ -3450,12 +3480,13 @@ public class SatelliteController extends Handler {
            if (mSatelliteServicesSupportedByCarriers.containsKey(subId)) {
                carrierPlmnList =
                        mSatelliteServicesSupportedByCarriers.get(subId).keySet().stream().toList();
                logd("mMergedPlmnListPerCarrier is updated by carrier config");
                logd("mMergedPlmnListPerCarrier is updated by carrier config: "
                        + String.join(",", carrierPlmnList));
            } else {
                carrierPlmnList = new ArrayList<>();
                logd("Empty mMergedPlmnListPerCarrier");
            }
            mMergedPlmnListPerCarrier.put(subId, carrierPlmnList);
            logd("update it using carrierPlmnList=" + carrierPlmnList);
        }
    }

@@ -3473,7 +3504,7 @@ public class SatelliteController extends Handler {
                if (!supportedServicesPerPlmn.isEmpty()) {
                    mSatelliteServicesSupportedByCarriers.put(subId, supportedServicesPerPlmn);
                    logd("updateSupportedSatelliteServices using ConfigUpdater, "
                            + "supportedServicesPerPlmn = " + supportedServicesPerPlmn);
                            + "supportedServicesPerPlmn = " + supportedServicesPerPlmn.size());
                    updatePlmnListPerCarrier(subId);
                    return;
                } else {
@@ -3580,7 +3611,7 @@ public class SatelliteController extends Handler {
                    return;
                }
                logd("updateEntitlementPlmnListPerCarrier: entitlementPlmnList="
                        + entitlementPlmnList);
                        + String.join(",", entitlementPlmnList));
                mEntitlementPlmnListPerCarrier.put(subId, entitlementPlmnList);
            }
        }
+16 −18
Original line number Diff line number Diff line
@@ -16,9 +16,6 @@

package com.android.internal.telephony.satellite;

import static android.telephony.NetworkRegistrationInfo.FIRST_SERVICE_TYPE;
import static android.telephony.NetworkRegistrationInfo.LAST_SERVICE_TYPE;

import static java.util.stream.Collectors.joining;

import android.annotation.NonNull;
@@ -43,6 +40,7 @@ import android.telephony.satellite.stub.SatelliteResult;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.util.TelephonyUtils;

import java.util.Arrays;
import java.util.HashMap;
@@ -302,9 +300,10 @@ public class SatelliteServiceUtils {
        }

        for (String plmn : supportedServicesBundle.keySet()) {
            if (TelephonyUtils.isValidPlmn(plmn)) {
                Set<Integer> supportedServicesSet = new HashSet<>();
                for (int serviceType : supportedServicesBundle.getIntArray(plmn)) {
                if (isServiceTypeValid(serviceType)) {
                    if (TelephonyUtils.isValidService(serviceType)) {
                        supportedServicesSet.add(serviceType);
                    } else {
                        loge("parseSupportedSatelliteServices: invalid service type=" + serviceType
@@ -315,6 +314,9 @@ public class SatelliteServiceUtils {
                        + supportedServicesSet.stream().map(String::valueOf).collect(
                        joining(",")));
                supportedServicesMap.put(plmn, supportedServicesSet);
            } else {
                loge("parseSupportedSatelliteServices: invalid plmn=" + plmn);
            }
        }
        return supportedServicesMap;
    }
@@ -344,10 +346,6 @@ public class SatelliteServiceUtils {
        return mergedStrSet.stream().toList();
    }

    private static boolean isServiceTypeValid(int serviceType) {
        return (serviceType >= FIRST_SERVICE_TYPE && serviceType <= LAST_SERVICE_TYPE);
    }

    /**
     * Return phone associated with phoneId 0.
     *
+23 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.annotation.NonNull;
import android.telephony.CellIdentity;
@@ -100,6 +102,7 @@ public class NtnCapabilityResolverTest extends TelephonyTest {
                .mapToInt(Integer::intValue)
                .toArray()));
        NtnCapabilityResolver.resolveNtnCapability(satelliteNri, SUB_ID);
        verify(mMockSatelliteController).getSatellitePlmnsForCarrier(anyInt());
        assertNotEquals(satelliteNri, originalNri);
        assertTrue(satelliteNri.isNonTerrestrialNetwork());
        assertTrue(Arrays.equals(mSatelliteSupportedServices,
@@ -118,12 +121,32 @@ public class NtnCapabilityResolverTest extends TelephonyTest {
                        .mapToInt(Integer::intValue)
                        .toArray()));
        NtnCapabilityResolver.resolveNtnCapability(cellularNri, SUB_ID);
        verify(mMockSatelliteController, times(2)).getSatellitePlmnsForCarrier(anyInt());
        assertEquals(cellularNri, originalNri);
        assertFalse(cellularNri.isNonTerrestrialNetwork());
        assertFalse(Arrays.equals(mSatelliteSupportedServices,
                cellularNri.getAvailableServices().stream()
                        .mapToInt(Integer::intValue)
                        .toArray()));

        // Test resolving an empty-PLMN NetworkRegistrationInfo.
        NetworkRegistrationInfo emptyPlmnNri = createNetworkRegistrationInfo("");
        originalNri = new NetworkRegistrationInfo(emptyPlmnNri);

        assertEquals(emptyPlmnNri, originalNri);
        assertFalse(emptyPlmnNri.isNonTerrestrialNetwork());
        assertFalse(Arrays.equals(mSatelliteSupportedServices,
                emptyPlmnNri.getAvailableServices().stream()
                        .mapToInt(Integer::intValue)
                        .toArray()));
        NtnCapabilityResolver.resolveNtnCapability(emptyPlmnNri, SUB_ID);
        verify(mMockSatelliteController, times(2)).getSatellitePlmnsForCarrier(anyInt());
        assertEquals(emptyPlmnNri, originalNri);
        assertFalse(emptyPlmnNri.isNonTerrestrialNetwork());
        assertFalse(Arrays.equals(mSatelliteSupportedServices,
                emptyPlmnNri.getAvailableServices().stream()
                        .mapToInt(Integer::intValue)
                        .toArray()));
    }

    private NetworkRegistrationInfo createNetworkRegistrationInfo(@NonNull String registeredPlmn) {
+41 −1
Original line number Diff line number Diff line
@@ -2750,7 +2750,7 @@ public class SatelliteControllerTest extends TelephonyTest {
                overlayConfigPlmnList, barredPlmnList);

        // If the entitlement plmn list is empty and the overlay config plmn list and the carrier
        // plmn list are available, verify not passing to the modem.
        // plmn list are available, verify passing to the modem.
        reset(mMockSatelliteModemInterface);
        entitlementPlmnList = new ArrayList<>();
        mergedPlmnList = carrierConfigPlmnList;
@@ -2763,6 +2763,46 @@ public class SatelliteControllerTest extends TelephonyTest {
        barredPlmnList = Arrays.stream(new String[]{"00105", "00107"}).toList();
        verifyPassingToModemAfterQueryCompleted(entitlementPlmnList, mergedPlmnList,
                overlayConfigPlmnList, barredPlmnList);

        // If the entitlement plmn list is null and the overlay config plmn list and the carrier
        // plmn list are available, verify passing to the modem.
        reset(mMockSatelliteModemInterface);
        entitlementPlmnList = null;
        mergedPlmnList = carrierConfigPlmnList;
        verifyPassingToModemAfterQueryCompleted(entitlementPlmnList, mergedPlmnList,
                overlayConfigPlmnList, barredPlmnList);

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", ""}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, mIIntegerConsumer);
        verify(mMockSatelliteModemInterface, never()).requestSatelliteEnabled(anyBoolean(),
                anyBoolean(), anyBoolean(), any(Message.class));

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "123456789"}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, mIIntegerConsumer);
        verify(mMockSatelliteModemInterface, never()).requestSatelliteEnabled(anyBoolean(),
                anyBoolean(), anyBoolean(), any(Message.class));

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "12"}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, mIIntegerConsumer);
        verify(mMockSatelliteModemInterface, never()).requestSatelliteEnabled(anyBoolean(),
                anyBoolean(), anyBoolean(), any(Message.class));

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "1234"}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, mIIntegerConsumer);
        verify(mMockSatelliteModemInterface, never()).requestSatelliteEnabled(anyBoolean(),
                anyBoolean(), anyBoolean(), any(Message.class));
    }

    private void verifyPassingToModemAfterQueryCompleted(List<String> entitlementPlmnList,
Loading