From 47c75040af42bf8d8ddcb8aad88b65aa740d1a73 Mon Sep 17 00:00:00 2001 From: maxbogue Date: Wed, 12 Aug 2015 11:05:01 -0700 Subject: [PATCH] [Sync] Convert to using auto-generated ModelType. See http://crrev.com/1247853007 for where the new ModelType was added. - ModelType is now just represented by an integer. - ModelType is now located in org.chromium.sync. - Many of the constants were singular and are now plural to match the ones in model_type.h. - ModelTypeSet is removed and a jintArray is used for JNI. BUG=509788 TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1262413006 Cr-Commit-Position: refs/heads/master@{#343051} --- chrome/android/BUILD.gn | 3 - .../chrome/browser/gsa/ContextReporter.java | 4 +- .../browser/invalidation/ChromiumSyncAdapter.java | 5 +- .../invalidation/InvalidationController.java | 8 +- .../chrome/browser/signin/SigninHelper.java | 5 +- .../chrome/browser/sync/ProfileSyncService.java | 151 ++++----------- .../browser/sync/ui/SyncCustomizationFragment.java | 24 +-- .../invalidation/InvalidationServiceTest.java | 5 +- .../invalidations/InvalidationControllerTest.java | 24 ++- .../chromium/chrome/browser/sync/AutofillTest.java | 2 +- .../chrome/browser/sync/BookmarksTest.java | 12 +- .../chrome/browser/sync/FakeServerHelper.java | 13 +- .../sync/SyncCustomizationFragmentTest.java | 48 ++--- .../chromium/chrome/browser/sync/SyncTestBase.java | 5 +- .../chrome/browser/sync/TypedUrlsTest.java | 6 +- .../browser/sync/profile_sync_service_android.cc | 133 ++------------ chrome/browser/sync/profile_sync_service_android.h | 17 +- .../sync/profile_sync_service_android_unittest.cc | 37 ---- chrome/chrome.gyp | 1 - chrome/chrome_browser.gypi | 9 - components/invalidation.gypi | 1 + .../invalidation/InvalidationClientService.java | 9 +- .../InvalidationClientServiceTest.java | 143 +++++++++------ .../src/org/chromium/sync/ModelTypeHelper.java | 17 ++ .../sync/internal_api/pub/base/ModelType.java | 203 --------------------- .../sync/notifier/InvalidationIntentProtocol.java | 8 +- .../sync/notifier/InvalidationPreferencesTest.java | 18 +- .../android/fake_server_helper_android.cc | 19 +- .../android/fake_server_helper_android.h | 4 +- 29 files changed, 267 insertions(+), 667 deletions(-) delete mode 100644 sync/android/java/src/org/chromium/sync/internal_api/pub/base/ModelType.java diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index a843951f3cef..b0cbbe1d64a7 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn @@ -181,7 +181,6 @@ android_library("chrome_java") { # GYP: //chrome/chrome_browser.gypi:connectivity_check_result_java # GYP: //chrome/chrome_browser.gypi:shortcut_source_java # GYP: //chrome/chrome_browser.gypi:profile_account_management_metrics_java -# GYP: //chrome/chrome_browser.gypi:profile_sync_service_model_type_selection_java # GYP: //chrome/chrome_browser.gypi:connection_security_security_levels_java # GYP: //chrome/chrome_browser.gypi:tab_load_status_java java_cpp_enum("chrome_android_java_enums_srcjar") { @@ -192,7 +191,6 @@ java_cpp_enum("chrome_android_java_enums_srcjar") { "//chrome/browser/android/tab_android.h", "//chrome/browser/profiles/profile_metrics.h", "//chrome/browser/ssl/connection_security.h", - "//chrome/browser/sync/profile_sync_service_android.cc", ] outputs = [ "org/chromium/chrome/browser/ActivityTypeIds.java", @@ -201,7 +199,6 @@ java_cpp_enum("chrome_android_java_enums_srcjar") { "org/chromium/chrome/browser/TabLoadStatus.java", "org/chromium/chrome/browser/profiles/ProfileAccountManagementMetrics.java", "org/chromium/chrome/browser/ssl/ConnectionSecurityLevel.java", - "org/chromium/chrome/browser/sync/ModelTypeSelection.java", ] } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gsa/ContextReporter.java b/chrome/android/java/src/org/chromium/chrome/browser/gsa/ContextReporter.java index a1084b453347..438375f7b50b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gsa/ContextReporter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gsa/ContextReporter.java @@ -19,8 +19,8 @@ import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; +import org.chromium.sync.ModelType; import org.chromium.sync.internal_api.pub.PassphraseType; -import org.chromium.sync.internal_api.pub.base.ModelType; import java.util.concurrent.atomic.AtomicBoolean; @@ -221,7 +221,7 @@ public class ContextReporter { public static void reportSyncStatus(ProfileSyncService syncService) { if (!syncService.isSyncInitialized()) { reportStatus(STATUS_SYNC_NOT_INITIALIZED); - } else if (!syncService.getActiveDataTypes().contains(ModelType.TYPED_URL)) { + } else if (!syncService.getActiveDataTypes().contains(ModelType.TYPED_URLS)) { reportStatus(STATUS_SYNC_NOT_SYNCING_URLS); } else if (!syncService.getPassphraseType().equals(PassphraseType.KEYSTORE_PASSPHRASE)) { reportStatus(STATUS_SYNC_NOT_KEYSTORE_PASSPHRASE); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java index 850fdb2b9768..72dc3ab583e3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/ChromiumSyncAdapter.java @@ -25,7 +25,8 @@ 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.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; +import org.chromium.sync.ModelTypeHelper; import org.chromium.sync.signin.ChromeSigninController; import java.util.concurrent.Semaphore; @@ -173,7 +174,7 @@ public abstract class ChromiumSyncAdapter extends AbstractThreadedSyncAdapter { // Count the number of sessions sync invalidations to evaluate effectiveness of // AndroidSessionNotifications field trial. The histogram is recorded here because // RecordHistogram requires the native library to be loaded. - if (ModelType.SESSION.name().equals(objectId)) { + if (ModelTypeHelper.toNotificationType(ModelType.SESSIONS).equals(objectId)) { RecordHistogram.recordBooleanHistogram("Sync.InvalidationSessionsAndroid", true); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java index b2bf677110ee..3575e4321275 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/invalidation/InvalidationController.java @@ -16,7 +16,7 @@ import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.components.invalidation.InvalidationClientService; import org.chromium.sync.AndroidSyncSettings; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; import org.chromium.sync.notifier.InvalidationIntentProtocol; import org.chromium.sync.signin.ChromeSigninController; @@ -160,12 +160,12 @@ public class InvalidationController implements ApplicationStatus.ApplicationStat // may be scheduled far into the future. mEnableSessionInvalidationsTimer.resume(); - HashSet typesToRegister = new HashSet(); + HashSet typesToRegister = new HashSet(); typesToRegister.addAll(ProfileSyncService.get(mContext).getPreferredDataTypes()); if (!mSessionInvalidationsEnabled) { - typesToRegister.remove(ModelType.SESSION); + typesToRegister.remove(ModelType.SESSIONS); typesToRegister.remove(ModelType.FAVICON_TRACKING); - typesToRegister.remove(ModelType.FAVICON_IMAGE); + typesToRegister.remove(ModelType.FAVICON_IMAGES); } Intent registerIntent = InvalidationIntentProtocol.createRegisterIntent( diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java index 4e6555065895..c87e2130df59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java @@ -24,7 +24,6 @@ import org.chromium.chrome.browser.signin.SigninManager.SignInFlowObserver; import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.SyncController; import org.chromium.sync.AndroidSyncSettings; -import org.chromium.sync.internal_api.pub.base.ModelType; import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.sync.signin.ChromeSigninController; @@ -233,7 +232,7 @@ public class SigninHelper { // Before signing out, remember the current sync state and data types. final boolean isSyncWanted = AndroidSyncSettings.isChromeSyncEnabled(mContext); - final Set dataTypes = mProfileSyncService.getPreferredDataTypes(); + final Set dataTypes = mProfileSyncService.getPreferredDataTypes(); // TODO(acleung): Deal with passphrase or just prompt user to re-enter it? @@ -253,7 +252,7 @@ public class SigninHelper { private void performResignin(String newName, final boolean isSyncWanted, - final Set dataTypes) { + final Set dataTypes) { // This is the correct account now. final Account account = AccountManagerHelper.createAccountFromName(newName); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java index 56eaa07e021b..324dd7f6bb0f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java @@ -16,17 +16,14 @@ import org.chromium.base.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.chrome.browser.identity.UniqueIdentificationGenerator; +import org.chromium.sync.ModelType; import org.chromium.sync.internal_api.pub.PassphraseType; -import org.chromium.sync.internal_api.pub.base.ModelType; import org.json.JSONArray; import org.json.JSONException; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -73,6 +70,15 @@ public class ProfileSyncService { @VisibleForTesting public static final String SESSION_TAG_PREFIX = "session_sync"; + private static final int[] ALL_SELECTABLE_TYPES = new int[] { + ModelType.AUTOFILL, + ModelType.BOOKMARKS, + ModelType.PASSWORDS, + ModelType.PREFERENCES, + ModelType.PROXY_TABS, + ModelType.TYPED_URLS + }; + private static ProfileSyncService sProfileSyncService; @VisibleForTesting @@ -345,9 +351,9 @@ public class ProfileSyncService { * * @return Set of active data types. */ - public Set getActiveDataTypes() { - long modelTypeSelection = nativeGetActiveDataTypes(mNativeProfileSyncServiceAndroid); - return modelTypeSelectionToSet(modelTypeSelection); + public Set getActiveDataTypes() { + int[] activeDataTypes = nativeGetActiveDataTypes(mNativeProfileSyncServiceAndroid); + return modelTypeArrayToSet(activeDataTypes); } /** @@ -357,72 +363,26 @@ public class ProfileSyncService { * * @return Set of preferred types. */ - public Set getPreferredDataTypes() { - long modelTypeSelection = nativeGetPreferredDataTypes(mNativeProfileSyncServiceAndroid); - return modelTypeSelectionToSet(modelTypeSelection); + public Set getPreferredDataTypes() { + int[] modelTypeArray = nativeGetPreferredDataTypes(mNativeProfileSyncServiceAndroid); + return modelTypeArrayToSet(modelTypeArray); } - @VisibleForTesting - public static Set modelTypeSelectionToSet(long modelTypeSelection) { - Set syncTypes = new HashSet(); - if ((modelTypeSelection & ModelTypeSelection.AUTOFILL) != 0) { - syncTypes.add(ModelType.AUTOFILL); - } - if ((modelTypeSelection & ModelTypeSelection.AUTOFILL_PROFILE) != 0) { - syncTypes.add(ModelType.AUTOFILL_PROFILE); - } - if ((modelTypeSelection & ModelTypeSelection.AUTOFILL_WALLET) != 0) { - syncTypes.add(ModelType.AUTOFILL_WALLET); - } - if ((modelTypeSelection & ModelTypeSelection.AUTOFILL_WALLET_METADATA) != 0) { - syncTypes.add(ModelType.AUTOFILL_WALLET_METADATA); - } - if ((modelTypeSelection & ModelTypeSelection.BOOKMARK) != 0) { - syncTypes.add(ModelType.BOOKMARK); - } - if ((modelTypeSelection & ModelTypeSelection.DEVICE_INFO) != 0) { - syncTypes.add(ModelType.DEVICE_INFO); - } - if ((modelTypeSelection & ModelTypeSelection.EXPERIMENTS) != 0) { - syncTypes.add(ModelType.EXPERIMENTS); - } - if ((modelTypeSelection & ModelTypeSelection.FAVICON_IMAGE) != 0) { - syncTypes.add(ModelType.FAVICON_IMAGE); - } - if ((modelTypeSelection & ModelTypeSelection.FAVICON_TRACKING) != 0) { - syncTypes.add(ModelType.FAVICON_TRACKING); - } - if ((modelTypeSelection & ModelTypeSelection.HISTORY_DELETE_DIRECTIVE) != 0) { - syncTypes.add(ModelType.HISTORY_DELETE_DIRECTIVE); - } - if ((modelTypeSelection & ModelTypeSelection.NIGORI) != 0) { - syncTypes.add(ModelType.NIGORI); - } - if ((modelTypeSelection & ModelTypeSelection.PASSWORD) != 0) { - syncTypes.add(ModelType.PASSWORD); - } - if ((modelTypeSelection & ModelTypeSelection.PREFERENCE) != 0) { - syncTypes.add(ModelType.PREFERENCE); - } - if ((modelTypeSelection & ModelTypeSelection.PRIORITY_PREFERENCE) != 0) { - syncTypes.add(ModelType.PRIORITY_PREFERENCE); - } - if ((modelTypeSelection & ModelTypeSelection.PROXY_TABS) != 0) { - syncTypes.add(ModelType.PROXY_TABS); - } - if ((modelTypeSelection & ModelTypeSelection.SESSION) != 0) { - syncTypes.add(ModelType.SESSION); + private static Set modelTypeArrayToSet(int[] modelTypeArray) { + Set modelTypeSet = new HashSet(); + for (int i = 0; i < modelTypeArray.length; i++) { + modelTypeSet.add(modelTypeArray[i]); } - if ((modelTypeSelection & ModelTypeSelection.SUPERVISED_USER_SETTING) != 0) { - syncTypes.add(ModelType.MANAGED_USER_SETTING); - } - if ((modelTypeSelection & ModelTypeSelection.SUPERVISED_USER_WHITELIST) != 0) { - syncTypes.add(ModelType.MANAGED_USER_WHITELIST); - } - if ((modelTypeSelection & ModelTypeSelection.TYPED_URL) != 0) { - syncTypes.add(ModelType.TYPED_URL); + return modelTypeSet; + } + + private static int[] modelTypeSetToArray(Set modelTypeSet) { + int[] modelTypeArray = new int[modelTypeSet.size()]; + int i = 0; + for (int modelType : modelTypeSet) { + modelTypeArray[i++] = modelType; } - return syncTypes; + return modelTypeArray; } public boolean hasKeepEverythingSynced() { @@ -437,28 +397,9 @@ public class ProfileSyncService { * @param enabledTypes The set of types to enable. Ignored (can be null) if * syncEverything is true. */ - public void setPreferredDataTypes(boolean syncEverything, Set enabledTypes) { - long modelTypeSelection = 0; - if (syncEverything || enabledTypes.contains(ModelType.AUTOFILL)) { - modelTypeSelection |= ModelTypeSelection.AUTOFILL; - } - if (syncEverything || enabledTypes.contains(ModelType.BOOKMARK)) { - modelTypeSelection |= ModelTypeSelection.BOOKMARK; - } - if (syncEverything || enabledTypes.contains(ModelType.PASSWORD)) { - modelTypeSelection |= ModelTypeSelection.PASSWORD; - } - if (syncEverything || enabledTypes.contains(ModelType.PREFERENCE)) { - modelTypeSelection |= ModelTypeSelection.PREFERENCE; - } - if (syncEverything || enabledTypes.contains(ModelType.PROXY_TABS)) { - modelTypeSelection |= ModelTypeSelection.PROXY_TABS; - } - if (syncEverything || enabledTypes.contains(ModelType.TYPED_URL)) { - modelTypeSelection |= ModelTypeSelection.TYPED_URL; - } - nativeSetPreferredDataTypes( - mNativeProfileSyncServiceAndroid, syncEverything, modelTypeSelection); + public void setPreferredDataTypes(boolean syncEverything, Set enabledTypes) { + nativeSetPreferredDataTypes(mNativeProfileSyncServiceAndroid, syncEverything, syncEverything + ? ALL_SELECTABLE_TYPES : modelTypeSetToArray(enabledTypes)); } public void setSyncSetupCompleted() { @@ -567,32 +508,12 @@ public class ProfileSyncService { nativeOverrideNetworkResourcesForTest(mNativeProfileSyncServiceAndroid, networkResources); } - @CalledByNative - private static String modelTypeSelectionToStringForTest(long modelTypeSelection) { - SortedSet set = new TreeSet(); - Set filteredTypes = ModelType.filterOutNonInvalidationTypes( - modelTypeSelectionToSet(modelTypeSelection)); - for (ModelType type : filteredTypes) { - set.add(type.toString()); - } - StringBuilder sb = new StringBuilder(); - Iterator it = set.iterator(); - if (it.hasNext()) { - sb.append(it.next()); - while (it.hasNext()) { - sb.append(", "); - sb.append(it.next()); - } - } - return sb.toString(); - } - /** * @return Whether sync is enabled to sync urls or open tabs with a non custom passphrase. */ public boolean isSyncingUrlsWithKeystorePassphrase() { return isSyncInitialized() - && getPreferredDataTypes().contains(ModelType.TYPED_URL) + && getPreferredDataTypes().contains(ModelType.TYPED_URLS) && getPassphraseType().equals(PassphraseType.KEYSTORE_PASSPHRASE); } @@ -673,10 +594,10 @@ public class ProfileSyncService { private native String nativeGetSyncEnterCustomPassphraseBodyText( long nativeProfileSyncServiceAndroid); private native boolean nativeIsSyncKeystoreMigrationDone(long nativeProfileSyncServiceAndroid); - private native long nativeGetActiveDataTypes(long nativeProfileSyncServiceAndroid); - private native long nativeGetPreferredDataTypes(long nativeProfileSyncServiceAndroid); + private native int[] nativeGetActiveDataTypes(long nativeProfileSyncServiceAndroid); + private native int[] nativeGetPreferredDataTypes(long nativeProfileSyncServiceAndroid); private native void nativeSetPreferredDataTypes( - long nativeProfileSyncServiceAndroid, boolean syncEverything, long modelTypeSelection); + long nativeProfileSyncServiceAndroid, boolean syncEverything, int[] modelTypeArray); private native void nativeSetSetupInProgress( long nativeProfileSyncServiceAndroid, boolean inProgress); private native void nativeSetSyncSetupCompleted(long nativeProfileSyncServiceAndroid); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java index c147d9014bc8..a4795f600143 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java @@ -33,8 +33,8 @@ import org.chromium.chrome.browser.preferences.ChromeSwitchPreference; import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.SyncController; import org.chromium.sync.AndroidSyncSettings; +import org.chromium.sync.ModelType; import org.chromium.sync.internal_api.pub.PassphraseType; -import org.chromium.sync.internal_api.pub.base.ModelType; import java.util.HashSet; import java.util.Set; @@ -323,14 +323,14 @@ public class SyncCustomizationFragment extends PreferenceFragment invController.ensureStartedAndUpdateRegisteredTypes(); } - private Set getSelectedModelTypes() { - Set types = new HashSet(); + private Set getSelectedModelTypes() { + Set types = new HashSet(); if (mSyncAutofill.isChecked()) types.add(ModelType.AUTOFILL); - if (mSyncBookmarks.isChecked()) types.add(ModelType.BOOKMARK); - if (mSyncOmnibox.isChecked()) types.add(ModelType.TYPED_URL); - if (mSyncPasswords.isChecked()) types.add(ModelType.PASSWORD); + if (mSyncBookmarks.isChecked()) types.add(ModelType.BOOKMARKS); + if (mSyncOmnibox.isChecked()) types.add(ModelType.TYPED_URLS); + if (mSyncPasswords.isChecked()) types.add(ModelType.PASSWORDS); if (mSyncRecentTabs.isChecked()) types.add(ModelType.PROXY_TABS); - if (mSyncSettings.isChecked()) types.add(ModelType.PREFERENCE); + if (mSyncSettings.isChecked()) types.add(ModelType.PREFERENCES); return types; } @@ -518,16 +518,16 @@ public class SyncCustomizationFragment extends PreferenceFragment pref.setEnabled(isSyncEnabled && !syncEverything && canSyncType); } if (isSyncEnabled && !syncEverything) { - Set syncTypes = mProfileSyncService.getPreferredDataTypes(); + Set syncTypes = mProfileSyncService.getPreferredDataTypes(); mSyncAutofill.setChecked(syncTypes.contains(ModelType.AUTOFILL)); - mSyncBookmarks.setChecked(syncTypes.contains(ModelType.BOOKMARK)); - mSyncOmnibox.setChecked(syncTypes.contains(ModelType.TYPED_URL)); + mSyncBookmarks.setChecked(syncTypes.contains(ModelType.BOOKMARKS)); + mSyncOmnibox.setChecked(syncTypes.contains(ModelType.TYPED_URLS)); mSyncPasswords.setChecked(passwordSyncConfigurable - && syncTypes.contains(ModelType.PASSWORD)); + && syncTypes.contains(ModelType.PASSWORDS)); mSyncRecentTabs.setChecked(syncTypes.contains(ModelType.PROXY_TABS)); // TODO(zea): Switch this to PREFERENCE once that datatype is // supported on Android. - mSyncSettings.setChecked(syncTypes.contains(ModelType.PRIORITY_PREFERENCE)); + mSyncSettings.setChecked(syncTypes.contains(ModelType.PRIORITY_PREFERENCES)); } } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/InvalidationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/InvalidationServiceTest.java index 644278da66de..e343566470be 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/InvalidationServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/invalidation/InvalidationServiceTest.java @@ -16,7 +16,8 @@ import org.chromium.components.invalidation.InvalidationClientService; import org.chromium.components.invalidation.InvalidationService; import org.chromium.content.browser.test.NativeLibraryTestBase; import org.chromium.sync.AndroidSyncSettings; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; +import org.chromium.sync.ModelTypeHelper; import org.chromium.sync.notifier.InvalidationIntentProtocol; import org.chromium.sync.test.util.MockSyncContentResolverDelegate; @@ -45,7 +46,7 @@ public class InvalidationServiceTest extends NativeLibraryTestBase { @Feature({"Sync"}) public void testSetRegisteredObjectIds() { InvalidationService service = InvalidationServiceFactory.getForTest(mContext); - ObjectId bookmark = ModelType.BOOKMARK.toObjectId(); + ObjectId bookmark = ModelTypeHelper.toObjectId(ModelType.BOOKMARKS); service.setRegisteredObjectIds(new int[] {1, 2, bookmark.getSource()}, new String[] {"a", "b", new String(bookmark.getName())}); assertEquals(1, mContext.getNumStartedIntents()); diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/invalidations/InvalidationControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/invalidations/InvalidationControllerTest.java index 3990a959887a..75d323fc1b0f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/invalidations/InvalidationControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/invalidations/InvalidationControllerTest.java @@ -17,7 +17,8 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.components.invalidation.InvalidationClientService; import org.chromium.sync.AndroidSyncSettings; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; +import org.chromium.sync.ModelTypeHelper; import org.chromium.sync.notifier.InvalidationIntentProtocol; import org.chromium.sync.signin.ChromeSigninController; import org.chromium.sync.test.util.MockSyncContentResolverDelegate; @@ -45,13 +46,13 @@ public class InvalidationControllerTest { * {@link ProfileSyncService#getPreferredDataTypes()} */ private static class ProfileSyncServiceStub extends ProfileSyncService { - private Set mPreferredDataTypes; + private Set mPreferredDataTypes; public ProfileSyncServiceStub(Context context) { super(context); } - public void setPreferredDataTypes(Set types) { + public void setPreferredDataTypes(Set types) { mPreferredDataTypes = types; } @@ -61,7 +62,7 @@ public class InvalidationControllerTest { } @Override - public Set getPreferredDataTypes() { + public Set getPreferredDataTypes() { return mPreferredDataTypes; } } @@ -88,12 +89,21 @@ public class InvalidationControllerTest { mShadowActivity = Robolectric.shadowOf(activity); mContext = activity; + ModelTypeHelper.setTestDelegate(new ModelTypeHelper.TestDelegate() { + public String toNotificationType(int modelType) { + return Integer.toString(modelType); + } + }); + ProfileSyncServiceStub profileSyncServiceStub = new ProfileSyncServiceStub(mContext); ProfileSyncService.overrideForTests(profileSyncServiceStub); profileSyncServiceStub.setPreferredDataTypes( - CollectionUtil.newHashSet(ModelType.BOOKMARK, ModelType.SESSION)); - mAllTypes = CollectionUtil.newHashSet(ModelType.BOOKMARK.name(), ModelType.SESSION.name()); - mNonSessionTypes = CollectionUtil.newHashSet(ModelType.BOOKMARK.name()); + CollectionUtil.newHashSet(ModelType.BOOKMARKS, ModelType.SESSIONS)); + mAllTypes = CollectionUtil.newHashSet( + ModelTypeHelper.toNotificationType(ModelType.BOOKMARKS), + ModelTypeHelper.toNotificationType(ModelType.SESSIONS)); + mNonSessionTypes = CollectionUtil.newHashSet(ModelTypeHelper.toNotificationType( + ModelType.BOOKMARKS)); // We don't want to use the system content resolver, so we override it. MockSyncContentResolverDelegate delegate = new MockSyncContentResolverDelegate(); diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java index 4f4b5ff0a1fd..8abf2deaeaab 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/AutofillTest.java @@ -11,7 +11,7 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; import org.chromium.sync.protocol.AutofillProfileSpecifics; import org.chromium.sync.protocol.EntitySpecifics; import org.json.JSONException; diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java index ed07f81d3b44..542586938360 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/BookmarksTest.java @@ -15,7 +15,7 @@ import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; import org.chromium.sync.protocol.BookmarkSpecifics; import org.chromium.sync.protocol.SyncEntity; import org.json.JSONException; @@ -329,7 +329,7 @@ public class BookmarksTest extends SyncTestBase { @LargeTest @Feature({"Sync"}) public void testDisabledNoDownloadBookmark() throws Exception { - disableDataType(ModelType.BOOKMARK); + disableDataType(ModelType.BOOKMARKS); addServerBookmark(TITLE, URL); SyncTestUtil.triggerSyncAndWaitForCompletion(mContext); waitForServerBookmarkCountWithName(1, TITLE); @@ -341,7 +341,7 @@ public class BookmarksTest extends SyncTestBase { @LargeTest @Feature({"Sync"}) public void testDisabledNoUploadBookmark() throws Exception { - disableDataType(ModelType.BOOKMARK); + disableDataType(ModelType.BOOKMARKS); addClientBookmark(TITLE, URL); SyncTestUtil.triggerSyncAndWaitForCompletion(mContext); assertServerBookmarkCountWithName(0, TITLE); @@ -435,7 +435,7 @@ public class BookmarksTest extends SyncTestBase { private List getServerBookmarks() throws Exception { List entities = - mFakeServerHelper.getSyncEntitiesByModelType(ModelType.BOOKMARK); + mFakeServerHelper.getSyncEntitiesByModelType(ModelType.BOOKMARKS); List bookmarks = new ArrayList(entities.size()); for (SyncEntity entity : entities) { String id = entity.idString; @@ -454,7 +454,7 @@ public class BookmarksTest extends SyncTestBase { private void assertServerBookmarkCountWithName(int count, String name) { assertTrue("There should be " + count + " remote bookmarks with name " + name + ".", mFakeServerHelper.verifyEntityCountByTypeAndName( - count, ModelType.BOOKMARK, name)); + count, ModelType.BOOKMARKS, name)); } private void waitForClientBookmarkCount(final int n) throws InterruptedException { @@ -478,7 +478,7 @@ public class BookmarksTest extends SyncTestBase { public boolean isSatisfied() { try { return mFakeServerHelper.verifyEntityCountByTypeAndName( - count, ModelType.BOOKMARK, name); + count, ModelType.BOOKMARKS, name); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java index 8a9a2dea8bdc..43120bc541a0 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FakeServerHelper.java @@ -10,7 +10,6 @@ import com.google.protobuf.nano.InvalidProtocolBufferNanoException; import com.google.protobuf.nano.MessageNano; import org.chromium.base.ThreadUtils; -import org.chromium.sync.internal_api.pub.base.ModelType; import org.chromium.sync.protocol.EntitySpecifics; import org.chromium.sync.protocol.SyncEntity; @@ -147,7 +146,7 @@ public class FakeServerHelper { * * @return whether the number of specified entities exist */ - public boolean verifyEntityCountByTypeAndName(final int count, final ModelType modelType, + public boolean verifyEntityCountByTypeAndName(final int count, final int modelType, final String name) { checkFakeServerInitialized( "useFakeServer must be called before data verification."); @@ -155,7 +154,7 @@ public class FakeServerHelper { @Override public Boolean call() { return nativeVerifyEntityCountByTypeAndName(mNativeFakeServerHelperAndroid, - sNativeFakeServer, count, modelType.toString(), name); + sNativeFakeServer, count, modelType, name); } }); } @@ -186,14 +185,14 @@ public class FakeServerHelper { * * @return a list of all the SyncEntity protos for that type. */ - public List getSyncEntitiesByModelType(final ModelType modelType) + public List getSyncEntitiesByModelType(final int modelType) throws ExecutionException { checkFakeServerInitialized("useFakeServer must be called before getting sync entities."); return ThreadUtils.runOnUiThreadBlocking(new Callable>() { @Override public List call() throws InvalidProtocolBufferNanoException { byte[][] serializedEntities = nativeGetSyncEntitiesByModelType( - mNativeFakeServerHelperAndroid, sNativeFakeServer, modelType.toString()); + mNativeFakeServerHelperAndroid, sNativeFakeServer, modelType); List entities = new ArrayList(serializedEntities.length); for (int i = 0; i < serializedEntities.length; i++) { SyncEntity entity = new SyncEntity(); @@ -376,12 +375,12 @@ public class FakeServerHelper { private native void nativeDeleteFakeServer( long nativeFakeServerHelperAndroid, long nativeFakeServer); private native boolean nativeVerifyEntityCountByTypeAndName( - long nativeFakeServerHelperAndroid, long nativeFakeServer, int count, String modelType, + long nativeFakeServerHelperAndroid, long nativeFakeServer, int count, int modelType, String name); private native boolean nativeVerifySessions( long nativeFakeServerHelperAndroid, long nativeFakeServer, String[] urlArray); private native byte[][] nativeGetSyncEntitiesByModelType( - long nativeFakeServerHelperAndroid, long nativeFakeServer, String modelType); + long nativeFakeServerHelperAndroid, long nativeFakeServer, int modelType); private native void nativeInjectUniqueClientEntity( long nativeFakeServerHelperAndroid, long nativeFakeServer, String name, byte[] serializedEntitySpecifics); diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java index a2f589cc9f22..11b7b53fd694 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java @@ -4,6 +4,7 @@ package org.chromium.chrome.browser.sync; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.app.FragmentTransaction; @@ -32,12 +33,12 @@ import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.sync.AndroidSyncSettings; +import org.chromium.sync.ModelType; import org.chromium.sync.internal_api.pub.PassphraseType; -import org.chromium.sync.internal_api.pub.base.ModelType; import java.util.Collection; -import java.util.EnumSet; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; @@ -45,6 +46,7 @@ import java.util.concurrent.Callable; /** * Tests for SyncCustomizationFragment. */ +@SuppressLint("UseSparseArrays") public class SyncCustomizationFragmentTest extends SyncTestBase { private static final String TAG = "SyncCustomizationFragmentTest"; @@ -72,17 +74,17 @@ public class SyncCustomizationFragmentTest extends SyncTestBase { /** * Maps ModelTypes to their UI element IDs. */ - private static final Map UI_DATATYPES; + private static final Map UI_DATATYPES; static { - UI_DATATYPES = new HashMap(); + UI_DATATYPES = new HashMap(); UI_DATATYPES.put(ModelType.AUTOFILL, SyncCustomizationFragment.PREFERENCE_SYNC_AUTOFILL); - UI_DATATYPES.put(ModelType.BOOKMARK, SyncCustomizationFragment.PREFERENCE_SYNC_BOOKMARKS); - UI_DATATYPES.put(ModelType.TYPED_URL, SyncCustomizationFragment.PREFERENCE_SYNC_OMNIBOX); - UI_DATATYPES.put(ModelType.PASSWORD, SyncCustomizationFragment.PREFERENCE_SYNC_PASSWORDS); + UI_DATATYPES.put(ModelType.BOOKMARKS, SyncCustomizationFragment.PREFERENCE_SYNC_BOOKMARKS); + UI_DATATYPES.put(ModelType.TYPED_URLS, SyncCustomizationFragment.PREFERENCE_SYNC_OMNIBOX); + UI_DATATYPES.put(ModelType.PASSWORDS, SyncCustomizationFragment.PREFERENCE_SYNC_PASSWORDS); UI_DATATYPES.put(ModelType.PROXY_TABS, SyncCustomizationFragment.PREFERENCE_SYNC_RECENT_TABS); - UI_DATATYPES.put(ModelType.PREFERENCE, + UI_DATATYPES.put(ModelType.PREFERENCES, SyncCustomizationFragment.PREFERENCE_SYNC_SETTINGS); } @@ -198,7 +200,7 @@ public class SyncCustomizationFragmentTest extends SyncTestBase { SyncTestUtil.waitForSyncActive(mContext); SyncCustomizationFragment fragment = startSyncCustomizationFragment(); SwitchPreference syncEverything = getSyncEverything(fragment); - Map dataTypes = getDataTypes(fragment); + Map dataTypes = getDataTypes(fragment); assertDefaultSyncOnState(fragment); togglePreference(syncEverything); @@ -207,19 +209,19 @@ public class SyncCustomizationFragmentTest extends SyncTestBase { assertTrue(dataType.isEnabled()); } - Set expectedTypes = EnumSet.copyOf(dataTypes.keySet()); + Set expectedTypes = new HashSet(dataTypes.keySet()); // TODO(zea): update this once preferences are supported. - expectedTypes.remove(ModelType.PREFERENCE); - expectedTypes.add(ModelType.PRIORITY_PREFERENCE); + expectedTypes.remove(ModelType.PREFERENCES); + expectedTypes.add(ModelType.PRIORITY_PREFERENCES); assertDataTypesAre(expectedTypes); togglePreference(dataTypes.get(ModelType.AUTOFILL)); - togglePreference(dataTypes.get(ModelType.PASSWORD)); + togglePreference(dataTypes.get(ModelType.PASSWORDS)); // Nothing should have changed before the fragment closes. assertDataTypesAre(expectedTypes); closeFragment(fragment); expectedTypes.remove(ModelType.AUTOFILL); - expectedTypes.remove(ModelType.PASSWORD); + expectedTypes.remove(ModelType.PASSWORDS); assertDataTypesAre(expectedTypes); } @@ -436,11 +438,11 @@ public class SyncCustomizationFragmentTest extends SyncTestBase { SyncCustomizationFragment.PREFERENCE_SYNC_EVERYTHING); } - private Map getDataTypes(SyncCustomizationFragment fragment) { - Map dataTypes = - new HashMap(); - for (Map.Entry uiDataType : UI_DATATYPES.entrySet()) { - ModelType modelType = uiDataType.getKey(); + private Map getDataTypes(SyncCustomizationFragment fragment) { + Map dataTypes = + new HashMap(); + for (Map.Entry uiDataType : UI_DATATYPES.entrySet()) { + Integer modelType = uiDataType.getKey(); String prefId = uiDataType.getValue(); dataTypes.put(modelType, (CheckBoxPreference) fragment.findPreference(prefId)); } @@ -506,16 +508,16 @@ public class SyncCustomizationFragmentTest extends SyncTestBase { getManageData(fragment).isEnabled()); } - private void assertDataTypesAre(final Set enabledDataTypes) { - final Set disabledDataTypes = EnumSet.copyOf(UI_DATATYPES.keySet()); + private void assertDataTypesAre(final Set enabledDataTypes) { + final Set disabledDataTypes = new HashSet(UI_DATATYPES.keySet()); disabledDataTypes.removeAll(enabledDataTypes); ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - Set actualDataTypes = mProfileSyncService.getPreferredDataTypes(); + Set actualDataTypes = mProfileSyncService.getPreferredDataTypes(); assertTrue(actualDataTypes.containsAll(enabledDataTypes)); // There is no Set.containsNone(), sadly. - for (ModelType disabledDataType : disabledDataTypes) { + for (Integer disabledDataType : disabledDataTypes) { assertFalse(actualDataTypes.contains(disabledDataType)); } } diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java index f967b31ca2ff..710a28343ddc 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java @@ -16,7 +16,6 @@ import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.shell.ChromeShellTestBase; import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; import org.chromium.sync.AndroidSyncSettings; -import org.chromium.sync.internal_api.pub.base.ModelType; import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.sync.signin.ChromeSigninController; import org.chromium.sync.test.util.MockAccountManager; @@ -187,11 +186,11 @@ public class SyncTestBase extends ChromeShellTestBase { }); } - protected void disableDataType(final ModelType modelType) { + protected void disableDataType(final int modelType) { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - Set preferredTypes = mProfileSyncService.getPreferredDataTypes(); + Set preferredTypes = mProfileSyncService.getPreferredDataTypes(); preferredTypes.remove(modelType); mProfileSyncService.setPreferredDataTypes(false, preferredTypes); } diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java index 11a04ab8921b..abad5bb7703e 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/TypedUrlsTest.java @@ -13,7 +13,7 @@ import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.LoadUrlParams; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; import org.chromium.sync.protocol.EntitySpecifics; import org.chromium.sync.protocol.SyncEnums; import org.chromium.sync.protocol.TypedUrlSpecifics; @@ -138,7 +138,7 @@ public class TypedUrlsTest extends SyncTestBase { private void assertServerTypedUrlCountWithName(int count, String name) { assertTrue("Expected " + count + " server typed URLs with name " + name + ".", mFakeServerHelper.verifyEntityCountByTypeAndName( - count, ModelType.TYPED_URL, name)); + count, ModelType.TYPED_URLS, name)); } private void waitForClientTypedUrlCount(final int count) throws InterruptedException { @@ -162,7 +162,7 @@ public class TypedUrlsTest extends SyncTestBase { public boolean isSatisfied() { try { return mFakeServerHelper.verifyEntityCountByTypeAndName( - count, ModelType.TYPED_URL, name); + count, ModelType.TYPED_URLS, name); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/chrome/browser/sync/profile_sync_service_android.cc b/chrome/browser/sync/profile_sync_service_android.cc index 711452da6abc..b08d61e9d3be 100644 --- a/chrome/browser/sync/profile_sync_service_android.cc +++ b/chrome/browser/sync/profile_sync_service_android.cc @@ -5,6 +5,7 @@ #include "chrome/browser/sync/profile_sync_service_android.h" #include "base/android/jni_android.h" +#include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "base/bind.h" #include "base/i18n/time_formatting.h" @@ -44,33 +45,6 @@ using content::BrowserThread; namespace { -// This enum contains the list of sync ModelTypes that Android can register for -// invalidations for. -// -// A Java counterpart will be generated for this enum. -// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.sync -enum ModelTypeSelection { - AUTOFILL = 1 << 0, - BOOKMARK = 1 << 1, - PASSWORD = 1 << 2, - SESSION = 1 << 3, - TYPED_URL = 1 << 4, - AUTOFILL_PROFILE = 1 << 5, - HISTORY_DELETE_DIRECTIVE = 1 << 6, - PROXY_TABS = 1 << 7, - FAVICON_IMAGE = 1 << 8, - FAVICON_TRACKING = 1 << 9, - NIGORI = 1 << 10, - DEVICE_INFO = 1 << 11, - EXPERIMENTS = 1 << 12, - SUPERVISED_USER_SETTING = 1 << 13, - SUPERVISED_USER_WHITELIST = 1 << 14, - AUTOFILL_WALLET = 1 << 15, - AUTOFILL_WALLET_METADATA = 1 << 16, - PREFERENCE = 1 << 17, - PRIORITY_PREFERENCE = 1 << 18, -}; - // Native callback for the JNI GetAllNodes method. When // ProfileSyncService::GetAllNodes completes, this method is called and the // results are sent to the Java callback. @@ -358,40 +332,32 @@ jboolean ProfileSyncServiceAndroid::IsSyncKeystoreMigrationDone( return is_status_valid && !status.keystore_migration_time.is_null(); } -jlong ProfileSyncServiceAndroid::GetActiveDataTypes( +ScopedJavaLocalRef ProfileSyncServiceAndroid::GetActiveDataTypes( JNIEnv* env, jobject obj) { syncer::ModelTypeSet types = sync_service_->GetActiveDataTypes(); types.PutAll(syncer::ControlTypes()); - return ModelTypeSetToSelection(types); + return ModelTypeSetToJavaIntArray(env, types); } -jlong ProfileSyncServiceAndroid::GetPreferredDataTypes( +ScopedJavaLocalRef ProfileSyncServiceAndroid::GetPreferredDataTypes( JNIEnv* env, jobject obj) { syncer::ModelTypeSet types = sync_service_->GetPreferredDataTypes(); types.PutAll(syncer::ControlTypes()); - return ModelTypeSetToSelection(types); + return ModelTypeSetToJavaIntArray(env, types); } void ProfileSyncServiceAndroid::SetPreferredDataTypes( JNIEnv* env, jobject obj, jboolean sync_everything, - jlong model_type_selection) { + jintArray model_type_array) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + std::vector types_vector; + base::android::JavaIntArrayToIntVector(env, model_type_array, &types_vector); syncer::ModelTypeSet types; - // Note: only user selectable types should be included here. - if (model_type_selection & AUTOFILL) - types.Put(syncer::AUTOFILL); - if (model_type_selection & BOOKMARK) - types.Put(syncer::BOOKMARKS); - if (model_type_selection & PASSWORD) - types.Put(syncer::PASSWORDS); - if (model_type_selection & PROXY_TABS) - types.Put(syncer::PROXY_TABS); - if (model_type_selection & TYPED_URL) - types.Put(syncer::TYPED_URLS); - if (model_type_selection & PREFERENCE) - types.Put(syncer::PREFERENCES); - DCHECK(syncer::UserSelectableTypes().HasAll(types)); + for (size_t i = 0; i < types_vector.size(); i++) { + types.Put(static_cast(types_vector[i])); + } + types.RetainAll(syncer::UserSelectableTypes()); sync_service_->OnUserChoseDatatypes(sync_everything, types); } @@ -474,76 +440,15 @@ void ProfileSyncServiceAndroid::OverrideNetworkResourcesForTest( } // static -jlong ProfileSyncServiceAndroid::ModelTypeSetToSelection( +ScopedJavaLocalRef +ProfileSyncServiceAndroid::ModelTypeSetToJavaIntArray( + JNIEnv* env, syncer::ModelTypeSet types) { - jlong model_type_selection = 0; - if (types.Has(syncer::BOOKMARKS)) { - model_type_selection |= BOOKMARK; - } - if (types.Has(syncer::AUTOFILL)) { - model_type_selection |= AUTOFILL; - } - if (types.Has(syncer::AUTOFILL_PROFILE)) { - model_type_selection |= AUTOFILL_PROFILE; - } - if (types.Has(syncer::AUTOFILL_WALLET_DATA)) { - model_type_selection |= AUTOFILL_WALLET; - } - if (types.Has(syncer::AUTOFILL_WALLET_METADATA)) { - model_type_selection |= AUTOFILL_WALLET_METADATA; - } - if (types.Has(syncer::PASSWORDS)) { - model_type_selection |= PASSWORD; - } - if (types.Has(syncer::PREFERENCES)) { - model_type_selection |= PREFERENCE; - } - if (types.Has(syncer::PRIORITY_PREFERENCES)) { - model_type_selection |= PRIORITY_PREFERENCE; - } - if (types.Has(syncer::TYPED_URLS)) { - model_type_selection |= TYPED_URL; - } - if (types.Has(syncer::SESSIONS)) { - model_type_selection |= SESSION; + std::vector type_vector; + for (syncer::ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { + type_vector.push_back(it.Get()); } - if (types.Has(syncer::HISTORY_DELETE_DIRECTIVES)) { - model_type_selection |= HISTORY_DELETE_DIRECTIVE; - } - if (types.Has(syncer::PROXY_TABS)) { - model_type_selection |= PROXY_TABS; - } - if (types.Has(syncer::FAVICON_IMAGES)) { - model_type_selection |= FAVICON_IMAGE; - } - if (types.Has(syncer::FAVICON_TRACKING)) { - model_type_selection |= FAVICON_TRACKING; - } - if (types.Has(syncer::DEVICE_INFO)) { - model_type_selection |= DEVICE_INFO; - } - if (types.Has(syncer::NIGORI)) { - model_type_selection |= NIGORI; - } - if (types.Has(syncer::EXPERIMENTS)) { - model_type_selection |= EXPERIMENTS; - } - if (types.Has(syncer::SUPERVISED_USER_SETTINGS)) { - model_type_selection |= SUPERVISED_USER_SETTING; - } - if (types.Has(syncer::SUPERVISED_USER_WHITELISTS)) { - model_type_selection |= SUPERVISED_USER_WHITELIST; - } - return model_type_selection; -} - -// static -std::string ProfileSyncServiceAndroid::ModelTypeSelectionToStringForTest( - jlong model_type_selection) { - ScopedJavaLocalRef string = - Java_ProfileSyncService_modelTypeSelectionToStringForTest( - AttachCurrentThread(), model_type_selection); - return ConvertJavaStringToUTF8(string); + return base::android::ToJavaIntArray(env, type_vector); } // static diff --git a/chrome/browser/sync/profile_sync_service_android.h b/chrome/browser/sync/profile_sync_service_android.h index 3bb270e6eed5..6f85932c2cb9 100644 --- a/chrome/browser/sync/profile_sync_service_android.h +++ b/chrome/browser/sync/profile_sync_service_android.h @@ -138,13 +138,16 @@ class ProfileSyncServiceAndroid : public sync_driver::SyncServiceObserver { // synced. Note that control types are always included here. // Returns a bit map of the values from // profile_sync_service_android.cc. - jlong GetActiveDataTypes(JNIEnv* env, jobject obj); + base::android::ScopedJavaLocalRef GetActiveDataTypes(JNIEnv* env, + jobject obj); // Get the set of preferred data types. These are the types that the user // has requested be synced. // Returns a bit map of the values from // profile_sync_service_android.cc. - jlong GetPreferredDataTypes(JNIEnv* env, jobject obj); + base::android::ScopedJavaLocalRef GetPreferredDataTypes( + JNIEnv* env, + jobject obj); // Enables the passed data types. // If |sync_everything| is true, then all data types are enabled and the @@ -155,7 +158,7 @@ class ProfileSyncServiceAndroid : public sync_driver::SyncServiceObserver { void SetPreferredDataTypes(JNIEnv* env, jobject obj, jboolean sync_everything, - jlong model_type_selection); + jintArray model_type_selection); // Tells sync that we're currently configuring so no data types should be // downloaded yet. @@ -210,12 +213,8 @@ class ProfileSyncServiceAndroid : public sync_driver::SyncServiceObserver { jlong network_resources); // Public for tests. - static jlong ModelTypeSetToSelection(syncer::ModelTypeSet model_types); - - // Converts a bitmap of model types to a set of Java ModelTypes, and returns - // their string descriptions separated by commas. - static std::string ModelTypeSelectionToStringForTest( - jlong model_type_selection); + static base::android::ScopedJavaLocalRef + ModelTypeSetToJavaIntArray(JNIEnv* env, syncer::ModelTypeSet model_types); static ProfileSyncServiceAndroid* GetProfileSyncServiceAndroid(); diff --git a/chrome/browser/sync/profile_sync_service_android_unittest.cc b/chrome/browser/sync/profile_sync_service_android_unittest.cc index 0377f126006b..150cd390d95e 100644 --- a/chrome/browser/sync/profile_sync_service_android_unittest.cc +++ b/chrome/browser/sync/profile_sync_service_android_unittest.cc @@ -20,19 +20,6 @@ #include "sync/internal_api/public/base/model_type.h" #include "testing/gtest/include/gtest/gtest.h" -namespace { - -int NumberOfSetBits(jlong bitmask) { - int num = 0; - while (bitmask > 0) { - num += (bitmask & 1); - bitmask >>= 1; - } - return num; -} - -} // namespace - class ProfileSyncServiceAndroidTest : public testing::Test { public: ProfileSyncServiceAndroidTest() @@ -77,27 +64,3 @@ class ProfileSyncServiceAndroidTest : public testing::Test { TestingProfile profile_; scoped_ptr sync_service_; }; - -TEST_F(ProfileSyncServiceAndroidTest, ModelTypesToInvalidationNames) { - syncer::ModelTypeSet model_types = GetRegisteredDataTypes(); - - jlong model_type_selection = - ProfileSyncServiceAndroid::ModelTypeSetToSelection(model_types); - // The number of set bits in the model type bitmask should be equal to the - // number of model types. - EXPECT_EQ(static_cast(model_types.Size()), - NumberOfSetBits(model_type_selection)); - - std::vector invalidation_names; - for (syncer::ModelTypeSet::Iterator it = model_types.First(); it.Good(); - it.Inc()) { - std::string notification_type; - if (syncer::RealModelTypeToNotificationType(it.Get(), ¬ification_type)) - invalidation_names.push_back(notification_type); - } - - std::sort(invalidation_names.begin(), invalidation_names.end()); - EXPECT_EQ(base::JoinString(invalidation_names, ", "), - ProfileSyncServiceAndroid::ModelTypeSelectionToStringForTest( - model_type_selection)); -} diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index f23ed8f38a53..c3e21bc223df 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -581,7 +581,6 @@ 'content_setting_java', 'content_settings_type_java', 'page_info_connection_type_java', - 'profile_sync_service_model_type_selection_java', 'resource_id_java', 'tab_load_status_java', 'shortcut_source_java', diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index f3d94e6daa9b..0e80012a3573 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -3982,15 +3982,6 @@ }, { # GN: //chrome/android:chrome_android_java_enums_srcjar - 'target_name': 'profile_sync_service_model_type_selection_java', - 'type': 'none', - 'variables': { - 'source_file': 'browser/sync/profile_sync_service_android.cc', - }, - 'includes': [ '../build/android/java_cpp_enum.gypi' ], - }, - { - # GN: //chrome/android:chrome_android_java_enums_srcjar 'target_name': 'connection_security_security_levels_java', 'type': 'none', 'variables': { diff --git a/components/invalidation.gypi b/components/invalidation.gypi index 4e361f845e76..affc2b39fc2c 100644 --- a/components/invalidation.gypi +++ b/components/invalidation.gypi @@ -224,6 +224,7 @@ 'dependencies': [ 'invalidation_java', '../base/base.gyp:base_java_test_support', + '../content/content_shell_and_tests.gyp:content_java_test_support', ], 'variables': { 'java_in_dir': 'invalidation/impl/android/javatests', diff --git a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java index 852904b9c50f..50e04d871870 100644 --- a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java +++ b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java @@ -22,8 +22,8 @@ import org.chromium.base.ApplicationStatus; import org.chromium.base.CollectionUtil; import org.chromium.base.VisibleForTesting; import org.chromium.sync.AndroidSyncSettings; +import org.chromium.sync.ModelTypeHelper; import org.chromium.sync.SyncConstants; -import org.chromium.sync.internal_api.pub.base.ModelType; import org.chromium.sync.notifier.InvalidationClientNameProvider; import org.chromium.sync.notifier.InvalidationIntentProtocol; import org.chromium.sync.notifier.InvalidationPreferences; @@ -299,7 +299,7 @@ public class InvalidationClientService extends AndroidListener { private Set readSyncRegistrationsFromPrefs() { Set savedTypes = new InvalidationPreferences(this).getSavedSyncedTypes(); if (savedTypes == null) return Collections.emptySet(); - else return ModelType.syncTypesToObjectIds(savedTypes); + return ModelTypeHelper.notificationTypesToObjectIds(savedTypes); } /** @@ -309,7 +309,7 @@ public class InvalidationClientService extends AndroidListener { private Set readNonSyncRegistrationsFromPrefs() { Set objectIds = new InvalidationPreferences(this).getSavedObjectIds(); if (objectIds == null) return Collections.emptySet(); - else return objectIds; + return objectIds; } /** @@ -380,7 +380,8 @@ public class InvalidationClientService extends AndroidListener { // When computing the desired set of object ids, if only sync types were provided, then // keep the existing non-sync types, and vice-versa. Set desiredSyncRegistrations = syncTypes != null - ? ModelType.syncTypesToObjectIds(syncTypes) : existingSyncRegistrations; + ? ModelTypeHelper.notificationTypesToObjectIds(syncTypes) + : existingSyncRegistrations; Set desiredNonSyncRegistrations = objectIds != null ? objectIds : existingNonSyncRegistrations; Set desiredRegistrations = joinRegistrations(desiredNonSyncRegistrations, diff --git a/components/invalidation/impl/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java b/components/invalidation/impl/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java index a868f639ab06..bf5d075bac19 100644 --- a/components/invalidation/impl/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java +++ b/components/invalidation/impl/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java @@ -17,9 +17,12 @@ import com.google.ipc.invalidation.external.client.types.Invalidation; import com.google.ipc.invalidation.external.client.types.ObjectId; import org.chromium.base.CollectionUtil; +import org.chromium.base.library_loader.LibraryLoader; +import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.test.util.AdvancedMockContext; import org.chromium.base.test.util.Feature; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelType; +import org.chromium.sync.ModelTypeHelper; import org.chromium.sync.notifier.InvalidationIntentProtocol; import org.chromium.sync.notifier.InvalidationPreferences; import org.chromium.sync.notifier.InvalidationPreferences.EditContext; @@ -59,6 +62,7 @@ public class InvalidationClientServiceTest extends return new ComponentName(this, InvalidationClientServiceTest.class); } }); + LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized(getContext()); setupService(); } @@ -84,10 +88,8 @@ public class InvalidationClientServiceTest extends // Empty existing and desired registrations should yield empty operation sets. InvalidationClientService.computeRegistrationOps( - ModelType.modelTypesToObjectIds( - CollectionUtil.newHashSet(ModelType.BOOKMARK, ModelType.SESSION)), - ModelType.modelTypesToObjectIds( - CollectionUtil.newHashSet(ModelType.BOOKMARK, ModelType.SESSION)), + toObjectIdSet(ModelType.BOOKMARKS, ModelType.SESSIONS), + toObjectIdSet(ModelType.BOOKMARKS, ModelType.SESSIONS), regAccumulator, unregAccumulator); assertEquals(0, regAccumulator.size()); assertEquals(0, unregAccumulator.size()); @@ -100,31 +102,26 @@ public class InvalidationClientServiceTest extends // Empty existing and non-empty desired registrations should yield desired registrations // as the registration operations to do and no unregistrations. - Set desiredTypes = - CollectionUtil.newHashSet( - ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId()); + Set desiredTypes = toObjectIdSet(ModelType.BOOKMARKS, ModelType.SESSIONS); InvalidationClientService.computeRegistrationOps( new HashSet(), desiredTypes, regAccumulator, unregAccumulator); assertEquals( - CollectionUtil.newHashSet( - ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId()), + toObjectIdSet(ModelType.BOOKMARKS, ModelType.SESSIONS), new HashSet(regAccumulator)); assertEquals(0, unregAccumulator.size()); regAccumulator.clear(); // Unequal existing and desired registrations should yield both registrations and - // unregistrations. We should unregister TYPED_URL and register BOOKMARK, keeping SESSION. + // unregistrations. We should unregister TYPED_URLS and register BOOKMARKS, keeping + // SESSIONS. InvalidationClientService.computeRegistrationOps( - CollectionUtil.newHashSet( - ModelType.SESSION.toObjectId(), ModelType.TYPED_URL.toObjectId()), - CollectionUtil.newHashSet( - ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId()), + toObjectIdSet(ModelType.SESSIONS, ModelType.TYPED_URLS), + toObjectIdSet(ModelType.BOOKMARKS, ModelType.SESSIONS), regAccumulator, unregAccumulator); - assertEquals(CollectionUtil.newHashSet(ModelType.BOOKMARK.toObjectId()), regAccumulator); - assertEquals(CollectionUtil.newHashSet(ModelType.TYPED_URL.toObjectId()), - unregAccumulator); + assertEquals(toObjectIdSet(ModelType.BOOKMARKS), regAccumulator); + assertEquals(toObjectIdSet(ModelType.TYPED_URLS), unregAccumulator); regAccumulator.clear(); unregAccumulator.clear(); } @@ -154,7 +151,7 @@ public class InvalidationClientServiceTest extends // Verify registrations issued. assertEquals(CollectionUtil.newHashSet( - ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId(), objectId), + toObjectId(ModelType.BOOKMARKS), toObjectId(ModelType.SESSIONS), objectId), new HashSet(getService().mRegistrations.get(0))); } @@ -184,7 +181,7 @@ public class InvalidationClientServiceTest extends getService().reissueRegistrations(CLIENT_ID); assertEquals(1, getService().mRegistrations.size()); assertEquals(CollectionUtil.newHashSet( - ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId(), objectId), + toObjectId(ModelType.BOOKMARKS), toObjectId(ModelType.SESSIONS), objectId), new HashSet(getService().mRegistrations.get(0))); } @@ -210,11 +207,11 @@ public class InvalidationClientServiceTest extends assertTrue(invPrefs.commit(editContext)); // Cases 1 and 2: calls matching desired state cause no actions. - getService().informRegistrationStatus(CLIENT_ID, ModelType.SESSION.toObjectId(), + getService().informRegistrationStatus(CLIENT_ID, toObjectId(ModelType.SESSIONS), RegistrationState.REGISTERED); getService().informRegistrationStatus(CLIENT_ID, desiredObjectId, RegistrationState.REGISTERED); - getService().informRegistrationStatus(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), + getService().informRegistrationStatus(CLIENT_ID, toObjectId(ModelType.BOOKMARKS), RegistrationState.UNREGISTERED); getService().informRegistrationStatus(CLIENT_ID, undesiredObjectId, RegistrationState.UNREGISTERED); @@ -222,25 +219,25 @@ public class InvalidationClientServiceTest extends assertTrue(getService().mUnregistrations.isEmpty()); // Case 3: registration of undesired object triggers an unregistration. - getService().informRegistrationStatus(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), + getService().informRegistrationStatus(CLIENT_ID, toObjectId(ModelType.BOOKMARKS), RegistrationState.REGISTERED); getService().informRegistrationStatus(CLIENT_ID, undesiredObjectId, RegistrationState.REGISTERED); assertEquals(2, getService().mUnregistrations.size()); assertEquals(0, getService().mRegistrations.size()); - assertEquals(CollectionUtil.newArrayList(ModelType.BOOKMARK.toObjectId()), + assertEquals(CollectionUtil.newArrayList(toObjectId(ModelType.BOOKMARKS)), getService().mUnregistrations.get(0)); assertEquals(CollectionUtil.newArrayList(undesiredObjectId), getService().mUnregistrations.get(1)); // Case 4: unregistration of a desired object triggers a registration. - getService().informRegistrationStatus(CLIENT_ID, ModelType.SESSION.toObjectId(), + getService().informRegistrationStatus(CLIENT_ID, toObjectId(ModelType.SESSIONS), RegistrationState.UNREGISTERED); getService().informRegistrationStatus(CLIENT_ID, desiredObjectId, RegistrationState.UNREGISTERED); assertEquals(2, getService().mUnregistrations.size()); assertEquals(2, getService().mRegistrations.size()); - assertEquals(CollectionUtil.newArrayList(ModelType.SESSION.toObjectId()), + assertEquals(CollectionUtil.newArrayList(toObjectId(ModelType.SESSIONS)), getService().mRegistrations.get(0)); assertEquals(CollectionUtil.newArrayList(desiredObjectId), getService().mRegistrations.get(1)); @@ -271,9 +268,9 @@ public class InvalidationClientServiceTest extends assertTrue(invPrefs.commit(editContext)); // Cases 2 and 4: permanent registration failures never cause calls to be made. - getService().informRegistrationFailure(CLIENT_ID, ModelType.SESSION.toObjectId(), false, + getService().informRegistrationFailure(CLIENT_ID, toObjectId(ModelType.SESSIONS), false, ""); - getService().informRegistrationFailure(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), false, + getService().informRegistrationFailure(CLIENT_ID, toObjectId(ModelType.BOOKMARKS), false, ""); getService().informRegistrationFailure(CLIENT_ID, desiredObjectId, false, ""); getService().informRegistrationFailure(CLIENT_ID, undesiredObjectId, false, ""); @@ -281,22 +278,22 @@ public class InvalidationClientServiceTest extends assertTrue(getService().mUnregistrations.isEmpty()); // Case 1: transient failure of a desired registration results in re-registration. - getService().informRegistrationFailure(CLIENT_ID, ModelType.SESSION.toObjectId(), true, ""); + getService().informRegistrationFailure(CLIENT_ID, toObjectId(ModelType.SESSIONS), true, ""); getService().informRegistrationFailure(CLIENT_ID, desiredObjectId, true, ""); assertEquals(2, getService().mRegistrations.size()); assertTrue(getService().mUnregistrations.isEmpty()); - assertEquals(CollectionUtil.newArrayList(ModelType.SESSION.toObjectId()), + assertEquals(CollectionUtil.newArrayList(toObjectId(ModelType.SESSIONS)), getService().mRegistrations.get(0)); assertEquals(CollectionUtil.newArrayList(desiredObjectId), getService().mRegistrations.get(1)); // Case 3: transient failure of an undesired registration results in unregistration. - getService().informRegistrationFailure(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), true, + getService().informRegistrationFailure(CLIENT_ID, toObjectId(ModelType.BOOKMARKS), true, ""); getService().informRegistrationFailure(CLIENT_ID, undesiredObjectId, true, ""); assertEquals(2, getService().mRegistrations.size()); assertEquals(2, getService().mUnregistrations.size()); - assertEquals(CollectionUtil.newArrayList(ModelType.BOOKMARK.toObjectId()), + assertEquals(CollectionUtil.newArrayList(toObjectId(ModelType.BOOKMARKS)), getService().mUnregistrations.get(0)); assertEquals(CollectionUtil.newArrayList(undesiredObjectId), getService().mUnregistrations.get(1)); @@ -524,8 +521,8 @@ public class InvalidationClientServiceTest extends getService().onCreate(); // Send register Intent. - Set desiredRegistrations = CollectionUtil.newHashSet( - ModelType.BOOKMARK, ModelType.SESSION); + Set desiredRegistrations = CollectionUtil.newHashSet( + ModelType.BOOKMARKS, ModelType.SESSIONS); Account account = AccountManagerHelper.createAccountFromName("test@example.com"); Intent registrationIntent = createRegisterIntent(account, desiredRegistrations); getService().onHandleIntent(registrationIntent); @@ -534,17 +531,17 @@ public class InvalidationClientServiceTest extends assertTrue(InvalidationClientService.getIsClientStartedForTest()); InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); assertEquals(account, invPrefs.getSavedSyncedAccount()); - assertEquals(ModelType.modelTypesToSyncTypesForTest(desiredRegistrations), + assertEquals(modelTypesToNotificationTypes(desiredRegistrations), invPrefs.getSavedSyncedTypes()); assertNull(invPrefs.getSavedObjectIds()); assertEquals(1, mStartServiceIntents.size()); assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); // Send a registration-change intent with different types to register for. - desiredRegistrations = CollectionUtil.newHashSet(ModelType.PASSWORD); + desiredRegistrations = CollectionUtil.newHashSet(ModelType.PASSWORDS); getService().onHandleIntent(createRegisterIntent(account, desiredRegistrations)); assertEquals(account, invPrefs.getSavedSyncedAccount()); - assertEquals(ModelType.modelTypesToSyncTypesForTest(desiredRegistrations), + assertEquals(modelTypesToNotificationTypes(desiredRegistrations), invPrefs.getSavedSyncedTypes()); assertEquals(1, mStartServiceIntents.size()); @@ -568,10 +565,10 @@ public class InvalidationClientServiceTest extends * @param expectedObjectIds The additional object ids expected to be registered. * @param isReady Whether the client is ready to register/unregister. */ - private boolean expectedObjectIdsRegistered(Set expectedTypes, + private boolean expectedObjectIdsRegistered(Set expectedTypes, Set expectedObjectIds, boolean isReady) { // Get synced types saved to preferences. - Set expectedSyncTypes = ModelType.modelTypesToSyncTypesForTest(expectedTypes); + Set expectedSyncTypes = modelTypesToNotificationTypes(expectedTypes); InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); Set actualSyncTypes = invPrefs.getSavedSyncedTypes(); if (actualSyncTypes == null) { @@ -587,7 +584,7 @@ public class InvalidationClientServiceTest extends // Get expected registered object ids. Set expectedRegisteredIds = new HashSet(); if (isReady) { - expectedRegisteredIds.addAll(ModelType.modelTypesToObjectIds(expectedTypes)); + expectedRegisteredIds.addAll(modelTypesToObjectIds(expectedTypes)); expectedRegisteredIds.addAll(expectedObjectIds); } @@ -609,7 +606,7 @@ public class InvalidationClientServiceTest extends Account account = AccountManagerHelper.createAccountFromName("test@example.com"); Set objectIds = new HashSet(); - Set types = new HashSet(); + Set types = new HashSet(); // Register for some object ids. objectIds.add(ObjectId.newInstance(1, "obj1".getBytes())); @@ -620,8 +617,8 @@ public class InvalidationClientServiceTest extends assertTrue(expectedObjectIdsRegistered(types, objectIds, false /* isReady */)); // Register for some types. - types.add(ModelType.BOOKMARK); - types.add(ModelType.SESSION); + types.add(ModelType.BOOKMARKS); + types.add(ModelType.SESSIONS); registrationIntent = createRegisterIntent(account, types); getService().onHandleIntent(registrationIntent); assertTrue(expectedObjectIdsRegistered(types, objectIds, false /* isReady */)); @@ -638,7 +635,7 @@ public class InvalidationClientServiceTest extends assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); // Change type registration with object ids registered. - types.remove(ModelType.BOOKMARK); + types.remove(ModelType.BOOKMARKS); registrationIntent = createRegisterIntent(account, types); getService().onHandleIntent(registrationIntent); assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); @@ -663,8 +660,8 @@ public class InvalidationClientServiceTest extends assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); // Change type registration with no object ids registered. - types.add(ModelType.BOOKMARK); - types.add(ModelType.PASSWORD); + types.add(ModelType.BOOKMARKS); + types.add(ModelType.PASSWORDS); registrationIntent = createRegisterIntent(account, types); getService().onHandleIntent(registrationIntent); assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); @@ -679,7 +676,7 @@ public class InvalidationClientServiceTest extends // Send register Intent. Account account = AccountManagerHelper.createAccountFromName("test@example.com"); Intent registrationIntent = createRegisterIntent( - account, CollectionUtil.newHashSet(ModelType.PROXY_TABS, ModelType.SESSION)); + account, CollectionUtil.newHashSet(ModelType.PROXY_TABS, ModelType.SESSIONS)); getService().onHandleIntent(registrationIntent); // Verify client started and state written. @@ -697,7 +694,7 @@ public class InvalidationClientServiceTest extends // Ensure registrations are correct. Set expectedRegistrations = - ModelType.modelTypesToObjectIds(CollectionUtil.newHashSet(ModelType.SESSION)); + modelTypesToObjectIds(CollectionUtil.newHashSet(ModelType.SESSIONS)); assertEquals(expectedRegistrations, new HashSet(getService().mRegistrations.get(0))); } @@ -710,7 +707,7 @@ public class InvalidationClientServiceTest extends // Send register Intent with no desired types. Account account = AccountManagerHelper.createAccountFromName("test@example.com"); - Intent registrationIntent = createRegisterIntent(account, new HashSet()); + Intent registrationIntent = createRegisterIntent(account, new HashSet()); getService().onHandleIntent(registrationIntent); // Verify client started and state written. @@ -727,13 +724,13 @@ public class InvalidationClientServiceTest extends // Send register Intent for SESSIONS and PROXY_TABS in an already ready client. registrationIntent = createRegisterIntent(account, - CollectionUtil.newHashSet(ModelType.PROXY_TABS, ModelType.SESSION)); + CollectionUtil.newHashSet(ModelType.PROXY_TABS, ModelType.SESSIONS)); getService().onHandleIntent(registrationIntent); // Ensure that PROXY_TABS registration request is ignored. assertEquals(1, getService().mRegistrations.size()); Set expectedTypes = - ModelType.modelTypesToObjectIds(CollectionUtil.newHashSet(ModelType.SESSION)); + modelTypesToObjectIds(CollectionUtil.newHashSet(ModelType.SESSIONS)); assertEquals(expectedTypes, new HashSet(getService().mRegistrations.get(0))); } @@ -748,8 +745,8 @@ public class InvalidationClientServiceTest extends // Send register Intent. Account account = AccountManagerHelper.createAccountFromName("test@example.com"); - Set desiredRegistrations = CollectionUtil.newHashSet( - ModelType.BOOKMARK, ModelType.SESSION); + Set desiredRegistrations = CollectionUtil.newHashSet( + ModelType.BOOKMARKS, ModelType.SESSIONS); Intent registrationIntent = createRegisterIntent(account, desiredRegistrations); getService().onHandleIntent(registrationIntent); @@ -757,7 +754,7 @@ public class InvalidationClientServiceTest extends assertFalse(InvalidationClientService.getIsClientStartedForTest()); InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); assertEquals(account, invPrefs.getSavedSyncedAccount()); - assertEquals(ModelType.modelTypesToSyncTypesForTest(desiredRegistrations), + assertEquals(modelTypesToNotificationTypes(desiredRegistrations), invPrefs.getSavedSyncedTypes()); assertEquals(0, mStartServiceIntents.size()); } @@ -775,9 +772,9 @@ public class InvalidationClientServiceTest extends // Send register Intent. Verify client started but no registrations issued. Account account = AccountManagerHelper.createAccountFromName("test@example.com"); - Set desiredRegistrations = CollectionUtil.newHashSet( - ModelType.BOOKMARK, ModelType.SESSION); - Set desiredObjectIds = ModelType.modelTypesToObjectIds(desiredRegistrations); + Set desiredRegistrations = CollectionUtil.newHashSet( + ModelType.BOOKMARKS, ModelType.SESSIONS); + Set desiredObjectIds = modelTypesToObjectIds(desiredRegistrations); Intent registrationIntent = createRegisterIntent(account, desiredRegistrations); getService().onHandleIntent(registrationIntent); @@ -785,7 +782,7 @@ public class InvalidationClientServiceTest extends assertEquals(1, mStartServiceIntents.size()); assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); - assertEquals(ModelType.modelTypesToSyncTypesForTest(desiredRegistrations), + assertEquals(modelTypesToNotificationTypes(desiredRegistrations), invPrefs.getSavedSyncedTypes()); assertEquals(desiredObjectIds, getService().readRegistrationsFromPrefs()); @@ -828,6 +825,34 @@ public class InvalidationClientServiceTest extends // Bug: https://code.google.com/p/chromium/issues/detail?id=172398 } + private ObjectId toObjectId(int modelType) { + return ModelTypeHelper.toObjectId(modelType); + } + + private Set toObjectIdSet(int... modelTypes) { + Set objectIds = new HashSet(modelTypes.length); + for (int i = 0; i < modelTypes.length; i++) { + objectIds.add(toObjectId(modelTypes[i])); + } + return objectIds; + } + + private Set modelTypesToObjectIds(Set modelTypes) { + Set objectIds = new HashSet(); + for (Integer modelType : modelTypes) { + objectIds.add(toObjectId(modelType)); + } + return objectIds; + } + + private Set modelTypesToNotificationTypes(Set modelTypes) { + Set strings = new HashSet(); + for (Integer modelType : modelTypes) { + strings.add(ModelTypeHelper.toNotificationType(modelType)); + } + return strings; + } + /** Creates an intent to start the InvalidationClientService. */ private Intent createStartIntent() { Intent intent = new Intent(); @@ -842,7 +867,7 @@ public class InvalidationClientServiceTest extends } /** Creates an intent to register some types with the InvalidationClientService. */ - private Intent createRegisterIntent(Account account, Set types) { + private Intent createRegisterIntent(Account account, Set types) { Intent intent = InvalidationIntentProtocol.createRegisterIntent(account, types); return intent; } diff --git a/sync/android/java/src/org/chromium/sync/ModelTypeHelper.java b/sync/android/java/src/org/chromium/sync/ModelTypeHelper.java index 3e053c296a10..dd86170724d4 100644 --- a/sync/android/java/src/org/chromium/sync/ModelTypeHelper.java +++ b/sync/android/java/src/org/chromium/sync/ModelTypeHelper.java @@ -24,6 +24,14 @@ import java.util.Set; */ @JNINamespace("syncer") public class ModelTypeHelper { + /** + * Implement this class to override the behavior of + * {@link ModelTypeHelper#toNotificationType()} for tests. + */ + public interface TestDelegate { + public String toNotificationType(int modelType); + } + private static final String TAG = "ModelTypeHelper"; private static final Object sLock = new Object(); @@ -32,6 +40,8 @@ public class ModelTypeHelper { ModelType.PROXY_TABS }; + private static TestDelegate sDelegate = null; + // Convenience sets for checking whether a type can have invalidations. Some ModelTypes // such as PROXY_TABS are not real types and can't be registered. Initializing these // once reduces toNotificationType() calls in the isInvalidationType() method. @@ -84,6 +94,8 @@ public class ModelTypeHelper { * @return the string representation of the model type constant. */ public static String toNotificationType(int modelType) { + if (sDelegate != null) return sDelegate.toNotificationType(modelType); + // Because PROXY_TABS isn't an invalidation type, it doesn't have a string from native, // but for backwards compatibility we need to keep its pref value the same as the old // ModelType enum name value. @@ -110,5 +122,10 @@ public class ModelTypeHelper { return objectIds; } + @VisibleForTesting + public static void setTestDelegate(TestDelegate delegate) { + sDelegate = delegate; + } + private static native String nativeModelTypeToNotificationType(int modelType); } diff --git a/sync/android/java/src/org/chromium/sync/internal_api/pub/base/ModelType.java b/sync/android/java/src/org/chromium/sync/internal_api/pub/base/ModelType.java deleted file mode 100644 index dc35ba65ef95..000000000000 --- a/sync/android/java/src/org/chromium/sync/internal_api/pub/base/ModelType.java +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.sync.internal_api.pub.base; - -import android.util.Log; - -import com.google.ipc.invalidation.external.client.types.ObjectId; -import com.google.protos.ipc.invalidation.Types; - -import org.chromium.base.VisibleForTesting; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -/** - * The model types that are synced in Chrome for Android. - */ -public enum ModelType { - /** - * An autofill object. - */ - AUTOFILL("AUTOFILL"), - /** - * An autofill profile object. - */ - AUTOFILL_PROFILE("AUTOFILL_PROFILE"), - /** - * A bookmark folder or a bookmark URL object. - */ - BOOKMARK("BOOKMARK"), - /** - * Flags to enable experimental features. - */ - EXPERIMENTS("EXPERIMENTS"), - /** - * An object representing a set of Nigori keys. - */ - NIGORI("NIGORI"), - /** - * A password entry. - */ - PASSWORD("PASSWORD"), - /** - * An object representing a preference. - */ - PREFERENCE("PREFERENCE"), - /** - * An object representing a priority preference. - */ - PRIORITY_PREFERENCE("PRIORITY_PREFERENCE"), - /** - * An object representing a browser session or tab. - */ - SESSION("SESSION"), - /** - * A typed_url folder or a typed_url object. - */ - TYPED_URL("TYPED_URL"), - /** - * A history delete directive object. - */ - HISTORY_DELETE_DIRECTIVE("HISTORY_DELETE_DIRECTIVE"), - /** - * A device info object. - */ - DEVICE_INFO("DEVICE_INFO"), - /** - * A proxy tabs object (placeholder for sessions). - */ - PROXY_TABS("NULL", true), - /** - * A favicon image object. - */ - FAVICON_IMAGE("FAVICON_IMAGE"), - /** - * A favicon tracking object. - */ - FAVICON_TRACKING("FAVICON_TRACKING"), - /** - * A supervised user setting object. The old name "managed user" is used for backwards - * compatibility. - */ - MANAGED_USER_SETTING("MANAGED_USER_SETTING"), - /** - * A supervised user whitelist object. - */ - MANAGED_USER_WHITELIST("MANAGED_USER_WHITELIST"), - /** - * An autofill wallet data object. - */ - AUTOFILL_WALLET("AUTOFILL_WALLET"), - /** - * Usage counts and last use dates for autofill wallet data objects. - */ - AUTOFILL_WALLET_METADATA("AUTOFILL_WALLET_METADATA"); - - private static final String TAG = "ModelType"; - - private final String mModelType; - - private final boolean mNonInvalidationType; - - ModelType(String modelType, boolean nonInvalidationType) { - assert nonInvalidationType || name().equals(modelType); - mModelType = modelType; - mNonInvalidationType = nonInvalidationType; - } - - ModelType(String modelType) { - this(modelType, false); - } - - private boolean isNonInvalidationType() { - return mNonInvalidationType; - } - - /** - * Returns the {@link ObjectId} representation of this {@link ModelType}. - * - * This should be used with caution, since it converts even {@link ModelType} instances with - * |mNonInvalidationType| set. For automatically stripping such {@link ModelType} entries out, - * use {@link ModelType#modelTypesToObjectIds(java.util.Set)} instead. - */ - @VisibleForTesting - public ObjectId toObjectId() { - return ObjectId.newInstance(Types.ObjectSource.CHROME_SYNC, mModelType.getBytes()); - } - - public static ModelType fromObjectId(ObjectId objectId) { - try { - return valueOf(new String(objectId.getName())); - } catch (IllegalArgumentException e) { - return null; - } - } - - /** - * Converts string representations of types to sync to {@link ModelType}s. - * Returns set of {@code ModelType} values for all elements of {@code syncTypes} for which - * {@link ModelType#valueOf(String)} successfully returns; other elements are dropped. - */ - public static Set syncTypesToModelTypes(Collection syncTypes) { - Set modelTypes = new HashSet(syncTypes.size()); - for (String syncType : syncTypes) { - try { - modelTypes.add(valueOf(syncType)); - } catch (IllegalArgumentException exception) { - // Drop invalid sync types. - Log.w(TAG, "Could not translate sync type to model type: " + syncType); - } - } - return modelTypes; - } - - /** - * Converts a set of sync types {@link String} to a set of {@link ObjectId}. - * - * This strips out any {@link ModelType} that is not an invalidation type. - */ - public static Set syncTypesToObjectIds(Collection syncTypes) { - return modelTypesToObjectIds(syncTypesToModelTypes(syncTypes)); - } - - /** - * Converts a set of {@link ModelType} to a set of {@link ObjectId}. - * - * This strips out any {@link ModelType} that is not an invalidation type. - */ - public static Set modelTypesToObjectIds(Set modelTypes) { - Set filteredModelTypes = filterOutNonInvalidationTypes(modelTypes); - Set objectIds = new HashSet(filteredModelTypes.size()); - for (ModelType modelType : filteredModelTypes) { - objectIds.add(modelType.toObjectId()); - } - return objectIds; - } - - /** Converts a set of {@link ModelType} to a set of string names. */ - @VisibleForTesting - public static Set modelTypesToSyncTypesForTest(Set modelTypes) { - Set objectIds = new HashSet(modelTypes.size()); - for (ModelType modelType : modelTypes) { - objectIds.add(modelType.toString()); - } - return objectIds; - } - - /** Filters out non-invalidation types from a set of {@link ModelType}. */ - @VisibleForTesting - public static Set filterOutNonInvalidationTypes(Set modelTypes) { - Set filteredTypes = new HashSet(modelTypes.size()); - for (ModelType modelType : modelTypes) { - if (!modelType.isNonInvalidationType()) { - filteredTypes.add(modelType); - } - } - return filteredTypes; - } - -} diff --git a/sync/android/java/src/org/chromium/sync/notifier/InvalidationIntentProtocol.java b/sync/android/java/src/org/chromium/sync/notifier/InvalidationIntentProtocol.java index e0692047c934..6f0af9421cb7 100644 --- a/sync/android/java/src/org/chromium/sync/notifier/InvalidationIntentProtocol.java +++ b/sync/android/java/src/org/chromium/sync/notifier/InvalidationIntentProtocol.java @@ -11,7 +11,7 @@ import com.google.ipc.invalidation.external.client.types.ObjectId; import com.google.protos.ipc.invalidation.Types; import org.chromium.base.CollectionUtil; -import org.chromium.sync.internal_api.pub.base.ModelType; +import org.chromium.sync.ModelTypeHelper; import java.util.ArrayList; import java.util.HashSet; @@ -59,12 +59,12 @@ public class InvalidationIntentProtocol { * Create an Intent that will start the invalidation listener service and * register for the specified types. */ - public static Intent createRegisterIntent(Account account, Set types) { + public static Intent createRegisterIntent(Account account, Set types) { Intent registerIntent = new Intent(ACTION_REGISTER); String[] selectedTypesArray = new String[types.size()]; int pos = 0; - for (ModelType type : types) { - selectedTypesArray[pos++] = type.name(); + for (Integer type : types) { + selectedTypesArray[pos++] = ModelTypeHelper.toNotificationType(type); } registerIntent.putStringArrayListExtra(EXTRA_REGISTERED_TYPES, CollectionUtil.newArrayList(selectedTypesArray)); diff --git a/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationPreferencesTest.java b/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationPreferencesTest.java index f8e841edbde0..4bcfd20f0844 100644 --- a/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationPreferencesTest.java +++ b/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationPreferencesTest.java @@ -14,10 +14,8 @@ import com.google.ipc.invalidation.external.client.types.ObjectId; import org.chromium.base.CollectionUtil; import org.chromium.base.test.util.AdvancedMockContext; import org.chromium.base.test.util.Feature; -import org.chromium.sync.internal_api.pub.base.ModelType; import java.util.Arrays; -import java.util.HashSet; import java.util.Set; /** @@ -36,20 +34,6 @@ public class InvalidationPreferencesTest extends InstrumentationTestCase { @SmallTest @Feature({"Sync"}) - public void testTranslateBasicSyncTypes() throws Exception { - /* - * Test plan: convert three strings to model types, one of which is invalid. Verify that - * the two valid strings are properly converted and that the invalid string is dropped. - */ - HashSet expectedTypes = CollectionUtil.newHashSet( - ModelType.BOOKMARK, ModelType.SESSION); - Set actualTypes = ModelType.syncTypesToModelTypes( - CollectionUtil.newHashSet("BOOKMARK", "SESSION", "0!!!INVALID")); - assertEquals(expectedTypes, actualTypes); - } - - @SmallTest - @Feature({"Sync"}) public void testReadMissingData() { /* * Test plan: read saved state from empty preferences. Verify that null is returned. @@ -97,4 +81,4 @@ public class InvalidationPreferencesTest extends InstrumentationTestCase { assertTrue(Arrays.equals( internalClientState, invPreferences.getInternalNotificationClientState())); } -} \ No newline at end of file +} diff --git a/sync/test/fake_server/android/fake_server_helper_android.cc b/sync/test/fake_server/android/fake_server_helper_android.cc index 40fcefd69a25..18539ff46ea6 100644 --- a/sync/test/fake_server/android/fake_server_helper_android.cc +++ b/sync/test/fake_server/android/fake_server_helper_android.cc @@ -64,14 +64,9 @@ jboolean FakeServerHelperAndroid::VerifyEntityCountByTypeAndName( jobject obj, jlong fake_server, jlong count, - jstring model_type_string, + jint model_type_int, jstring name) { - syncer::ModelType model_type; - if (!NotificationTypeToRealModelType(base::android::ConvertJavaStringToUTF8( - env, model_type_string), &model_type)) { - LOG(WARNING) << "Invalid ModelType string."; - return false; - } + syncer::ModelType model_type = static_cast(model_type_int); fake_server::FakeServer* fake_server_ptr = reinterpret_cast(fake_server); fake_server::FakeServerVerifier fake_server_verifier(fake_server_ptr); @@ -114,17 +109,11 @@ base::android::ScopedJavaLocalRef FakeServerHelperAndroid::GetSyncEntitiesByModelType(JNIEnv* env, jobject obj, jlong fake_server, - jstring model_type_string) { + jint model_type_int) { fake_server::FakeServer* fake_server_ptr = reinterpret_cast(fake_server); - syncer::ModelType model_type; - if (!NotificationTypeToRealModelType( - base::android::ConvertJavaStringToUTF8(env, model_type_string), - &model_type)) { - LOG(WARNING) << "Invalid ModelType string."; - NOTREACHED(); - } + syncer::ModelType model_type = static_cast(model_type_int); std::vector entities = fake_server_ptr->GetSyncEntitiesByModelType(model_type); diff --git a/sync/test/fake_server/android/fake_server_helper_android.h b/sync/test/fake_server/android/fake_server_helper_android.h index 98a628dedae2..a0418ed730d7 100644 --- a/sync/test/fake_server/android/fake_server_helper_android.h +++ b/sync/test/fake_server/android/fake_server_helper_android.h @@ -38,7 +38,7 @@ class FakeServerHelperAndroid { jobject obj, jlong fake_server, jlong count, - jstring model_type_string, + jint model_type_int, jstring name); // Returns true iff |fake_server| has exactly one window of sessions with @@ -53,7 +53,7 @@ class FakeServerHelperAndroid { JNIEnv* env, jobject obj, jlong fake_server, - jstring model_type_string); + jint model_type_int); // Injects a UniqueClientEntity into |fake_server|. void InjectUniqueClientEntity(JNIEnv* env, -- 2.11.4.GIT