summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.xml11
-rw-r--r--core/java/android/app/DownloadManager.java35
-rw-r--r--core/java/android/provider/Downloads.java26
3 files changed, 71 insertions, 1 deletions
diff --git a/api/current.xml b/api/current.xml
index 4ecaf539d27b..b51242b97adf 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -29358,6 +29358,17 @@
visibility="public"
>
</field>
+<field name="COLUMN_MEDIAPROVIDER_URI"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;mediaprovider_uri&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="COLUMN_MEDIA_TYPE"
type="java.lang.String"
transient="false"
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index b9a541dec257..fd96cf0f7119 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -28,7 +28,6 @@ import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.BaseColumns;
import android.provider.Downloads;
-import android.util.Log;
import android.util.Pair;
import java.io.File;
@@ -141,6 +140,12 @@ public class DownloadManager {
*/
public final static String COLUMN_LAST_MODIFIED_TIMESTAMP = "last_modified_timestamp";
+ /**
+ * The URI to the corresponding entry in MediaProvider for this downloaded entry. It is
+ * used to delete the entries from MediaProvider database when it is deleted from the
+ * downloaded list.
+ */
+ public static final String COLUMN_MEDIAPROVIDER_URI = "mediaprovider_uri";
/**
* Value of {@link #COLUMN_STATUS} when the download is waiting to start.
@@ -271,6 +276,7 @@ public class DownloadManager {
// this array must contain all public columns
private static final String[] COLUMNS = new String[] {
COLUMN_ID,
+ COLUMN_MEDIAPROVIDER_URI,
COLUMN_TITLE,
COLUMN_DESCRIPTION,
COLUMN_URI,
@@ -287,6 +293,7 @@ public class DownloadManager {
// columns to request from DownloadProvider
private static final String[] UNDERLYING_COLUMNS = new String[] {
Downloads.Impl._ID,
+ Downloads.Impl.COLUMN_MEDIAPROVIDER_URI,
Downloads.COLUMN_TITLE,
Downloads.COLUMN_DESCRIPTION,
Downloads.COLUMN_URI,
@@ -683,6 +690,9 @@ public class DownloadManager {
selectionParts.add(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI + " != '0'");
}
+ // only return rows which are not marked 'deleted = 1'
+ selectionParts.add(Downloads.Impl.COLUMN_DELETED + " != '1'");
+
String selection = joinStrings(" AND ", selectionParts);
String orderDirection = (mOrderDirection == ORDER_ASCENDING ? "ASC" : "DESC");
String orderBy = mOrderByColumn + " " + orderDirection;
@@ -749,6 +759,26 @@ public class DownloadManager {
}
/**
+ * Marks the specified download as 'to be deleted'. This is done when a completed download
+ * is to be removed but the row was stored without enough info to delete the corresponding
+ * metadata from Mediaprovider database. Actual cleanup of this row is done in DownloadService.
+ *
+ * @param ids the IDs of the downloads to be marked 'deleted'
+ * @return the number of downloads actually updated
+ * @hide
+ */
+ public int markRowDeleted(long... ids) {
+ if (ids == null || ids.length == 0) {
+ // called with nothing to remove!
+ throw new IllegalArgumentException("input param 'ids' can't be null");
+ }
+ ContentValues values = new ContentValues();
+ values.put(Downloads.Impl.COLUMN_DELETED, 1);
+ return mResolver.update(mBaseUri, values, getWhereClauseForIds(ids),
+ getWhereArgsForIds(ids));
+ }
+
+ /**
* Cancel downloads and remove them from the download manager. Each download will be stopped if
* it was running, and it will no longer be accessible through the download manager. If a file
* was already downloaded to external storage, it will not be deleted.
@@ -959,6 +989,9 @@ public class DownloadManager {
if (column.equals(COLUMN_LOCAL_FILENAME)) {
return getUnderlyingString(Downloads.Impl._DATA);
}
+ if (column.equals(COLUMN_MEDIAPROVIDER_URI)) {
+ return getUnderlyingString(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI);
+ }
assert column.equals(COLUMN_LOCAL_URI);
return getLocalUri();
diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java
index 8fd0e0a3f712..72bf6b08d684 100644
--- a/core/java/android/provider/Downloads.java
+++ b/core/java/android/provider/Downloads.java
@@ -300,6 +300,15 @@ public final class Downloads {
*/
public static final String COLUMN_DESCRIPTION = "description";
+ /**
+ * Set to true if this download is deleted. It is completely removed from the database
+ * when MediaProvider database also deletes the metadata asociated with this downloaded file.
+ * <P>Type: BOOLEAN</P>
+ * <P>Owner can Read</P>
+ * @hide
+ */
+ public static final String COLUMN_DELETED = "deleted";
+
/*
* Lists the destinations that an application can specify for a download.
*/
@@ -881,6 +890,23 @@ public final class Downloads {
public static final String COLUMN_BYPASS_RECOMMENDED_SIZE_LIMIT =
"bypass_recommended_size_limit";
+ /**
+ * Set to true if this download is deleted. It is completely removed from the database
+ * when MediaProvider database also deletes the metadata asociated with this downloaded file.
+ * <P>Type: BOOLEAN</P>
+ * <P>Owner can Read</P>
+ */
+ public static final String COLUMN_DELETED = "deleted";
+
+ /**
+ * The URI to the corresponding entry in MediaProvider for this downloaded entry. It is
+ * used to delete the entries from MediaProvider database when it is deleted from the
+ * downloaded list.
+ * <P>Type: TEXT</P>
+ * <P>Owner can Read</P>
+ */
+ public static final String COLUMN_MEDIAPROVIDER_URI = "mediaprovider_uri";
+
/*
* Lists the destinations that an application can specify for a download.
*/