blob: 2437953530e7e5bc822c5424e003222506c19ceb [file] [log] [blame]
// 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<SyncDecryptionPassphraseType>() {
@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<SyncDecryptionPassphraseType> getVisibleTypes() {
Set<SyncDecryptionPassphraseType> 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<SyncDecryptionPassphraseType> getAllowedTypes(boolean encryptEverythingAllowed) {
Set<SyncDecryptionPassphraseType> 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<SyncDecryptionPassphraseType> 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);
}
}