summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/downloads/DownloadInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/providers/downloads/DownloadInfo.java')
-rw-r--r--src/com/android/providers/downloads/DownloadInfo.java212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/com/android/providers/downloads/DownloadInfo.java b/src/com/android/providers/downloads/DownloadInfo.java
new file mode 100644
index 00000000..e051f41a
--- /dev/null
+++ b/src/com/android/providers/downloads/DownloadInfo.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.downloads;
+
+import android.net.Uri;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Downloads;
+
+/**
+ * Stores information about an individual download.
+ */
+public class DownloadInfo {
+ public int id;
+ public String uri;
+ public boolean noIntegrity;
+ public String hint;
+ public String filename;
+ public String mimetype;
+ public int destination;
+ public int visibility;
+ public int control;
+ public int status;
+ public int numFailed;
+ public int retryAfter;
+ public int redirectCount;
+ public long lastMod;
+ public String pckg;
+ public String clazz;
+ public String extras;
+ public String cookies;
+ public String userAgent;
+ public String referer;
+ public int totalBytes;
+ public int currentBytes;
+ public String etag;
+ public boolean mediaScanned;
+
+ public volatile boolean hasActiveThread;
+
+ public DownloadInfo(int id, String uri, boolean noIntegrity,
+ String hint, String filename,
+ String mimetype, int destination, int visibility, int control,
+ int status, int numFailed, int retryAfter, int redirectCount, long lastMod,
+ String pckg, String clazz, String extras, String cookies,
+ String userAgent, String referer, int totalBytes, int currentBytes, String etag,
+ boolean mediaScanned) {
+ this.id = id;
+ this.uri = uri;
+ this.noIntegrity = noIntegrity;
+ this.hint = hint;
+ this.filename = filename;
+ this.mimetype = mimetype;
+ this.destination = destination;
+ this.visibility = visibility;
+ this.control = control;
+ this.status = status;
+ this.numFailed = numFailed;
+ this.retryAfter = retryAfter;
+ this.redirectCount = redirectCount;
+ this.lastMod = lastMod;
+ this.pckg = pckg;
+ this.clazz = clazz;
+ this.extras = extras;
+ this.cookies = cookies;
+ this.userAgent = userAgent;
+ this.referer = referer;
+ this.totalBytes = totalBytes;
+ this.currentBytes = currentBytes;
+ this.etag = etag;
+ this.mediaScanned = mediaScanned;
+ }
+
+ public void sendIntentIfRequested(Uri contentUri, Context context) {
+ if (pckg != null && clazz != null) {
+ Intent intent = new Intent(Downloads.DOWNLOAD_COMPLETED_ACTION);
+ intent.setClassName(pckg, clazz);
+ if (extras != null) {
+ intent.putExtra(Downloads.NOTIFICATION_EXTRAS, extras);
+ }
+ // We only send the content: URI, for security reasons. Otherwise, malicious
+ // applications would have an easier time spoofing download results by
+ // sending spoofed intents.
+ intent.setData(contentUri);
+ context.sendBroadcast(intent);
+ }
+ }
+
+ /**
+ * Returns the time when a download should be restarted. Must only
+ * be called when numFailed > 0.
+ */
+ public long restartTime() {
+ if (retryAfter > 0) {
+ return lastMod + retryAfter;
+ }
+ return lastMod +
+ Constants.RETRY_FIRST_DELAY *
+ (1000 + Helpers.rnd.nextInt(1001)) * (1 << (numFailed - 1));
+ }
+
+ /**
+ * Returns whether this download (which the download manager hasn't seen yet)
+ * should be started.
+ */
+ public boolean isReadyToStart(long now) {
+ if (control == Downloads.CONTROL_PAUSED) {
+ // the download is paused, so it's not going to start
+ return false;
+ }
+ if (status == 0) {
+ // status hasn't been initialized yet, this is a new download
+ return true;
+ }
+ if (status == Downloads.STATUS_PENDING) {
+ // download is explicit marked as ready to start
+ return true;
+ }
+ if (status == Downloads.STATUS_RUNNING) {
+ // download was interrupted (process killed, loss of power) while it was running,
+ // without a chance to update the database
+ return true;
+ }
+ if (status == Downloads.STATUS_RUNNING_PAUSED) {
+ if (numFailed == 0) {
+ // download is waiting for network connectivity to return before it can resume
+ return true;
+ }
+ if (restartTime() < now) {
+ // download was waiting for a delayed restart, and the delay has expired
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether this download (which the download manager has already seen
+ * and therefore potentially started) should be restarted.
+ *
+ * In a nutshell, this returns true if the download isn't already running
+ * but should be, and it can know whether the download is already running
+ * by checking the status.
+ */
+ public boolean isReadyToRestart(long now) {
+ if (control == Downloads.CONTROL_PAUSED) {
+ // the download is paused, so it's not going to restart
+ return false;
+ }
+ if (status == 0) {
+ // download hadn't been initialized yet
+ return true;
+ }
+ if (status == Downloads.STATUS_PENDING) {
+ // download is explicit marked as ready to start
+ return true;
+ }
+ if (status == Downloads.STATUS_RUNNING_PAUSED) {
+ if (numFailed == 0) {
+ // download is waiting for network connectivity to return before it can resume
+ return true;
+ }
+ if (restartTime() < now) {
+ // download was waiting for a delayed restart, and the delay has expired
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether this download has a visible notification after
+ * completion.
+ */
+ public boolean hasCompletionNotification() {
+ if (!Downloads.isStatusCompleted(status)) {
+ return false;
+ }
+ if (visibility == Downloads.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether this download is allowed to use the network.
+ */
+ public boolean canUseNetwork(boolean available, boolean roaming) {
+ if (!available) {
+ return false;
+ }
+ if (destination == Downloads.DESTINATION_CACHE_PARTITION_NOROAMING) {
+ return !roaming;
+ } else {
+ return true;
+ }
+ }
+}