| Index: chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ChromiumSyncAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java
|
| similarity index 60%
|
| rename from chrome/android/java/src/org/chromium/chrome/browser/sync/ChromiumSyncAdapter.java
|
| rename to chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java
|
| index 83b9cd31d506b571b46f489948e4aa3ef28d9f6e..bb827bbbd8f1856079449a11512b8c57a6407212 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ChromiumSyncAdapter.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -package org.chromium.chrome.browser.sync;
|
| +package org.chromium.chrome.browser.invalidation;
|
|
|
| import android.accounts.Account;
|
| import android.app.Application;
|
| @@ -13,17 +13,15 @@ import android.content.Context;
|
| import android.content.SyncResult;
|
| import android.os.Bundle;
|
| import android.os.Handler;
|
| -import android.util.Log;
|
| -
|
| -import com.google.protos.ipc.invalidation.Types;
|
|
|
| +import org.chromium.base.Log;
|
| import org.chromium.base.ThreadUtils;
|
| import org.chromium.base.VisibleForTesting;
|
| import org.chromium.base.annotations.SuppressFBWarnings;
|
| import org.chromium.base.library_loader.LibraryProcessType;
|
| import org.chromium.base.library_loader.ProcessInitException;
|
| -import org.chromium.chrome.browser.invalidation.InvalidationServiceFactory;
|
| import org.chromium.chrome.browser.profiles.Profile;
|
| +import org.chromium.components.invalidation.PendingInvalidation;
|
| import org.chromium.content.app.ContentApplication;
|
| import org.chromium.content.browser.BrowserStartupController;
|
| import org.chromium.sync.signin.ChromeSigninController;
|
| @@ -32,21 +30,11 @@ import java.util.concurrent.Semaphore;
|
| import java.util.concurrent.TimeUnit;
|
|
|
| /**
|
| - * A sync adapter for Chromium.
|
| + * A Sync adapter that receives invalidations from {@link InvalidationClientService} and dispatches
|
| + * it to the native side with a caching layer in {@link DelayedInvalidationsController}.
|
| */
|
| public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
| - private static final String TAG = "ChromiumSyncAdapter";
|
| -
|
| - // TODO(nyquist) Make these fields package protected once downstream sync adapter tests are
|
| - // removed.
|
| - @VisibleForTesting
|
| - public static final String INVALIDATION_OBJECT_SOURCE_KEY = "objectSource";
|
| - @VisibleForTesting
|
| - public static final String INVALIDATION_OBJECT_ID_KEY = "objectId";
|
| - @VisibleForTesting
|
| - public static final String INVALIDATION_VERSION_KEY = "version";
|
| - @VisibleForTesting
|
| - public static final String INVALIDATION_PAYLOAD_KEY = "payload";
|
| + private static final String TAG = "cr.invalidation";
|
|
|
| private final Application mApplication;
|
| private final boolean mAsyncStartup;
|
| @@ -61,7 +49,7 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
|
|
| @Override
|
| public void onPerformSync(Account account, Bundle extras, String authority,
|
| - ContentProviderClient provider, SyncResult syncResult) {
|
| + ContentProviderClient provider, SyncResult syncResult) {
|
| if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE)) {
|
| Account signedInAccount = ChromeSigninController.get(getContext()).getSignedInUser();
|
| if (account.equals(signedInAccount)) {
|
| @@ -71,8 +59,11 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
| }
|
| return;
|
| }
|
| + PendingInvalidation invalidation = new PendingInvalidation(extras);
|
|
|
| - if (!DelayedSyncController.getInstance().shouldPerformSync(getContext(), extras, account)) {
|
| + DelayedInvalidationsController controller = DelayedInvalidationsController.getInstance();
|
| + if (!controller.shouldNotifyInvalidation(extras)) {
|
| + controller.addPendingInvalidation(getContext(), account.name, invalidation);
|
| return;
|
| }
|
|
|
| @@ -81,7 +72,7 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
|
|
| // Configure the callback with all the data it needs.
|
| BrowserStartupController.StartupCallback callback =
|
| - getStartupCallback(mApplication, account, extras, syncResult, semaphore);
|
| + getStartupCallback(mApplication, account.name, invalidation, syncResult, semaphore);
|
| startBrowserProcess(callback, syncResult, semaphore);
|
|
|
| try {
|
| @@ -92,14 +83,13 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
| syncResult.stats.numIoExceptions++;
|
| }
|
| } catch (InterruptedException e) {
|
| - Log.w(TAG, "Got InterruptedException when trying to request a sync.", e);
|
| + Log.w(TAG, "Got InterruptedException when trying to request an invalidation.", e);
|
| // Using numIoExceptions so Android will treat this as a soft error.
|
| syncResult.stats.numIoExceptions++;
|
| }
|
| }
|
|
|
| - private void startBrowserProcess(
|
| - final BrowserStartupController.StartupCallback callback,
|
| + private void startBrowserProcess(final BrowserStartupController.StartupCallback callback,
|
| final SyncResult syncResult, Semaphore semaphore) {
|
| try {
|
| ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| @@ -110,8 +100,8 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
| if (mAsyncStartup) {
|
| try {
|
| BrowserStartupController.get(mApplication,
|
| - LibraryProcessType.PROCESS_BROWSER)
|
| - .startBrowserProcessesAsync(callback);
|
| + LibraryProcessType.PROCESS_BROWSER)
|
| + .startBrowserProcessesAsync(callback);
|
| } catch (ProcessInitException e) {
|
| Log.e(TAG, "Unable to load native library.", e);
|
| System.exit(-1);
|
| @@ -123,7 +113,7 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
| });
|
| } catch (RuntimeException e) {
|
| // It is still unknown why we ever experience this. See http://crbug.com/180044.
|
| - Log.w(TAG, "Got exception when trying to request a sync. Informing Android system.", e);
|
| + Log.w(TAG, "Got exception when trying to notify the invalidation.", e);
|
| // Using numIoExceptions so Android will treat this as a soft error.
|
| syncResult.stats.numIoExceptions++;
|
| semaphore.release();
|
| @@ -148,40 +138,23 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
| });
|
| }
|
|
|
| - private BrowserStartupController.StartupCallback getStartupCallback(
|
| - final Context context, final Account acct, Bundle extras,
|
| + private BrowserStartupController.StartupCallback getStartupCallback(final Context context,
|
| + final String account, final PendingInvalidation invalidation,
|
| final SyncResult syncResult, final Semaphore semaphore) {
|
| - final boolean syncAllTypes = extras.getString(INVALIDATION_OBJECT_ID_KEY) == null;
|
| - final int objectSource = syncAllTypes ? 0 : extras.getInt(INVALIDATION_OBJECT_SOURCE_KEY);
|
| - final String objectId = syncAllTypes ? "" : extras.getString(INVALIDATION_OBJECT_ID_KEY);
|
| - final long version = syncAllTypes ? 0 : extras.getLong(INVALIDATION_VERSION_KEY);
|
| - final String payload = syncAllTypes ? "" : extras.getString(INVALIDATION_PAYLOAD_KEY);
|
| -
|
| return new BrowserStartupController.StartupCallback() {
|
| @Override
|
| public void onSuccess(boolean alreadyStarted) {
|
| - // Startup succeeded, so we can tickle the sync engine.
|
| - if (syncAllTypes) {
|
| - Log.v(TAG, "Received sync tickle for all types.");
|
| - requestSyncForAllTypes();
|
| - } else {
|
| - // Invalidations persisted before objectSource was added should be assumed to be
|
| - // for Sync objects. TODO(stepco): Remove this check once all persisted
|
| - // invalidations can be expected to have the objectSource.
|
| - int resolvedSource = objectSource;
|
| - if (resolvedSource == 0) {
|
| - resolvedSource = Types.ObjectSource.CHROME_SYNC;
|
| - }
|
| - Log.v(TAG, "Received sync tickle for " + resolvedSource + " " + objectId + ".");
|
| - requestSync(resolvedSource, objectId, version, payload);
|
| - }
|
| + // Startup succeeded, so we can notify the invalidation.
|
| + notifyInvalidation(invalidation.mObjectSource, invalidation.mObjectId,
|
| + invalidation.mVersion, invalidation.mPayload);
|
| semaphore.release();
|
| }
|
|
|
| @Override
|
| public void onFailure() {
|
| - // The startup failed, so we reset the delayed sync state.
|
| - DelayedSyncController.getInstance().setDelayedSync(context, acct.name);
|
| + // The startup failed, so we defer the invalidation.
|
| + DelayedInvalidationsController.getInstance().addPendingInvalidation(
|
| + context, account, invalidation);
|
| // Using numIoExceptions so Android will treat this as a soft error.
|
| syncResult.stats.numIoExceptions++;
|
| semaphore.release();
|
| @@ -190,14 +163,9 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter {
|
| }
|
|
|
| @VisibleForTesting
|
| - public void requestSync(int objectSource, String objectId, long version, String payload) {
|
| - InvalidationServiceFactory.getForProfile(Profile.getLastUsedProfile())
|
| - .requestSyncFromNativeChrome(objectSource, objectId, version, payload);
|
| - }
|
| -
|
| - @VisibleForTesting
|
| - public void requestSyncForAllTypes() {
|
| + public void notifyInvalidation(
|
| + int objectSource, String objectId, long version, String payload) {
|
| InvalidationServiceFactory.getForProfile(Profile.getLastUsedProfile())
|
| - .requestSyncFromNativeChromeForAllTypes();
|
| + .notifyInvalidationToNativeChrome(objectSource, objectId, version, payload);
|
| }
|
| }
|
|
|