summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alon Albert <aalbert@google.com> 2011-02-15 15:07:59 -0800
committer Alon Albert <aalbert@google.com> 2011-02-16 10:16:33 -0800
commitc441e4e355b2c277da3ff72b6319cdf024d29e7f (patch)
treec7554ca7c29c17cd048c117d391a73f2edb3585a
parent2050de5b9a5c097e30545ab822211d49031bd9dc (diff)
DO NOT MERGE - Clear backoffs on reconnect
Slightly modified backport from HC Bug: 3460736 Change-Id: I155dfd34bb7abb76a10b5b58fe9a32af2449d4f1
-rw-r--r--core/java/android/content/SyncManager.java7
-rw-r--r--core/java/android/content/SyncStorageEngine.java26
2 files changed, 33 insertions, 0 deletions
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 26b6ad70b351..5a836049c4cc 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -258,6 +258,7 @@ public class SyncManager implements OnAccountsUpdateListener {
// DISCONNECTED for GPRS in any order. if we receive the CONNECTED first, and then
// a DISCONNECTED, we want to make sure we set mDataConnectionIsConnected to true
// since we still have a WiFi connection.
+ final boolean wasConnected = mDataConnectionIsConnected;
switch (state) {
case CONNECTED:
mDataConnectionIsConnected = true;
@@ -273,6 +274,12 @@ public class SyncManager implements OnAccountsUpdateListener {
// ignore the rest of the states -- leave our boolean alone.
}
if (mDataConnectionIsConnected) {
+ if (!wasConnected) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Reconnection detected: clearing all backoffs");
+ }
+ mSyncStorageEngine.clearAllBackoffs();
+ }
sendCheckAlarmsMessage();
}
}
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index e1a9dbbe629b..faf136545a6a 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -525,6 +525,32 @@ public class SyncStorageEngine extends Handler {
}
}
+ public void clearAllBackoffs() {
+ boolean changed = false;
+ synchronized (mAuthorities) {
+ for (AccountInfo accountInfo : mAccounts.values()) {
+ for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) {
+ if (authorityInfo.backoffTime != NOT_IN_BACKOFF_MODE
+ || authorityInfo.backoffDelay != NOT_IN_BACKOFF_MODE) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "clearAllBackoffs:"
+ + " authority:" + authorityInfo.authority
+ + " account:" + accountInfo.account.name
+ + " backoffTime was: " + authorityInfo.backoffTime
+ + " backoffDelay was: " + authorityInfo.backoffDelay);
+ }
+ authorityInfo.backoffTime = NOT_IN_BACKOFF_MODE;
+ authorityInfo.backoffDelay = NOT_IN_BACKOFF_MODE;
+ changed = true;
+ }
+ }
+ }
+ }
+
+ if (changed) {
+ reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
+ }
+ }
public void setDelayUntilTime(Account account, String providerName, long delayUntil) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "setDelayUntil: " + account + ", provider " + providerName