package com.fsck.k9.activity.misc;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Container class for information about an attachment.
*
* This is used by {@link com.fsck.k9.activity.MessageCompose} to fetch and manage attachments.
*/
public class Attachment implements Parcelable {
/**
* The URI pointing to the source of the attachment.
*
* In most cases this will be a {@code content://}-URI.
*/
public final Uri uri;
/**
* The current loading state.
*/
public final LoadingState state;
/**
* The ID of the loader that is used to load the metadata or contents.
*/
public final int loaderId;
/**
* The content type of the attachment.
*
* Valid iff {@link #state} is {@link LoadingState#METADATA} or {@link LoadingState#COMPLETE}.
*/
public final String contentType;
/**
* The (file)name of the attachment.
*
* Valid iff {@link #state} is {@link LoadingState#METADATA} or {@link LoadingState#COMPLETE}.
*/
public final String name;
/**
* The size of the attachment.
*
* Valid iff {@link #state} is {@link LoadingState#METADATA} or {@link LoadingState#COMPLETE}.
*/
public final Long size;
/**
* The name of the temporary file containing the local copy of the attachment.
*
* Valid iff {@link #state} is {@link LoadingState#COMPLETE}.
*/
public final String filename;
public enum LoadingState {
URI_ONLY,
METADATA,
COMPLETE,
CANCELLED
}
private Attachment(Uri uri, LoadingState state, int loaderId, String contentType, String name, Long size,
String filename) {
this.uri = uri;
this.state = state;
this.loaderId = loaderId;
this.contentType = contentType;
this.name = name;
this.size = size;
this.filename = filename;
}
private Attachment(Parcel in) {
uri = in.readParcelable(Uri.class.getClassLoader());
state = (LoadingState) in.readSerializable();
loaderId = in.readInt();
contentType = in.readString();
name = in.readString();
if (in.readInt() != 0) {
size = in.readLong();
} else {
size = null;
}
filename = in.readString();
}
public static Attachment createAttachment(Uri uri, int loaderId, String contentType) {
return new Attachment(uri, Attachment.LoadingState.URI_ONLY, loaderId, contentType, null, null, null);
}
public Attachment deriveWithMetadataLoaded(String usableContentType, String name, long size) {
if (state != Attachment.LoadingState.URI_ONLY) {
throw new IllegalStateException("deriveWithMetadataLoaded can only be called on a URI_ONLY attachment!");
}
return new Attachment(uri, Attachment.LoadingState.METADATA, loaderId, usableContentType, name, size, null);
}
public Attachment deriveWithLoadCancelled() {
if (state != Attachment.LoadingState.METADATA) {
throw new IllegalStateException("deriveWitLoadCancelled can only be called on a METADATA attachment!");
}
return new Attachment(uri, Attachment.LoadingState.CANCELLED, loaderId, contentType, name, size, null);
}
public Attachment deriveWithLoadComplete(String absolutePath) {
if (state != Attachment.LoadingState.METADATA) {
throw new IllegalStateException("deriveWithLoadComplete can only be called on a METADATA attachment!");
}
return new Attachment(uri, Attachment.LoadingState.COMPLETE, loaderId, contentType, name, size, absolutePath);
}
// === Parcelable ===
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(uri, flags);
dest.writeSerializable(state);
dest.writeInt(loaderId);
dest.writeString(contentType);
dest.writeString(name);
if (size != null) {
dest.writeInt(1);
dest.writeLong(size);
} else {
dest.writeInt(0);
}
dest.writeString(filename);
}
public static final Parcelable.Creator<Attachment> CREATOR =
new Parcelable.Creator<Attachment>() {
@Override
public Attachment createFromParcel(Parcel in) {
return new Attachment(in);
}
@Override
public Attachment[] newArray(int size) {
return new Attachment[size];
}
};
}