diff options
author | Fred Quintana <fredq@google.com> | 2009-08-27 21:32:08 -0700 |
---|---|---|
committer | Fred Quintana <fredq@google.com> | 2009-08-31 18:04:39 -0700 |
commit | f892fb3a431e04151382d1bddc4438fd04487a6a (patch) | |
tree | bb50bcd8d951f668c8615752cdd82a327894796c | |
parent | ae209acd8d48755df7d49459b1bcbc3b8e20561d (diff) | |
download | frameworks_base-f892fb3a431e04151382d1bddc4438fd04487a6a.zip frameworks_base-f892fb3a431e04151382d1bddc4438fd04487a6a.tar.gz frameworks_base-f892fb3a431e04151382d1bddc4438fd04487a6a.tar.bz2 |
- don't schedule syncs that we will never dispatch
- expedite the INITIALIZATION sync
-rw-r--r-- | core/java/android/content/SyncManager.java | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index 15144a2..4e9e49c 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -148,6 +148,9 @@ class SyncManager implements OnAccountsUpdatedListener { private volatile boolean mSyncPollInitialized; private final PendingIntent mSyncAlarmIntent; private final PendingIntent mSyncPollAlarmIntent; + // Synchronized on "this". Instead of using this directly one should instead call + // its accessor, getConnManager(). + private ConnectivityManager mConnManagerDoNotUseDirectly; private final SyncAdaptersCache mSyncAdapters; @@ -280,6 +283,16 @@ class SyncManager implements OnAccountsUpdatedListener { private final boolean mFactoryTest; + private ConnectivityManager getConnectivityManager() { + synchronized (this) { + if (mConnManagerDoNotUseDirectly == null) { + mConnManagerDoNotUseDirectly = (ConnectivityManager)mContext.getSystemService( + Context.CONNECTIVITY_SERVICE); + } + return mConnManagerDoNotUseDirectly; + } + } + public SyncManager(Context context, boolean factoryTest) { mFactoryTest = factoryTest; @@ -536,6 +549,14 @@ class SyncManager implements OnAccountsUpdatedListener { return; } + if (!getConnectivityManager().getBackgroundDataSetting()) { + if (isLoggable) { + Log.v(TAG, "not syncing because background data usage isn't allowed"); + } + setStatusText("Sync is disabled."); + return; + } + if (mAccounts == null) setStatusText("The accounts aren't known yet."); if (!mDataConnectionIsConnected) setStatusText("No data connection"); if (mStorageIsLow) setStatusText("Memory low"); @@ -602,6 +623,8 @@ class SyncManager implements OnAccountsUpdatedListener { if (hasSyncAdapter) syncableAuthorities.add(requestedAuthority); } + final boolean masterSyncAutomatically = mSyncStorageEngine.getMasterSyncAutomatically(); + for (String authority : syncableAuthorities) { for (Account account : accounts) { int isSyncable = mSyncStorageEngine.getIsSyncable(account, authority); @@ -618,22 +641,36 @@ class SyncManager implements OnAccountsUpdatedListener { if (!syncAdapterInfo.type.supportsUploading() && uploadOnly) { continue; } + // make this an initialization sync if the isSyncable state is unknown Bundle extrasCopy = extras; + long delayCopy = delay; if (isSyncable < 0) { extrasCopy = new Bundle(extras); extrasCopy.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true); + delayCopy = -1; // expedite this + } else { + final boolean syncAutomatically = masterSyncAutomatically + && mSyncStorageEngine.getSyncAutomatically(account, authority); + boolean syncAllowed = manualSync || syncAutomatically; + if (!syncAllowed) { + if (isLoggable) { + Log.d(TAG, "scheduleSync: sync of " + account + ", " + authority + + " is not allowed, dropping request"); + continue; + } + } } if (isLoggable) { Log.v(TAG, "scheduleSync:" - + " delay " + delay + + " delay " + delayCopy + ", source " + source + ", account " + account + ", authority " + authority + ", extras " + extrasCopy); } scheduleSyncOperation( - new SyncOperation(account, source, authority, extrasCopy, delay)); + new SyncOperation(account, source, authority, extrasCopy, delayCopy)); } } } @@ -1591,9 +1628,8 @@ class SyncManager implements OnAccountsUpdatedListener { // found that is runnable (not disabled, etc). If that one is ready to run then // start it, otherwise just get out. SyncOperation op; - final ConnectivityManager connManager = (ConnectivityManager) - mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - final boolean backgroundDataUsageAllowed = connManager.getBackgroundDataSetting(); + final boolean backgroundDataUsageAllowed = + getConnectivityManager().getBackgroundDataSetting(); synchronized (mSyncQueue) { while (true) { op = mSyncQueue.head(); |