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

Commit 410d5320 authored by Hunsuk Choi's avatar Hunsuk Choi
Browse files

Make RadioOnStateListener complete after discarding the dialing

RadioOnStateListener can run even after the call is discarded.
Ensure it complete if the call is discarded.

Bug: 333619699
Test: atest EmergencyStateTrackerTest
Change-Id: Id72d32e6874784e783e4e569bab78c9c087c2df2
parent 33294684
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1555,6 +1555,11 @@ public class EmergencyStateTracker {

                @Override
                public boolean isOkToCall(Phone phone, int serviceState, boolean imsVoiceCapable) {
                    if (!Objects.equals(mOngoingConnection, expectedConnection)) {
                        Rlog.i(TAG, "isOkToCall "
                                + expectedConnection.getTelecomCallId() + " canceled.");
                        return true;
                    }
                    // Wait for normal service state or timeout if required.
                    if (phone == phoneForEmergency
                            && waitForInServiceTimeout > 0
@@ -1567,6 +1572,11 @@ public class EmergencyStateTracker {

                @Override
                public boolean onTimeout(Phone phone, int serviceState, boolean imsVoiceCapable) {
                    if (!Objects.equals(mOngoingConnection, expectedConnection)) {
                        Rlog.i(TAG, "onTimeout "
                                + expectedConnection.getTelecomCallId() + " canceled.");
                        return true;
                    }
                    // onTimeout shall be called only with the Phone for emergency
                    return phone.getServiceStateTracker().isRadioOn()
                            && !satelliteController.isSatelliteEnabled();
+40 −0
Original line number Diff line number Diff line
@@ -260,6 +260,46 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(testPhone).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any());
    }

    @Test
    @SmallTest
    public void startEmergencyCall_radioOff_turnOnRadioHangupCallTurnOffRadio() {
        EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
                true /* isSuplDdsSwitchRequiredForEmergencyCall */);
        // Create test Phones and set radio off
        Phone testPhone = setupTestPhoneForEmergencyCall(false /* isRoaming */,
                false /* isRadioOn */);
        setConfigForDdsSwitch(testPhone, null,
                CarrierConfigManager.Gps.SUPL_EMERGENCY_MODE_TYPE_DP_ONLY, "150");
        ServiceState ss = mock(ServiceState.class);
        doReturn(ss).when(mSST).getServiceState();
        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
                .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                .build();
        doReturn(nri).when(ss).getNetworkRegistrationInfo(anyInt(), anyInt());
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencyCall(testPhone,
                mTestConnection1, false);

        // startEmergencyCall should trigger radio on
        ArgumentCaptor<RadioOnStateListener.Callback> callback = ArgumentCaptor
                .forClass(RadioOnStateListener.Callback.class);
        verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true), eq(testPhone),
                eq(false), eq(DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS));

        // Hangup the call
        emergencyStateTracker.endCall(mTestConnection1);

        // onTimeout and isOkToCall should return true even in case radion is off
        assertTrue(callback.getValue()
                .isOkToCall(testPhone, ServiceState.STATE_POWER_OFF, false));
        assertTrue(callback.getValue()
                .onTimeout(testPhone, ServiceState.STATE_POWER_OFF, false));

        callback.getValue().onComplete(null, true);

        assertFalse(future.isDone());
    }

    /**
     * Test that if startEmergencyCall fails to turn on radio, then it's future completes with
     * DisconnectCause.POWER_OFF.