diff --git a/api/current.xml b/api/current.xml index 211ad95d352f2..f4eefae2da80e 100644 --- a/api/current.xml +++ b/api/current.xml @@ -28843,7 +28843,7 @@ - + - + selectionParts = new ArrayList(); + String[] selectionArgs = null; - if (mId != null) { - uri = ContentUris.withAppendedId(uri, mId); + if (mIds != null) { + selectionParts.add(getWhereClauseForIds(mIds)); + selectionArgs = getWhereArgsForIds(mIds); } if (mStatusFlags != null) { @@ -682,7 +684,7 @@ public class DownloadManager { String orderDirection = (mOrderDirection == ORDER_ASCENDING ? "ASC" : "DESC"); String orderBy = mOrderByColumn + " " + orderDirection; - return resolver.query(uri, projection, selection, null, orderBy); + return resolver.query(uri, projection, selection, selectionArgs, orderBy); } private String joinStrings(String joiner, Iterable parts) { @@ -744,17 +746,28 @@ public class DownloadManager { } /** - * Cancel a download and remove it from the download manager. The download will be stopped if + * 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, it will not be deleted. + * was already downloaded to external storage, it will not be deleted. * - * @param id the ID of the download + * @param ids the IDs of the downloads to remove + * @return the number of downloads actually removed */ - public void remove(long id) { - int numDeleted = mResolver.delete(getDownloadUri(id), null, null); - if (numDeleted == 0) { - throw new IllegalArgumentException("Download " + id + " does not exist"); + public int remove(long... ids) { + StringBuilder whereClause = new StringBuilder(); + String[] whereArgs = new String[ids.length]; + + whereClause.append(Downloads.Impl._ID + " IN ("); + for (int i = 0; i < ids.length; i++) { + if (i > 0) { + whereClause.append(","); + } + whereClause.append("?"); + whereArgs[i] = Long.toString(ids[i]); } + whereClause.append(")"); + + return mResolver.delete(mBaseUri, whereClause.toString(), whereArgs); } /** @@ -782,20 +795,20 @@ public class DownloadManager { } /** - * Restart the given download, which must have already completed (successfully or not). This + * Restart the given downloads, which must have already completed (successfully or not). This * method will only work when called from within the download manager's process. - * @param id the ID of the download + * @param ids the IDs of the downloads * @hide */ - public void restartDownload(long id) { - Cursor cursor = query(new Query().setFilterById(id)); + public void restartDownload(long... ids) { + Cursor cursor = query(new Query().setFilterById(ids)); try { - if (!cursor.moveToFirst()) { - throw new IllegalArgumentException("No download with id " + id); - } - int status = cursor.getInt(cursor.getColumnIndex(COLUMN_STATUS)); - if (status != STATUS_SUCCESSFUL && status != STATUS_FAILED) { - throw new IllegalArgumentException("Cannot restart incomplete download: " + id); + for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + int status = cursor.getInt(cursor.getColumnIndex(COLUMN_STATUS)); + if (status != STATUS_SUCCESSFUL && status != STATUS_FAILED) { + throw new IllegalArgumentException("Cannot restart incomplete download: " + + cursor.getLong(cursor.getColumnIndex(COLUMN_ID))); + } } } finally { cursor.close(); @@ -806,7 +819,7 @@ public class DownloadManager { values.put(Downloads.Impl.COLUMN_TOTAL_BYTES, -1); values.putNull(Downloads.Impl._DATA); values.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_PENDING); - mResolver.update(getDownloadUri(id), values, null, null); + mResolver.update(mBaseUri, values, getWhereClauseForIds(ids), getWhereArgsForIds(ids)); } /** @@ -816,6 +829,33 @@ public class DownloadManager { return ContentUris.withAppendedId(mBaseUri, id); } + /** + * Get a parameterized SQL WHERE clause to select a bunch of IDs. + */ + static String getWhereClauseForIds(long[] ids) { + StringBuilder whereClause = new StringBuilder(); + whereClause.append(Downloads.Impl._ID + " IN ("); + for (int i = 0; i < ids.length; i++) { + if (i > 0) { + whereClause.append(","); + } + whereClause.append("?"); + } + whereClause.append(")"); + return whereClause.toString(); + } + + /** + * Get the selection args for a clause returned by {@link #getWhereClauseForIds(long[])}. + */ + static String[] getWhereArgsForIds(long[] ids) { + String[] whereArgs = new String[ids.length]; + for (int i = 0; i < ids.length; i++) { + whereArgs[i] = Long.toString(ids[i]); + } + return whereArgs; + } + /** * This class wraps a cursor returned by DownloadProvider -- the "underlying cursor" -- and * presents a different set of columns, those defined in the DownloadManager.COLUMN_* constants.