1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.content.browser;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import android.content.Context;
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.CalledByNative;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.JNINamespace;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Java counterpart of android DownloadController.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Its a singleton class instantiated by the C++ DownloadController.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@JNINamespace("content")
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)public class DownloadController {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static final String LOGTAG = "DownloadController";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static DownloadController sInstance;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    /**
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     * Class for notifying the application that download has completed.
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     */
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    public interface DownloadNotificationService {
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        /**
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)         * Notify the host application that a download is finished.
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         * @param downloadInfo Information about the completed download.
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         */
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        void onDownloadCompleted(final DownloadInfo downloadInfo);
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        /**
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         * Notify the host application that a download is in progress.
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         * @param downloadInfo Information about the in-progress download.
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)         */
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        void onDownloadUpdated(final DownloadInfo downloadInfo);
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    private static DownloadNotificationService sDownloadNotificationService;
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static DownloadController getInstance() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (sInstance == null) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sInstance = new DownloadController();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return sInstance;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private DownloadController() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nativeInit();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static ContentViewDownloadDelegate downloadDelegateFromView(ContentViewCore view) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return view.getDownloadDelegate();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    public static void setDownloadNotificationService(DownloadNotificationService service) {
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        sDownloadNotificationService = service;
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Notifies the download delegate of a new GET download and passes all the information
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * needed to download the file.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The download delegate is expected to handle the download.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void newHttpGetDownload(ContentViewCore view, String url,
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            String userAgent, String contentDisposition, String mimeType,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            String cookie, String referer, String filename, long contentLength) {
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view);
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (downloadDelegate != null) {
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            DownloadInfo downloadInfo = new DownloadInfo.Builder()
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setUrl(url)
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setUserAgent(userAgent)
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setContentDisposition(contentDisposition)
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setMimeType(mimeType)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setCookie(cookie)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setReferer(referer)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    .setFileName(filename)
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setContentLength(contentLength)
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setIsGETRequest(true)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .build();
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            downloadDelegate.requestHttpGetDownload(downloadInfo);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Notifies the download delegate that a new download has started. This can
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * be either a POST download or a GET download with authentication.
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     * @param view ContentViewCore associated with the download item.
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     * @param filename File name of the downloaded file.
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     * @param mimeType Mime of the downloaded item.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    public void onDownloadStarted(ContentViewCore view, String filename, String mimeType) {
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (downloadDelegate != null) {
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            downloadDelegate.onDownloadStarted(filename, mimeType);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Notifies the download delegate that a download completed and passes along info about the
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * download. This can be either a POST download or a GET download with authentication.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public void onDownloadCompleted(Context context, String url, String mimeType,
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            String filename, String path, long contentLength, boolean successful, int downloadId) {
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (sDownloadNotificationService != null) {
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            DownloadInfo downloadInfo = new DownloadInfo.Builder()
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setUrl(url)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setMimeType(mimeType)
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setFileName(filename)
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setFilePath(path)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setContentLength(contentLength)
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setIsSuccessful(successful)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setDescription(filename)
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setDownloadId(downloadId)
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .setHasDownloadId(true)
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    .build();
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            sDownloadNotificationService.onDownloadCompleted(downloadInfo);
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /**
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     * Notifies the download delegate about progress of a download. Downloads that use Chrome
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     * network stack use custom notification to display the progress of downloads.
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     */
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    @CalledByNative
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public void onDownloadUpdated(Context context, String url, String mimeType,
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            String filename, String path, long contentLength, boolean successful, int downloadId,
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            int percentCompleted, long timeRemainingInMs) {
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (sDownloadNotificationService != null) {
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            DownloadInfo downloadInfo = new DownloadInfo.Builder()
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setUrl(url)
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setMimeType(mimeType)
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setFileName(filename)
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setFilePath(path)
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setContentLength(contentLength)
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setIsSuccessful(successful)
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setDescription(filename)
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setDownloadId(downloadId)
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setHasDownloadId(true)
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setPercentCompleted(percentCompleted)
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .setTimeRemainingInMillis(timeRemainingInMs)
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            .build();
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            sDownloadNotificationService.onDownloadUpdated(downloadInfo);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Notifies the download delegate that a dangerous download started.
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @CalledByNative
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void onDangerousDownload(ContentViewCore view, String filename,
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            int downloadId) {
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ContentViewDownloadDelegate downloadDelegate = downloadDelegateFromView(view);
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (downloadDelegate != null) {
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            downloadDelegate.onDangerousDownload(filename, downloadId);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // native methods
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native void nativeInit();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
169