diff options
Diffstat (limited to 'src/com/android/providers/downloads/DownloadProvider.java')
-rw-r--r-- | src/com/android/providers/downloads/DownloadProvider.java | 79 |
1 files changed, 35 insertions, 44 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index d97d6189..9336b737 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -16,6 +16,7 @@ package com.android.providers.downloads; +import android.app.DownloadManager; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; @@ -25,10 +26,8 @@ import android.content.UriMatcher; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.database.CrossProcessCursor; import android.database.Cursor; -import android.database.CursorWindow; -import android.database.CursorWrapper; +import android.database.DatabaseUtils; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; @@ -45,11 +44,11 @@ import com.google.common.annotations.VisibleForTesting; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; /** @@ -59,7 +58,7 @@ public final class DownloadProvider extends ContentProvider { /** Database filename */ private static final String DB_NAME = "downloads.db"; /** Current database version */ - private static final int DB_VERSION = 106; + private static final int DB_VERSION = 107; /** Name of table in the database */ private static final String DB_TABLE = "downloads"; @@ -80,6 +79,11 @@ public final class DownloadProvider extends ContentProvider { private static final int ALL_DOWNLOADS_ID = 4; /** URI matcher constant for the URI of a download's request headers */ private static final int REQUEST_HEADERS_URI = 5; + /** URI matcher constant for the public URI returned by + * {@link DownloadManager#getUriForDownloadedFile(long)} if the given downloaded file + * is publicly accessible. + */ + private static final int PUBLIC_DOWNLOAD_ID = 6; static { sURIMatcher.addURI("downloads", "my_downloads", MY_DOWNLOADS); sURIMatcher.addURI("downloads", "my_downloads/#", MY_DOWNLOADS_ID); @@ -97,6 +101,9 @@ public final class DownloadProvider extends ContentProvider { sURIMatcher.addURI("downloads", "download/#/" + Downloads.Impl.RequestHeaders.URI_SEGMENT, REQUEST_HEADERS_URI); + sURIMatcher.addURI("downloads", + Downloads.Impl.PUBLICLY_ACCESSIBLE_DOWNLOADS_URI_SEGMENT + "/#", + PUBLIC_DOWNLOAD_ID); } /** Different base URIs that could be used to access an individual download */ @@ -135,6 +142,8 @@ public final class DownloadProvider extends ContentProvider { sAppReadableColumnsSet.add(sAppReadableColumnsArray[i]); } } + private static final List<String> downloadManagerColumnsList = + Arrays.asList(DownloadManager.UNDERLYING_COLUMNS); /** The database that lies underneath this content provider */ private SQLiteOpenHelper mOpenHelper = null; @@ -279,6 +288,10 @@ public final class DownloadProvider extends ContentProvider { "BOOLEAN NOT NULL DEFAULT 0"); break; + case 107: + addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ERROR_MSG, "TEXT"); + break; + default: throw new IllegalStateException("Don't know how to upgrade to " + version); } @@ -425,6 +438,15 @@ public final class DownloadProvider extends ContentProvider { case MY_DOWNLOADS_ID: { return DOWNLOAD_TYPE; } + case PUBLIC_DOWNLOAD_ID: { + // return the mimetype of this id from the database + final String id = getDownloadIdFromUri(uri); + final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); + return DatabaseUtils.stringForQuery(db, + "SELECT " + Downloads.Impl.COLUMN_MIME_TYPE + " FROM " + DB_TABLE + + " WHERE " + Downloads.Impl._ID + " = ?", + new String[]{id}); + } default: { if (Constants.LOGV) { Log.v(Constants.TAG, "calling getType on an unknown URI: " + uri); @@ -645,6 +667,7 @@ public final class DownloadProvider extends ContentProvider { values.remove(Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES); values.remove(Downloads.Impl.COLUMN_ALLOW_ROAMING); values.remove(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI); + values.remove(Downloads.Impl.COLUMN_MEDIA_SCANNED); Iterator<Map.Entry<String, Object>> iterator = values.valueSet().iterator(); while (iterator.hasNext()) { String key = iterator.next().getKey(); @@ -720,8 +743,10 @@ public final class DownloadProvider extends ContentProvider { if (projection == null) { projection = sAppReadableColumnsArray; } else { + // check the validity of the columns in projection for (int i = 0; i < projection.length; ++i) { - if (!sAppReadableColumnsSet.contains(projection[i])) { + if (!sAppReadableColumnsSet.contains(projection[i]) && + !downloadManagerColumnsList.contains(projection[i])) { throw new IllegalArgumentException( "column " + projection[i] + " is not allowed in queries"); } @@ -737,10 +762,6 @@ public final class DownloadProvider extends ContentProvider { fullSelection.getParameters(), null, null, sort); if (ret != null) { - ret = new ReadOnlyCursorWrapper(ret); - } - - if (ret != null) { ret.setNotificationUri(getContext().getContentResolver(), uri); if (Constants.LOGVV) { Log.v(Constants.TAG, @@ -831,9 +852,8 @@ public final class DownloadProvider extends ContentProvider { + getDownloadIdFromUri(uri); String[] projection = new String[] {Downloads.Impl.RequestHeaders.COLUMN_HEADER, Downloads.Impl.RequestHeaders.COLUMN_VALUE}; - Cursor cursor = db.query(Downloads.Impl.RequestHeaders.HEADERS_DB_TABLE, projection, where, - null, null, null, null); - return new ReadOnlyCursorWrapper(cursor); + return db.query(Downloads.Impl.RequestHeaders.HEADERS_DB_TABLE, projection, where, + null, null, null, null); } /** @@ -972,7 +992,8 @@ public final class DownloadProvider extends ContentProvider { int uriMatch) { SqlSelection selection = new SqlSelection(); selection.appendClause(where, whereArgs); - if (uriMatch == MY_DOWNLOADS_ID || uriMatch == ALL_DOWNLOADS_ID) { + if (uriMatch == MY_DOWNLOADS_ID || uriMatch == ALL_DOWNLOADS_ID || + uriMatch == PUBLIC_DOWNLOAD_ID) { selection.appendClause(Downloads.Impl._ID + " = ?", getDownloadIdFromUri(uri)); } if ((uriMatch == MY_DOWNLOADS || uriMatch == MY_DOWNLOADS_ID) @@ -1128,34 +1149,4 @@ public final class DownloadProvider extends ContentProvider { to.put(key, defaultValue); } } - - private class ReadOnlyCursorWrapper extends CursorWrapper implements CrossProcessCursor { - public ReadOnlyCursorWrapper(Cursor cursor) { - super(cursor); - mCursor = (CrossProcessCursor) cursor; - } - - public boolean deleteRow() { - throw new SecurityException("Download manager cursors are read-only"); - } - - public boolean commitUpdates() { - throw new SecurityException("Download manager cursors are read-only"); - } - - public void fillWindow(int pos, CursorWindow window) { - mCursor.fillWindow(pos, window); - } - - public CursorWindow getWindow() { - return mCursor.getWindow(); - } - - public boolean onMove(int oldPosition, int newPosition) { - return mCursor.onMove(oldPosition, newPosition); - } - - private CrossProcessCursor mCursor; - } - } |