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

Commit 2fc488ae authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Select proper handover type and monitoring timeout duration" into main

parents 843c3b07 8dcd39df
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.