package de.danoeh.antennapod.core.service.download;
import android.database.Cursor;
import android.support.annotation.NonNull;
import java.util.Date;
import de.danoeh.antennapod.core.feed.FeedFile;
import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.danoeh.antennapod.core.util.DownloadError;
/** Contains status attributes for one download */
public class DownloadStatus {
/**
* Downloaders should use this constant for the size attribute if necessary
* so that the listadapters etc. can react properly.
*/
public static final int SIZE_UNKNOWN = -1;
// ----------------------------------- ATTRIBUTES STORED IN DB
/** Unique id for storing the object in database. */
protected long id;
/**
* A human-readable string which is shown to the user so that he can
* identify the download. Should be the title of the item/feed/media or the
* URL if the download has no other title.
*/
protected String title;
protected DownloadError reason;
/**
* A message which can be presented to the user to give more information.
* Should be null if Download was successful.
*/
protected String reasonDetailed;
protected boolean successful;
protected Date completionDate;
protected long feedfileId;
/**
* Is used to determine the type of the feedfile even if the feedfile does
* not exist anymore. The value should be FEEDFILETYPE_FEED,
* FEEDFILETYPE_FEEDIMAGE or FEEDFILETYPE_FEEDMEDIA
*/
protected int feedfileType;
// ------------------------------------ NOT STORED IN DB
protected boolean done;
protected boolean cancelled;
/** Constructor for restoring Download status entries from DB. */
public DownloadStatus(long id, String title, long feedfileId,
int feedfileType, boolean successful, DownloadError reason,
Date completionDate, String reasonDetailed) {
this.id = id;
this.title = title;
this.done = true;
this.feedfileId = feedfileId;
this.reason = reason;
this.successful = successful;
this.completionDate = (Date) completionDate.clone();
this.reasonDetailed = reasonDetailed;
this.feedfileType = feedfileType;
}
public DownloadStatus(@NonNull DownloadRequest request, DownloadError reason,
boolean successful, boolean cancelled, String reasonDetailed) {
this.title = request.getTitle();
this.feedfileId = request.getFeedfileId();
this.feedfileType = request.getFeedfileType();
this.reason = reason;
this.successful = successful;
this.cancelled = cancelled;
this.reasonDetailed = reasonDetailed;
this.completionDate = new Date();
}
/** Constructor for creating new completed downloads. */
public DownloadStatus(@NonNull FeedFile feedfile, String title, DownloadError reason,
boolean successful, String reasonDetailed) {
this.title = title;
this.done = true;
this.feedfileId = feedfile.getId();
this.feedfileType = feedfile.getTypeAsInt();
this.reason = reason;
this.successful = successful;
this.completionDate = new Date();
this.reasonDetailed = reasonDetailed;
}
/** Constructor for creating new completed downloads. */
public DownloadStatus(long feedfileId, int feedfileType, String title,
DownloadError reason, boolean successful, String reasonDetailed) {
this.title = title;
this.done = true;
this.feedfileId = feedfileId;
this.feedfileType = feedfileType;
this.reason = reason;
this.successful = successful;
this.completionDate = new Date();
this.reasonDetailed = reasonDetailed;
}
public static DownloadStatus fromCursor(Cursor cursor) {
int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID);
int indexTitle = cursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE);
int indexFeedFile = cursor.getColumnIndex(PodDBAdapter.KEY_FEEDFILE);
int indexFileFileType = cursor.getColumnIndex(PodDBAdapter.KEY_FEEDFILETYPE);
int indexSuccessful = cursor.getColumnIndex(PodDBAdapter.KEY_SUCCESSFUL);
int indexReason = cursor.getColumnIndex(PodDBAdapter.KEY_REASON);
int indexCompletionDate = cursor.getColumnIndex(PodDBAdapter.KEY_COMPLETION_DATE);
int indexReasonDetailed = cursor.getColumnIndex(PodDBAdapter.KEY_REASON_DETAILED);
long id = cursor.getLong(indexId);
String title = cursor.getString(indexTitle);
long feedfileId = cursor.getLong(indexFeedFile);
int feedfileType = cursor.getInt(indexFileFileType);
boolean successful = cursor.getInt(indexSuccessful) > 0;
int reason = cursor.getInt(indexReason);
Date completionDate = new Date(cursor.getLong(indexCompletionDate));
String reasonDetailed = cursor.getString(indexReasonDetailed);
return new DownloadStatus(id, title, feedfileId,
feedfileType, successful, DownloadError.fromCode(reason), completionDate,
reasonDetailed);
}
@Override
public String toString() {
return "DownloadStatus [id=" + id + ", title=" + title + ", reason="
+ reason + ", reasonDetailed=" + reasonDetailed
+ ", successful=" + successful + ", completionDate="
+ completionDate + ", feedfileId=" + feedfileId
+ ", feedfileType=" + feedfileType + ", done=" + done
+ ", cancelled=" + cancelled + "]";
}
public long getId() {
return id;
}
public String getTitle() {
return title;
}
public DownloadError getReason() {
return reason;
}
public String getReasonDetailed() {
return reasonDetailed;
}
public boolean isSuccessful() {
return successful;
}
public Date getCompletionDate() {
return (Date) completionDate.clone();
}
public long getFeedfileId() {
return feedfileId;
}
public int getFeedfileType() {
return feedfileType;
}
public boolean isDone() {
return done;
}
public boolean isCancelled() {
return cancelled;
}
public void setSuccessful() {
this.successful = true;
this.reason = DownloadError.SUCCESS;
this.done = true;
}
public void setFailed(DownloadError reason, String reasonDetailed) {
this.successful = false;
this.reason = reason;
this.reasonDetailed = reasonDetailed;
this.done = true;
}
public void setCancelled() {
this.successful = false;
this.reason = DownloadError.ERROR_DOWNLOAD_CANCELLED;
this.done = true;
this.cancelled = true;
}
public void setCompletionDate(Date completionDate) {
this.completionDate = (Date) completionDate.clone();
}
public void setId(long id) {
this.id = id;
}
}