diff options
author | Wink Saville <wink@google.com> | 2012-06-28 09:34:41 -0700 |
---|---|---|
committer | Wink Saville <wink@google.com> | 2012-06-28 09:34:41 -0700 |
commit | 68e66497e78f1fcfcb49a28a17ac7805734e7a3c (patch) | |
tree | 86e8b596eb10b14ee30a9e1abcc6992cdd9a599e /telephony/java/com | |
parent | 1157e1a8d4320589983fc39688bb7be7d6487d67 (diff) | |
download | frameworks_base-68e66497e78f1fcfcb49a28a17ac7805734e7a3c.zip frameworks_base-68e66497e78f1fcfcb49a28a17ac7805734e7a3c.tar.gz frameworks_base-68e66497e78f1fcfcb49a28a17ac7805734e7a3c.tar.bz2 |
Preserve retryCount when retrying.
Bug: 6529189
Change-Id: I743aed08aa161d91899aeb2ccacffcd224e48c0a
Diffstat (limited to 'telephony/java/com')
5 files changed, 100 insertions, 28 deletions
diff --git a/telephony/java/com/android/internal/telephony/ApnContext.java b/telephony/java/com/android/internal/telephony/ApnContext.java index 3a3044e..9746398 100644 --- a/telephony/java/com/android/internal/telephony/ApnContext.java +++ b/telephony/java/com/android/internal/telephony/ApnContext.java @@ -50,6 +50,8 @@ public class ApnContext { String mReason; + int mRetryCount; + /** * user/app requested connection on this APN */ @@ -64,6 +66,7 @@ public class ApnContext { mApnType = apnType; mState = DataConnectionTracker.State.IDLE; setReason(Phone.REASON_DATA_ENABLED); + setRetryCount(0); mDataEnabled = new AtomicBoolean(false); mDependencyMet = new AtomicBoolean(true); mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0); @@ -182,6 +185,21 @@ public class ApnContext { return mReason; } + public synchronized void setRetryCount(int retryCount) { + if (DBG) { + log("setRetryCount: " + retryCount); + } + mRetryCount = retryCount; + DataConnection dc = mDataConnection; + if (dc != null) { + dc.setRetryCount(retryCount); + } + } + + public synchronized int getRetryCount() { + return mRetryCount; + } + public boolean isReady() { return mDataEnabled.get() && mDependencyMet.get(); } @@ -214,8 +232,8 @@ public class ApnContext { return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns=" + mWaitingApns + " mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown + " mApnSetting=" + mApnSetting + " mDataConnectionAc=" + mDataConnectionAc + - " mReason=" + mReason + " mDataEnabled=" + mDataEnabled + - " mDependencyMet=" + mDependencyMet + "}"; + " mReason=" + mReason + " mRetryCount=" + mRetryCount + + " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}"; } protected void log(String s) { diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java index cc4adfd..3f7e71e 100644 --- a/telephony/java/com/android/internal/telephony/DataConnection.java +++ b/telephony/java/com/android/internal/telephony/DataConnection.java @@ -426,6 +426,14 @@ public abstract class DataConnection extends StateMachine { } /** + * set retry manager retryCount + */ + public void setRetryCount(int retryCount) { + if (DBG) log("setRetryCount: " + retryCount); + mRetryMgr.setRetryCount(retryCount); + } + + /** * @return retry manager retryTimer */ public int getRetryTimer() { diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java index 588515b..0dee7a1 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java @@ -303,7 +303,8 @@ public abstract class DataConnectionTracker extends Handler { new HashMap<String, Integer>(); /** Phone.APN_TYPE_* ===> ApnContext */ - protected ConcurrentHashMap<String, ApnContext> mApnContexts; + protected ConcurrentHashMap<String, ApnContext> mApnContexts = + new ConcurrentHashMap<String, ApnContext>(); /* Currently active APN */ protected ApnSetting mActiveApn; @@ -1203,6 +1204,9 @@ public abstract class DataConnectionTracker extends Handler { } protected void resetAllRetryCounts() { + for (ApnContext ac : mApnContexts.values()) { + ac.setRetryCount(0); + } for (DataConnection dc : mDataConnections.values()) { dc.resetRetryCount(); } diff --git a/telephony/java/com/android/internal/telephony/RetryManager.java b/telephony/java/com/android/internal/telephony/RetryManager.java index ae451b9..250d99e 100644 --- a/telephony/java/com/android/internal/telephony/RetryManager.java +++ b/telephony/java/com/android/internal/telephony/RetryManager.java @@ -73,7 +73,7 @@ import java.util.ArrayList; * {@hide} */ public class RetryManager { - static public final String LOG_TAG = "RetryManager"; + static public final String LOG_TAG = "GSM"; static public final boolean DBG = true; static public final boolean VDBG = false; @@ -304,7 +304,6 @@ public class RetryManager { /** * Set retry count to the specified value - * and turns off retrying forever. */ public void setRetryCount(int count) { mRetryCount = count; @@ -316,11 +315,18 @@ public class RetryManager { mRetryCount = 0; } - mRetryForever = false; if (DBG) log("setRetryCount: " + mRetryCount); } /** + * Set retry forever to the specified value + */ + public void setRetryForever(boolean retryForever) { + mRetryForever = retryForever; + if (DBG) log("setRetryForever: " + mRetryForever); + } + + /** * Clear the data-retry counter */ public void resetRetryCount() { @@ -399,6 +405,6 @@ public class RetryManager { } private void log(String s) { - Log.d(LOG_TAG, s); + Log.d(LOG_TAG, "[RM] " + s); } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index ed67759..6b863a7 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -134,6 +134,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { private static final String INTENT_RECONNECT_ALARM = "com.android.internal.telephony.gprs-reconnect"; private static final String INTENT_RECONNECT_ALARM_EXTRA_TYPE = "reconnect_alarm_extra_type"; + private static final String INTENT_RECONNECT_ALARM_EXTRA_RETRY_COUNT = + "reconnect_alaram_extra_retry_count"; private static final String INTENT_DATA_STALL_ALARM = "com.android.internal.telephony.gprs-data-stall"; @@ -148,18 +150,23 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { @Override protected void onActionIntentReconnectAlarm(Intent intent) { - if (DBG) log("GPRS reconnect alarm. Previous state was " + mState); - String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON); int connectionId = intent.getIntExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE, -1); + int retryCount = intent.getIntExtra(INTENT_RECONNECT_ALARM_EXTRA_RETRY_COUNT, 0); DataConnectionAc dcac= mDataConnectionAsyncChannels.get(connectionId); + if (DBG) { + log("onActionIntentReconnectAlarm: mState=" + mState + " reason=" + reason + + " connectionId=" + connectionId + " retryCount=" + retryCount); + } + if (dcac != null) { for (ApnContext apnContext : dcac.getApnListSync()) { apnContext.setDataConnectionAc(null); apnContext.setDataConnection(null); apnContext.setReason(reason); + apnContext.setRetryCount(retryCount); if (apnContext.getState() == State.FAILED) { apnContext.setState(State.IDLE); } @@ -207,7 +214,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { p.getContext().getContentResolver().registerContentObserver( Telephony.Carriers.CONTENT_URI, true, mApnObserver); - mApnContexts = new ConcurrentHashMap<String, ApnContext>(); initApnContextsAndDataConnection(); broadcastMessenger(); } @@ -674,10 +680,15 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { break; } } - configureRetry(dcac.dataConnection, hasDefault); + configureRetry(dcac.dataConnection, hasDefault, 0); } } + // Be sure retry counts for Apncontexts and DC's are sync'd. + // When DCT/ApnContexts are refactored and we cleanup retrying + // this won't be needed. + resetAllRetryCounts(); + // Only check for default APN state for (ApnContext apnContext : mApnContexts.values()) { if (apnContext.getState() == State.FAILED) { @@ -1078,7 +1089,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { // configure retry count if no other Apn is using the same connection. if (refCount == 0) { - configureRetry(dc, apn.canHandleType(Phone.APN_TYPE_DEFAULT)); + configureRetry(dc, apn.canHandleType(Phone.APN_TYPE_DEFAULT), + apnContext.getRetryCount()); } apnContext.setDataConnectionAc(dcac); apnContext.setDataConnection(dc); @@ -1330,7 +1342,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); // reset reconnect timer - apnContext.getDataConnection().resetRetryCount(); + apnContext.setRetryCount(0); } // TODO: For multiple Active APNs not exactly sure how to do this. @@ -1601,6 +1613,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { loge("reconnectAfterFail: apnContext == null, impossible"); return; } + if (DBG) { + log("reconnectAfterFail: lastFailCause=" + lastFailCauseCode + + " retryOverride=" + retryOverride + " apnContext=" + apnContext); + } if ((apnContext.getState() == State.FAILED) && (apnContext.getDataConnection() != null)) { if (!apnContext.getDataConnection().isRetryNeeded()) { @@ -1616,7 +1632,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { if (DBG) log("reconnectAfterFail: activate failed, Reregistering to network"); mReregisterOnReconnectFailure = true; mPhone.getServiceStateTracker().reRegisterNetwork(null); - apnContext.getDataConnection().resetRetryCount(); + apnContext.setRetryCount(0); return; } } @@ -1627,6 +1643,11 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { if (nextReconnectDelay < 0) { nextReconnectDelay = apnContext.getDataConnection().getRetryTimer(); apnContext.getDataConnection().increaseRetryCount(); + if (DBG) { + log("reconnectAfterFail: increaseRetryCount=" + + apnContext.getDataConnection().getRetryCount() + + " nextReconnectDelay=" + nextReconnectDelay); + } } startAlarmForReconnect(nextReconnectDelay, apnContext); @@ -1643,16 +1664,11 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { private void startAlarmForReconnect(int delay, ApnContext apnContext) { - if (DBG) { - log("Schedule alarm for reconnect: activate failed. Scheduling next attempt for " - + (delay / 1000) + "s"); - } - DataConnectionAc dcac = apnContext.getDataConnectionAc(); if ((dcac == null) || (dcac.dataConnection == null)) { // should not happen, but just in case. - loge("null dcac or dc."); + loge("startAlarmForReconnect: null dcac or dc."); return; } @@ -1661,12 +1677,29 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { Intent intent = new Intent(INTENT_RECONNECT_ALARM + '.' + dcac.dataConnection.getDataConnectionId()); - intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, apnContext.getReason()); - intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE, - dcac.dataConnection.getDataConnectionId()); + String reason = apnContext.getReason(); + intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, reason); + int connectionId = dcac.dataConnection.getDataConnectionId(); + intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE, connectionId); + + // TODO: Until a real fix is created, which probably entails pushing + // retires into the DC itself, this fix gets the retry count and + // puts it in the reconnect alarm. When the reconnect alarm fires + // onActionIntentReconnectAlarm is called which will use the value saved + // here and save it in the ApnContext and send the EVENT_CONNECT message + // which invokes setupData. Then setupData will use the value in the ApnContext + // and to tell the DC to set the retry count in the retry manager. + int retryCount = dcac.dataConnection.getRetryCount(); + intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_RETRY_COUNT, retryCount); + + if (DBG) { + log("startAlarmForReconnect: next attempt in " + (delay / 1000) + "s" + + " reason='" + reason + "' connectionId=" + connectionId + + " retryCount=" + retryCount); + } PendingIntent alarmIntent = PendingIntent.getBroadcast (mPhone.getContext(), 0, - intent, 0); + intent, PendingIntent.FLAG_UPDATE_CURRENT); dcac.setReconnectIntentSync(alarmIntent); am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, alarmIntent); @@ -1942,9 +1975,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { // Make sure our reconnect delay starts at the initial value // next time the radio comes on - for (DataConnection dc : mDataConnections.values()) { - dc.resetRetryCount(); - } + resetAllRetryCounts(); mReregisterOnReconnectFailure = false; if (mPhone.getSimulatedRadioControl() != null) { @@ -2287,7 +2318,11 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return conn; } - private void configureRetry(DataConnection dc, boolean forDefault) { + private void configureRetry(DataConnection dc, boolean forDefault, int retryCount) { + if (DBG) { + log("configureRetry: forDefault=" + forDefault + " retryCount=" + retryCount + + " dc=" + dc); + } if (dc == null) return; if (!dc.configureRetry(getReryConfig(forDefault))) { @@ -2307,6 +2342,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } } } + dc.setRetryCount(retryCount); } private void destroyDataConnections() { |