am 3ff0a5e5: am d753f070: Merge change I5d199964 into eclair-mr2

Merge commit '3ff0a5e55da0af3e120adbcc6ec3494d0905964e'

* commit '3ff0a5e55da0af3e120adbcc6ec3494d0905964e':
  add an IPC for sync initialization
This commit is contained in:
Fred Quintana
2009-10-15 09:59:53 -07:00
committed by Android Git Automerger
5 changed files with 87 additions and 24 deletions

View File

@ -21,6 +21,7 @@ import android.os.Bundle;
import android.os.Process;
import android.os.NetStat;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.EventLog;
import java.util.concurrent.atomic.AtomicInteger;
@ -117,6 +118,12 @@ public abstract class AbstractThreadedSyncAdapter {
}
}
}
public void initialize(Account account, String authority) throws RemoteException {
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true);
startSync(null, authority, account, extras);
}
}
/**

View File

@ -44,4 +44,12 @@ oneway interface ISyncAdapter {
* @param syncContext the ISyncContext that was passed to {@link #startSync}
*/
void cancelSync(ISyncContext syncContext);
/**
* Initialize the SyncAdapter for this account and authority.
*
* @param account the account that should be synced
* @param authority the authority that should be synced
*/
void initialize(in Account account, String authority);
}

View File

@ -38,6 +38,12 @@ public abstract class SyncAdapter {
public void cancelSync(ISyncContext syncContext) throws RemoteException {
SyncAdapter.this.cancelSync();
}
public void initialize(Account account, String authority) throws RemoteException {
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true);
startSync(null, authority, account, extras);
}
}
Transport mTransport = new Transport();

View File

@ -56,7 +56,9 @@ public class SyncContext {
if (now < mLastHeartbeatSendTime + HEARTBEAT_SEND_INTERVAL_IN_MS) return;
try {
mLastHeartbeatSendTime = now;
mSyncContext.sendHeartbeat();
if (mSyncContext != null) {
mSyncContext.sendHeartbeat();
}
} catch (RemoteException e) {
// this should never happen
}
@ -64,13 +66,15 @@ public class SyncContext {
public void onFinished(SyncResult result) {
try {
mSyncContext.onFinished(result);
if (mSyncContext != null) {
mSyncContext.onFinished(result);
}
} catch (RemoteException e) {
// this should never happen
}
}
public IBinder getSyncContextBinder() {
return mSyncContext.asBinder();
return (mSyncContext == null) ? null : mSyncContext.asBinder();
}
}

View File

@ -544,6 +544,46 @@ class SyncManager implements OnAccountsUpdateListener {
return (activeSyncContext != null) ? activeSyncContext.mSyncOperation.account : null;
}
private void initializeSyncAdapter(Account account, String authority) {
SyncAdapterType syncAdapterType = SyncAdapterType.newKey(authority, account.type);
RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
mSyncAdapters.getServiceInfo(syncAdapterType);
if (syncAdapterInfo == null) {
Log.w(TAG, "can't find a sync adapter for " + syncAdapterType);
return;
}
Intent intent = new Intent();
intent.setAction("android.content.SyncAdapter");
intent.setComponent(syncAdapterInfo.componentName);
mContext.bindService(intent, new InitializerServiceConnection(account, authority),
Context.BIND_AUTO_CREATE);
}
private class InitializerServiceConnection implements ServiceConnection {
private final Account mAccount;
private final String mAuthority;
public InitializerServiceConnection(Account account, String authority) {
mAccount = account;
mAuthority = authority;
}
public void onServiceConnected(ComponentName name, IBinder service) {
try {
ISyncAdapter.Stub.asInterface(service).initialize(mAccount, mAuthority);
} catch (RemoteException e) {
// doesn't matter, we will retry again later
} finally {
mContext.unbindService(this);
}
}
public void onServiceDisconnected(ComponentName name) {
mContext.unbindService(this);
}
}
/**
* Returns whether or not sync is enabled. Sync can be enabled by
* setting the system property "ro.config.sync" to the value "yes".
@ -686,36 +726,34 @@ class SyncManager implements OnAccountsUpdateListener {
continue;
}
// make this an initialization sync if the isSyncable state is unknown
Bundle extrasCopy = extras;
long delayCopy = delay;
// initialize the SyncAdapter if the isSyncable state is unknown
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 || (backgroundDataUsageAllowed && syncAutomatically);
if (!syncAllowed) {
if (isLoggable) {
Log.d(TAG, "scheduleSync: sync of " + account + ", " + authority
+ " is not allowed, dropping request");
}
continue;
}
initializeSyncAdapter(account, authority);
continue;
}
final boolean syncAutomatically = masterSyncAutomatically
&& mSyncStorageEngine.getSyncAutomatically(account, authority);
boolean syncAllowed =
manualSync || (backgroundDataUsageAllowed && 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 " + delayCopy
+ " delay " + delay
+ ", source " + source
+ ", account " + account
+ ", authority " + authority
+ ", extras " + extrasCopy);
+ ", extras " + extras);
}
scheduleSyncOperation(
new SyncOperation(account, source, authority, extrasCopy, delayCopy));
new SyncOperation(account, source, authority, extras, delay));
}
}
}