Move download requests to the background.
Bug:3189668
Do not create a DownloadHandler since the methods can all be
static.
Do not pass the length to DownloadHandler, since it is no longer
used.
Change-Id: I280160f62906d1acb263b45fde57062210005a0a
diff --git a/src/com/android/browser/DownloadHandler.java b/src/com/android/browser/DownloadHandler.java
index b833bd7..cbf26f4 100644
--- a/src/com/android/browser/DownloadHandler.java
+++ b/src/com/android/browser/DownloadHandler.java
@@ -29,6 +29,7 @@
import android.net.Uri;
import android.net.WebAddress;
import android.os.Environment;
+import android.text.TextUtils;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.URLUtil;
@@ -44,23 +45,17 @@
private static final String LOGTAG = "DLHandler";
- Activity mActivity;
-
- public DownloadHandler(Activity activity) {
- mActivity = activity;
- }
-
/**
* Notify the host application a download should be done, or that
* the data should be streamed if a streaming viewer is available.
+ * @param activity Activity requesting the download.
* @param url The full url to the content that should be downloaded
- * @param contentDisposition Content-disposition http header, if
- * present.
+ * @param userAgent User agent of the downloading application.
+ * @param contentDisposition Content-disposition http header, if present.
* @param mimetype The mimetype of the content reported by the server
- * @param contentLength The file size reported by the server
*/
- public void onDownloadStart(String url, String userAgent,
- String contentDisposition, String mimetype, long contentLength) {
+ public static void onDownloadStart(Activity activity, String url,
+ String userAgent, String contentDisposition, String mimetype) {
// if we're dealing wih A/V content that's not explicitly marked
// for download, check if it's streamable.
if (contentDisposition == null
@@ -70,10 +65,10 @@
// that matches.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), mimetype);
- ResolveInfo info = mActivity.getPackageManager().resolveActivity(intent,
+ ResolveInfo info = activity.getPackageManager().resolveActivity(intent,
PackageManager.MATCH_DEFAULT_ONLY);
if (info != null) {
- ComponentName myName = mActivity.getComponentName();
+ ComponentName myName = activity.getComponentName();
// If we resolved to ourselves, we don't want to attempt to
// load the url only to try and download it again.
if (!myName.getPackageName().equals(
@@ -83,7 +78,7 @@
// someone (other than us) knows how to handle this mime
// type with this scheme, don't download.
try {
- mActivity.startActivity(intent);
+ activity.startActivity(intent);
return;
} catch (ActivityNotFoundException ex) {
if (LOGD_ENABLED) {
@@ -97,7 +92,8 @@
}
}
}
- onDownloadStartNoStream(url, userAgent, contentDisposition, mimetype, contentLength);
+ onDownloadStartNoStream(activity, url, userAgent, contentDisposition,
+ mimetype);
}
// This is to work around the fact that java.net.URI throws Exceptions
@@ -133,14 +129,15 @@
/**
* Notify the host application a download should be done, even if there
* is a streaming viewer available for thise type.
+ * @param activity Activity requesting the download.
* @param url The full url to the content that should be downloaded
- * @param contentDisposition Content-disposition http header, if
- * present.
+ * @param userAgent User agent of the downloading application.
+ * @param contentDisposition Content-disposition http header, if present.
* @param mimetype The mimetype of the content reported by the server
- * @param contentLength The file size reported by the server
*/
- /*package */ void onDownloadStartNoStream(String url, String userAgent,
- String contentDisposition, String mimetype, long contentLength) {
+ /*package */ static void onDownloadStartNoStream(Activity activity,
+ String url, String userAgent, String contentDisposition,
+ String mimetype) {
String filename = URLUtil.guessFileName(url,
contentDisposition, mimetype);
@@ -153,14 +150,14 @@
// Check to see if the SDCard is busy, same as the music app
if (status.equals(Environment.MEDIA_SHARED)) {
- msg = mActivity.getString(R.string.download_sdcard_busy_dlg_msg);
+ msg = activity.getString(R.string.download_sdcard_busy_dlg_msg);
title = R.string.download_sdcard_busy_dlg_title;
} else {
- msg = mActivity.getString(R.string.download_no_sdcard_dlg_msg, filename);
+ msg = activity.getString(R.string.download_no_sdcard_dlg_msg, filename);
title = R.string.download_no_sdcard_dlg_title;
}
- new AlertDialog.Builder(mActivity)
+ new AlertDialog.Builder(activity)
.setTitle(title)
.setIcon(android.R.drawable.ic_dialog_alert)
.setMessage(msg)
@@ -184,34 +181,37 @@
String addressString = webAddress.toString();
Uri uri = Uri.parse(addressString);
- DownloadManager.Request request = new DownloadManager.Request(uri);
+ final DownloadManager.Request request = new DownloadManager.Request(uri);
request.setMimeType(mimetype);
- request.setDestinationInExternalFilesDir(mActivity, null, filename);
+ request.setDestinationInExternalFilesDir(activity, null, filename);
// let this downloaded file be scanned by MediaScanner - so that it can
// show up in Gallery app, for example.
request.allowScanningByMediaScanner();
request.setDescription(webAddress.getHost());
+ // XXX: Have to use the old url since the cookies were stored using the
+ // old percent-encoded url.
String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie", cookies);
request.setNotificationVisibility(
DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
if (mimetype == null) {
- ContentValues values = new ContentValues();
- values.put(FetchUrlMimeType.URI, addressString);
- // XXX: Have to use the old url since the cookies were stored using the
- // old percent-encoded url.
- values.put(FetchUrlMimeType.COOKIE_DATA, cookies);
- values.put(FetchUrlMimeType.USER_AGENT, userAgent);
-
+ if (TextUtils.isEmpty(addressString)) {
+ return;
+ }
// We must have long pressed on a link or image to download it. We
// are not sure of the mimetype in this case, so do a head request
- new FetchUrlMimeType(mActivity, request).execute(values);
+ new FetchUrlMimeType(activity, request, addressString, cookies,
+ userAgent).start();
} else {
- DownloadManager manager
- = (DownloadManager) mActivity.getSystemService(Context.DOWNLOAD_SERVICE);
- manager.enqueue(request);
+ final DownloadManager manager
+ = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
+ new Thread("Browser download") {
+ public void run() {
+ manager.enqueue(request);
+ }
+ }.start();
}
- Toast.makeText(mActivity, R.string.download_pending, Toast.LENGTH_SHORT)
+ Toast.makeText(activity, R.string.download_pending, Toast.LENGTH_SHORT)
.show();
}