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

Commit 8dcd39df authored by Thomas Nguyen's avatar Thomas Nguyen
Browse files

Select proper handover type and monitoring timeout duration

Bug: 366014519
Flag: EXEMPT bugfix
Test: SatelliteSOSMessageRecommenderTest SatelliteControllerTest
Manual system test with Skylo, Vzw, Starlink

Change-Id: I2962b57c7ea8e364119be92b1b467fcebb6d9354
parent 2f27354e
Loading
Loading
Loading
Loading
+23 −11
Original line number Diff line number Diff line
@@ -3961,28 +3961,30 @@ public class SatelliteController extends Handler {
    }

    /**
     * @return {@code true} if the device is connected to satellite via any carrier within the
     * @return {@code true} and the corresponding subId if the device is connected to
     * satellite via any carrier within the
     * {@link CarrierConfigManager#KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT}
     * duration, {@code false} otherwise.
     * duration, {@code false} and null otherwise.
     */
    public boolean isSatelliteConnectedViaCarrierWithinHysteresisTime() {
    public Pair<Boolean, Integer> isSatelliteConnectedViaCarrierWithinHysteresisTime() {
        if (!mFeatureFlags.carrierEnabledSatelliteFlag()) {
            logd("isSatelliteConnectedViaCarrierWithinHysteresisTime: carrierEnabledSatelliteFlag"
                    + " is disabled");
            return false;
            return new Pair<>(false, null);
        }
        if (isUsingNonTerrestrialNetworkViaCarrier().first) {
            return true;
        Pair<Boolean, Integer> ntnConnectedState = isUsingNonTerrestrialNetworkViaCarrier();
        if (ntnConnectedState.first) {
            return ntnConnectedState;
        }
        for (Phone phone : PhoneFactory.getPhones()) {
            if (isInSatelliteModeForCarrierRoaming(phone)) {
                logd("isSatelliteConnectedViaCarrierWithinHysteresisTime: "
                        + "subId:" + phone.getSubId()
                        + " is connected to satellite within hysteresis time");
                return true;
                return new Pair<>(true, phone.getSubId());
            }
        }
        return false;
        return new Pair<>(false, null);
    }

    /**
@@ -4185,7 +4187,7 @@ public class SatelliteController extends Handler {
        return DEFAULT_CARRIER_EMERGENCY_CALL_WAIT_FOR_CONNECTION_TIMEOUT_MILLIS;
    }

    private int getCarrierEmergencyCallWaitForConnectionTimeoutMillis(int subId) {
    public int getCarrierEmergencyCallWaitForConnectionTimeoutMillis(int subId) {
        PersistableBundle config = getPersistableBundle(subId);
        return config.getInt(KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INT);
    }
@@ -4546,12 +4548,22 @@ public class SatelliteController extends Handler {
            return null;
        }
        String iccid = subInfo.getIccId();
        String apn = getConfigForSubId(subId).getString(KEY_SATELLITE_NIDD_APN_NAME_STRING, "");
        String apn = getNiddApnName(subId);
        return new SatelliteModemEnableRequestAttributes(
                arg.enableSatellite, arg.enableDemoMode, arg.isEmergency,
                new SatelliteSubscriptionInfo(iccid, apn));
    }

    @NonNull private String getNiddApnName(int subId) {
        if (SatelliteServiceUtils.isNtnOnlySubscriptionId(subId)) {
            String apn = mContext.getResources().getString(R.string.config_satellite_nidd_apn_name);
            if (!TextUtils.isEmpty(apn)) {
                return apn;
            }
        }
        return getConfigForSubId(subId).getString(KEY_SATELLITE_NIDD_APN_NAME_STRING, "");
    }

    private void handleRequestSatelliteAttachRestrictionForCarrierCmd(
            SatelliteControllerHandlerRequest request) {
        RequestHandleSatelliteAttachRestrictionForCarrierArgument argument =
@@ -6532,7 +6544,7 @@ public class SatelliteController extends Handler {
                        /*visible*/ true);
            }
        } else if (mIsNotificationShowing
                && !isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
                && !isSatelliteConnectedViaCarrierWithinHysteresisTime().first) {
            // Dismiss the notification if it is still displaying.
            dismissSatelliteNotification();
        }
