summaryrefslogtreecommitdiffstats
path: root/core/java/android/content/SyncManager.java
diff options
context:
space:
mode:
authorFred Quintana <fredq@google.com>2009-09-29 20:44:30 -0700
committerFred Quintana <fredq@google.com>2009-09-30 11:06:25 -0700
commite91ebe2be9580625ff31af8583e55aaefc50474f (patch)
treeed15117cb1991cb6e5d6d6daf460fdaa40cc6f0d /core/java/android/content/SyncManager.java
parentfff0b4a6c22c458b6a05bc1fd8840b4bc09be38e (diff)
downloadframeworks_base-e91ebe2be9580625ff31af8583e55aaefc50474f.zip
frameworks_base-e91ebe2be9580625ff31af8583e55aaefc50474f.tar.gz
frameworks_base-e91ebe2be9580625ff31af8583e55aaefc50474f.tar.bz2
- make SyncManager get the accounts list during the constructor,
which will allow syncs to be scheduled during bootup. The providers need this so that they can potentially schedule syncs while they are starting up. - make the SyncManager message handler wait until boot has completed to start dispatching messages
Diffstat (limited to 'core/java/android/content/SyncManager.java')
-rw-r--r--core/java/android/content/SyncManager.java56
1 files changed, 39 insertions, 17 deletions
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 6181a07..5376f78 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -73,6 +73,7 @@ import java.util.Map;
import java.util.PriorityQueue;
import java.util.Random;
import java.util.Collection;
+import java.util.concurrent.CountDownLatch;
/**
* @hide
@@ -200,11 +201,7 @@ class SyncManager implements OnAccountsUpdatedListener {
private BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
- if (!mFactoryTest) {
- mBootCompleted = true;
- AccountManager.get(mContext).addOnAccountsUpdatedListener(SyncManager.this,
- mSyncHandler, true /* updateImmediately */);
- }
+ mSyncHandler.onBootCompleted();
}
};
@@ -357,8 +354,10 @@ class SyncManager implements OnAccountsUpdatedListener {
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(mConnectivityIntentReceiver, intentFilter);
- intentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
- context.registerReceiver(mBootCompletedReceiver, intentFilter);
+ if (!factoryTest) {
+ intentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
+ context.registerReceiver(mBootCompletedReceiver, intentFilter);
+ }
intentFilter = new IntentFilter(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED);
context.registerReceiver(mBackgroundDataSettingChanged, intentFilter);
@@ -398,6 +397,13 @@ class SyncManager implements OnAccountsUpdatedListener {
sendCheckAlarmsMessage();
}
});
+
+ if (!factoryTest) {
+ AccountManager.get(mContext).addOnAccountsUpdatedListener(SyncManager.this,
+ mSyncHandler, false /* updateImmediately */);
+ // do this synchronously to ensure we have the accounts before this call returns
+ onAccountsUpdated(AccountManager.get(mContext).getAccounts());
+ }
}
private synchronized void initializeSyncPoll() {
@@ -580,10 +586,8 @@ class SyncManager implements OnAccountsUpdatedListener {
Bundle extras, long delay, boolean onlyThoseWithUnkownSyncableState) {
boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
- if (!mBootCompleted) {
- if (isLoggable) {
- Log.v(TAG, "suppressing scheduleSync() since boot hasn't completed");
- }
+ if (mAccounts == null) {
+ Log.e(TAG, "scheduleSync: the accounts aren't known yet, this should never happen");
return;
}
@@ -595,10 +599,9 @@ class SyncManager implements OnAccountsUpdatedListener {
return;
}
- final boolean backgroundDataUsageAllowed =
+ final boolean backgroundDataUsageAllowed = !mBootCompleted ||
getConnectivityManager().getBackgroundDataSetting();
- if (mAccounts == null) setStatusText("The accounts aren't known yet.");
if (!mDataConnectionIsConnected) setStatusText("No data connection");
if (mStorageIsLow) setStatusText("Memory low");
@@ -1453,7 +1456,29 @@ class SyncManager implements OnAccountsUpdatedListener {
// used to track if we have installed the error notification so that we don't reinstall
// it if sync is still failing
private boolean mErrorNotificationInstalled = false;
+ private volatile CountDownLatch mReadyToRunLatch = new CountDownLatch(1);
+
+ public void onBootCompleted() {
+ mBootCompleted = true;
+ if (mReadyToRunLatch != null) {
+ mReadyToRunLatch.countDown();
+ }
+ }
+ private void waitUntilReadyToRun() {
+ CountDownLatch latch = mReadyToRunLatch;
+ if (latch != null) {
+ while (true) {
+ try {
+ latch.await();
+ mReadyToRunLatch = null;
+ return;
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+ }
/**
* Used to keep track of whether a sync notification is active and who it is for.
*/
@@ -1491,11 +1516,8 @@ class SyncManager implements OnAccountsUpdatedListener {
}
public void handleMessage(Message msg) {
- handleSyncHandlerMessage(msg);
- }
-
- private void handleSyncHandlerMessage(Message msg) {
try {
+ waitUntilReadyToRun();
switch (msg.what) {
case SyncHandler.MESSAGE_SYNC_FINISHED:
if (Log.isLoggable(TAG, Log.VERBOSE)) {