Loading src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +14 −3 Original line number Diff line number Diff line Loading @@ -500,20 +500,20 @@ public class DataStallRecoveryManager extends Handler { logv("enter: isRecoveryNeeded()"); // To avoid back to back recovery, wait for a grace period if (getElapsedTimeSinceRecoveryMs() < getDataStallRecoveryDelayMillis(mLastAction)) { log("skip back to back data stall recovery"); logl("skip back to back data stall recovery"); return false; } // Skip recovery if it can cause a call to drop if (mPhone.getState() != PhoneConstants.State.IDLE && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { log("skip data stall recovery as there is an active call"); logl("skip data stall recovery as there is an active call"); return false; } // Skip when poor signal strength if (mPhone.getSignalStrength().getLevel() <= CellSignalStrength.SIGNAL_STRENGTH_POOR) { log("skip data stall recovery as in poor signal condition"); logl("skip data stall recovery as in poor signal condition"); resetAction(); return false; } Loading Loading @@ -591,6 +591,17 @@ public class DataStallRecoveryManager extends Handler { broadcastDataStallDetected(recoveryAction); mNetworkCheckTimerStarted = false; // DSRM used sendMessageDelayed to process the next event EVENT_DO_RECOVERY, so it need // to check the condition if DSRM need to process the recovery action. // Skip recovery if it can cause a call to drop if (mPhone.getState() != PhoneConstants.State.IDLE && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); cancelNetworkCheckTimer(); startNetworkCheckTimer(mLastAction); return; } switch (recoveryAction) { case RECOVERY_ACTION_GET_DATA_CALL_LIST: logl("doRecovery(): get data call list"); Loading tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +27 −8 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.net.NetworkAgent; import android.telephony.Annotation.ValidationStatus; import android.telephony.CarrierConfigManager; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -88,7 +89,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { super.tearDown(); } private void sendValidationFailedCallback() throws Exception { private void sendValidationStatusCallback(@ValidationStatus int status) throws Exception { ArgumentCaptor<DataNetworkControllerCallback> dataNetworkControllerCallbackCaptor = ArgumentCaptor.forClass(DataNetworkControllerCallback.class); verify(mDataNetworkController) Loading @@ -96,8 +97,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { dataNetworkControllerCallbackCaptor.capture()); DataNetworkControllerCallback dataNetworkControllerCallback = dataNetworkControllerCallbackCaptor.getValue(); dataNetworkControllerCallback.onInternetDataNetworkValidationStatusChanged( NetworkAgent.VALIDATION_STATUS_NOT_VALID); dataNetworkControllerCallback.onInternetDataNetworkValidationStatusChanged(status); } @Test Loading @@ -107,7 +107,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mDataStallRecoveryManagerCallback).onDataStallReestablishInternet(); Loading @@ -120,7 +120,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mSST, times(1)).powerOffRadioSafely(); Loading @@ -133,7 +133,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); Loading @@ -148,7 +148,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); Loading @@ -163,10 +163,29 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); } @Test public void testDoNotDoRecoveryBySendMessageDelayedWhenDialCall() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); mDataStallRecoveryManager.setRecoveryAction(0); doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); logd("Sending validation failed callback"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(1); mDataStallRecoveryManager.sendMessageDelayed( mDataStallRecoveryManager.obtainMessage(2), 1000); moveTimeForward(15000); processAllMessages(); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); } } Loading
src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +14 −3 Original line number Diff line number Diff line Loading @@ -500,20 +500,20 @@ public class DataStallRecoveryManager extends Handler { logv("enter: isRecoveryNeeded()"); // To avoid back to back recovery, wait for a grace period if (getElapsedTimeSinceRecoveryMs() < getDataStallRecoveryDelayMillis(mLastAction)) { log("skip back to back data stall recovery"); logl("skip back to back data stall recovery"); return false; } // Skip recovery if it can cause a call to drop if (mPhone.getState() != PhoneConstants.State.IDLE && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { log("skip data stall recovery as there is an active call"); logl("skip data stall recovery as there is an active call"); return false; } // Skip when poor signal strength if (mPhone.getSignalStrength().getLevel() <= CellSignalStrength.SIGNAL_STRENGTH_POOR) { log("skip data stall recovery as in poor signal condition"); logl("skip data stall recovery as in poor signal condition"); resetAction(); return false; } Loading Loading @@ -591,6 +591,17 @@ public class DataStallRecoveryManager extends Handler { broadcastDataStallDetected(recoveryAction); mNetworkCheckTimerStarted = false; // DSRM used sendMessageDelayed to process the next event EVENT_DO_RECOVERY, so it need // to check the condition if DSRM need to process the recovery action. // Skip recovery if it can cause a call to drop if (mPhone.getState() != PhoneConstants.State.IDLE && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); cancelNetworkCheckTimer(); startNetworkCheckTimer(mLastAction); return; } switch (recoveryAction) { case RECOVERY_ACTION_GET_DATA_CALL_LIST: logl("doRecovery(): get data call list"); Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +27 −8 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.net.NetworkAgent; import android.telephony.Annotation.ValidationStatus; import android.telephony.CarrierConfigManager; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -88,7 +89,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { super.tearDown(); } private void sendValidationFailedCallback() throws Exception { private void sendValidationStatusCallback(@ValidationStatus int status) throws Exception { ArgumentCaptor<DataNetworkControllerCallback> dataNetworkControllerCallbackCaptor = ArgumentCaptor.forClass(DataNetworkControllerCallback.class); verify(mDataNetworkController) Loading @@ -96,8 +97,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { dataNetworkControllerCallbackCaptor.capture()); DataNetworkControllerCallback dataNetworkControllerCallback = dataNetworkControllerCallbackCaptor.getValue(); dataNetworkControllerCallback.onInternetDataNetworkValidationStatusChanged( NetworkAgent.VALIDATION_STATUS_NOT_VALID); dataNetworkControllerCallback.onInternetDataNetworkValidationStatusChanged(status); } @Test Loading @@ -107,7 +107,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mDataStallRecoveryManagerCallback).onDataStallReestablishInternet(); Loading @@ -120,7 +120,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mSST, times(1)).powerOffRadioSafely(); Loading @@ -133,7 +133,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); Loading @@ -148,7 +148,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); Loading @@ -163,10 +163,29 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationFailedCallback(); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); } @Test public void testDoNotDoRecoveryBySendMessageDelayedWhenDialCall() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); mDataStallRecoveryManager.setRecoveryAction(0); doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); logd("Sending validation failed callback"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(1); mDataStallRecoveryManager.sendMessageDelayed( mDataStallRecoveryManager.obtainMessage(2), 1000); moveTimeForward(15000); processAllMessages(); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); } }