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

Commit 188ba24a authored by Thomas Nguyen's avatar Thomas Nguyen Committed by Android (Google) Code Review
Browse files

Merge "Check emergency messaging support before showing SOS button" into main

parents ab44f897 7157f276
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);