+40 −15
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.telephony.DropBoxManagerLoggerBackend;
import android.telephony.PersistentLogger;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsRegistrationAttributes;
@@ -79,6 +80,7 @@ import com.android.internal.telephony.metrics.SatelliteStats;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;


/**
@@ -119,8 +121,10 @@ public class SatelliteSOSMessageRecommender extends Handler {
    private boolean mCheckingAccessRestrictionInProgress = false;
    protected long mTimeoutMillis = 0;
    private final long mOemEnabledTimeoutMillis;
    private final AtomicBoolean mIsSatelliteConnectedViaCarrierWithinHysteresisTime =
    protected final AtomicBoolean mIsSatelliteConnectedViaCarrierWithinHysteresisTime =
            new AtomicBoolean(false);
    protected final AtomicInteger mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime =
            new AtomicInteger(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
    @GuardedBy("mLock")
    private boolean mIsTimerTimedOut = false;
    protected int mCountOfTimerStarted = 0;
@@ -238,8 +242,7 @@ public class SatelliteSOSMessageRecommender extends Handler {
         * should do this check now so that we have higher chance of sending the event
         * EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer.
         */
        mIsSatelliteConnectedViaCarrierWithinHysteresisTime.set(
                mSatelliteController.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        updateSatelliteConnectedViaCarrierWithinHysteresisTimeState();
        sendMessage(obtainMessage(EVENT_EMERGENCY_CALL_STARTED, connection));
    }

