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

Commit 06456c32 authored by Jaesik Kong's avatar Jaesik Kong Committed by Android (Google) Code Review
Browse files

Merge changes from topic "DisableEcbmInUmtsGsm" into main

* changes:
  (APDS) Don't enter ECBM when ECC ends in GSM/UMTS networks
  Add flag not to enter ECBM in GSM and UMTS networks
parents abe59cab cb84dbd3
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -49,3 +49,14 @@ flag {
    description: "This flag controls the addition of EMERGENCY_REDIAL_ON_IMS and EMERGENCY_REDIAL_ON_VOWIFI redial codes for normal routed emergency calls."
    bug:"357980439"
}

# OWNER=jaesikkong TARGET=25Q2
flag {
    name: "disable_ecbm_based_on_rat"
    namespace: "telephony"
    description: "Fix bug entering the emergency callback mode in GSM or UMTS network."
    bug:"389010789"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+43 −10
Original line number Diff line number Diff line
@@ -163,6 +163,8 @@ public class EmergencyStateTracker {
    private android.telecom.Connection mOngoingConnection;
    // Domain of the active emergency call. Assuming here that there will only be one domain active.
    private int mEmergencyCallDomain = NetworkRegistrationInfo.DOMAIN_UNKNOWN;
    // Phone type of the active emergency call. Assuming that there will only be one phone active.
    private int mEmergencyCallPhoneType = PhoneConstants.PHONE_TYPE_NONE;
    private CompletableFuture<Integer> mCallEmergencyModeFuture;
    private boolean mIsInEmergencyCall;
    private boolean mIsInEcm;
@@ -702,7 +704,7 @@ public class EmergencyStateTracker {
        }

        if (wasActive && mActiveEmergencyCalls.isEmpty()
                && isEmergencyCallbackModeSupported(mPhone)) {
                && isEmergencyCallbackModeSupported(mPhone, true)) {
            enterEmergencyCallbackMode();

            if (mOngoingConnection == null) {
@@ -713,10 +715,17 @@ public class EmergencyStateTracker {
            if (isInEcm()) {
                mIsEmergencyCallStartedDuringEmergencySms = false;
                mCallEmergencyModeFuture = null;
                // If the emergency call was initiated during the emergency callback mode,
                // the emergency callback mode should be restored when the emergency call is ended.

                if (mActiveEmergencyCalls.isEmpty()) {
                    // If the emergency call was initiated during the emergency callback mode,
                    // the emergency callback mode should be restored when the emergency call is
                    // ended.
                    if (isEmergencyCallbackModeSupported(mPhone, true)) {
                        enterEmergencyCallbackMode();
                    } else {
                        exitEmergencyCallbackMode();
                        clearEmergencyCallInfo();
                    }
                }
            } else {
                if (isInScbm()) {
@@ -735,6 +744,7 @@ public class EmergencyStateTracker {

    private void clearEmergencyCallInfo() {
        mEmergencyCallDomain = NetworkRegistrationInfo.DOMAIN_UNKNOWN;
        mEmergencyCallPhoneType = PhoneConstants.PHONE_TYPE_NONE;
        mIsTestEmergencyNumber = false;
        mIsEmergencyCallStartedDuringEmergencySms = false;
        mCallEmergencyModeFuture = null;
@@ -1075,10 +1085,17 @@ public class EmergencyStateTracker {
                Rlog.w(TAG, "domain updated: Unexpected phoneType:" + phoneType);
            }
        }
        if (mEmergencyCallDomain == domain) return;

        if (mEmergencyCallPhoneType != phoneType) {
            Rlog.i(TAG, "phoneType updated: from " + mEmergencyCallPhoneType + " to " + phoneType);
            mEmergencyCallPhoneType = phoneType;
        }

        if (mEmergencyCallDomain != domain) {
            Rlog.i(TAG, "domain updated: from " + mEmergencyCallDomain + " to " + domain);
            mEmergencyCallDomain = domain;
        }
    }

    /**
     * Handles emergency call state change.
@@ -1127,12 +1144,27 @@ public class EmergencyStateTracker {
    }

    /**
     * Returns {@code true} if device and carrier support emergency callback mode.
     * Returns {@code true} if device and carrier support emergency callback mode. If
     * {@code forEcbm} is {@code true}, it also checks RAT used when the emergency call ended.
     *
     * @param phone The {@link Phone} instance to be checked.
     * @param forEcbm {@code true} if it's for the ECBM. {@code false} if it's for the SCBM.
     */
    @VisibleForTesting
    public boolean isEmergencyCallbackModeSupported(Phone phone) {
    public boolean isEmergencyCallbackModeSupported(Phone phone, boolean forEcbm) {
        // TODO(b/399787802): Remove the forEcbm parameter and related logic when the CDMA-related
        // APIs are deprecated. Replace this logic with a check that utilizes the domain parameter
        // to determine ECBM and SCBM support.
        if (forEcbm) {
            if (mFeatureFlags.disableEcbmBasedOnRat()) {
                if ((mEmergencyCallPhoneType == PhoneConstants.PHONE_TYPE_GSM)
                        || (mEmergencyCallPhoneType == PhoneConstants.PHONE_TYPE_NONE)) {
                    Rlog.d(TAG, "ecbmUnavailableRat");
                    return false;
                }
            }
        }

        if (phone == null) {
            return false;
        }
@@ -1256,6 +1288,7 @@ public class EmergencyStateTracker {
        // the emergency call.
        if (mOngoingConnection == null) {
            mEmergencyCallDomain = NetworkRegistrationInfo.DOMAIN_UNKNOWN;
            mEmergencyCallPhoneType = PhoneConstants.PHONE_TYPE_NONE;
            mIsTestEmergencyNumber = false;
            mPhone = null;
        }
@@ -1475,7 +1508,7 @@ public class EmergencyStateTracker {

            // If SCBM supports, SCBM will be entered here regardless of ECBM state.
            if (success && domain == NetworkRegistrationInfo.DOMAIN_PS
                    && (isInScbm() || isEmergencyCallbackModeSupported(mSmsPhone))) {
                    && (isInScbm() || isEmergencyCallbackModeSupported(mSmsPhone, false))) {
                enterEmergencySmsCallbackMode();
            } else if (isInScbm()) {
                // Sets the emergency mode to CALLBACK without re-initiating SCBM timer.
+127 −38
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        doReturn(TelephonyManager.SIM_STATE_READY)
                .when(mTelephonyManagerProxy).getSimState(anyInt());
        doReturn(true).when(mFeatureFlags).emergencyCallbackModeNotification();
        doReturn(true).when(mFeatureFlags).disableEcbmBasedOnRat();
    }

    @After
@@ -664,37 +665,6 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        assertFalse(emergencyStateTracker.isInImsEcm());
    }

    /**
     * Ensure that if for some reason we enter ECBM for CS domain and the Phone type is GSM,
     * isInCdmaEcm returns false.
     */
    @Test
    @SmallTest
    public void onEmergencyCallDomainUpdated_CsDomain_Gsm() {
        EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
                /* isSuplDdsSwitchRequiredForEmergencyCall= */ true);
        // Create test Phones
        Phone testPhone = setupTestPhoneForEmergencyCall(/* isRoaming= */ true,
                /* isRadioOn= */ true);
        // For some reason the Phone is reporting GSM instead of CDMA.
        doReturn(PhoneConstants.PHONE_TYPE_GSM).when(testPhone).getPhoneType();
        // Call startEmergencyCall() to set testPhone
        CompletableFuture<Integer> unused = emergencyStateTracker.startEmergencyCall(testPhone,
                mTestConnection1, false);

        // Set call to ACTIVE
        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        // set domain
        emergencyStateTracker.onEmergencyCallDomainUpdated(PhoneConstants.PHONE_TYPE_CDMA,
                mTestConnection1);
        // End call to enter ECM
        emergencyStateTracker.endCall(mTestConnection1);

        assertTrue(emergencyStateTracker.isInEcm());
        assertFalse(emergencyStateTracker.isInCdmaEcm());
        assertFalse(emergencyStateTracker.isInImsEcm());
    }

    /**
     * Test that onEmergencyTransportChanged sets the new emergency mode.
     */
@@ -755,6 +725,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                mTestConnection1, false);
        // Set call to ACTIVE
        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);
        // Set ecm as supported
        setEcmSupportedConfig(testPhone, true);

@@ -819,6 +791,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                mTestConnection1, false);
        // Set call to ACTIVE
        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);
        // Set ecm as supported
        setEcmSupportedConfig(testPhone, /* ecmSupported= */ true);

@@ -857,6 +831,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                mTestConnection1, false);
        // Set call to ACTIVE
        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);
        // Set ecm as supported
        setEcmSupportedConfig(testPhone, /* ecmSupported= */ true);

@@ -931,6 +907,37 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(testPhone).exitEmergencyMode(any(Message.class));
    }

    /**
     * Test that after endCall() is called, EmergencyStateTracker will not enter ECM if the call was
     * ACTIVE in UMTS or GSM network.
     */
    @Test
    @SmallTest
    public void endCall_callActiveInUmts_noEcm() {
        // Setup EmergencyStateTracker
        EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
                /* isSuplDdsSwitchRequiredForEmergencyCall= */ true);
        // Create test Phone
        Phone testPhone = setupTestPhoneForEmergencyCall(/* isRoaming= */ true,
                /* isRadioOn= */ true);
        // Start emergency call then enter ECM
        CompletableFuture<Integer> unused = emergencyStateTracker.startEmergencyCall(testPhone,
                mTestConnection1, false);
        // Set call to ACTIVE
        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        // Make sure that the call was made in UMTS network.
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_GSM, mTestConnection1);
        // Set ecm as supported
        setEcmSupportedConfig(testPhone, true);

        assertFalse(emergencyStateTracker.isInEcm());

        emergencyStateTracker.endCall(mTestConnection1);

        assertFalse(emergencyStateTracker.isInEcm());
    }

    @Test
    @SmallTest
    public void testOnEmergencyTransportChangedUsingDifferentThread() {
@@ -1016,6 +1023,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);
        emergencyStateTracker.endCall(mTestConnection1);
        processAllMessages();

