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

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

Check if device is connected to satellite within hysteresis per phone

object.

Bug: 328117928
Manual Testing: b/328117928#comment3
Test Request Bugs: 329286654
Test: atest SatelliteControllerTest

Change-Id: I875ab713a4cde0f5eecd1cc5cae732163b49a319
parent 55f9314b
Loading
Loading
Loading
Loading
+98 −22
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
@@ -333,6 +334,14 @@ public class SatelliteController extends Handler {
    @NonNull private final SparseBooleanArray
            mWasSatelliteConnectedViaCarrier = new SparseBooleanArray();

    /**
     * Key: Subscription ID; Value: set of
     * {@link android.telephony.NetworkRegistrationInfo.ServiceType}
     */
    @GuardedBy("mSatelliteConnectedLock")
    @NonNull private final Map<Integer, List<Integer>>
            mSatModeCapabilitiesForCarrierRoaming = new HashMap<>();

    @GuardedBy("mSatelliteConnectedLock")
    @NonNull private final SparseBooleanArray
            mIsSatelliteConnectedViaCarrierHysteresisTimeExpired = new SparseBooleanArray();
@@ -2579,13 +2588,49 @@ public class SatelliteController extends Handler {
            return true;
        }
        for (Phone phone : PhoneFactory.getPhones()) {
            if (isSatelliteSupportedViaCarrier(phone.getSubId())) {
            if (isInSatelliteModeForCarrierRoaming(phone)) {
                logd("isSatelliteConnectedViaCarrierWithinHysteresisTime: "
                        + "subId:" + phone.getSubId()
                        + " is connected to satellite within hysteresis time");
                return true;
            }
        }
        return false;
    }

    /**
     * Get whether device is connected to satellite via carrier.
     *
     * @param phone phone object
     * @return {@code true} if the device is connected to satellite using the phone within the
     * {@link CarrierConfigManager#KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT}
     * duration, {@code false} otherwise.
     */
    public boolean isInSatelliteModeForCarrierRoaming(@Nullable Phone phone) {
        if (!mFeatureFlags.carrierEnabledSatelliteFlag()) {
            logd("isInSatelliteModeForCarrierRoaming: carrierEnabledSatelliteFlag is disabled");
            return false;
        }

        if (phone == null) {
            return false;
        }

        if (!isSatelliteSupportedViaCarrier(phone.getSubId())) {
            return false;
        }

        ServiceState serviceState = phone.getServiceState();
        if (serviceState != null && serviceState.isUsingNonTerrestrialNetwork()) {
            return true;
        }

        synchronized (mSatelliteConnectedLock) {
            Boolean isHysteresisTimeExpired =
                    mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.get(
                            phone.getSubId());
            if (isHysteresisTimeExpired != null && isHysteresisTimeExpired) {
                        continue;
                return false;
            }

            Long lastDisconnectedTime =
@@ -2599,11 +2644,34 @@ public class SatelliteController extends Handler {
            } else {
                mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put(
                        phone.getSubId(), true);
                mSatModeCapabilitiesForCarrierRoaming.remove(phone.getSubId());
                return false;
            }
        }
    }

    /**
     * Return capabilities of carrier roaming satellite network.
     *
     * @param phone phone object
     * @return The list of services supported by the carrier associated with the {@code subId}
     */
    @NonNull
    public List<Integer> getCapabilitiesForCarrierRoamingSatelliteMode(Phone phone) {
        if (!mFeatureFlags.carrierEnabledSatelliteFlag()) {
            logd("getCapabilitiesForCarrierRoamingSatelliteMode: carrierEnabledSatelliteFlag"
                    + " is disabled");
            return new ArrayList<>();
        }

        synchronized (mSatelliteConnectedLock) {
            int subId = phone.getSubId();
            if (mSatModeCapabilitiesForCarrierRoaming.containsKey(subId)) {
                return mSatModeCapabilitiesForCarrierRoaming.get(subId);
            }
        return false;
        }

        return new ArrayList<>();
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@@ -3722,6 +3790,14 @@ public class SatelliteController extends Handler {
                        mWasSatelliteConnectedViaCarrier.put(phone.getSubId(), true);
                        mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put(
                                phone.getSubId(), false);

                        for (NetworkRegistrationInfo nri
                                : serviceState.getNetworkRegistrationInfoList()) {
                            if (nri.isNonTerrestrialNetwork()) {
                                mSatModeCapabilitiesForCarrierRoaming.put(phone.getSubId(),
                                        nri.getAvailableServices());
                            }
                        }
                    } else {
                        Boolean connected = mWasSatelliteConnectedViaCarrier.get(phone.getSubId());
                        if (connected != null && connected) {
+10 −0
Original line number Diff line number Diff line
@@ -2477,12 +2477,16 @@ public class SatelliteControllerTest extends TelephonyTest {
        processAllMessages();
        mSatelliteControllerUT.elapsedRealtime = 0;
        assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));

        when(mServiceState.isUsingNonTerrestrialNetwork()).thenReturn(false);
        when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false);
        sendServiceStateChangedEvent();
        processAllMessages();
        assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));

        // Last satellite connected time of Phone2 should be 0
        when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(true);
@@ -2492,6 +2496,8 @@ public class SatelliteControllerTest extends TelephonyTest {
        mSatelliteControllerUT.elapsedRealtime = 2 * 60 * 1000;
        // But Phone2 is connected to NTN right now
        assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));

        // Last satellite disconnected time of Phone2 should be 2 * 60 * 1000
        when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false);
@@ -2499,10 +2505,14 @@ public class SatelliteControllerTest extends TelephonyTest {
        processAllMessages();
        // Current time (2) - last disconnected time (2) < hysteresis timeout (1)
        assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));

        // Current time (4) - last disconnected time (2) > hysteresis timeout (1)
        mSatelliteControllerUT.elapsedRealtime = 4 * 60 * 1000;
        assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
    }

    @Test