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

Commit 4e90bca2 authored by Thomas Nguyen's avatar Thomas Nguyen Committed by Android (Google) Code Review
Browse files

Merge "Validate PLMNs and services from entitlement and carrier config" into 24D1-dev

parents 910f990c 0f5293f4
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