@@ -377,8 +380,7 @@ public class SatelliteSOSMessageRecommender extends Handler {

    private void updateSatelliteViaCarrierAvailability() {
        if (!mIsSatelliteConnectedViaCarrierWithinHysteresisTime.get()) {
            mIsSatelliteConnectedViaCarrierWithinHysteresisTime.set(
                    mSatelliteController.isSatelliteConnectedViaCarrierWithinHysteresisTime());
            updateSatelliteConnectedViaCarrierWithinHysteresisTimeState();
        }
    }

@@ -571,11 +573,20 @@ public class SatelliteSOSMessageRecommender extends Handler {

    private void selectEmergencyCallWaitForConnectionTimeoutDuration() {
        if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
            int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get();
            mTimeoutMillis =
                    mSatelliteController.getCarrierEmergencyCallWaitForConnectionTimeoutMillis();
                    mSatelliteController.getCarrierEmergencyCallWaitForConnectionTimeoutMillis(
                            satelliteSubId);
        } else {
            int satelliteSubId = mSatelliteController.getSelectedSatelliteSubId();
            if (!SatelliteServiceUtils.isNtnOnlySubscriptionId(satelliteSubId)) {
                mTimeoutMillis =
                    mSatelliteController.getCarrierEmergencyCallWaitForConnectionTimeoutMillis(
                        satelliteSubId);
            } else {
                mTimeoutMillis = mOemEnabledTimeoutMillis;
            }
        }
        plogd("mTimeoutMillis = " + mTimeoutMillis);
    }

@@ -763,19 +774,20 @@ public class SatelliteSOSMessageRecommender extends Handler {

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    public int getEmergencyCallToSatelliteHandoverType() {
        if (Flags.carrierRoamingNbIotNtn()
                && isDeviceProvisioned()
                && isSatelliteAllowedByReasons()
                && isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
            int satelliteSubId = mSatelliteController.getSelectedSatelliteSubId();
        if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
            int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get();
            return mSatelliteController.getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType(
                    satelliteSubId);
        } else if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
            return EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_T911;
        } else {
            int satelliteSubId = mSatelliteController.getSelectedSatelliteSubId();
            if (!SatelliteServiceUtils.isNtnOnlySubscriptionId(satelliteSubId)) {
                return mSatelliteController
                    .getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType(satelliteSubId);
            } else {
                return EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS;
            }
        }
    }

    private void requestIsSatelliteAllowedForCurrentLocation() {
        synchronized (mLock) {
@@ -831,6 +843,19 @@ public class SatelliteSOSMessageRecommender extends Handler {
        return (provisioned != null) && provisioned;
    }

    private void updateSatelliteConnectedViaCarrierWithinHysteresisTimeState() {
        Pair<Boolean, Integer> satelliteConnectedState =
                mSatelliteController.isSatelliteConnectedViaCarrierWithinHysteresisTime();
        mIsSatelliteConnectedViaCarrierWithinHysteresisTime.set(satelliteConnectedState.first);
        if (satelliteConnectedState.first) {
            mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.set(
                    satelliteConnectedState.second);
        } else {
            mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.set(
                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
        }
    }

    private static void logv(@NonNull String log) {
        Rlog.v(TAG, log);
    }
+23 −0
Original line number Diff line number Diff line
@@ -365,6 +365,29 @@ public class SatelliteServiceUtils {
        return subId;
    }

    /**
     * Check if the subscription ID is a NTN only subscription ID.
     *
     * @return {@code true} if the subscription ID is a NTN only subscription ID,
     * {@code false} otherwise.
    */
    public static boolean isNtnOnlySubscriptionId(int subId) {
        SubscriptionManagerService subscriptionManagerService =
            SubscriptionManagerService.getInstance();
        if (subscriptionManagerService == null) {
            logd("isNtnOnlySubscriptionId: subscriptionManagerService is null");
            return false;
        }

        SubscriptionInfo subInfo = subscriptionManagerService.getSubscriptionInfo(subId);
        if (subInfo == null) {
            logd("isNtnOnlySubscriptionId: subInfo is null for subId=" + subId);
            return false;
        }

        return subInfo.isOnlyNonTerrestrialNetwork();
    }

    /**
     * Expected format of the input dictionary bundle is:
     * <ul>
+12 −6
Original line number Diff line number Diff line
@@ -2974,7 +2974,8 @@ public class SatelliteControllerTest extends TelephonyTest {
    @Test
    public void testCarrierEnabledSatelliteConnectionHysteresisTime() throws Exception {
        when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(false);
        assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT
                        .isSatelliteConnectedViaCarrierWithinHysteresisTime().first);

        when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
        when(mServiceState2.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
@@ -2994,7 +2995,8 @@ public class SatelliteControllerTest extends TelephonyTest {
        doReturn(cellSignalStrengthList).when(mSignalStrength).getCellSignalStrengths();
        processAllMessages();
        mSatelliteControllerUT.elapsedRealtime = 0;
        assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT
                        .isSatelliteConnectedViaCarrierWithinHysteresisTime().first);
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));

@@ -3002,7 +3004,8 @@ public class SatelliteControllerTest extends TelephonyTest {
        when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false);
        sendServiceStateChangedEvent();
        processAllMessages();
        assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT
                        .isSatelliteConnectedViaCarrierWithinHysteresisTime().first);
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
        verify(mPhone, times(1)).notifyCarrierRoamingNtnModeChanged(eq(false));
@@ -3017,7 +3020,8 @@ public class SatelliteControllerTest extends TelephonyTest {
        // 2 minutes later and hysteresis timeout is 1 minute
        mSatelliteControllerUT.elapsedRealtime = 2 * 60 * 1000;
        // But Phone2 is connected to NTN right now
        assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertTrue(mSatelliteControllerUT
                       .isSatelliteConnectedViaCarrierWithinHysteresisTime().first);
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
        verify(mPhone, times(0)).notifyCarrierRoamingNtnModeChanged(eq(false));
@@ -3030,7 +3034,8 @@ public class SatelliteControllerTest extends TelephonyTest {
        sendServiceStateChangedEvent();
        processAllMessages();
        // Current time (2) - last disconnected time (2) < hysteresis timeout (1)
        assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertTrue(mSatelliteControllerUT
                       .isSatelliteConnectedViaCarrierWithinHysteresisTime().first);
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
        verify(mPhone, times(0)).notifyCarrierRoamingNtnModeChanged(eq(false));
@@ -3042,7 +3047,8 @@ public class SatelliteControllerTest extends TelephonyTest {
        mSatelliteControllerUT.elapsedRealtime = 4 * 60 * 1000;
        moveTimeForward(2 * 60 * 1000);
        processAllMessages();
        assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
        assertFalse(mSatelliteControllerUT
                        .isSatelliteConnectedViaCarrierWithinHysteresisTime().first);
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
        assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
        verify(mPhone, times(0)).notifyCarrierRoamingNtnModeChanged(eq(false));
+141 −47

File changed.

Preview size limit exceeded, changes collapsed.