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

Commit a859dce9 authored by Aishwarya Mallampati's avatar Aishwarya Mallampati
Browse files

Send all satellite PLMNs

Call setSatellitePlmn for all phones:
- sim insertion

All satellite plmn set is stored in persistant storage
- plmns are not removed from allPlmnSet after sim removal

Changes related to setSatelliteEnabledForCarrier:
- Query modem to get whether satellite is enabled for each phone object on bootup
- Store the results returned by modem in a cache

Bug: 396475892
Test: atest testSatelliteAttachEnabledForCarrier, testSatelliteAttachRestrictionForCarrier, testGetSatellitePlmnsForCarrier
Flag: EXEMPT bugfix
Send all satellite PLMNs

Change-Id: I4a36fccb2a007249eed9cec7d1323ce9d62e1ce1
parent 07806de6
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -5459,6 +5459,9 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    public void setSatellitePlmn(int simSlot,
            @NonNull List<String> carrierPlmnList, @NonNull List<String> allSatellitePlmnList,
            Message result) {
        logd("setSatellitePlmn: simSlot=" + simSlot
                + " carrierPlmnList=" + carrierPlmnList.toString()
                + " allSatellitePlmnList=" + allSatellitePlmnList.toString());
        mCi.setSatellitePlmn(simSlot, carrierPlmnList, allSatellitePlmnList, result);
    }

@@ -5472,6 +5475,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
     */
    public void setSatelliteEnabledForCarrier(int simSlot, boolean satelliteEnabled,
            Message result) {
        logd("setSatelliteEnabledForCarrier: simSlot=" + simSlot
                + " satelliteEnabled=" + satelliteEnabled);
        mCi.setSatelliteEnabledForCarrier(simSlot, satelliteEnabled, result);
    }

