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

Commit 7d80faae authored by Jaesik Kong's avatar Jaesik Kong
Browse files

Set forEmergencyCall of setRadioPower to false for normal routing ECC

AP-DS turns radio power on with isForEcc=true when ECC is dialed in AP mode, and modem exit emergency mode when hanging up the call or emergency call timer expiry which starts at entering emergency mode. However, in the case of normal routing ECC, AP-DS won't call setEmergencyMode, so if the ECC is ended before connected, modem can't know the call is disconnected. AP-DS set isForEcc=false when turns radio power on when triggering normal routing ECC in AP mode to prevent this exception case.

Change-Id: Ib07be2e04a9d736e66fb39cbadd699b1a0c2d0f2
Flag: EXEMPT bugfix
Bug: 354111304
Test: atest TelephonyStateTrackerTest
Test: manual test for 995 and 999
Step 1. Power up the device with Starhub SIM in 5G location
Step 2. Change preferred network type to 3G
Step 3. APM on, make APM normal routing emc
 - Normal routing ECC number 995 in singapore
 - Emergency routing ECC number 999 in singapore
Step 4. immediately hangup the emc call before call connect
Step 5. Now change preferred network type to 5G
Step 6. Once device register to 5G change network type to 3G
parent 16a76e11
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1661,7 +1661,8 @@ public class EmergencyStateTracker {
                    return phone.getServiceStateTracker().isRadioOn()
                            && !satelliteController.isSatelliteEnabled();
                }
            }, !isTestEmergencyNumber, phone, isTestEmergencyNumber, waitForInServiceTimeout);
            }, !isTestEmergencyNumber, phone, isTestEmergencyNumber, waitForInServiceTimeout,
                    /* forNormalRoutingEmergencyCall */ false);
        } else {
            switchDdsAndSetEmergencyMode(phone, emergencyType);
        }
+15 −6
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ public class RadioOnHelper implements RadioOnStateListener.Callback {
     */
    public void triggerRadioOnAndListen(RadioOnStateListener.Callback callback,
            boolean forEmergencyCall, Phone phoneForEmergencyCall, boolean isTestEmergencyNumber,
            int emergencyTimeoutIntervalMillis) {
            int emergencyTimeoutIntervalMillis, boolean forNormalRoutingEmergencyCall) {
        setupListeners();
        mCallback = callback;
        mInProgressListeners.clear();
@@ -102,7 +102,8 @@ public class RadioOnHelper implements RadioOnStateListener.Callback {
            mListeners.get(i).waitForRadioOn(phone, this, forEmergencyCall, forEmergencyCall
                    && phone == phoneForEmergencyCall, timeoutCallbackInterval);
        }
        powerOnRadio(forEmergencyCall, phoneForEmergencyCall, isTestEmergencyNumber);
        powerOnRadio(forEmergencyCall, phoneForEmergencyCall, isTestEmergencyNumber,
                forNormalRoutingEmergencyCall);
        if (SatelliteController.getInstance().isSatelliteEnabled()) {
            powerOffSatellite(phoneForEmergencyCall);
        }
@@ -113,17 +114,25 @@ public class RadioOnHelper implements RadioOnStateListener.Callback {
     * get an onServiceStateChanged() callback when the radio successfully comes up.
     */
    private void powerOnRadio(boolean forEmergencyCall, Phone phoneForEmergencyCall,
            boolean isTestEmergencyNumber) {
            boolean isTestEmergencyNumber, boolean forNormalRoutingEmergencyCall) {

        // Always try to turn on the radio here independent of APM setting - if we got here in the
        // first place, the radio is off independent of APM setting.
        for (Phone phone : PhoneFactory.getPhones()) {
            Rlog.d(TAG, "powerOnRadio, enabling Radio");
            if (isTestEmergencyNumber) {
                phone.setRadioPowerOnForTestEmergencyCall(phone == phoneForEmergencyCall);
                phone.setRadioPowerOnForTestEmergencyCall(
                        (phone == phoneForEmergencyCall) && !forNormalRoutingEmergencyCall);
            } else {
                phone.setRadioPower(true, forEmergencyCall, phone == phoneForEmergencyCall,
                        false);
                if (forNormalRoutingEmergencyCall) {
                    if (phone.getServiceStateTracker() != null) {
                        // Clear all radio off reasons to ensure that the radio is turned on for
                        // normal routing emergency call.
                        phone.getServiceStateTracker().clearAllRadioOffReasons();
                    }
                }
                phone.setRadioPower(true, forEmergencyCall && !forNormalRoutingEmergencyCall,
                        (phone == phoneForEmergencyCall) && !forNormalRoutingEmergencyCall, false);
            }
        }

+8 −8
Original line number Diff line number Diff line
@@ -180,7 +180,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        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));
                eq(false), eq(DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS), eq(false));
        // isOkToCall() should return true when IN_SERVICE state
        assertFalse(callback.getValue()
                .isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE, false));
@@ -239,7 +239,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        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));
                eq(false), eq(DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS), eq(false));
        // onTimeout should return true when radion on
        assertFalse(callback.getValue()
                .isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE, false));
@@ -287,7 +287,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        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));
                eq(false), eq(DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS), eq(false));

        // Hangup the call
        emergencyStateTracker.endCall(mTestConnection1);
@@ -323,7 +323,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        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));
                eq(false), eq(DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS), eq(false));
        // Verify future completes with DisconnectCause.POWER_OFF if radio not ready
        CompletableFuture<Void> unused = future.thenAccept((result) -> {
            assertEquals((Integer) result, (Integer) DisconnectCause.POWER_OFF);
@@ -359,7 +359,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        ArgumentCaptor<RadioOnStateListener.Callback> callback = ArgumentCaptor
                .forClass(RadioOnStateListener.Callback.class);
        verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true), eq(testPhone),
                eq(false), eq(0));
                eq(false), eq(0), eq(false));
        // isOkToCall() should return true once satellite modem is off
        assertFalse(callback.getValue()
                .isOkToCall(testPhone, ServiceState.STATE_IN_SERVICE, false));
@@ -400,7 +400,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        ArgumentCaptor<RadioOnStateListener.Callback> callback = ArgumentCaptor
                .forClass(RadioOnStateListener.Callback.class);
        verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true), eq(testPhone),
                eq(false), eq(0));
                eq(false), eq(0), eq(false));
        // Verify future completes with DisconnectCause.POWER_OFF if radio not ready
        CompletableFuture<Void> unused = future.thenAccept((result) -> {
            assertEquals((Integer) result, (Integer) DisconnectCause.SATELLITE_ENABLED);
@@ -428,7 +428,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {

        // Radio already on so shouldn't trigger this
        verify(mRadioOnHelper, never()).triggerRadioOnAndListen(any(), anyBoolean(), any(),
                anyBoolean(), eq(0));
                anyBoolean(), eq(0), eq(false));
        // Carrier supports control-plane fallback, so no DDS switch
        verify(mPhoneSwitcher, never()).overrideDefaultDataForEmergency(anyInt(), anyInt(), any());
    }
@@ -3168,7 +3168,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        // Wait for the radio off for all phones
        verify(mSST, times(2)).registerForVoiceRegStateOrRatChanged(any(), anyInt(), any());
        verify(mRadioOnHelper, never()).triggerRadioOnAndListen(any(), anyBoolean(), any(),
                anyBoolean(), eq(0));
                anyBoolean(), eq(0), eq(false));
    }

    /**