// 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; import android.os.Parcel; import android.os.Parcelable; import java.util.HashSet; import java.util.Set; /** * This enum describes the type of passphrase required, if any, to decrypt synced data. * * It implements the Android {@link Parcelable} interface so it is easy to pass around in intents. * * It maps the native enum syncer::PassphraseType, but has the additional values INVALID and NONE. */ public enum SyncDecryptionPassphraseType implements Parcelable { INVALID(-2), // Used as default value and is not a valid decryption type. NONE(-1), // No encryption (deprecated). IMPLICIT_PASSPHRASE(0), // GAIA-based passphrase (deprecated). KEYSTORE_PASSPHRASE(1), // Keystore passphrase. FROZEN_IMPLICIT_PASSPHRASE(2), // Frozen GAIA passphrase. CUSTOM_PASSPHRASE(3); // User-provided passphrase. public static Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public SyncDecryptionPassphraseType createFromParcel(Parcel parcel) { return fromInternalValue(parcel.readInt()); } @Override public SyncDecryptionPassphraseType[] newArray(int size) { return new SyncDecryptionPassphraseType[size]; } }; public static SyncDecryptionPassphraseType fromInternalValue(int value) { for (SyncDecryptionPassphraseType type : values()) { if (type.internalValue() == value) { return type; } } // Falling back to INVALID. Should not happen if |value| was retrieved from native. return INVALID; } private final int mNativeValue; private SyncDecryptionPassphraseType(int nativeValue) { mNativeValue = nativeValue; } public Set getVisibleTypes() { Set visibleTypes = new HashSet<>(); switch (this) { case NONE: // Intentional fall through. case IMPLICIT_PASSPHRASE: // Intentional fall through. case KEYSTORE_PASSPHRASE: visibleTypes.add(this); visibleTypes.add(CUSTOM_PASSPHRASE); break; case FROZEN_IMPLICIT_PASSPHRASE: visibleTypes.add(KEYSTORE_PASSPHRASE); visibleTypes.add(FROZEN_IMPLICIT_PASSPHRASE); break; case CUSTOM_PASSPHRASE: visibleTypes.add(KEYSTORE_PASSPHRASE); visibleTypes.add(CUSTOM_PASSPHRASE); break; case INVALID: // Intentional fall through. default: visibleTypes.add(this); break; } return visibleTypes; } /** * Get the types that are allowed to be enabled from the current type. * * @param encryptEverythingAllowed Whether encrypting all data is allowed. */ public Set getAllowedTypes(boolean encryptEverythingAllowed) { Set allowedTypes = new HashSet<>(); switch (this) { case NONE: // Intentional fall through. case IMPLICIT_PASSPHRASE: // Intentional fall through. case KEYSTORE_PASSPHRASE: allowedTypes.add(this); if (encryptEverythingAllowed) { allowedTypes.add(CUSTOM_PASSPHRASE); } break; case FROZEN_IMPLICIT_PASSPHRASE: // Intentional fall through. case CUSTOM_PASSPHRASE: // Intentional fall through. case INVALID: // Intentional fall through. default: break; } return allowedTypes; } /** * TODO(maxbogue): Remove when no longer used in Clank; see http://crbug.com/424187. */ @Deprecated public Set getAllowedTypes() { return getAllowedTypes(true); } public int internalValue() { // Since the values in this enums are constant and very small, this cast is safe. return mNativeValue; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mNativeValue); } }