Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d753f070 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change I5d199964 into eclair-mr2

* changes:
  add an IPC for sync initialization
parents f18b9311 e7424ffd
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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);
        }
    }

    /**
+8 −0
Original line number Diff line number Diff line
@@ -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);
}
+6 −0
Original line number Diff line number Diff line
@@ -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();
+7 −3
Original line number Diff line number Diff line
@@ -56,7 +56,9 @@ public class SyncContext {
        if (now < mLastHeartbeatSendTime + HEARTBEAT_SEND_INTERVAL_IN_MS) return;
        try {
            mLastHeartbeatSendTime = now;
            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 {
            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();
    }
}
+58 −20
Original line number Diff line number Diff line
@@ -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,14 +726,12 @@ 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 {
                        initializeSyncAdapter(account, authority);
                        continue;
                    }

                    final boolean syncAutomatically = masterSyncAutomatically
                            && mSyncStorageEngine.getSyncAutomatically(account, authority);
                    boolean syncAllowed =
@@ -705,17 +743,17 @@ class SyncManager implements OnAccountsUpdateListener {
                        }
                        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));
                }
            }
        }