You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.4 KiB
109 lines
3.4 KiB
10 years ago
|
/*
|
||
|
* Copyright 2014 A.C.R. Development
|
||
|
*/
|
||
|
package acr.browser.lightning;
|
||
|
|
||
|
import android.app.DownloadManager;
|
||
|
import android.content.Context;
|
||
|
import android.os.Environment;
|
||
|
import android.webkit.MimeTypeMap;
|
||
|
import android.webkit.URLUtil;
|
||
9 years ago
|
import android.widget.Toast;
|
||
10 years ago
|
|
||
|
import java.io.IOException;
|
||
9 years ago
|
import java.net.HttpURLConnection;
|
||
|
import java.net.URL;
|
||
10 years ago
|
|
||
|
/**
|
||
10 years ago
|
* This class is used to pull down the http headers of a given URL so that we
|
||
|
* can analyse the mimetype and make any correction needed before we give the
|
||
|
* URL to the download manager. This operation is needed when the user
|
||
|
* long-clicks on a link or image and we don't know the mimetype. If the user
|
||
|
* just clicks on the link, we will do the same steps of correcting the mimetype
|
||
|
* down in android.os.webkit.LoadListener rather than handling it here.
|
||
10 years ago
|
*/
|
||
10 years ago
|
public class FetchUrlMimeType extends Thread {
|
||
10 years ago
|
|
||
10 years ago
|
private Context mContext;
|
||
|
|
||
|
private DownloadManager.Request mRequest;
|
||
|
|
||
|
private String mUri;
|
||
|
|
||
|
private String mCookies;
|
||
|
|
||
|
private String mUserAgent;
|
||
10 years ago
|
|
||
10 years ago
|
public FetchUrlMimeType(Context context, DownloadManager.Request request, String uri,
|
||
|
String cookies, String userAgent) {
|
||
10 years ago
|
mContext = context.getApplicationContext();
|
||
|
mRequest = request;
|
||
|
mUri = uri;
|
||
|
mCookies = cookies;
|
||
|
mUserAgent = userAgent;
|
||
9 years ago
|
Toast.makeText(mContext, R.string.download_pending, Toast.LENGTH_SHORT).show();
|
||
10 years ago
|
}
|
||
10 years ago
|
|
||
10 years ago
|
@Override
|
||
|
public void run() {
|
||
|
// User agent is likely to be null, though the AndroidHttpClient
|
||
|
// seems ok with that.
|
||
|
String mimeType = null;
|
||
|
String contentDisposition = null;
|
||
9 years ago
|
HttpURLConnection connection = null;
|
||
10 years ago
|
try {
|
||
9 years ago
|
URL url = new URL(mUri);
|
||
|
connection = (HttpURLConnection) url.openConnection();
|
||
|
if (mCookies != null && mCookies.length() > 0) {
|
||
|
connection.addRequestProperty("Cookie", mCookies);
|
||
|
connection.setRequestProperty("User-Agent", mUserAgent);
|
||
|
}
|
||
|
connection.connect();
|
||
10 years ago
|
// We could get a redirect here, but if we do lets let
|
||
|
// the download manager take care of it, and thus trust that
|
||
|
// the server sends the right mimetype
|
||
9 years ago
|
if (connection.getResponseCode() == 200) {
|
||
|
String header = connection.getHeaderField("Content-Type");
|
||
10 years ago
|
if (header != null) {
|
||
9 years ago
|
mimeType = header;
|
||
10 years ago
|
final int semicolonIndex = mimeType.indexOf(';');
|
||
|
if (semicolonIndex != -1) {
|
||
|
mimeType = mimeType.substring(0, semicolonIndex);
|
||
|
}
|
||
|
}
|
||
9 years ago
|
String contentDispositionHeader = connection.getHeaderField("Content-Disposition");
|
||
10 years ago
|
if (contentDispositionHeader != null) {
|
||
9 years ago
|
contentDisposition = contentDispositionHeader;
|
||
10 years ago
|
}
|
||
|
}
|
||
|
} catch (IllegalArgumentException ex) {
|
||
9 years ago
|
if (connection != null)
|
||
|
connection.disconnect();
|
||
10 years ago
|
} catch (IOException ex) {
|
||
9 years ago
|
if (connection != null)
|
||
|
connection.disconnect();
|
||
10 years ago
|
} finally {
|
||
9 years ago
|
if (connection != null)
|
||
|
connection.disconnect();
|
||
10 years ago
|
}
|
||
10 years ago
|
|
||
10 years ago
|
if (mimeType != null) {
|
||
10 years ago
|
if (mimeType.equalsIgnoreCase("text/plain")
|
||
|
|| mimeType.equalsIgnoreCase("application/octet-stream")) {
|
||
|
String newMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
|
||
|
MimeTypeMap.getFileExtensionFromUrl(mUri));
|
||
10 years ago
|
if (newMimeType != null) {
|
||
|
mRequest.setMimeType(newMimeType);
|
||
|
}
|
||
|
}
|
||
10 years ago
|
String filename = URLUtil.guessFileName(mUri, contentDisposition, mimeType);
|
||
10 years ago
|
mRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
|
||
|
}
|
||
10 years ago
|
|
||
10 years ago
|
// Start the download
|
||
10 years ago
|
DownloadManager manager = (DownloadManager) mContext
|
||
|
.getSystemService(Context.DOWNLOAD_SERVICE);
|
||
10 years ago
|
manager.enqueue(mRequest);
|
||
|
}
|
||
10 years ago
|
}
|