Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / public / android / java / src / org / chromium / content / browser / DownloadController.java
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 }