// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.content.browser; import android.content.Context; import org.chromium.base.CalledByNative; import org.chromium.base.JNINamespace; /** * Java counterpart of android DownloadController. * * Its a singleton class instantiated by the C++ DownloadController. */ @JNINamespace("content") public class DownloadController { private static final String LOGTAG = "DownloadController"; private static DownloadController sInstance; /** * Class for notifying the application that download has completed. */ public interface DownloadNotificationService { /** * Notify the host application that a download is finished. * @param downloadInfo Information about the completed download. */ void onDownloadCompleted(final DownloadInfo downloadInfo); /** * Notify the host application that a download is in progress. * @param downloadInfo Information about the in-progress download. */ void onDownloadUpdated(final DownloadInfo downloadInfo); } private static DownloadNotificationService sDownloadNotificationService; @CalledByNative public static DownloadController getInstance() { if (sInstance == null) { sInstance = new DownloadController(); } return sInstance; } private DownloadController() { nativeInit(); } private static ContentViewDownloadDelegate downloadDelegateFromView(ContentViewCore view) { return view.getDownloadDelegate(); } public static void setDownloadNotificationService(DownloadNotificationService service) { sDownloadNotificationService = service; } /** * Notifies the download delegate of a new GET download and passes all the information * needed to download the file. * * The download delegate is expected to handle the download. */ @CalledByNative public void newHttpGetDownload(ContentViewCore view, String url, String userAgent, String contentDisposition, String mimeType, String cookie, String referer, String filename, long contentLength) { ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view); if (downloadDelegate != null) { DownloadInfo downloadInfo = new DownloadInfo.Builder() .setUrl(url) .setUserAgent(userAgent) .setContentDisposition(contentDisposition) .setMimeType(mimeType) .setCookie(cookie) .setReferer(referer) .setFileName(filename) .setContentLength(contentLength) .setIsGETRequest(true) .build(); downloadDelegate.requestHttpGetDownload(downloadInfo); } } /** * Notifies the download delegate that a new download has started. This can * be either a POST download or a GET download with authentication. * @param view ContentViewCore associated with the download item. * @param filename File name of the downloaded file. * @param mimeType Mime of the downloaded item. */ @CalledByNative public void onDownloadStarted(ContentViewCore view, String filename, String mimeType) { ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view); if (downloadDelegate != null) { downloadDelegate.onDownloadStarted(filename, mimeType); } } /** * Notifies the download delegate that a download completed and passes along info about the * download. This can be either a POST download or a GET download with authentication. */ @CalledByNative public void onDownloadCompleted(Context context, String url, String mimeType, String filename, String path, long contentLength, boolean successful, int downloadId) { if (sDownloadNotificationService != null) { DownloadInfo downloadInfo = new DownloadInfo.Builder() .setUrl(url) .setMimeType(mimeType) .setFileName(filename) .setFilePath(path) .setContentLength(contentLength) .setIsSuccessful(successful) .setDescription(filename) .setDownloadId(downloadId) .setHasDownloadId(true) .build(); sDownloadNotificationService.onDownloadCompleted(downloadInfo); } } /** * Notifies the download delegate about progress of a download. Downloads that use Chrome * network stack use custom notification to display the progress of downloads. */ @CalledByNative public void onDownloadUpdated(Context context, String url, String mimeType, String filename, String path, long contentLength, boolean successful, int downloadId, int percentCompleted, long timeRemainingInMs) { if (sDownloadNotificationService != null) { DownloadInfo downloadInfo = new DownloadInfo.Builder() .setUrl(url) .setMimeType(mimeType) .setFileName(filename) .setFilePath(path) .setContentLength(contentLength) .setIsSuccessful(successful) .setDescription(filename) .setDownloadId(downloadId) .setHasDownloadId(true) .setPercentCompleted(percentCompleted) .setTimeRemainingInMillis(timeRemainingInMs) .build(); sDownloadNotificationService.onDownloadUpdated(downloadInfo); } } /** * Notifies the download delegate that a dangerous download started. */ @CalledByNative public void onDangerousDownload(ContentViewCore view, String filename, int downloadId) { ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view); if (downloadDelegate != null) { downloadDelegate.onDangerousDownload(filename, downloadId); } } // native methods private native void nativeInit(); }