Merge "Enhancement on ICS data stall polling logic" into ics-mr1

This commit is contained in:
Wink Saville
2012-01-04 13:53:25 -08:00
committed by Android (Google) Code Review
4 changed files with 73 additions and 17 deletions

View File

@ -3642,11 +3642,20 @@ public final class Settings {
"pdp_watchdog_max_pdp_reset_fail_count";
/**
* The number of milliseconds to delay when checking for data stalls
* The number of milliseconds to delay when checking for data stalls during
* non-aggressive detection. (screen is turned off.)
* @hide
*/
public static final String DATA_STALL_ALARM_DELAY_IN_MS =
"data_stall_alarm_delay_in_ms";
public static final String DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS =
"data_stall_alarm_non_aggressive_delay_in_ms";
/**
* The number of milliseconds to delay when checking for data stalls during
* aggressive detection. (screen on or suspected data stall)
* @hide
*/
public static final String DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS =
"data_stall_alarm_aggressive_delay_in_ms";
/**
* The interval in milliseconds at which to check gprs registration

View File

@ -212,8 +212,10 @@ public abstract class DataConnectionTracker extends Handler {
// represents an invalid IP address
protected static final String NULL_IP = "0.0.0.0";
// Default for the data stall alarm
protected static final int DATA_STALL_ALARM_DELAY_IN_MS_DEFAULT = 1000 * 60 * 6;
// Default for the data stall alarm while non-aggressive stall detection
protected static final int DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60 * 6;
// Default for the data stall alarm for aggressive stall detection
protected static final int DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60;
// If attempt is less than this value we're doing first level recovery
protected static final int DATA_STALL_NO_RECV_POLL_LIMIT = 1;
// Tag for tracking stale alarms
@ -323,10 +325,12 @@ public abstract class DataConnectionTracker extends Handler {
mIsScreenOn = true;
stopNetStatPoll();
startNetStatPoll();
restartDataStallAlarm();
} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
mIsScreenOn = false;
stopNetStatPoll();
startNetStatPoll();
restartDataStallAlarm();
} else if (action.startsWith(getActionIntentReconnectAlarm())) {
log("Reconnect alarm. Previous state was " + mState);
onActionIntentReconnectAlarm(intent);
@ -622,6 +626,7 @@ public abstract class DataConnectionTracker extends Handler {
protected abstract String getActionIntentDataStallAlarm();
protected abstract void startNetStatPoll();
protected abstract void stopNetStatPoll();
protected abstract void restartDataStallAlarm();
protected abstract void restartRadio();
protected abstract void log(String s);
protected abstract void loge(String s);

View File

@ -158,6 +158,9 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
return INTENT_DATA_STALL_ALARM;
}
@Override
protected void restartDataStallAlarm() {}
@Override
protected void setState(State s) {
if (DBG) log ("setState: " + s);

View File

@ -97,13 +97,21 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
private ContentResolver mResolver;
// Recovery action taken in case of data stall
class RecoveryAction {
private static class RecoveryAction {
public static final int GET_DATA_CALL_LIST = 0;
public static final int CLEANUP = 1;
public static final int REREGISTER = 2;
public static final int RADIO_RESTART = 3;
public static final int RADIO_RESTART_WITH_PROP = 4;
private static boolean isAggressiveRecovery(int value) {
return ((value == RecoveryAction.CLEANUP) ||
(value == RecoveryAction.REREGISTER) ||
(value == RecoveryAction.RADIO_RESTART) ||
(value == RecoveryAction.RADIO_RESTART_WITH_PROP));
}
}
public int getRecoveryAction() {
int action = Settings.System.getInt(mPhone.getContext().getContentResolver(),
"radio.data.stall.recovery.action", RecoveryAction.GET_DATA_CALL_LIST);
@ -131,6 +139,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
static final String APN_ID = "apn_id";
private boolean canSetPreferApn = false;
private static final boolean DATA_STALL_SUSPECTED = true;
private static final boolean DATA_STALL_NOT_SUSPECTED = false;
@Override
protected void onActionIntentReconnectAlarm(Intent intent) {
if (DBG) log("GPRS reconnect alarm. Previous state was " + mState);
@ -586,7 +597,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (getOverallState() == State.CONNECTED) {
if (DBG) log("onDataConnectionAttached: start polling notify attached");
startNetStatPoll();
startDataStallAlarm();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
notifyDataConnection(Phone.REASON_DATA_ATTACHED);
} else {
// update APN availability so that APN can be enabled.
@ -1271,7 +1282,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
// setState(State.CONNECTED);
mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
startNetStatPoll();
startDataStallAlarm();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
// reset reconnect timer
apnContext.getDataConnection().resetRetryCount();
}
@ -1437,10 +1448,12 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
Settings.Secure.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
NUMBER_SENT_PACKETS_OF_HANG);
boolean suspectedStall = DATA_STALL_NOT_SUSPECTED;
if (mSentSinceLastRecv >= hangWatchdogTrigger) {
if (DBG) {
log("onDataStallAlarm: tag=" + tag + " do recovery action=" + getRecoveryAction());
}
suspectedStall = DATA_STALL_SUSPECTED;
sendMessage(obtainMessage(EVENT_DO_RECOVERY));
} else {
if (VDBG) {
@ -1448,7 +1461,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
" pkts since last received, < watchdogTrigger=" + hangWatchdogTrigger);
}
}
startDataStallAlarm();
startDataStallAlarm(suspectedStall);
}
@ -1614,12 +1627,24 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
}
private void startDataStallAlarm() {
int delayInMs = Settings.Secure.getInt(mResolver,
Settings.Secure.DATA_STALL_ALARM_DELAY_IN_MS,
DATA_STALL_ALARM_DELAY_IN_MS_DEFAULT);
private void startDataStallAlarm(boolean suspectedStall) {
int nextAction = getRecoveryAction();
int delayInMs;
// If screen is on or data stall is currently suspected, set the alarm
// with an aggresive timeout.
if (mIsScreenOn || suspectedStall || RecoveryAction.isAggressiveRecovery(nextAction)) {
delayInMs = Settings.Secure.getInt(mResolver,
Settings.Secure.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS,
DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
} else {
delayInMs = Settings.Secure.getInt(mResolver,
Settings.Secure.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS,
DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
}
mDataStallAlarmTag += 1;
if (DBG) {
if (VDBG) {
log("startDataStallAlarm: tag=" + mDataStallAlarmTag +
" delay=" + (delayInMs / 1000) + "s");
}
@ -1638,7 +1663,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
AlarmManager am =
(AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
if (DBG) {
if (VDBG) {
log("stopDataStallAlarm: current tag=" + mDataStallAlarmTag +
" mDataStallAlarmIntent=" + mDataStallAlarmIntent);
}
@ -1649,6 +1674,20 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
}
}
@Override
protected void restartDataStallAlarm() {
// To be called on screen status change.
// Do not cancel the alarm if it is set with aggressive timeout.
int nextAction = getRecoveryAction();
if (RecoveryAction.isAggressiveRecovery(nextAction)) {
if (DBG) log("data stall recovery action is pending. not resetting the alarm.");
return;
}
stopDataStallAlarm();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
}
private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode,
ApnContext apnContext) {
if (DBG) log( "notifyNoData: type=" + apnContext.getApnType());
@ -2044,7 +2083,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (isConnected()) {
if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
startNetStatPoll();
startDataStallAlarm();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
} else {
// clean slate after call end.
@ -2386,7 +2425,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
mIsPsRestricted = false;
if (isConnected()) {
startNetStatPoll();
startDataStallAlarm();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
} else {
// TODO: Should all PDN states be checked to fail?
if (mState == State.FAILED) {