// 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.FieldTrialList; import org.chromium.base.VisibleForTesting; import org.chromium.base.library_loader.LibraryLoader; import java.util.Collection; import java.util.EnumSet; 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 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"); /** Special type representing all possible types. */ public static final String ALL_TYPES_TYPE = "ALL_TYPES"; 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() { if ((this == SESSION || this == FAVICON_TRACKING) && LibraryLoader.isInitialized()) { return FieldTrialList .findFullName("AndroidSessionNotifications") .equals("Disabled"); } 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. *

* If {@code syncTypes} contains {@link #ALL_TYPES_TYPE}, then the returned * set contains all values of the {@code ModelType} enum. *

* Otherwise, the returned set contains the {@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) { if (syncTypes.contains(ALL_TYPES_TYPE)) { return EnumSet.allOf(ModelType.class); } else { 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. */ 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; } }