diff options
author | Ben Lin <linben@google.com> | 2016-04-29 16:56:48 -0700 |
---|---|---|
committer | Simon Shields <simon@lineageos.org> | 2018-10-30 12:32:21 +0100 |
commit | b132242dc7f800c8e5444f6921a2689a101685a2 (patch) | |
tree | a07d145057cf10c1fbdd8ab85bb246f03ab7b2d8 | |
parent | 21b5b3c3edd6dde44098aac75daa1f55d5a68f77 (diff) | |
download | android_packages_providers_DownloadProvider-b132242dc7f800c8e5444f6921a2689a101685a2.tar.gz android_packages_providers_DownloadProvider-b132242dc7f800c8e5444f6921a2689a101685a2.tar.bz2 android_packages_providers_DownloadProvider-b132242dc7f800c8e5444f6921a2689a101685a2.zip |
Enable search for Downloads.
Bug: 26524617
Change-Id: Ide23c822b97ccab29a341184f14698dc942e8e14
3 files changed, 47 insertions, 5 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 7f242137..7571e91b 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -42,6 +42,7 @@ import android.database.DatabaseUtils; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.os.Binder; import android.os.ParcelFileDescriptor; @@ -926,8 +927,6 @@ public final class DownloadProvider extends ContentProvider { final String selection, final String[] selectionArgs, final String sort) { - Helpers.validateSelection(selection, sAppReadableColumnsSet); - SQLiteDatabase db = mOpenHelper.getReadableDatabase(); int match = sURIMatcher.match(uri); @@ -974,7 +973,10 @@ public final class DownloadProvider extends ContentProvider { logVerboseQueryInfo(projection, selection, selectionArgs, sort, db); } - Cursor ret = db.query(DB_TABLE, projection, fullSelection.getSelection(), + SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); + builder.setTables(DB_TABLE); + builder.setStrict(true); + Cursor ret = builder.query(db, projection, fullSelection.getSelection(), fullSelection.getParameters(), null, null, sort); if (ret != null) { diff --git a/src/com/android/providers/downloads/DownloadStorageProvider.java b/src/com/android/providers/downloads/DownloadStorageProvider.java index acf7c536..6f632b44 100644 --- a/src/com/android/providers/downloads/DownloadStorageProvider.java +++ b/src/com/android/providers/downloads/DownloadStorageProvider.java @@ -108,8 +108,8 @@ public class DownloadStorageProvider extends DocumentsProvider { final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection)); final RowBuilder row = result.newRow(); row.add(Root.COLUMN_ROOT_ID, DOC_ID_ROOT); - row.add(Root.COLUMN_FLAGS, - Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_CREATE); + row.add(Root.COLUMN_FLAGS, Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_RECENTS + | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH); row.add(Root.COLUMN_ICON, R.mipmap.ic_launcher_download); row.add(Root.COLUMN_TITLE, getContext().getString(R.string.root_downloads)); row.add(Root.COLUMN_DOCUMENT_ID, DOC_ID_ROOT); @@ -314,6 +314,28 @@ public class DownloadStorageProvider extends DocumentsProvider { } @Override + public Cursor querySearchDocuments(String rootId, String query, String[] projection) + throws FileNotFoundException { + final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection)); + + // Delegate to real provider + final long token = Binder.clearCallingIdentity(); + Cursor cursor = null; + try { + cursor = mDm.query(new DownloadManager.Query().setOnlyIncludeVisibleInDownloadsUi(true) + .setFilterByString(query)); + copyNotificationUri(result, cursor); + while (cursor.moveToNext()) { + includeDownloadFromCursor(result, cursor); + } + } finally { + IoUtils.closeQuietly(cursor); + Binder.restoreCallingIdentity(token); + } + return result; + } + + @Override public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal) throws FileNotFoundException { if (mArchiveHelper.isArchivedDocument(docId)) { diff --git a/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java b/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java index 0330fd38..813252a8 100644 --- a/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java +++ b/tests/src/com/android/providers/downloads/AbstractDownloadProviderFunctionalTest.java @@ -172,6 +172,7 @@ public abstract class AbstractDownloadProviderFunctionalTest extends mSystemFacade.setUp(); assertTrue(isDatabaseEmpty()); // ensure we're not messing with real data + assertTrue(isDatabaseSecureAgainstBadSelection()); mServer = new MockWebServer(); mServer.play(); } @@ -200,6 +201,23 @@ public abstract class AbstractDownloadProviderFunctionalTest extends } } + private boolean isDatabaseSecureAgainstBadSelection() { + Cursor cursor = null; + try { + cursor = mResolver.query(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, null, + "('1'='1'))) ORDER BY lastmod DESC--", null, null); + } + catch (Exception e) { + return true; + } finally { + if (cursor != null) { + cursor.close(); + } + } + + return false; + } + /** * Remove any downloaded files and delete any lingering downloads. */ |