+180 −35
Original line number Diff line number Diff line
@@ -242,6 +242,8 @@ public class SatelliteController extends Handler {
    @VisibleForTesting(visibility =  VisibleForTesting.Visibility.PRIVATE)
    public static final String NTN_SMS_SUPPORTED_BY_MESSAGES_APP_KEY =
            "ntn_sms_supported_by_messages_app_key";
    public static final String CARRIER_ROAMING_NTN_ALL_SATELLITE_PLMN_SET_KEY =
            "carrier_roaming_ntn_all_satellite_plmn_set_key";

    public static final long DEFAULT_CARRIER_EMERGENCY_CALL_WAIT_FOR_CONNECTION_TIMEOUT_MILLIS =
            TimeUnit.SECONDS.toMillis(30);
@@ -319,6 +321,8 @@ public class SatelliteController extends Handler {
    private static final int CMD_LOCATION_SERVICE_STATE_CHANGED = 62;
    protected static final int
        EVENT_WAIT_FOR_UPDATE_SYSTEM_SELECTION_CHANNELS_RESPONSE_TIMED_OUT = 63;
    private static final int CMD_GET_SATELLITE_ENABLED_FOR_CARRIER = 64;
    private static final int EVENT_GET_SATELLITE_ENABLED_FOR_CARRIER_DONE = 65;

    @NonNull private static SatelliteController sInstance;
    @NonNull private final Context mContext;
@@ -693,6 +697,10 @@ public class SatelliteController extends Handler {
    @GuardedBy("mNtnSmsSupportedByMessagesAppLock")
    private Boolean mNtnSmsSupportedByMessagesApp = null;

    private final Object mCarrierRoamingNtnAllSatellitePlmnSetLock = new Object();
    @GuardedBy("mCarrierRoamingNtnAllSatellitePlmnSetLock")
    private Set<String> mCarrierRoamingNtnAllSatellitePlmnSet = null;

    private final Object mSatelliteModemStateLock = new Object();
    @GuardedBy("mSatelliteModemStateLock")
    @SatelliteManager.SatelliteModemState
@@ -979,10 +987,20 @@ public class SatelliteController extends Handler {

        loadSatelliteSharedPreferences();
        if (mSharedPreferences != null) {
            try {
                synchronized (mNtnSmsSupportedByMessagesAppLock) {
                    mNtnSmsSupportedByMessagesApp = mSharedPreferences.getBoolean(
                            NTN_SMS_SUPPORTED_BY_MESSAGES_APP_KEY, false);
                }

                synchronized (mCarrierRoamingNtnAllSatellitePlmnSetLock) {
                    mCarrierRoamingNtnAllSatellitePlmnSet = mSharedPreferences.getStringSet(
                            CARRIER_ROAMING_NTN_ALL_SATELLITE_PLMN_SET_KEY, new HashSet<>());
                }
            } catch (Exception ex) {
                plogd("SatelliteController constructor: "
                        + "cannot get default shared preferences. e" + ex);
            }
        }

        mWaitTimeForSatelliteEnablingResponse = getWaitForSatelliteEnablingResponseTimeoutMillis();
@@ -1012,6 +1030,11 @@ public class SatelliteController extends Handler {
        mSatelliteOptimizedApplicationsTracker = new SatelliteOptimizedApplicationsTracker(
                getLooper(), mContext
        );

        for (Phone phoneToSendRequest : PhoneFactory.getPhones()) {
            sendRequestAsync(CMD_GET_SATELLITE_ENABLED_FOR_CARRIER, null, phoneToSendRequest);
        }

        logd("Satellite Tracker is created");
    }

@@ -1895,10 +1918,14 @@ public class SatelliteController extends Handler {
                int error =  SatelliteServiceUtils.getSatelliteError(ar,
                        "requestSetSatelliteEnabledForCarrier");

                plogd("EVENT_EVALUATE_SATELLITE_ATTACH_RESTRICTION_CHANGE_DONE: subId="
                        + subId + " error:" + error);
                synchronized (mIsSatelliteEnabledLock) {
                    if (error == SATELLITE_RESULT_SUCCESS) {
                        boolean enableSatellite = mSatelliteAttachRestrictionForCarrierArray
                                .getOrDefault(argument.subId, Collections.emptySet()).isEmpty();
                        plogd("EVENT_EVALUATE_SATELLITE_ATTACH_RESTRICTION_CHANGE_DONE: "
                                + "satelliteAttachEnabledForCarrier=" + enableSatellite);
                        mIsSatelliteAttachEnabledForCarrierArrayPerSub.put(subId, enableSatellite);
                    } else {
                        mIsSatelliteAttachEnabledForCarrierArrayPerSub.remove(subId);
@@ -2252,6 +2279,43 @@ public class SatelliteController extends Handler {
                break;
            }

            case CMD_GET_SATELLITE_ENABLED_FOR_CARRIER: {
                request = (SatelliteControllerHandlerRequest) msg.obj;
                Phone phone = request.phone;
                int subId = phone.getSubId();
                onCompleted = obtainMessage(EVENT_GET_SATELLITE_ENABLED_FOR_CARRIER_DONE,
                        subId);
                int simSlot = SubscriptionManager.getSlotIndex(subId);
                plogd("CMD_GET_SATELLITE_ENABLED_FOR_CARRIER: subId=" + subId);
                phone.isSatelliteEnabledForCarrier(simSlot, onCompleted);
                break;
            }

            case EVENT_GET_SATELLITE_ENABLED_FOR_CARRIER_DONE: {
                ar = (AsyncResult) msg.obj;

                if (ar.result == null) {
                    loge("EVENT_GET_SATELLITE_ENABLED_FOR_CARRIER_DONE: result is null");
                } else {
                    int subId = (int) ar.userObj;
                    int error = SatelliteServiceUtils.getSatelliteError(
                            ar, "isSatelliteEnabledForCarrier");
                    boolean satelliteEnabled = (boolean) ar.result;
                    plogd("EVENT_GET_SATELLITE_ENABLED_FOR_CARRIER_DONE: subId=" + subId
                            + " error=" + error + " satelliteEnabled=" + satelliteEnabled);

                    if (error == SATELLITE_RESULT_SUCCESS) {
                        synchronized (mIsSatelliteEnabledLock) {
                            mIsSatelliteAttachEnabledForCarrierArrayPerSub.put(
                                    subId, satelliteEnabled);
                        }
                        evaluateEnablingSatelliteForCarrier(subId,
                                SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER, null);
                    }
                }
                break;
            }

            default:
                Log.w(TAG, "SatelliteControllerHandler: unexpected message code: " +
                        msg.what);
@@ -3832,9 +3896,7 @@ public class SatelliteController extends Handler {
            return new ArrayList<>();
        }

        synchronized (mSupportedSatelliteServicesLock) {
            return mMergedPlmnListPerCarrier.get(subId, new ArrayList<>()).stream().toList();
        }
        return getCarrierPlmnList(subId);
    }

    /**
@@ -4358,10 +4420,14 @@ public class SatelliteController extends Handler {
                updateAndNotifyChangesInCarrierRoamingNtnAvailableServices(subId,
                        plmnServiceTypeMap);
                updatePlmnListPerCarrier(subId);

                configureSatellitePlmnForCarrier(subId);
                evaluateEnablingSatelliteForCarrier(subId,
                        SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER, null);
                mSubscriptionManagerService.setSatelliteEntitlementInfo(subId, allowedPlmnList,
                        barredPlmnList, plmnDataPlanMap, plmnServiceTypeMap,
                        plmnDataServicePolicyMap, plmnVoiceServicePolicyMap);

            } else {
                loge("onSatelliteEntitlementStatusUpdated: either invalid allowedPlmnList "
                        + "or invalid barredPlmnList");
@@ -5290,16 +5356,94 @@ public class SatelliteController extends Handler {
            return;
        }

        synchronized (mSupportedSatelliteServicesLock) {
            List<String> carrierPlmnList = mMergedPlmnListPerCarrier.get(subId,
                    new ArrayList<>()).stream().toList();
            List<String> barredPlmnList = mEntitlementBarredPlmnListPerCarrier.get(subId,
                    new ArrayList<>()).stream().toList();
            int slotId = SubscriptionManager.getSlotIndex(subId);
            phone.setSatellitePlmn(slotId, carrierPlmnList, SatelliteServiceUtils.mergeStrLists(
                    carrierPlmnList, mSatellitePlmnListFromOverlayConfig, barredPlmnList),
        List<String> allPlmnList = new ArrayList<>(getAllPlmnSet());
        phone.setSatellitePlmn(phone.getPhoneId(), getCarrierPlmnList(subId), allPlmnList,
                obtainMessage(EVENT_SET_SATELLITE_PLMN_INFO_DONE));
    }

    private Set<String> getAllPlmnSet() {
        Set<String> allPlmnSetFromSubInfo = new HashSet<>();
        int[] activeSubIdArray = mSubscriptionManagerService.getActiveSubIdList(true);
        for (int activeSubId : activeSubIdArray) {
            allPlmnSetFromSubInfo.addAll(getCarrierPlmnList(activeSubId));
            allPlmnSetFromSubInfo.addAll(getBarredPlmnList(activeSubId));
        }
        allPlmnSetFromSubInfo.addAll(mSatellitePlmnListFromOverlayConfig);

        Set<String> allPlmnListFromStorage = getCarrierRoamingNtnAllSatellitePlmnSetFromStorage();
        if (!allPlmnListFromStorage.containsAll(allPlmnSetFromSubInfo)) {
            allPlmnListFromStorage.addAll(allPlmnSetFromSubInfo);
            persistCarrierRoamingNtnAllSatellitePlmnSet(allPlmnListFromStorage);
        }

        plogd("getAllPlmnList: " + allPlmnListFromStorage);
        return allPlmnListFromStorage;
    }

    private List<String> getCarrierPlmnList(int subId) {
        synchronized (mSupportedSatelliteServicesLock) {
            return mMergedPlmnListPerCarrier.get(subId, new ArrayList<>()).stream().toList();
        }
    }

    private List<String> getBarredPlmnList(int subId) {
        synchronized (mSupportedSatelliteServicesLock) {
            return mEntitlementBarredPlmnListPerCarrier.get(
                    subId, new ArrayList<>()).stream().toList();
        }
    }

    private void persistCarrierRoamingNtnAllSatellitePlmnSet(Set<String> allSatellitePlmnSet) {
        plogd("persistCarrierRoamingNtnAllSatellitePlmnSet");
        if (!loadSatelliteSharedPreferences()) return;

        if (mSharedPreferences == null) {
            ploge("persistCarrierRoamingNtnAllSatellitePlmnSet: mSharedPreferences is null");
        } else {
            try {
                mSharedPreferences.edit().putStringSet(
                        CARRIER_ROAMING_NTN_ALL_SATELLITE_PLMN_SET_KEY, allSatellitePlmnSet)
                        .apply();
            } catch (Exception ex) {
                plogd("persistCarrierRoamingNtnAllSatellitePlmnSet: ex=" + ex);
            }

            synchronized (mCarrierRoamingNtnAllSatellitePlmnSetLock) {
                mCarrierRoamingNtnAllSatellitePlmnSet = allSatellitePlmnSet;
            }
        }
    }

    private Set<String> getCarrierRoamingNtnAllSatellitePlmnSetFromStorage() {
        synchronized (mCarrierRoamingNtnAllSatellitePlmnSetLock) {
            if (mCarrierRoamingNtnAllSatellitePlmnSet != null) {
                plogd("getCarrierRoamingNtnAllSatellitePlmnSetFromStorage: "
                        + mCarrierRoamingNtnAllSatellitePlmnSet);
                return mCarrierRoamingNtnAllSatellitePlmnSet;
            }
        }

        if (!loadSatelliteSharedPreferences()) return new HashSet<>();

        if (mSharedPreferences == null) {
            ploge("getCarrierRoamingNtnAllSatellitePlmnSetFromStorage: mSharedPreferences is null");
            return new HashSet<>();
        } else {
            Set<String> allSatellitePlmnSet = new HashSet<>();
            try {
                allSatellitePlmnSet = mSharedPreferences.getStringSet(
                        CARRIER_ROAMING_NTN_ALL_SATELLITE_PLMN_SET_KEY, new HashSet<>());
            } catch (Exception ex) {
                plogd("getCarrierRoamingNtnAllSatellitePlmnSetFromStorage: ex=" + ex);
            }

            synchronized (mCarrierRoamingNtnAllSatellitePlmnSetLock) {
                mCarrierRoamingNtnAllSatellitePlmnSet = allSatellitePlmnSet;
                plogd("getCarrierRoamingNtnAllSatellitePlmnSetFromStorage: "
                        + mCarrierRoamingNtnAllSatellitePlmnSet);
                return mCarrierRoamingNtnAllSatellitePlmnSet;
            }
        }
    }

    private void handleSetSatellitePlmnInfoDoneEvent(Message msg) {
@@ -5480,6 +5624,7 @@ public class SatelliteController extends Handler {
            return;
        }

        getSatelliteEnabledForCarrierAtModem(subId);
        updateCarrierConfig(subId);
        updateSatelliteESOSSupported(subId);
        updateSatelliteProvisionedStatePerSubscriberId();
@@ -5493,6 +5638,16 @@ public class SatelliteController extends Handler {
        updateRegionalSatelliteEarfcns(subId);
    }

    private void getSatelliteEnabledForCarrierAtModem(int subId) {
        Phone phone = SatelliteServiceUtils.getPhone(subId);
        synchronized (mIsSatelliteEnabledLock) {
            if (!mIsSatelliteAttachEnabledForCarrierArrayPerSub.containsKey(subId)) {
                // Get enabled status from modem for new subscription
                sendRequestAsync(CMD_GET_SATELLITE_ENABLED_FOR_CARRIER, null, phone);
            }
        }
    }

    // imsi, msisdn, default sms subId change
    private void handleSubscriptionsChanged() {
        sendMessageDelayed(obtainMessage(CMD_EVALUATE_ESOS_PROFILES_PRIORITIZATION),
@@ -5500,9 +5655,10 @@ public class SatelliteController extends Handler {
    }

    private void processNewCarrierConfigData(int subId) {
        configureSatellitePlmnForCarrier(subId);
        setSatelliteAttachEnabledForCarrierOnSimLoaded(subId);
        updateRestrictReasonForEntitlementPerCarrier(subId);
        configureSatellitePlmnForCarrier(subId);
        evaluateEnablingSatelliteForCarrier(subId,
                SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER, null);
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@@ -5613,23 +5769,6 @@ public class SatelliteController extends Handler {
        }
    }

    /**
     * When a SIM is loaded, we need to check if users has enabled satellite attach for the carrier
     * associated with the SIM, and evaluate if satellite should be enabled for the carrier.
     *
     * @param subId Subscription ID.
     */
    private void setSatelliteAttachEnabledForCarrierOnSimLoaded(int subId) {
        synchronized (mIsSatelliteEnabledLock) {
            if (isSatelliteAttachEnabledForCarrierByUser(subId)
                    && !mIsSatelliteAttachEnabledForCarrierArrayPerSub.getOrDefault(subId,
                    false)) {
                evaluateEnablingSatelliteForCarrier(subId,
                        SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER, null);
            }
        }
    }

    /**
     * Update the value of SimInfo.COLUMN_SATELLITE_ESOS_SUPPORTED stored in the database based
     * on the value in the carrier config.
@@ -5928,7 +6067,7 @@ public class SatelliteController extends Handler {
    /**
     * Check whether satellite is enabled for carrier at modem.
     *
     * @param subId Subscription ID to check for.
     * @param subId subscription ID
     * @return {@code true} if satellite modem is enabled, {@code false} otherwise.
     */
    private boolean isSatelliteEnabledForCarrierAtModem(int subId) {
@@ -5971,7 +6110,13 @@ public class SatelliteController extends Handler {
        state and the current state are different. */
        boolean isSatelliteExpectedToBeEnabled = !isSatelliteRestrictedForCarrier(subId)
                && isSatelliteSupportedViaCarrier(subId);
        if (isSatelliteExpectedToBeEnabled != isSatelliteEnabledForCarrierAtModem(subId)) {
        boolean isSatelliteEnabledForCarrierAtModem = isSatelliteEnabledForCarrierAtModem(
                phone.getSubId());
        plogd("evaluateEnablingSatelliteForCarrier: subId=" + subId + " reason=" + reason
                + " isSatelliteExpectedToBeEnabled=" + isSatelliteExpectedToBeEnabled
                + " isSatelliteEnabledForCarrierAtModem=" + isSatelliteEnabledForCarrierAtModem);

        if (isSatelliteExpectedToBeEnabled != isSatelliteEnabledForCarrierAtModem) {
            int simSlot = SubscriptionManager.getSlotIndex(subId);
            RequestHandleSatelliteAttachRestrictionForCarrierArgument argument =
                    new RequestHandleSatelliteAttachRestrictionForCarrierArgument(subId,
+11 −3
Original line number Diff line number Diff line
@@ -2305,6 +2305,7 @@ public class SatelliteControllerTest extends TelephonyTest {
        reset(mPhone);

        // Test empty config_satellite_providers and empty carrier PLMN list
        // allSatellitePlmnList is stored in shared preference, so plmns will not be removed
        mCarrierConfigChangedListenerList.clear();
        mContextFixture.putStringArrayResource(
                R.array.config_satellite_providers, EMPTY_STRING_ARRAY);
@@ -2325,7 +2326,7 @@ public class SatelliteControllerTest extends TelephonyTest {
        carrierPlmnList = testSatelliteController.getSatellitePlmnsForCarrier(SUB_ID);
        assertTrue(carrierPlmnList.isEmpty());
        verify(mPhone, times(1)).setSatellitePlmn(anyInt(),
                eq(EMPTY_STRING_LIST), eq(EMPTY_STRING_LIST), any(Message.class));
                eq(EMPTY_STRING_LIST), eq(allSatellitePlmnList), any(Message.class));
        reset(mMockSatelliteModemInterface);
        reset(mPhone);
    }
@@ -3015,14 +3016,17 @@ public class SatelliteControllerTest extends TelephonyTest {
        // If the entitlement plmn list is empty and the overlay config plmn list and the carrier
        // plmn list are available, verify passing to the modem.
        reset(mMockSatelliteModemInterface);
        reset(mPhone);
        entitlementPlmnList = new ArrayList<>();
        mergedPlmnList = carrierConfigPlmnList;
        verifyPassingToModemAfterQueryCompleted(entitlementPlmnList, mergedPlmnList,
                overlayConfigPlmnList, barredPlmnList);


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

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        reset(mPhone);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", ""}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(),
@@ -3047,6 +3052,7 @@ public class SatelliteControllerTest extends TelephonyTest {

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        reset(mPhone);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "123456789"}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(),
@@ -3056,6 +3062,7 @@ public class SatelliteControllerTest extends TelephonyTest {

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        reset(mPhone);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "12"}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(),
@@ -3065,6 +3072,7 @@ public class SatelliteControllerTest extends TelephonyTest {

        // If the entitlement plmn list is invalid, verify not passing to the modem.
        reset(mMockSatelliteModemInterface);
        reset(mPhone);
        entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "1234"}).toList();
        mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
                entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(),
@@ -3090,7 +3098,7 @@ public class SatelliteControllerTest extends TelephonyTest {
            assertEquals(plmnListPerCarrier, allSatellitePlmnList);
        }
        verify(mPhone, times(1)).setSatellitePlmn(anyInt(),
                eq(plmnListPerCarrier), eq(allSatellitePlmnList), any(Message.class));
                eq(plmnListPerCarrier), anyList(), any(Message.class));
    }

    private void setConfigData(List<String> plmnList) {