@@ -1085,6 +1094,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                Integer.valueOf(DisconnectCause.NOT_DISCONNECTED));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);
        emergencyStateTracker.endCall(mTestConnection1);
        processAllMessages();

@@ -1093,6 +1104,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {

        // Second emergency call started.
        future = emergencyStateTracker.startEmergencyCall(phone0, mTestConnection2, false);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection2);

        assertTrue(emergencyStateTracker.isInEmergencyMode());
        assertFalse(future.isDone());
@@ -1113,6 +1126,63 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                eq(EMERGENCY_CALLBACK_MODE_CALL), anyInt());
    }

    @Test
    @SmallTest
    public void testEndUmtsCallInEcm() {
        EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
                /* isSuplDdsSwitchRequiredForEmergencyCall= */ true);
        Phone phone0 = setupTestPhoneForEmergencyCall(/* isRoaming= */ true,
                /* isRadioOn= */ true);
        setUpAsyncResultForSetEmergencyMode(phone0, E_REG_RESULT);
        setEcmSupportedConfig(phone0, true);

        // First active call.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencyCall(phone0,
                mTestConnection1, false);
        processAllMessages();

        assertTrue(emergencyStateTracker.isInEmergencyMode());
        assertTrue(emergencyStateTracker.isInEmergencyCall());
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));
        assertEquals(future.getNow(DisconnectCause.ERROR_UNSPECIFIED),
                Integer.valueOf(DisconnectCause.NOT_DISCONNECTED));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Ends call and enter ECBM.
        emergencyStateTracker.endCall(mTestConnection1);
        processAllMessages();

        assertTrue(emergencyStateTracker.isInEcm());
        assertFalse(emergencyStateTracker.isInEmergencyCall());


        // Second emergency call start and not active.
        future = emergencyStateTracker.startEmergencyCall(phone0, mTestConnection2, false);

        // Make sure that the 2nd call was tried in UMTS network.
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_GSM, mTestConnection2);

        assertTrue(emergencyStateTracker.isInEmergencyMode());
        assertFalse(future.isDone());

        emergencyStateTracker.endCall(mTestConnection2);
        processAllMessages();

        // At this time, it shouldn't recover ECM since UE is in UMTS network.
        assertFalse(emergencyStateTracker.isInEmergencyMode());
        // Enter ECBM once at the 1st call ends.
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_CALLBACK), any(Message.class));
        verify(phone0).startEmergencyCallbackMode(eq(EMERGENCY_CALLBACK_MODE_CALL), anyLong());
        // Exit ECBM at the 2nd call starts and ends.
        verify(phone0, times(2))
                .stopEmergencyCallbackMode(eq(EMERGENCY_CALLBACK_MODE_CALL), anyInt());
        verify(phone0).exitEmergencyMode(any(Message.class));
    }

    @Test
    @SmallTest
    public void testEndCallAfterExitEmergencyCallbackModeIsCalledInNonEcbm() throws Exception {
@@ -1452,6 +1522,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        assertTrue(emergencyStateTracker.isInEmergencyCall());

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);
        emergencyStateTracker.endCall(mTestConnection1);

        assertTrue(emergencyStateTracker.isInEcm());
