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

Commit fc826b4e authored by jaesikkong's avatar jaesikkong Committed by Jaesik Kong
Browse files

(APDS) Adding a new param to set in-service state timeout for EmergencyStateTracker

This CL is adding a new parameter waitForInServiceInApmTimeout in
EmergencyStateTracker.make() API to make the timeout value configurable.

Flag: EXEMPT bugfix
Bug: 372376726
Test: atest EmergencyStateTrackerTest
Test: Manual test
1. Dialing ECC in APM.
2. Verify that APDS waits for modem to get in-service state up to the
   time configured.
Change-Id: I12de194ada9b6d233d90560a6057ce18a78511c9
parent 8b834e63
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -109,8 +109,6 @@ public class EmergencyStateTracker {
     * from the modem.
     */
    private static final int DEFAULT_DATA_SWITCH_TIMEOUT_MS = 1 * 1000;
    @VisibleForTesting
    public static final int DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS = 3 * 1000;
    /** Default value for if Emergency Callback Mode is supported. */
    private static final boolean DEFAULT_EMERGENCY_CALLBACK_MODE_SUPPORTED = true;
    /** Default Emergency Callback Mode exit timeout value. */
@@ -142,6 +140,7 @@ public class EmergencyStateTracker {
    private final CarrierConfigManager mConfigManager;
    private final Handler mHandler;
    private final boolean mIsSuplDdsSwitchRequiredForEmergencyCall;
    private final int mWaitForInServiceTimeoutMs;
    private final PowerManager.WakeLock mWakeLock;
    private RadioOnHelper mRadioOnHelper;
    @EmergencyConstants.EmergencyMode
@@ -474,10 +473,10 @@ public class EmergencyStateTracker {
     * @param featureFlags                            The telephony feature flags.
     */
    public static void make(Context context, boolean isSuplDdsSwitchRequiredForEmergencyCall,
            @NonNull FeatureFlags featureFlags) {
            int waitForInServiceTimeout, @NonNull FeatureFlags featureFlags) {
        if (INSTANCE == null) {
            INSTANCE = new EmergencyStateTracker(context, Looper.myLooper(),
                    isSuplDdsSwitchRequiredForEmergencyCall, featureFlags);
                    isSuplDdsSwitchRequiredForEmergencyCall, waitForInServiceTimeout, featureFlags);
        }
    }

@@ -497,11 +496,13 @@ public class EmergencyStateTracker {
     * Initializes EmergencyStateTracker.
     */
    private EmergencyStateTracker(Context context, Looper looper,
            boolean isSuplDdsSwitchRequiredForEmergencyCall, @NonNull FeatureFlags featureFlags) {
            boolean isSuplDdsSwitchRequiredForEmergencyCall, int waitForInServiceTimeout,
            @NonNull FeatureFlags featureFlags) {
        mEcmExitTimeoutMs = DEFAULT_ECM_EXIT_TIMEOUT_MS;
        mContext = context;
        mHandler = new MyHandler(looper);
        mIsSuplDdsSwitchRequiredForEmergencyCall = isSuplDdsSwitchRequiredForEmergencyCall;
        mWaitForInServiceTimeoutMs = waitForInServiceTimeout;
        mFeatureFlags = featureFlags;
        PowerManager pm = context.getSystemService(PowerManager.class);
        mWakeLock = (pm != null) ? pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -534,6 +535,10 @@ public class EmergencyStateTracker {
     * @param looper                                  The {@link Looper} of the application.
     * @param isSuplDdsSwitchRequiredForEmergencyCall Whether gnss supl requires default data for
     *                                                emergency call.
     * @param waitForInServiceTimeout                 The timeout duration how long does it wait for
     *                                                modem to get in-service state when emergency
     *                                                call is dialed in airplane mode before
     *                                                starting the emergency call.
     * @param phoneFactoryProxy                       The {@link PhoneFactoryProxy} to be injected.
     * @param phoneSwitcherProxy                      The {@link PhoneSwitcherProxy} to be injected.
     * @param telephonyManagerProxy                   The {@link TelephonyManagerProxy} to be
@@ -543,12 +548,14 @@ public class EmergencyStateTracker {
     */
    @VisibleForTesting
    public EmergencyStateTracker(Context context, Looper looper,
            boolean isSuplDdsSwitchRequiredForEmergencyCall, PhoneFactoryProxy phoneFactoryProxy,
            PhoneSwitcherProxy phoneSwitcherProxy, TelephonyManagerProxy telephonyManagerProxy,
            RadioOnHelper radioOnHelper, long ecmExitTimeoutMs, FeatureFlags featureFlags) {
            boolean isSuplDdsSwitchRequiredForEmergencyCall, int waitForInServiceTimeout,
            PhoneFactoryProxy phoneFactoryProxy, PhoneSwitcherProxy phoneSwitcherProxy,
            TelephonyManagerProxy telephonyManagerProxy, RadioOnHelper radioOnHelper,
            long ecmExitTimeoutMs, FeatureFlags featureFlags) {
        mContext = context;
        mHandler = new MyHandler(looper);
        mIsSuplDdsSwitchRequiredForEmergencyCall = isSuplDdsSwitchRequiredForEmergencyCall;
        mWaitForInServiceTimeoutMs = waitForInServiceTimeout;
        mPhoneFactoryProxy = phoneFactoryProxy;
        mPhoneSwitcherProxy = phoneSwitcherProxy;
        mTelephonyManagerProxy = telephonyManagerProxy;
@@ -1684,8 +1691,7 @@ public class EmergencyStateTracker {

            final Phone phoneForEmergency = phone;
            final android.telecom.Connection expectedConnection = mOngoingConnection;
            final int waitForInServiceTimeout =
                    needToTurnOnRadio ? DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS : 0;
            final int waitForInServiceTimeout = needToTurnOnRadio ? mWaitForInServiceTimeoutMs : 0;
            Rlog.i(TAG, "turnOnRadioAndSwitchDds: timeout=" + waitForInServiceTimeout);
            mRadioOnHelper.triggerRadioOnAndListen(new RadioOnStateListener.Callback() {
                @Override
+12 −9
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import static android.telephony.TelephonyManager.EMERGENCY_CALLBACK_MODE_SMS;
import static com.android.internal.telephony.emergency.EmergencyConstants.MODE_EMERGENCY_CALLBACK;
import static com.android.internal.telephony.emergency.EmergencyConstants.MODE_EMERGENCY_WLAN;
import static com.android.internal.telephony.emergency.EmergencyConstants.MODE_EMERGENCY_WWAN;
import static com.android.internal.telephony.emergency.EmergencyStateTracker.DEFAULT_WAIT_FOR_IN_SERVICE_TIMEOUT_MS;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -106,6 +105,7 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
    private static final String TEST_SMS_ID = "1111";
    private static final String TEST_SMS_ID_2 = "2222";
    private static final int TEST_ECM_EXIT_TIMEOUT_MS = 500;
    private static final int TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS = 3000;
    private static final EmergencyRegistrationResult E_REG_RESULT = new EmergencyRegistrationResult(
            EUTRAN, REGISTRATION_STATE_HOME, DOMAIN_CS_PS, true, true, 0, 1, "001", "01", "US");

@@ -139,7 +139,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
            EmergencyStateTracker.getInstance();
        });

        EmergencyStateTracker.make(mContext, true, mFeatureFlags);
        EmergencyStateTracker
                .make(mContext, true, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS, mFeatureFlags);

        assertNotNull(EmergencyStateTracker.getInstance());
    }
@@ -147,7 +148,8 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
    @Test
    @SmallTest
    public void getInstance_returnsSameInstance() {
        EmergencyStateTracker.make(mContext, true, mFeatureFlags);
        EmergencyStateTracker
                .make(mContext, true, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS, mFeatureFlags);
        EmergencyStateTracker instance1 = EmergencyStateTracker.getInstance();
        EmergencyStateTracker instance2 = EmergencyStateTracker.getInstance();

@@ -184,7 +186,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(TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS));
        // isOkToCall() should return true when IN_SERVICE state
        assertFalse(callback.getValue()
                .isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE, false));
@@ -243,7 +245,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(TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS));
        // onTimeout should return true when radion on
        assertFalse(callback.getValue()
                .isOkToCall(testPhone, ServiceState.STATE_OUT_OF_SERVICE, false));
@@ -291,7 +293,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(TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS));

        // Hangup the call
        emergencyStateTracker.endCall(mTestConnection1);
@@ -327,7 +329,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(TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS));
        // Verify future completes with DisconnectCause.POWER_OFF if radio not ready
        CompletableFuture<Void> unused = future.thenAccept((result) -> {
            assertEquals((Integer) result, (Integer) DisconnectCause.POWER_OFF);
@@ -3408,8 +3410,9 @@ public class EmergencyStateTrackerTest extends TelephonyTest {
        doNothing().when(mPhoneSwitcher).overrideDefaultDataForEmergency(
                anyInt(), anyInt(), any());
        return new EmergencyStateTracker(mContext, mTestableLooper.getLooper(),
                isSuplDdsSwitchRequiredForEmergencyCall, mPhoneFactoryProxy, mPhoneSwitcherProxy,
                mTelephonyManagerProxy, mRadioOnHelper, TEST_ECM_EXIT_TIMEOUT_MS, mFeatureFlags);
                isSuplDdsSwitchRequiredForEmergencyCall, TEST_WAIT_FOR_IN_SERVICE_TIMEOUT_MS,
                mPhoneFactoryProxy, mPhoneSwitcherProxy, mTelephonyManagerProxy, mRadioOnHelper,
                TEST_ECM_EXIT_TIMEOUT_MS, mFeatureFlags);
    }

    private Phone setupTestPhoneForEmergencyCall(boolean isRoaming, boolean isRadioOn) {