@@ -97,13 +97,21 @@ public void onChange(boolean selfChange) {
9797 private ContentResolver mResolver ;
9898
9999 // Recovery action taken in case of data stall
100- class RecoveryAction {
100+ private static class RecoveryAction {
101101 public static final int GET_DATA_CALL_LIST = 0 ;
102102 public static final int CLEANUP = 1 ;
103103 public static final int REREGISTER = 2 ;
104104 public static final int RADIO_RESTART = 3 ;
105105 public static final int RADIO_RESTART_WITH_PROP = 4 ;
106+
107+ private static boolean isAggressiveRecovery (int value ) {
108+ return ((value == RecoveryAction .CLEANUP ) ||
109+ (value == RecoveryAction .REREGISTER ) ||
110+ (value == RecoveryAction .RADIO_RESTART ) ||
111+ (value == RecoveryAction .RADIO_RESTART_WITH_PROP ));
112+ }
106113 }
114+
107115 public int getRecoveryAction () {
108116 int action = Settings .System .getInt (mPhone .getContext ().getContentResolver (),
109117 "radio.data.stall.recovery.action" , RecoveryAction .GET_DATA_CALL_LIST );
@@ -131,6 +139,9 @@ public void putRecoveryAction(int action) {
131139 static final String APN_ID = "apn_id" ;
132140 private boolean canSetPreferApn = false ;
133141
142+ private static final boolean DATA_STALL_SUSPECTED = true ;
143+ private static final boolean DATA_STALL_NOT_SUSPECTED = false ;
144+
134145 @ Override
135146 protected void onActionIntentReconnectAlarm (Intent intent ) {
136147 if (DBG ) log ("GPRS reconnect alarm. Previous state was " + mState );
@@ -586,7 +597,7 @@ private void onDataConnectionAttached() {
586597 if (getOverallState () == State .CONNECTED ) {
587598 if (DBG ) log ("onDataConnectionAttached: start polling notify attached" );
588599 startNetStatPoll ();
589- startDataStallAlarm ();
600+ startDataStallAlarm (DATA_STALL_NOT_SUSPECTED );
590601 notifyDataConnection (Phone .REASON_DATA_ATTACHED );
591602 } else {
592603 // update APN availability so that APN can be enabled.
@@ -1271,7 +1282,7 @@ private void notifyDefaultData(ApnContext apnContext) {
12711282 // setState(State.CONNECTED);
12721283 mPhone .notifyDataConnection (apnContext .getReason (), apnContext .getApnType ());
12731284 startNetStatPoll ();
1274- startDataStallAlarm ();
1285+ startDataStallAlarm (DATA_STALL_NOT_SUSPECTED );
12751286 // reset reconnect timer
12761287 apnContext .getDataConnection ().resetRetryCount ();
12771288 }
@@ -1437,18 +1448,20 @@ protected void onDataStallAlarm(int tag) {
14371448 Settings .Secure .PDP_WATCHDOG_TRIGGER_PACKET_COUNT ,
14381449 NUMBER_SENT_PACKETS_OF_HANG );
14391450
1451+ boolean suspectedStall = DATA_STALL_NOT_SUSPECTED ;
14401452 if (mSentSinceLastRecv >= hangWatchdogTrigger ) {
14411453 if (DBG ) {
14421454 log ("onDataStallAlarm: tag=" + tag + " do recovery action=" + getRecoveryAction ());
14431455 }
1456+ suspectedStall = DATA_STALL_SUSPECTED ;
14441457 sendMessage (obtainMessage (EVENT_DO_RECOVERY ));
14451458 } else {
14461459 if (VDBG ) {
14471460 log ("onDataStallAlarm: tag=" + tag + " Sent " + String .valueOf (mSentSinceLastRecv ) +
14481461 " pkts since last received, < watchdogTrigger=" + hangWatchdogTrigger );
14491462 }
14501463 }
1451- startDataStallAlarm ();
1464+ startDataStallAlarm (suspectedStall );
14521465 }
14531466
14541467
@@ -1614,12 +1627,24 @@ private void startAlarmForReconnect(int delay, ApnContext apnContext) {
16141627
16151628 }
16161629
1617- private void startDataStallAlarm () {
1618- int delayInMs = Settings .Secure .getInt (mResolver ,
1619- Settings .Secure .DATA_STALL_ALARM_DELAY_IN_MS ,
1620- DATA_STALL_ALARM_DELAY_IN_MS_DEFAULT );
1630+ private void startDataStallAlarm (boolean suspectedStall ) {
1631+ int nextAction = getRecoveryAction ();
1632+ int delayInMs ;
1633+
1634+ // If screen is on or data stall is currently suspected, set the alarm
1635+ // with an aggresive timeout.
1636+ if (mIsScreenOn || suspectedStall || RecoveryAction .isAggressiveRecovery (nextAction )) {
1637+ delayInMs = Settings .Secure .getInt (mResolver ,
1638+ Settings .Secure .DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS ,
1639+ DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT );
1640+ } else {
1641+ delayInMs = Settings .Secure .getInt (mResolver ,
1642+ Settings .Secure .DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS ,
1643+ DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT );
1644+ }
1645+
16211646 mDataStallAlarmTag += 1 ;
1622- if (DBG ) {
1647+ if (VDBG ) {
16231648 log ("startDataStallAlarm: tag=" + mDataStallAlarmTag +
16241649 " delay=" + (delayInMs / 1000 ) + "s" );
16251650 }
@@ -1638,7 +1663,7 @@ private void stopDataStallAlarm() {
16381663 AlarmManager am =
16391664 (AlarmManager ) mPhone .getContext ().getSystemService (Context .ALARM_SERVICE );
16401665
1641- if (DBG ) {
1666+ if (VDBG ) {
16421667 log ("stopDataStallAlarm: current tag=" + mDataStallAlarmTag +
16431668 " mDataStallAlarmIntent=" + mDataStallAlarmIntent );
16441669 }
@@ -1649,6 +1674,20 @@ private void stopDataStallAlarm() {
16491674 }
16501675 }
16511676
1677+ @ Override
1678+ protected void restartDataStallAlarm () {
1679+ // To be called on screen status change.
1680+ // Do not cancel the alarm if it is set with aggressive timeout.
1681+ int nextAction = getRecoveryAction ();
1682+
1683+ if (RecoveryAction .isAggressiveRecovery (nextAction )) {
1684+ if (DBG ) log ("data stall recovery action is pending. not resetting the alarm." );
1685+ return ;
1686+ }
1687+ stopDataStallAlarm ();
1688+ startDataStallAlarm (DATA_STALL_NOT_SUSPECTED );
1689+ }
1690+
16521691 private void notifyNoData (GsmDataConnection .FailCause lastFailCauseCode ,
16531692 ApnContext apnContext ) {
16541693 if (DBG ) log ( "notifyNoData: type=" + apnContext .getApnType ());
@@ -2044,7 +2083,7 @@ protected void onVoiceCallEnded() {
20442083 if (isConnected ()) {
20452084 if (!mPhone .getServiceStateTracker ().isConcurrentVoiceAndDataAllowed ()) {
20462085 startNetStatPoll ();
2047- startDataStallAlarm ();
2086+ startDataStallAlarm (DATA_STALL_NOT_SUSPECTED );
20482087 notifyDataConnection (Phone .REASON_VOICE_CALL_ENDED );
20492088 } else {
20502089 // clean slate after call end.
@@ -2386,7 +2425,7 @@ public void handleMessage (Message msg) {
23862425 mIsPsRestricted = false ;
23872426 if (isConnected ()) {
23882427 startNetStatPoll ();
2389- startDataStallAlarm ();
2428+ startDataStallAlarm (DATA_STALL_NOT_SUSPECTED );
23902429 } else {
23912430 // TODO: Should all PDN states be checked to fail?
23922431 if (mState == State .FAILED ) {
0 commit comments