@@ -1665,6 +1737,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                Integer.valueOf(DisconnectCause.NOT_DISCONNECTED));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);
        emergencyStateTracker.endCall(mTestConnection1);

        assertTrue(emergencyStateTracker.isInEcm());
@@ -1759,6 +1833,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Emergency SMS is being started.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
@@ -2154,6 +2230,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Emergency SMS is being started.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
@@ -2195,6 +2273,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Emergency SMS is being started.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
@@ -2248,6 +2328,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Emergency SMS is being started.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
@@ -2308,6 +2390,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Emergency SMS is being started.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
@@ -2357,6 +2441,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Emergency SMS is being started.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
@@ -2419,6 +2505,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        verify(phone0).setEmergencyMode(eq(MODE_EMERGENCY_WWAN), any(Message.class));

        emergencyStateTracker.onEmergencyCallStateChanged(Call.State.ACTIVE, mTestConnection1);
        emergencyStateTracker.onEmergencyCallDomainUpdated(
                PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        // Emergency SMS is being started.
        CompletableFuture<Integer> future = emergencyStateTracker.startEmergencySms(phone0,
@@ -2477,6 +2565,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                false /* isSuplDdsSwitchRequiredForEmergencyCall */);

        assertNotNull(testEst.startEmergencyCall(phone, mTestConnection1, false));
        testEst.onEmergencyCallDomainUpdated(PhoneConstants.PHONE_TYPE_IMS, mTestConnection1);

        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerArgumentCaptor =
                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
@@ -2490,7 +2579,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                listenerArgumentCaptor.getAllValues().get(0);

        // Verify carrier config for valid subscription
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone));
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone, true));

        // onCarrierConfigurationChanged is not called yet.
        // SIM removed
