Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(717)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java

Issue 2239133002: [Offline pages] Downloads UI: Adding bridge for issuing notifications (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@download-notifications
Patch Set: Addressing CR feedback Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index 51ba93b47da8936d015c196550edb6ad3fe22c1e..c524bd054120ff09180d70c4e5d828473e5868fd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -28,6 +28,7 @@ import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.init.BrowserParts;
import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
import org.chromium.chrome.browser.init.EmptyBrowserParts;
+import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadBridge;
import org.chromium.chrome.browser.util.IntentUtils;
import java.text.NumberFormat;
@@ -56,6 +57,8 @@ public class DownloadNotificationService extends Service {
"org.chromium.chrome.browser.download.DOWNLOAD_RESUME";
public static final String ACTION_DOWNLOAD_RESUME_ALL =
"org.chromium.chrome.browser.download.DOWNLOAD_RESUME_ALL";
+ public static final String ACTION_DOWNLOAD_OPEN =
+ "org.chromium.chrome.browser.download.DOWNLOAD_OPEN";
static final int INVALID_DOWNLOAD_PERCENTAGE = -1;
@VisibleForTesting
static final String PENDING_DOWNLOAD_NOTIFICATIONS = "PendingDownloadNotifications";
@@ -201,7 +204,7 @@ public class DownloadNotificationService extends Service {
*/
public void notifyDownloadProgress(String downloadGuid, String fileName, int percentage,
long timeRemainingInMillis, long startTime, boolean isOffTheRecord,
- boolean canDownloadWhileMetered) {
+ boolean canDownloadWhileMetered, boolean isOfflinePage) {
boolean indeterminate = percentage == INVALID_DOWNLOAD_PERCENTAGE;
NotificationCompat.Builder builder = buildNotification(
android.R.drawable.stat_sys_download, fileName, null);
@@ -220,9 +223,10 @@ public class DownloadNotificationService extends Service {
}
}
int notificationId = getNotificationId(downloadGuid);
+ int itemType = isOfflinePage ? DownloadSharedPreferenceEntry.ITEM_TYPE_OFFLINE_PAGE
+ : DownloadSharedPreferenceEntry.ITEM_TYPE_DOWNLOAD;
addOrReplaceSharedPreferenceEntry(new DownloadSharedPreferenceEntry(notificationId,
- isOffTheRecord, canDownloadWhileMetered, downloadGuid, fileName,
- DownloadSharedPreferenceEntry.ITEM_TYPE_DOWNLOAD));
+ isOffTheRecord, canDownloadWhileMetered, downloadGuid, fileName, itemType));
if (startTime > 0) builder.setWhen(startTime);
Intent cancelIntent = buildActionIntent(
ACTION_DOWNLOAD_CANCEL, notificationId, downloadGuid, fileName);
@@ -311,18 +315,24 @@ public class DownloadNotificationService extends Service {
* @return ID of the successful download notification. Used for removing the notification when
* user click on the snackbar.
*/
- public int notifyDownloadSuccessful(String downloadGuid, String fileName,
- long systemDownloadId) {
+ public int notifyDownloadSuccessful(
+ String downloadGuid, String fileName, long systemDownloadId, boolean isOfflinePage) {
int notificationId = getNotificationId(downloadGuid);
NotificationCompat.Builder builder = buildNotification(
android.R.drawable.stat_sys_download_done, fileName,
mContext.getResources().getString(R.string.download_notification_completed));
ComponentName component = new ComponentName(
mContext.getPackageName(), DownloadBroadcastReceiver.class.getName());
- Intent intent = new Intent(DownloadManager.ACTION_NOTIFICATION_CLICKED);
+ Intent intent;
+ if (isOfflinePage) {
+ intent =
+ buildActionIntent(ACTION_DOWNLOAD_OPEN, notificationId, downloadGuid, fileName);
+ } else {
+ intent = new Intent(DownloadManager.ACTION_NOTIFICATION_CLICKED);
+ long[] idArray = {systemDownloadId};
+ intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, idArray);
+ }
intent.setComponent(component);
- long[] idArray = {systemDownloadId};
- intent.putExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, idArray);
builder.setContentIntent(PendingIntent.getBroadcast(
mContext, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT));
updateNotification(notificationId, builder.build());
@@ -470,6 +480,8 @@ public class DownloadNotificationService extends Service {
&& (mDownloadSharedPreferenceEntries.isEmpty()
|| DownloadManagerService.hasDownloadManagerService())) {
return;
+ } else if (intent.getAction() == ACTION_DOWNLOAD_OPEN) {
+ // TODO(fgorski): Do we even need to do anything special here, before we launch Chrome?
}
BrowserParts parts = new EmptyBrowserParts() {
@@ -480,7 +492,10 @@ public class DownloadNotificationService extends Service {
@Override
public void finishNativeInitialization() {
- DownloadServiceDelegate downloadServiceDelegate = getDelegateForEntry(entry);
+ DownloadServiceDelegate downloadServiceDelegate =
+ getServiceDelegate(intent.getAction() == ACTION_DOWNLOAD_OPEN
+ ? DownloadSharedPreferenceEntry.ITEM_TYPE_OFFLINE_PAGE
+ : entry.itemType);
switch (intent.getAction()) {
case ACTION_DOWNLOAD_CANCEL:
// TODO(qinmin): Alternatively, we can delete the downloaded content on
@@ -498,17 +513,23 @@ public class DownloadNotificationService extends Service {
case ACTION_DOWNLOAD_RESUME:
notifyDownloadProgress(entry.downloadGuid, entry.fileName,
INVALID_DOWNLOAD_PERCENTAGE, 0, 0, entry.isOffTheRecord,
- entry.canDownloadWhileMetered);
+ entry.canDownloadWhileMetered, isOfflinePage(entry));
downloadServiceDelegate.resumeDownload(entry.buildDownloadItem(), true);
break;
case ACTION_DOWNLOAD_RESUME_ALL:
assert entry == null;
resumeAllPendingDownloads();
break;
+ case ACTION_DOWNLOAD_OPEN:
+ assert entry == null;
+ String guid = IntentUtils.safeGetStringExtra(intent, EXTRA_DOWNLOAD_GUID);
+ downloadServiceDelegate.openItem(guid);
+ break;
default:
Log.e(TAG, "Unrecognized intent action.", intent);
break;
}
+ downloadServiceDelegate.destroyServiceDelegate();
}
};
try {
@@ -523,11 +544,16 @@ public class DownloadNotificationService extends Service {
/**
* Gets appropriate download delegate that can handle interactions with download item referred
* to by the entry.
- * @param entry download entry for which the delegate is provided
+ * @param forOfflinePage Whether the service should deal with offline pages or downloads.
* @return delegate for interactions with the entry
*/
- DownloadServiceDelegate getDelegateForEntry(DownloadSharedPreferenceEntry entry) {
- // TODO(fgorski): handle cases where entry is an offline page once implemented.
+ DownloadServiceDelegate getServiceDelegate(int downloadItemType) {
+ if (downloadItemType == DownloadSharedPreferenceEntry.ITEM_TYPE_OFFLINE_PAGE) {
+ return OfflinePageDownloadBridge.getDownloadServiceDelegate();
+ }
+ if (downloadItemType != DownloadSharedPreferenceEntry.ITEM_TYPE_DOWNLOAD) {
+ Log.e(TAG, "Unrecognized intent type.", downloadItemType);
+ }
return DownloadManagerService.getDownloadManagerService(getApplicationContext());
}
@@ -551,7 +577,8 @@ public class DownloadNotificationService extends Service {
if (ACTION_DOWNLOAD_RESUME_ALL.equals(intent.getAction())) return true;
if (!ACTION_DOWNLOAD_CANCEL.equals(intent.getAction())
&& !ACTION_DOWNLOAD_RESUME.equals(intent.getAction())
- && !ACTION_DOWNLOAD_PAUSE.equals(intent.getAction())) {
+ && !ACTION_DOWNLOAD_PAUSE.equals(intent.getAction())
+ && !ACTION_DOWNLOAD_OPEN.equals(intent.getAction())) {
return false;
}
if (!intent.hasExtra(EXTRA_DOWNLOAD_NOTIFICATION_ID)
@@ -621,9 +648,11 @@ public class DownloadNotificationService extends Service {
DownloadSharedPreferenceEntry entry = mDownloadSharedPreferenceEntries.get(i);
if (mDownloadsInProgress.contains(entry.downloadGuid)) continue;
if (!entry.canDownloadWhileMetered && isNetworkMetered) continue;
- notifyDownloadProgress(entry.downloadGuid, entry.fileName,
- INVALID_DOWNLOAD_PERCENTAGE, 0, 0, false, entry.canDownloadWhileMetered);
- getDelegateForEntry(entry).resumeDownload(entry.buildDownloadItem(), false);
+ notifyDownloadProgress(entry.downloadGuid, entry.fileName, INVALID_DOWNLOAD_PERCENTAGE,
+ 0, 0, false, entry.canDownloadWhileMetered, isOfflinePage(entry));
+ DownloadServiceDelegate downloadServiceDelegate = getServiceDelegate(entry.itemType);
+ downloadServiceDelegate.resumeDownload(entry.buildDownloadItem(), false);
+ downloadServiceDelegate.destroyServiceDelegate();
}
}
@@ -689,6 +718,10 @@ public class DownloadNotificationService extends Service {
return notificationId;
}
+ private boolean isOfflinePage(DownloadSharedPreferenceEntry entry) {
+ return entry.itemType == DownloadSharedPreferenceEntry.ITEM_TYPE_OFFLINE_PAGE;
+ }
+
/**
* Format remaining time for the given millis, in the following format:
* 5 hours; will include 1 unit, can go down to seconds precision.

Powered by Google App Engine
This is Rietveld 408576698