From afaf53bd2b1322167b6f31eda941e38335c4a952 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 26 Sep 2013 14:30:47 -0700 Subject: Revoke grants when downloads are deleted. When deleting downloads, revoke any Uri permission grants, which removes from getPersistedUriPermissions(). Bug: 10928851 Change-Id: I3e90c4071385832dcb3e0cf9ca3fdccafbe30037 --- src/com/android/providers/downloads/DownloadProvider.java | 13 +++++++++++++ .../providers/downloads/DownloadStorageProvider.java | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 999134f0..cb3dc18b 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -1162,6 +1162,19 @@ public final class DownloadProvider extends ContentProvider { case ALL_DOWNLOADS_ID: SqlSelection selection = getWhereClause(uri, where, whereArgs, match); deleteRequestHeaders(db, selection.getSelection(), selection.getParameters()); + + final Cursor cursor = db.query(DB_TABLE, new String[] { + Downloads.Impl._ID }, selection.getSelection(), selection.getParameters(), + null, null, null); + try { + while (cursor.moveToNext()) { + final long id = cursor.getLong(0); + DownloadStorageProvider.onDownloadProviderDelete(getContext(), id); + } + } finally { + IoUtils.closeQuietly(cursor); + } + count = db.delete(DB_TABLE, selection.getSelection(), selection.getParameters()); break; diff --git a/src/com/android/providers/downloads/DownloadStorageProvider.java b/src/com/android/providers/downloads/DownloadStorageProvider.java index d982f2a1..1b7b6916 100644 --- a/src/com/android/providers/downloads/DownloadStorageProvider.java +++ b/src/com/android/providers/downloads/DownloadStorageProvider.java @@ -25,6 +25,7 @@ import android.database.Cursor; import android.database.MatrixCursor; import android.database.MatrixCursor.RowBuilder; import android.graphics.Point; +import android.net.Uri; import android.os.Binder; import android.os.CancellationSignal; import android.os.Environment; @@ -47,6 +48,7 @@ import java.io.IOException; * contents. */ public class DownloadStorageProvider extends DocumentsProvider { + private static final String AUTHORITY = Constants.STORAGE_AUTHORITY; private static final String DOC_ID_ROOT = Constants.STORAGE_ROOT_ID; private static final String[] DEFAULT_ROOT_PROJECTION = new String[] { @@ -82,6 +84,11 @@ public class DownloadStorageProvider extends DocumentsProvider { result.setNotificationUri(getContext().getContentResolver(), cursor.getNotificationUri()); } + static void onDownloadProviderDelete(Context context, long id) { + final Uri uri = DocumentsContract.buildDocumentUri(AUTHORITY, Long.toString(id)); + context.revokeUriPermission(uri, ~0); + } + @Override public Cursor queryRoots(String[] projection) throws FileNotFoundException { final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection)); -- cgit v1.2.3