Loading src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +32 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.os.Message; import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.telecom.TelecomManager; import android.telephony.Annotation.RadioPowerState; import android.telephony.Annotation.ValidationStatus; import android.telephony.CellSignalStrength; Loading Loading @@ -818,6 +819,12 @@ public class DataStallRecoveryManager extends Handler { return false; } // Skip recovery if it can cause an emergrncy call to drop if (isInEmergencyCall()) { logl("skip data stall recovery as there is in an emergency call"); return false; } // Skip recovery if it can cause a call to drop if (!isPhoneStateIdle() && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); Loading Loading @@ -880,6 +887,31 @@ public class DataStallRecoveryManager extends Handler { return true; } /** * Checks if any of the available phones are currently in an emergency call * or in Emergency Callback Mode (ECM). * * @return {@code true} if the device is currently in an emergency call * or if at least one of the available phones is in ECM; * {@code false} otherwise. */ private boolean isInEmergencyCall() { TelecomManager mTelecomManager = mPhone .getContext().getSystemService(TelecomManager.class); if (mTelecomManager != null && mTelecomManager.isInEmergencyCall()) { logl("Emergency call detected on the device"); return true; } for (Phone phone : PhoneFactory.getPhones()) { if (phone.isInEcm()) { logl("ECM detected on phone" + phone.getPhoneId()); return true; } } return false; } /** * Set the validation status into metrics. * Loading tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +63 −0 Original line number Diff line number Diff line Loading @@ -26,7 +26,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.net.NetworkAgent; Loading Loading @@ -92,6 +94,9 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { Field field = DataStallRecoveryManager.class.getDeclaredField("mPredictWaitingMillis"); field.setAccessible(true); // Mock TelecomManager when(mContext.getSystemService(Context.TELECOM_SERVICE)).thenReturn(mTelecomManager); mFakeContentResolver = new FakeContentResolver(); doReturn(mFakeContentResolver).when(mContext).getContentResolver(); // Set the global settings for action enabled state and duration to Loading Loading @@ -129,6 +134,9 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { field.set(mDataStallRecoveryManager, 0L); doReturn(false).when(mTelecomManager).isInEmergencyCall(); doReturn(false).when(mPhone).isInEcm(); logd("DataStallRecoveryManagerTest -Setup!"); } Loading Loading @@ -680,4 +688,59 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { assertThat(getPrivateBooleanField(mDataStallRecoveryManager, "mIsValidNetwork")).isFalse(); } @Test public void testDoNotDoRecoveryActionWhenInEmergencyCall() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); sendOnInternetDataNetworkCallback(true); mDataStallRecoveryManager.setRecoveryAction( DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); doReturn(true).when(mDataNetworkController).isInternetDataAllowed(true); // set not in ECM doReturn(false).when(mPhone).isInEcm(); // set in emergency call doReturn(true).when(mTelecomManager).isInEmergencyCall(); logd("Sending validation failed callback while in emergency call"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mDataStallRecoveryManagerCallback, never()).onDataStallReestablishInternet(); verify(mSST, never()).powerOffRadioSafely(); verify(mPhone, never()).rebootModem(any()); // Still at cleanup assertThat(mDataStallRecoveryManager.getRecoveryAction()) .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); } @Test public void testDoNotDoRecoveryActionWhenInEcm() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); sendOnInternetDataNetworkCallback(true); mDataStallRecoveryManager.setRecoveryAction( DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); doReturn(true).when(mDataNetworkController).isInternetDataAllowed(true); // set in ECM doReturn(true).when(mPhone).isInEcm(); // set not in emergency call doReturn(false).when(mTelecomManager).isInEmergencyCall(); logd("Sending validation failed callback while in ECM"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mDataStallRecoveryManagerCallback, never()).onDataStallReestablishInternet(); verify(mSST, never()).powerOffRadioSafely(); verify(mPhone, never()).rebootModem(any()); // Still at cleanup assertThat(mDataStallRecoveryManager.getRecoveryAction()) .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); } } Loading
src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +32 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.os.Message; import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.telecom.TelecomManager; import android.telephony.Annotation.RadioPowerState; import android.telephony.Annotation.ValidationStatus; import android.telephony.CellSignalStrength; Loading Loading @@ -818,6 +819,12 @@ public class DataStallRecoveryManager extends Handler { return false; } // Skip recovery if it can cause an emergrncy call to drop if (isInEmergencyCall()) { logl("skip data stall recovery as there is in an emergency call"); return false; } // Skip recovery if it can cause a call to drop if (!isPhoneStateIdle() && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); Loading Loading @@ -880,6 +887,31 @@ public class DataStallRecoveryManager extends Handler { return true; } /** * Checks if any of the available phones are currently in an emergency call * or in Emergency Callback Mode (ECM). * * @return {@code true} if the device is currently in an emergency call * or if at least one of the available phones is in ECM; * {@code false} otherwise. */ private boolean isInEmergencyCall() { TelecomManager mTelecomManager = mPhone .getContext().getSystemService(TelecomManager.class); if (mTelecomManager != null && mTelecomManager.isInEmergencyCall()) { logl("Emergency call detected on the device"); return true; } for (Phone phone : PhoneFactory.getPhones()) { if (phone.isInEcm()) { logl("ECM detected on phone" + phone.getPhoneId()); return true; } } return false; } /** * Set the validation status into metrics. * Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +63 −0 Original line number Diff line number Diff line Loading @@ -26,7 +26,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.net.NetworkAgent; Loading Loading @@ -92,6 +94,9 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { Field field = DataStallRecoveryManager.class.getDeclaredField("mPredictWaitingMillis"); field.setAccessible(true); // Mock TelecomManager when(mContext.getSystemService(Context.TELECOM_SERVICE)).thenReturn(mTelecomManager); mFakeContentResolver = new FakeContentResolver(); doReturn(mFakeContentResolver).when(mContext).getContentResolver(); // Set the global settings for action enabled state and duration to Loading Loading @@ -129,6 +134,9 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { field.set(mDataStallRecoveryManager, 0L); doReturn(false).when(mTelecomManager).isInEmergencyCall(); doReturn(false).when(mPhone).isInEcm(); logd("DataStallRecoveryManagerTest -Setup!"); } Loading Loading @@ -680,4 +688,59 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { assertThat(getPrivateBooleanField(mDataStallRecoveryManager, "mIsValidNetwork")).isFalse(); } @Test public void testDoNotDoRecoveryActionWhenInEmergencyCall() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); sendOnInternetDataNetworkCallback(true); mDataStallRecoveryManager.setRecoveryAction( DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); doReturn(true).when(mDataNetworkController).isInternetDataAllowed(true); // set not in ECM doReturn(false).when(mPhone).isInEcm(); // set in emergency call doReturn(true).when(mTelecomManager).isInEmergencyCall(); logd("Sending validation failed callback while in emergency call"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mDataStallRecoveryManagerCallback, never()).onDataStallReestablishInternet(); verify(mSST, never()).powerOffRadioSafely(); verify(mPhone, never()).rebootModem(any()); // Still at cleanup assertThat(mDataStallRecoveryManager.getRecoveryAction()) .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); } @Test public void testDoNotDoRecoveryActionWhenInEcm() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); sendOnInternetDataNetworkCallback(true); mDataStallRecoveryManager.setRecoveryAction( DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); doReturn(true).when(mDataNetworkController).isInternetDataAllowed(true); // set in ECM doReturn(true).when(mPhone).isInEcm(); // set not in emergency call doReturn(false).when(mTelecomManager).isInEmergencyCall(); logd("Sending validation failed callback while in ECM"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mDataStallRecoveryManagerCallback, never()).onDataStallReestablishInternet(); verify(mSST, never()).powerOffRadioSafely(); verify(mPhone, never()).rebootModem(any()); // Still at cleanup assertThat(mDataStallRecoveryManager.getRecoveryAction()) .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_CLEANUP); } }