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

Commit 7157f276 authored by Thomas Nguyen's avatar Thomas Nguyen
Browse files

Check emergency messaging support before showing SOS button

The current check for isSatelliteConnectedViaCarrierWithinHysteresisTime() does not consider the carrier's capability of supporting emergency messaging. This means that if the user is connected to carrier satellite within the hysteresis time, but the carrier does not support emergency messaging, the user may still be shown an SOS button on dialer.

This commit adds a new check to the SatelliteSOSMessageRecommender that ensures that the carrier supports emergency messaging before allowing the user to see the SOS button.

Flag: EXEMPT bugfix
Bug: 394177376
Test: Manual system tests
SatelliteSOSMessageRecommenderTest SatelliteManagerTestOnMockService

Change-Id: Iffabdea9f71e53fad12f700eb2ceb77ede1a5449
parent ae05591f
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -307,7 +307,7 @@ public class SatelliteSOSMessageRecommender extends Handler {

    private void handleSatelliteProvisionStateChangedEvent(boolean provisioned) {
        if (!provisioned
                && !isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
                && !isSatelliteEmergencyMessagingViaCarrierAvailable()) {
            cleanUpResources(false);
        }
    }
@@ -347,7 +347,7 @@ public class SatelliteSOSMessageRecommender extends Handler {
            if (!isCellularAvailable
                    && isSatelliteAllowed()
                    && ((isDeviceProvisioned() && isSatelliteAllowedByReasons())
                    || isSatelliteConnectedViaCarrierWithinHysteresisTime())
                    || isSatelliteEmergencyMessagingViaCarrierAvailable())
                    && shouldTrackCall(mEmergencyConnection.getState())) {
                plogd("handleTimeoutEvent: Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer");
                Bundle extras = createExtraBundleForEventDisplayEmergencyMessage(
@@ -367,7 +367,7 @@ public class SatelliteSOSMessageRecommender extends Handler {

    private boolean isSatelliteAllowed() {
        synchronized (mLock) {
            if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) return true;
            if (isSatelliteEmergencyMessagingViaCarrierAvailable()) return true;
            return mIsSatelliteAllowedForCurrentLocation;
        }
    }
@@ -388,7 +388,12 @@ public class SatelliteSOSMessageRecommender extends Handler {
        return satelliteProvisioned != null ? satelliteProvisioned : false;
    }

    private boolean isSatelliteConnectedViaCarrierWithinHysteresisTime() {
    private boolean isSatelliteEmergencyMessagingViaCarrierAvailable() {
        if (!mSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier()) {
            plogd("isSatelliteEmergencyMessagingViaCarrierAvailable: false, "
                    + "device does not support satellite emergency messaging via carrier");
            return false;
        }
        return mIsSatelliteConnectedViaCarrierWithinHysteresisTime.get();
    }

@@ -567,7 +572,7 @@ public class SatelliteSOSMessageRecommender extends Handler {
    }

    private void selectEmergencyCallWaitForConnectionTimeoutDuration() {
        if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
        if (isSatelliteEmergencyMessagingViaCarrierAvailable()) {
            int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get();
            mTimeoutMillis =
                    mSatelliteController.getCarrierEmergencyCallWaitForConnectionTimeoutMillis(
@@ -769,7 +774,7 @@ public class SatelliteSOSMessageRecommender extends Handler {

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    public int getEmergencyCallToSatelliteHandoverType() {
        if (isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
        if (isSatelliteEmergencyMessagingViaCarrierAvailable()) {
            int satelliteSubId = mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.get();
            return mSatelliteController.getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType(
                    satelliteSubId);
@@ -841,6 +846,8 @@ public class SatelliteSOSMessageRecommender extends Handler {
    private void updateSatelliteConnectedViaCarrierWithinHysteresisTimeState() {
        Pair<Boolean, Integer> satelliteConnectedState =
                mSatelliteController.isSatelliteConnectedViaCarrierWithinHysteresisTime();
        plogd("updateSatelliteConnectedViaCarrierWithinHysteresisTimeState: subId="
                  + satelliteConnectedState.second + ", connected="+ satelliteConnectedState.first);
        mIsSatelliteConnectedViaCarrierWithinHysteresisTime.set(satelliteConnectedState.first);
        if (satelliteConnectedState.first) {
            mSubIdOfSatelliteConnectedViaCarrierWithinHysteresisTime.set(
+67 −0
Original line number Diff line number Diff line
@@ -331,6 +331,43 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest {
        assertFalse(mTestSOSMessageRecommender.isDialerNotified());
    }

    @Test
    public void testTimeoutBeforeEmergencyCallEnd_EventDisplayEmergencyMessageNotSent_Test2() {
        /*
         * This test is to test the case where the device is provisioned, supports satellite
         * via OEM, and is connected via carrier within the hysteresis time. However, satellite
         * is not allowed at current location and emergency messaing via carrier is not supported.
         * In this case, the EVENT_DISPLAY_EMERGENCY_MESSAGE should not be sent.
         */
        mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1);
        mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false;
        mTestSatelliteController.isOemEnabledSatelliteSupported = true;
        mTestSatelliteController.setDeviceProvisioned(true);
        mTestSOSMessageRecommender.isSatelliteAllowedCallback = null;
        mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false);
        processAllMessages();
        assertEquals(1, mTestSOSMessageRecommender.getCountOfTimerStarted());
        assertRegisterForStateChangedEventsTriggered(mPhone, 1, 1);
        assertRegisterForStateChangedEventsTriggered(mPhone2, 1, 1);
        assertNull(mTestSOSMessageRecommender.isSatelliteAllowedCallback);

        // Move Location service to emergency mode
        mTestSOSMessageRecommender.onEmergencyCallConnectionStateChanged(
                mTestConnection.getTelecomCallId(), Connection.STATE_DIALING);
        processAllMessages();
        assertNotNull(mTestSOSMessageRecommender.isSatelliteAllowedCallback);

        // Wait for the timeout to expires
        mTestSOSMessageRecommender.isSatelliteAllowedCallback.onResult(false);
        moveTimeForward(TEST_EMERGENCY_CALL_TO_SOS_MSG_HYSTERESIS_TIMEOUT_MILLIS);
        processAllMessages();
        assertFalse(mTestConnection.isEventSent(TelephonyManager.EVENT_DISPLAY_EMERGENCY_MESSAGE));
        assertUnregisterForStateChangedEventsTriggered(mPhone, 1, 1);
        assertUnregisterForStateChangedEventsTriggered(mPhone2, 1, 1);
        verify(mMockSatelliteStats, times(1)).onSatelliteSosMessageRecommender(any());
        assertFalse(mTestSOSMessageRecommender.isDialerNotified());
    }

    @Test
    public void testTimeoutBeforeEmergencyCallEnd_T911_FromNotConnectedToConnected() {
        mTestSOSMessageRecommender.isSatelliteAllowedCallback = null;
@@ -684,6 +721,20 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest {
        processAllMessages();
        assertEquals(carrierTimeoutMillis, mTestSOSMessageRecommender.getTimeOutMillis());
        verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any());

        // OEM supports satellite, device is connected to carrier satellite within hysteresis time,
        // but emergency messaging via carrier is not supported. Thus, OEM timer will be used.
        mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false;
        mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1);
        subscriptionInfo = new SubscriptionInfo.Builder()
                .setId(SUB_ID1).setOnlyNonTerrestrialNetwork(true).build();
        when(mMockSubscriptionManagerService.getSubscriptionInfo(eq(SUB_ID1)))
            .thenReturn(subscriptionInfo);
        mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false);
        processAllMessages();
        assertEquals(TEST_EMERGENCY_CALL_TO_SOS_MSG_HYSTERESIS_TIMEOUT_MILLIS,
                mTestSOSMessageRecommender.getTimeOutMillis());
        verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any());
    }

    @Test
@@ -716,6 +767,22 @@ public class SatelliteSOSMessageRecommenderTest extends TelephonyTest {
        mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN);
    }

    @Test
    public void testGetEmergencyCallToSatelliteHandoverType_OnlySatelliteViaOemAvailable() {
        mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN);

        mTestSatelliteController.setSatelliteConnectedViaCarrierWithinHysteresisTime(true, SUB_ID1);
        mTestSatelliteController.isSatelliteEmergencyMessagingSupportedViaCarrier = false;
        mTestSatelliteController.isOemEnabledSatelliteSupported = true;
        mTestSatelliteController.setDeviceProvisioned(true);
        mTestSOSMessageRecommender.onEmergencyCallStarted(mTestConnection, false);
        assertEquals(EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS,
                mTestSOSMessageRecommender.getEmergencyCallToSatelliteHandoverType());
        verify(mMockSatelliteStats, never()).onSatelliteSosMessageRecommender(any());

        mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN);
    }

    @Test
    public void testGetEmergencyCallToSatelliteHandoverType_OemAndCarrierNotAvailable() {
        mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN);