Loading src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java +16 −10 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 Loading Loading @@ -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); } } Loading @@ -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, Loading Loading @@ -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 Loading @@ -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; Loading Loading @@ -1689,8 +1696,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 Loading tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java +12 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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()); } Loading @@ -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(); Loading Loading @@ -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)); Loading Loading @@ -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)); Loading Loading @@ -292,7 +294,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 testConnection.setDisconnected(null); Loading Loading @@ -330,7 +332,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); Loading Loading @@ -3411,8 +3413,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) { Loading Loading
src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java +16 −10 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 Loading Loading @@ -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); } } Loading @@ -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, Loading Loading @@ -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 Loading @@ -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; Loading Loading @@ -1689,8 +1696,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 Loading
tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java +12 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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()); } Loading @@ -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(); Loading Loading @@ -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)); Loading Loading @@ -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)); Loading Loading @@ -292,7 +294,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 testConnection.setDisconnected(null); Loading Loading @@ -330,7 +332,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); Loading Loading @@ -3411,8 +3413,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) { Loading