Search in sources :

Example 1 with UIController

use of acr.browser.lightning.controller.UIController in project Lightning-Browser by anthonycr.

the class DownloadHandler method onDownloadStartNoStream.

/**
 * Notify the host application a download should be done, even if there is a
 * streaming viewer available for thise type.
 *
 * @param context            The context in which the download is requested.
 * @param url                The full url to the content that should be downloaded
 * @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 contentSize        The size of the content
 */
/* package */
private void onDownloadStartNoStream(@NonNull final Activity context, @NonNull UserPreferences preferences, @NonNull String url, String userAgent, String contentDisposition, @Nullable String mimetype, @NonNull String contentSize) {
    final String filename = URLUtil.guessFileName(url, contentDisposition, mimetype);
    // Check to see if we have an SDCard
    String status = Environment.getExternalStorageState();
    if (!status.equals(Environment.MEDIA_MOUNTED)) {
        int title;
        String msg;
        // Check to see if the SDCard is busy, same as the music app
        if (status.equals(Environment.MEDIA_SHARED)) {
            msg = context.getString(R.string.download_sdcard_busy_dlg_msg);
            title = R.string.download_sdcard_busy_dlg_title;
        } else {
            msg = context.getString(R.string.download_no_sdcard_dlg_msg);
            title = R.string.download_no_sdcard_dlg_title;
        }
        Dialog dialog = new AlertDialog.Builder(context).setTitle(title).setIcon(android.R.drawable.ic_dialog_alert).setMessage(msg).setPositiveButton(R.string.action_ok, null).show();
        BrowserDialog.setDialogSize(context, dialog);
        return;
    }
    // java.net.URI is a lot stricter than KURL so we have to encode some
    // extra characters. Fix for b 2538060 and b 1634719
    WebAddress webAddress;
    try {
        webAddress = new WebAddress(url);
        webAddress.setPath(encodePath(webAddress.getPath()));
    } catch (Exception e) {
        // This only happens for very bad urls, we want to catch the
        // exception here
        logger.log(TAG, "Exception while trying to parse url '" + url + '\'', e);
        ActivityExtensions.snackbar(context, R.string.problem_download);
        return;
    }
    String addressString = webAddress.toString();
    Uri uri = Uri.parse(addressString);
    final DownloadManager.Request request;
    try {
        request = new DownloadManager.Request(uri);
    } catch (IllegalArgumentException e) {
        ActivityExtensions.snackbar(context, R.string.cannot_download);
        return;
    }
    // set downloaded file destination to /sdcard/Download.
    // or, should it be set to one of several Environment.DIRECTORY* dirs
    // depending on mimetype?
    String location = preferences.getDownloadDirectory();
    location = FileUtils.addNecessarySlashes(location);
    Uri downloadFolder = Uri.parse(location);
    if (!isWriteAccessAvailable(downloadFolder)) {
        ActivityExtensions.snackbar(context, R.string.problem_location_download);
        return;
    }
    String newMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(Utils.guessFileExtension(filename));
    logger.log(TAG, "New mimetype: " + newMimeType);
    request.setMimeType(newMimeType);
    request.setDestinationUri(Uri.parse(Constants.FILE + location + filename));
    // let this downloaded file be scanned by MediaScanner - so that it can
    // show up in Gallery app, for example.
    request.setVisibleInDownloadsUi(true);
    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_REQUEST_HEADER, cookies);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    // noinspection VariableNotUsedInsideIf
    if (mimetype == null) {
        logger.log(TAG, "Mimetype is null");
        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
        final Disposable disposable = new FetchUrlMimeType(downloadManager, request, addressString, cookies, userAgent).create().subscribeOn(networkScheduler).observeOn(mainScheduler).subscribe(result -> {
            switch(result) {
                case FAILURE_ENQUEUE:
                    ActivityExtensions.snackbar(context, R.string.cannot_download);
                    break;
                case FAILURE_LOCATION:
                    ActivityExtensions.snackbar(context, R.string.problem_location_download);
                    break;
                case SUCCESS:
                    ActivityExtensions.snackbar(context, R.string.download_pending);
                    break;
            }
        });
    } else {
        logger.log(TAG, "Valid mimetype, attempting to download");
        try {
            downloadManager.enqueue(request);
        } catch (IllegalArgumentException e) {
            // Probably got a bad URL or something
            logger.log(TAG, "Unable to enqueue request", e);
            ActivityExtensions.snackbar(context, R.string.cannot_download);
        } catch (SecurityException e) {
            // TODO write a download utility that downloads files rather than rely on the system
            // because the system can only handle Environment.getExternal... as a path
            ActivityExtensions.snackbar(context, R.string.problem_location_download);
        }
        ActivityExtensions.snackbar(context, context.getString(R.string.download_pending) + ' ' + filename);
    }
    // save download in database
    UIController browserActivity = (UIController) context;
    LightningView view = browserActivity.getTabModel().getCurrentTab();
    if (view != null && !view.isIncognito()) {
        downloadsRepository.addDownloadIfNotExists(new DownloadEntry(url, filename, contentSize)).subscribeOn(databaseScheduler).subscribe(aBoolean -> {
            if (!aBoolean) {
                logger.log(TAG, "error saving download to database");
            }
        });
    }
}
Also used : AlertDialog(androidx.appcompat.app.AlertDialog) Disposable(io.reactivex.disposables.Disposable) Uri(android.net.Uri) DownloadManager(android.app.DownloadManager) IOException(java.io.IOException) ActivityNotFoundException(android.content.ActivityNotFoundException) UIController(acr.browser.lightning.controller.UIController) AlertDialog(androidx.appcompat.app.AlertDialog) Dialog(android.app.Dialog) BrowserDialog(acr.browser.lightning.dialog.BrowserDialog) LightningView(acr.browser.lightning.view.LightningView) DownloadEntry(acr.browser.lightning.database.downloads.DownloadEntry)

Aggregations

UIController (acr.browser.lightning.controller.UIController)1 DownloadEntry (acr.browser.lightning.database.downloads.DownloadEntry)1 BrowserDialog (acr.browser.lightning.dialog.BrowserDialog)1 LightningView (acr.browser.lightning.view.LightningView)1 Dialog (android.app.Dialog)1 DownloadManager (android.app.DownloadManager)1 ActivityNotFoundException (android.content.ActivityNotFoundException)1 Uri (android.net.Uri)1 AlertDialog (androidx.appcompat.app.AlertDialog)1 Disposable (io.reactivex.disposables.Disposable)1 IOException (java.io.IOException)1