ModelType.java revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package org.chromium.sync.internal_api.pub.base;
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.util.Log;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.google.common.collect.HashMultimap;
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.google.common.collect.Multimap;
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.google.common.collect.Sets;
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.google.ipc.invalidation.external.client.types.ObjectId;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.google.protos.ipc.invalidation.Types;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.Collection;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.HashSet;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.Set;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The model types that are synced in Chrome for Android.
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public enum ModelType {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * An autofill object.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AUTOFILL("AUTOFILL"),
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * An autofill profile object.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AUTOFILL_PROFILE("AUTOFILL_PROFILE"),
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * A bookmark folder or a bookmark URL object.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BOOKMARK("BOOKMARK"),
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Flags to enable experimental features.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPERIMENTS("EXPERIMENTS"),
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * An object representing a set of Nigori keys.
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NIGORI("NIGORI"),
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * A password entry.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PASSWORD("PASSWORD"),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * An object representing a browser session or tab.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SESSION("SESSION"),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * A typed_url folder or a typed_url object.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TYPED_URL("TYPED_URL"),
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * A history delete directive object.
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    HISTORY_DELETE_DIRECTIVE("HISTORY_DELETE_DIRECTIVE"),
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * A device info object.
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DEVICE_INFO("DEVICE_INFO"),
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * A proxy tabs object (placeholder for sessions).
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PROXY_TABS("NULL"),
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * A favicon image object.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FAVICON_IMAGE("FAVICON_IMAGE"),
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * A favicon tracking object.
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FAVICON_TRACKING("FAVICON_TRACKING");
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Special type representing all possible types. */
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static final String ALL_TYPES_TYPE = "ALL_TYPES";
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private static final String TAG = ModelType.class.getSimpleName();
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private final String mModelType;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ModelType(String modelType) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mModelType = modelType;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public ObjectId toObjectId() {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return ObjectId.newInstance(Types.ObjectSource.Type.CHROME_SYNC.getNumber(),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mModelType.getBytes());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static ModelType fromObjectId(ObjectId objectId) {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return valueOf(new String(objectId.getName()));
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } catch (IllegalArgumentException e) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return null;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Converts string representations of types to sync to {@link ModelType}s.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * <p>
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * If {@code syncTypes} contains {@link #ALL_TYPES_TYPE}, then the returned
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * set contains all values of the {@code ModelType} enum.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * <p>
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Otherwise, the returned set contains the {@code ModelType} values for all elements of
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * {@code syncTypes} for which {@link ModelType#valueOf(String)} successfully returns; other
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * elements are dropped.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static Set<ModelType> syncTypesToModelTypes(Collection<String> syncTypes) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (syncTypes.contains(ALL_TYPES_TYPE)) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return Sets.newHashSet(ModelType.values());
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Set<ModelType> modelTypes = Sets.newHashSetWithExpectedSize(syncTypes.size());
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            for (String syncType : syncTypes) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                try {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    modelTypes.add(valueOf(syncType));
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                } catch (IllegalArgumentException exception) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    // Drop invalid sync types.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    Log.w(TAG, "Could not translate sync type to model type: " + syncType);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return modelTypes;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Converts a set of {@link ModelType} to a set of {@link ObjectId}. */
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static Set<ObjectId> modelTypesToObjectIds(Set<ModelType> modelTypes) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Set<ObjectId> objectIds = Sets.newHashSetWithExpectedSize(modelTypes.size());
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (ModelType modelType : modelTypes) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            objectIds.add(modelType.toObjectId());
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return objectIds;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Converts a set of {@link ModelType} to a set of string names. */
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static Set<String> modelTypesToSyncTypes(Set<ModelType> modelTypes) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Set<String> objectIds = Sets.newHashSetWithExpectedSize(modelTypes.size());
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (ModelType modelType : modelTypes) {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            objectIds.add(modelType.toString());
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return objectIds;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
145