Home | History | Annotate | Download | only in browser
      1 // Copyright 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 package org.chromium.content.browser;
      6 
      7 import android.content.Context;
      8 
      9 import org.chromium.base.CalledByNative;
     10 import org.chromium.base.JNINamespace;
     11 
     12 /**
     13  * Java counterpart of android DownloadController.
     14  *
     15  * Its a singleton class instantiated by the C++ DownloadController.
     16  */
     17 @JNINamespace("content")
     18 public class DownloadController {
     19     private static final String LOGTAG = "DownloadController";
     20     private static final DownloadController sInstance = new DownloadController();
     21 
     22     /**
     23      * Class for notifying the application that download has completed.
     24      */
     25     public interface DownloadNotificationService {
     26         /**
     27          * Notify the host application that a download is finished.
     28          * @param downloadInfo Information about the completed download.
     29          */
     30         void onDownloadCompleted(final DownloadInfo downloadInfo);
     31 
     32         /**
     33          * Notify the host application that a download is in progress.
     34          * @param downloadInfo Information about the in-progress download.
     35          */
     36         void onDownloadUpdated(final DownloadInfo downloadInfo);
     37     }
     38 
     39     private static DownloadNotificationService sDownloadNotificationService;
     40 
     41     @CalledByNative
     42     public static DownloadController getInstance() {
     43         return sInstance;
     44     }
     45 
     46     private DownloadController() {
     47         nativeInit();
     48     }
     49 
     50     private static ContentViewDownloadDelegate downloadDelegateFromView(ContentViewCore view) {
     51         return view.getDownloadDelegate();
     52     }
     53 
     54     public static void setDownloadNotificationService(DownloadNotificationService service) {
     55         sDownloadNotificationService = service;
     56     }
     57 
     58     /**
     59      * Notifies the download delegate of a new GET download and passes all the information
     60      * needed to download the file.
     61      *
     62      * The download delegate is expected to handle the download.
     63      */
     64     @CalledByNative
     65     public void newHttpGetDownload(ContentViewCore view, String url,
     66             String userAgent, String contentDisposition, String mimeType,
     67             String cookie, String referer, boolean hasUserGesture,
     68             String filename, long contentLength) {
     69         ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view);
     70 
     71         if (downloadDelegate != null) {
     72             DownloadInfo downloadInfo = new DownloadInfo.Builder()
     73                     .setUrl(url)
     74                     .setUserAgent(userAgent)
     75                     .setContentDisposition(contentDisposition)
     76                     .setMimeType(mimeType)
     77                     .setCookie(cookie)
     78                     .setReferer(referer)
     79                     .setHasUserGesture(hasUserGesture)
     80                     .setFileName(filename)
     81                     .setContentLength(contentLength)
     82                     .setIsGETRequest(true)
     83                     .build();
     84             downloadDelegate.requestHttpGetDownload(downloadInfo);
     85         }
     86     }
     87 
     88     /**
     89      * Notifies the download delegate that a new download has started. This can
     90      * be either a POST download or a GET download with authentication.
     91      * @param view ContentViewCore associated with the download item.
     92      * @param filename File name of the downloaded file.
     93      * @param mimeType Mime of the downloaded item.
     94      */
     95     @CalledByNative
     96     public void onDownloadStarted(ContentViewCore view, String filename, String mimeType) {
     97         ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view);
     98 
     99         if (downloadDelegate != null) {
    100             downloadDelegate.onDownloadStarted(filename, mimeType);
    101         }
    102     }
    103 
    104     /**
    105      * Notifies the download delegate that a download completed and passes along info about the
    106      * download. This can be either a POST download or a GET download with authentication.
    107      */
    108     @CalledByNative
    109     public void onDownloadCompleted(Context context, String url, String mimeType,
    110             String filename, String path, long contentLength, boolean successful, int downloadId) {
    111         if (sDownloadNotificationService != null) {
    112             DownloadInfo downloadInfo = new DownloadInfo.Builder()
    113                     .setUrl(url)
    114                     .setMimeType(mimeType)
    115                     .setFileName(filename)
    116                     .setFilePath(path)
    117                     .setContentLength(contentLength)
    118                     .setIsSuccessful(successful)
    119                     .setDescription(filename)
    120                     .setDownloadId(downloadId)
    121                     .setHasDownloadId(true)
    122                     .build();
    123             sDownloadNotificationService.onDownloadCompleted(downloadInfo);
    124         }
    125     }
    126 
    127     /**
    128      * Notifies the download delegate about progress of a download. Downloads that use Chrome
    129      * network stack use custom notification to display the progress of downloads.
    130      */
    131     @CalledByNative
    132     public void onDownloadUpdated(Context context, String url, String mimeType,
    133             String filename, String path, long contentLength, boolean successful, int downloadId,
    134             int percentCompleted, long timeRemainingInMs) {
    135         if (sDownloadNotificationService != null) {
    136             DownloadInfo downloadInfo = new DownloadInfo.Builder()
    137             .setUrl(url)
    138             .setMimeType(mimeType)
    139             .setFileName(filename)
    140             .setFilePath(path)
    141             .setContentLength(contentLength)
    142             .setIsSuccessful(successful)
    143             .setDescription(filename)
    144             .setDownloadId(downloadId)
    145             .setHasDownloadId(true)
    146             .setPercentCompleted(percentCompleted)
    147             .setTimeRemainingInMillis(timeRemainingInMs)
    148             .build();
    149             sDownloadNotificationService.onDownloadUpdated(downloadInfo);
    150         }
    151     }
    152 
    153     /**
    154      * Notifies the download delegate that a dangerous download started.
    155      */
    156     @CalledByNative
    157     public void onDangerousDownload(ContentViewCore view, String filename,
    158             int downloadId) {
    159         ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view);
    160         if (downloadDelegate != null) {
    161             downloadDelegate.onDangerousDownload(filename, downloadId);
    162         }
    163     }
    164 
    165     // native methods
    166     private native void nativeInit();
    167 }
    168