diff --git a/api/current.xml b/api/current.xml index 233062cb0fee8..2dfae5ded2d42 100644 --- a/api/current.xml +++ b/api/current.xml @@ -97436,6 +97436,21 @@ + + + + + + - + + + + + + + + + + + + + + + - - - - - - - - + - + - - mRequestHeaders = new HashMap(); - private String mTitle; - private String mDescription; + private List> mRequestHeaders = new ArrayList>(); + private CharSequence mTitle; + private CharSequence mDescription; private boolean mShowNotification = true; - private String mMediaType; + private String mMimeType; private boolean mRoamingAllowed = true; private int mAllowedNetworkTypes = ~0; // default to all network types allowed private boolean mIsVisibleInDownloadsUi = true; @@ -300,12 +300,12 @@ public class DownloadManager { } /** - * Set the local destination for the downloaded data. Must be a file URI to a path on + * Set the local destination for the downloaded file. Must be a file URI to a path on * external storage, and the calling application must have the WRITE_EXTERNAL_STORAGE * permission. * - * By default, downloads are saved to a generated file in the download cache and may be - * deleted by the download manager at any time. + * By default, downloads are saved to a generated filename in the shared download cache and + * may be deleted by the system at any time to reclaim space. * * @return this object */ @@ -315,13 +315,62 @@ public class DownloadManager { } /** - * Set an HTTP header to be included with the download request. + * Set the local destination for the downloaded file to a path within the application's + * external files directory (as returned by {@link Context#getExternalFilesDir(String)}. + * + * @param context the {@link Context} to use in determining the external files directory + * @param dirType the directory type to pass to {@link Context#getExternalFilesDir(String)} + * @param subPath the path within the external directory, including the destination filename + * @return this object + */ + public Request setDestinationInExternalFilesDir(Context context, String dirType, + String subPath) { + setDestinationFromBase(context.getExternalFilesDir(dirType), subPath); + return this; + } + + /** + * Set the local destination for the downloaded file to a path within the public external + * storage directory (as returned by + * {@link Environment#getExternalStoragePublicDirectory(String)}. + * + * @param dirType the directory type to pass to + * {@link Environment#getExternalStoragePublicDirectory(String)} + * @param subPath the path within the external directory, including the destination filename + * @return this object + */ + public Request setDestinationInExternalPublicDir(String dirType, String subPath) { + setDestinationFromBase(Environment.getExternalStoragePublicDirectory(dirType), subPath); + return this; + } + + private void setDestinationFromBase(File base, String subPath) { + if (subPath == null) { + throw new NullPointerException("subPath cannot be null"); + } + mDestinationUri = Uri.withAppendedPath(Uri.fromFile(base), subPath); + } + + /** + * Add an HTTP header to be included with the download request. The header will be added to + * the end of the list. * @param header HTTP header name * @param value header value * @return this object + * @see HTTP/1.1 + * Message Headers */ - public Request setRequestHeader(String header, String value) { - mRequestHeaders.put(header, value); + public Request addRequestHeader(String header, String value) { + if (header == null) { + throw new NullPointerException("header cannot be null"); + } + if (header.contains(":")) { + throw new IllegalArgumentException("header may not contain ':'"); + } + if (value == null) { + value = ""; + } + mRequestHeaders.add(Pair.create(header, value)); return this; } @@ -329,7 +378,7 @@ public class DownloadManager { * Set the title of this download, to be displayed in notifications (if enabled) * @return this object */ - public Request setTitle(String title) { + public Request setTitle(CharSequence title) { mTitle = title; return this; } @@ -338,19 +387,20 @@ public class DownloadManager { * Set a description of this download, to be displayed in notifications (if enabled) * @return this object */ - public Request setDescription(String description) { + public Request setDescription(CharSequence description) { mDescription = description; return this; } /** - * Set the Internet Media Type of this download. This will override the media type declared + * Set the MIME content type of this download. This will override the content type declared * in the server's response. - * @see RFC 1590, defining Media Types + * @see HTTP/1.1 + * Media Types * @return this object */ - public Request setMediaType(String mediaType) { - mMediaType = mediaType; + public Request setMimeType(String mimeType) { + mMimeType = mimeType; return this; } @@ -428,7 +478,7 @@ public class DownloadManager { putIfNonNull(values, Downloads.COLUMN_TITLE, mTitle); putIfNonNull(values, Downloads.COLUMN_DESCRIPTION, mDescription); - putIfNonNull(values, Downloads.COLUMN_MIME_TYPE, mMediaType); + putIfNonNull(values, Downloads.COLUMN_MIME_TYPE, mMimeType); values.put(Downloads.COLUMN_VISIBILITY, mShowNotification ? Downloads.VISIBILITY_VISIBLE @@ -443,16 +493,16 @@ public class DownloadManager { private void encodeHttpHeaders(ContentValues values) { int index = 0; - for (Map.Entry entry : mRequestHeaders.entrySet()) { - String headerString = entry.getKey() + ": " + entry.getValue(); + for (Pair header : mRequestHeaders) { + String headerString = header.first + ": " + header.second; values.put(Downloads.Impl.RequestHeaders.INSERT_KEY_PREFIX + index, headerString); index++; } } - private void putIfNonNull(ContentValues contentValues, String key, String value) { + private void putIfNonNull(ContentValues contentValues, String key, Object value) { if (value != null) { - contentValues.put(key, value); + contentValues.put(key, value.toString()); } } } diff --git a/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java b/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java index 0293ded853c18..f21e7ac26c058 100644 --- a/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java +++ b/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java @@ -241,7 +241,7 @@ public class DownloadManagerTestApp extends DownloadManagerBaseTest { Uri remoteUri = getExternalFileUri(filename); Request request = new Request(remoteUri); - request.setMediaType(getMimeMapping(DownloadFileType.APK)); + request.setMimeType(getMimeMapping(DownloadFileType.APK)); dlRequest = mDownloadManager.enqueue(request);