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

Commit e9cd4727 authored by Aishwarya Mallampati's avatar Aishwarya Mallampati Committed by Android (Google) Code Review
Browse files

Merge "Check if device is connected to satellite within hysteresis per phone object." into 24D1-dev

parents 583cc5ef a5b99212
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;
@@ -334,6 +335,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();
@@ -2566,13 +2575,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 =
@@ -2586,11 +2631,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)
@@ -3716,6 +3784,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