@@ -2498,7 +2587,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        setEcmSupportedConfig(phone, false);

        // Verify default config for invalid subscription
        assertFalse(testEst.isEmergencyCallbackModeSupported(phone));
        assertFalse(testEst.isEmergencyCallbackModeSupported(phone, true));

        // Insert SIM again
        when(phone.getSubId()).thenReturn(1);
@@ -2519,7 +2608,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);

        // Verify saved config for valid subscription
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone));
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone, true));

        // Insert SIM in PIN locked again, but emergency callback mode not supported
        doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
@@ -2533,7 +2622,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);

        // Verify carrier config for valid subscription in PIN locked state, saved configuration
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone));
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone, true));

        // SIM removed again
        when(phone.getSubId()).thenReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
@@ -2545,7 +2634,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);

        // Verify saved config for valid subscription
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone));
        assertTrue(testEst.isEmergencyCallbackModeSupported(phone, true));

        // Insert SIM, PIN verified, again, but emergency callback mode not supported
        doReturn(TelephonyManager.SIM_STATE_READY)
@@ -2559,7 +2648,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);

        // Verify carrier config for valid subscription
        assertFalse(testEst.isEmergencyCallbackModeSupported(phone));
        assertFalse(testEst.isEmergencyCallbackModeSupported(phone, true));

        // SIM removed again
        when(phone.getSubId()).thenReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
@@ -2571,7 +2660,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);

        // Verify saved config for valid subscription
        assertFalse(testEst.isEmergencyCallbackModeSupported(phone));
        assertFalse(testEst.isEmergencyCallbackModeSupported(phone, true));
    }

    /**