Loading src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +21 −10 Original line number Diff line number Diff line Loading @@ -476,6 +476,7 @@ public class DataStallRecoveryManager extends Handler { log("startNetworkCheckTimer(): " + getDataStallRecoveryDelayMillis(action) + "ms"); if (!mNetworkCheckTimerStarted) { mNetworkCheckTimerStarted = true; mTimeLastRecoveryStartMs = SystemClock.elapsedRealtime(); sendMessageDelayed( obtainMessage(EVENT_DO_RECOVERY), getDataStallRecoveryDelayMillis(action)); } Loading @@ -498,6 +499,13 @@ public class DataStallRecoveryManager extends Handler { */ private boolean isRecoveryNeeded() { logv("enter: isRecoveryNeeded()"); // Skip recovery if we have already attempted all steps. if (mLastAction == RECOVERY_ACTION_RESET_MODEM) { logl("skip retrying continue recovery action"); return false; } // To avoid back to back recovery, wait for a grace period if (getElapsedTimeSinceRecoveryMs() < getDataStallRecoveryDelayMillis(mLastAction)) { logl("skip back to back data stall recovery"); Loading Loading @@ -583,13 +591,6 @@ public class DataStallRecoveryManager extends Handler { private void doRecovery() { @RecoveryAction final int recoveryAction = getRecoveryAction(); final int signalStrength = mPhone.getSignalStrength().getLevel(); TelephonyMetrics.getInstance() .writeSignalStrengthEvent(mPhone.getPhoneId(), signalStrength); TelephonyMetrics.getInstance().writeDataStallEvent(mPhone.getPhoneId(), recoveryAction); mLastAction = recoveryAction; mLastActionReported = false; 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. Loading @@ -598,10 +599,18 @@ public class DataStallRecoveryManager extends Handler { && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); cancelNetworkCheckTimer(); startNetworkCheckTimer(mLastAction); startNetworkCheckTimer(recoveryAction); return; } TelephonyMetrics.getInstance() .writeSignalStrengthEvent(mPhone.getPhoneId(), signalStrength); TelephonyMetrics.getInstance().writeDataStallEvent(mPhone.getPhoneId(), recoveryAction); mLastAction = recoveryAction; mLastActionReported = false; broadcastDataStallDetected(recoveryAction); mNetworkCheckTimerStarted = false; switch (recoveryAction) { case RECOVERY_ACTION_GET_DATA_CALL_LIST: logl("doRecovery(): get data call list"); Loading Loading @@ -745,10 +754,12 @@ public class DataStallRecoveryManager extends Handler { pw.println("mIsValidNetwork=" + mIsValidNetwork); pw.println("mDataStalled=" + mDataStalled); pw.println("mDataStallStartMs=" + mDataStallStartMs); pw.println("mLastAction=" + recoveryActionToString(mLastAction)); pw.println("mDataStallStartMs=" + DataUtils.elapsedTimeToString(mDataStallStartMs)); pw.println("mRadioPowerState=" + radioPowerStateToString(mRadioPowerState)); pw.println("mLastActionReported=" + mLastActionReported); pw.println("mTimeLastRecoveryStartMs=" + mTimeLastRecoveryStartMs); pw.println("mTimeLastRecoveryStartMs=" + DataUtils.elapsedTimeToString(mTimeLastRecoveryStartMs)); pw.println("getRecoveryAction()=" + recoveryActionToString(getRecoveryAction())); pw.println("mRadioStateChangedDuringDataStall=" + mRadioStateChangedDuringDataStall); pw.println( Loading tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +36 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { super.setUp(getClass().getSimpleName()); doReturn(true).when(mPhone).isUsingNewDataStack(); mCarrierConfigManager = mPhone.getContext().getSystemService(CarrierConfigManager.class); long[] dataStallRecoveryTimersArray = new long[] {1, 1, 1}; long[] dataStallRecoveryTimersArray = new long[] {100, 100, 100}; boolean[] dataStallRecoveryStepsArray = new boolean[] {false, false, false, false}; doReturn(dataStallRecoveryTimersArray) .when(mDataConfigManager) Loading Loading @@ -188,4 +188,39 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); } @Test public void testDoNotContinueRecoveryActionAfterModemReset() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); mDataStallRecoveryManager.setRecoveryAction(0); doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); logd("Sending validation failed callback"); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(0); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(1); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(3); // Handle multiple VALIDATION_STATUS_NOT_VALID and make sure we don't attempt recovery for (int i = 0; i < 4; i++) { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); logd("Sending validation failed callback"); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(0); } } } Loading
src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +21 −10 Original line number Diff line number Diff line Loading @@ -476,6 +476,7 @@ public class DataStallRecoveryManager extends Handler { log("startNetworkCheckTimer(): " + getDataStallRecoveryDelayMillis(action) + "ms"); if (!mNetworkCheckTimerStarted) { mNetworkCheckTimerStarted = true; mTimeLastRecoveryStartMs = SystemClock.elapsedRealtime(); sendMessageDelayed( obtainMessage(EVENT_DO_RECOVERY), getDataStallRecoveryDelayMillis(action)); } Loading @@ -498,6 +499,13 @@ public class DataStallRecoveryManager extends Handler { */ private boolean isRecoveryNeeded() { logv("enter: isRecoveryNeeded()"); // Skip recovery if we have already attempted all steps. if (mLastAction == RECOVERY_ACTION_RESET_MODEM) { logl("skip retrying continue recovery action"); return false; } // To avoid back to back recovery, wait for a grace period if (getElapsedTimeSinceRecoveryMs() < getDataStallRecoveryDelayMillis(mLastAction)) { logl("skip back to back data stall recovery"); Loading Loading @@ -583,13 +591,6 @@ public class DataStallRecoveryManager extends Handler { private void doRecovery() { @RecoveryAction final int recoveryAction = getRecoveryAction(); final int signalStrength = mPhone.getSignalStrength().getLevel(); TelephonyMetrics.getInstance() .writeSignalStrengthEvent(mPhone.getPhoneId(), signalStrength); TelephonyMetrics.getInstance().writeDataStallEvent(mPhone.getPhoneId(), recoveryAction); mLastAction = recoveryAction; mLastActionReported = false; 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. Loading @@ -598,10 +599,18 @@ public class DataStallRecoveryManager extends Handler { && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); cancelNetworkCheckTimer(); startNetworkCheckTimer(mLastAction); startNetworkCheckTimer(recoveryAction); return; } TelephonyMetrics.getInstance() .writeSignalStrengthEvent(mPhone.getPhoneId(), signalStrength); TelephonyMetrics.getInstance().writeDataStallEvent(mPhone.getPhoneId(), recoveryAction); mLastAction = recoveryAction; mLastActionReported = false; broadcastDataStallDetected(recoveryAction); mNetworkCheckTimerStarted = false; switch (recoveryAction) { case RECOVERY_ACTION_GET_DATA_CALL_LIST: logl("doRecovery(): get data call list"); Loading Loading @@ -745,10 +754,12 @@ public class DataStallRecoveryManager extends Handler { pw.println("mIsValidNetwork=" + mIsValidNetwork); pw.println("mDataStalled=" + mDataStalled); pw.println("mDataStallStartMs=" + mDataStallStartMs); pw.println("mLastAction=" + recoveryActionToString(mLastAction)); pw.println("mDataStallStartMs=" + DataUtils.elapsedTimeToString(mDataStallStartMs)); pw.println("mRadioPowerState=" + radioPowerStateToString(mRadioPowerState)); pw.println("mLastActionReported=" + mLastActionReported); pw.println("mTimeLastRecoveryStartMs=" + mTimeLastRecoveryStartMs); pw.println("mTimeLastRecoveryStartMs=" + DataUtils.elapsedTimeToString(mTimeLastRecoveryStartMs)); pw.println("getRecoveryAction()=" + recoveryActionToString(getRecoveryAction())); pw.println("mRadioStateChangedDuringDataStall=" + mRadioStateChangedDuringDataStall); pw.println( Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +36 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { super.setUp(getClass().getSimpleName()); doReturn(true).when(mPhone).isUsingNewDataStack(); mCarrierConfigManager = mPhone.getContext().getSystemService(CarrierConfigManager.class); long[] dataStallRecoveryTimersArray = new long[] {1, 1, 1}; long[] dataStallRecoveryTimersArray = new long[] {100, 100, 100}; boolean[] dataStallRecoveryStepsArray = new boolean[] {false, false, false, false}; doReturn(dataStallRecoveryTimersArray) .when(mDataConfigManager) Loading Loading @@ -188,4 +188,39 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); } @Test public void testDoNotContinueRecoveryActionAfterModemReset() throws Exception { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_VALID); mDataStallRecoveryManager.setRecoveryAction(0); doReturn(PhoneConstants.State.IDLE).when(mPhone).getState(); doReturn(3).when(mSignalStrength).getLevel(); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); logd("Sending validation failed callback"); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(0); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(1); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(2); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(3); // Handle multiple VALIDATION_STATUS_NOT_VALID and make sure we don't attempt recovery for (int i = 0; i < 4; i++) { sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); logd("Sending validation failed callback"); processAllMessages(); moveTimeForward(101); assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(0); } } }