Chromium Code Reviews| 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 6650be754492f4e727a3611fb3330abf78a109ae..5b0bed4729bb4d507e85507eb646d6575fb15734 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 |
| @@ -53,14 +53,18 @@ public class DownloadNotificationService extends Service { |
| static final int INVALID_DOWNLOAD_PERCENTAGE = -1; |
| @VisibleForTesting |
| static final String PENDING_DOWNLOAD_NOTIFICATIONS = "PendingDownloadNotifications"; |
| - private static final String NOTIFICATION_NAMESPACE = "DownloadNotificationService"; |
| + static final String NOTIFICATION_NAMESPACE = "DownloadNotificationService"; |
|
Ted C
2016/05/20 00:02:13
rename DEPRECATED?
qinmin
2016/05/23 23:03:14
There is no need to deprecate it. See reasons belo
|
| private static final String TAG = "DownloadNotification"; |
| + private static final String NEXT_DOWNLOAD_NOTIFICATION_ID = "NextDownloadNotificationId"; |
|
Ted C
2016/05/20 00:02:13
Instead of Next, I would use V2
qinmin
2016/05/23 23:03:13
Since I am keeping the namespace, V2 is probably n
Ted C
2016/05/23 23:15:23
got it...I was thinking it was a namespace...do'h
|
| + // Notification Id starting value, to avoid conflicts from IDs used in prior versions. |
| + private static final int STARTING_NOTIFICATION_ID = 1000000; |
|
Ted C
2016/05/20 00:02:13
any reason we don't use a different notification n
qinmin
2016/05/23 23:03:14
If we clear all existing notifications, we have to
|
| private final IBinder mBinder = new LocalBinder(); |
| private final List<DownloadSharedPreferenceEntry> mDownloadSharedPreferenceEntries = |
| new ArrayList<DownloadSharedPreferenceEntry>(); |
| private NotificationManager mNotificationManager; |
| private SharedPreferences mSharedPrefs; |
| private Context mContext; |
| + private int mNextNotificationId; |
| /** |
| * Class for clients to access. |
| @@ -98,6 +102,9 @@ public class DownloadNotificationService extends Service { |
| pauseAllDownloads(); |
| stopSelf(); |
| } |
| + mNextNotificationId = mSharedPrefs.getInt( |
| + NEXT_DOWNLOAD_NOTIFICATION_ID, STARTING_NOTIFICATION_ID); |
|
Ted C
2016/05/20 00:02:13
+4 indent
qinmin
2016/05/23 23:03:14
Done.
|
| + |
| } |
| @Override |
| @@ -118,7 +125,6 @@ public class DownloadNotificationService extends Service { |
| /** |
| * Add a in-progress download notification. |
| - * @param notificationId Notification ID of the download. |
| * @param downloadGuid GUID of the download. |
| * @param fileName File name of the download. |
| * @param percentage Percentage completed. Value should be between 0 to 100 if |
| @@ -128,8 +134,8 @@ public class DownloadNotificationService extends Service { |
| * @param isResumable Whether the download can be resumed. |
| * @param canDownloadWhileMetered Whether the download can happen in metered network. |
| */ |
| - public void notifyDownloadProgress(int notificationId, String downloadGuid, String fileName, |
| - int percentage, long timeRemainingInMillis, long startTime, boolean isResumable, |
| + public void notifyDownloadProgress(String downloadGuid, String fileName, int percentage, |
| + long timeRemainingInMillis, long startTime, boolean isResumable, |
| boolean canDownloadWhileMetered) { |
| boolean indeterminate = percentage == INVALID_DOWNLOAD_PERCENTAGE; |
| NotificationCompat.Builder builder = buildNotification( |
| @@ -142,6 +148,7 @@ public class DownloadNotificationService extends Service { |
| String duration = getDurationString(timeRemainingInMillis); |
| builder.setContentText(duration).setContentInfo(percentText); |
| } |
| + int notificationId = getNotificationId(downloadGuid); |
| addOrReplaceSharedPreferenceEntry(new DownloadSharedPreferenceEntry( |
| notificationId, isResumable, canDownloadWhileMetered, downloadGuid, fileName)); |
| if (startTime > 0) builder.setWhen(startTime); |
| @@ -169,15 +176,26 @@ public class DownloadNotificationService extends Service { |
| /** |
| * Cancel a download notification. |
| - * @param notificationId Notification ID of the download. |
| + * @notificationId Notification ID of the download |
| * @param downloadGuid GUID of the download. |
| */ |
| - public void cancelNotification(int notificationId, String downloadGuid) { |
| - mNotificationManager.cancel(NOTIFICATION_NAMESPACE, notificationId); |
| + @VisibleForTesting |
| + void cancelNotification(int notificaitonId, String downloadGuid) { |
| + mNotificationManager.cancel(NOTIFICATION_NAMESPACE, notificaitonId); |
| removeSharedPreferenceEntry(downloadGuid); |
| } |
| /** |
| + * Called when a download is canceled. |
| + * @param downloadGuid GUID of the download. |
| + */ |
| + public void notifyDownloadCanceled(String downloadGuid) { |
| + DownloadSharedPreferenceEntry entry = getDownloadSharedPreferenceEntry(downloadGuid); |
| + if (entry == null) return; |
| + cancelNotification(entry.notificationId, downloadGuid); |
| + } |
| + |
| + /** |
| * Change a download notification to paused state. |
| * @param downloadGuid GUID of the download. |
| * @param isAutoResumable whether download is can be resumed automatically. |
| @@ -210,13 +228,14 @@ public class DownloadNotificationService extends Service { |
| /** |
| * Add a download successful notification. |
| - * @param notificationId Notification ID of the download. |
| * @param downloadGuid GUID of the download. |
| * @param fileName GUID of the download. |
| * @param intent Intent to launch when clicking the notification. |
| + * @return ID of the successful download notification. Used for removing the notification when |
| + * user click on the snackbar. |
| */ |
| - public void notifyDownloadSuccessful(int notificationId, String downloadGuid, String fileName, |
| - Intent intent) { |
| + public int notifyDownloadSuccessful(String downloadGuid, String fileName, Intent intent) { |
| + int notificationId = getNotificationId(downloadGuid); |
| NotificationCompat.Builder builder = buildNotification( |
| android.R.drawable.stat_sys_download_done, fileName, |
| mContext.getResources().getString(R.string.download_notification_completed)); |
| @@ -226,15 +245,16 @@ public class DownloadNotificationService extends Service { |
| } |
| updateNotification(notificationId, builder.build()); |
| removeSharedPreferenceEntry(downloadGuid); |
| + return notificationId; |
| } |
| /** |
| * Add a download failed notification. |
| - * @param notificationId Notification ID of the download. |
| * @param downloadGuid GUID of the download. |
| * @param fileName GUID of the download. |
| */ |
| - public void notifyDownloadFailed(int notificationId, String downloadGuid, String fileName) { |
| + public void notifyDownloadFailed(String downloadGuid, String fileName) { |
| + int notificationId = getNotificationId(downloadGuid); |
| NotificationCompat.Builder builder = buildNotification( |
| android.R.drawable.stat_sys_download_done, fileName, |
| mContext.getResources().getString(R.string.download_notification_failed)); |
| @@ -342,9 +362,8 @@ public class DownloadNotificationService extends Service { |
| break; |
| case ACTION_DOWNLOAD_RESUME: |
| assert item != null; |
| - notifyDownloadProgress(notificationId, guid, fileName, |
| - INVALID_DOWNLOAD_PERCENTAGE, 0, 0, true, |
| - canDownloadWhileMetered); |
| + notifyDownloadProgress(guid, fileName, INVALID_DOWNLOAD_PERCENTAGE, 0, 0, |
| + true, canDownloadWhileMetered); |
| service.resumeDownload(item, true); |
| break; |
| default: |
| @@ -451,8 +470,8 @@ public class DownloadNotificationService extends Service { |
| for (int i = 0; i < mDownloadSharedPreferenceEntries.size(); ++i) { |
| DownloadSharedPreferenceEntry entry = mDownloadSharedPreferenceEntries.get(i); |
| if (!entry.canDownloadWhileMetered && isNetworkMetered) continue; |
| - notifyDownloadProgress(entry.notificationId, entry.downloadGuid, entry.fileName, |
| - INVALID_DOWNLOAD_PERCENTAGE, 0, 0, true, entry.canDownloadWhileMetered); |
| + notifyDownloadProgress(entry.downloadGuid, entry.fileName, INVALID_DOWNLOAD_PERCENTAGE, |
| + 0, 0, true, entry.canDownloadWhileMetered); |
| service.resumeDownload(entry.buildDownloadItem(), false); |
| } |
| } |
| @@ -500,4 +519,20 @@ public class DownloadNotificationService extends Service { |
| DownloadManagerService.storeDownloadInfo( |
| mSharedPrefs, PENDING_DOWNLOAD_NOTIFICATIONS, entries); |
| } |
| + |
| + /** |
| + * Return the notification ID for the given download GUID. |
| + * @return notification ID to be used. |
| + */ |
| + private int getNotificationId(String downloadGuid) { |
| + DownloadSharedPreferenceEntry entry = getDownloadSharedPreferenceEntry(downloadGuid); |
| + if (entry != null) return entry.notificationId; |
| + int notificationId = mNextNotificationId; |
| + mNextNotificationId = mNextNotificationId == Integer.MAX_VALUE |
| + ? STARTING_NOTIFICATION_ID : mNextNotificationId + 1; |
| + SharedPreferences.Editor editor = mSharedPrefs.edit(); |
| + editor.putInt(NEXT_DOWNLOAD_NOTIFICATION_ID, mNextNotificationId); |
| + editor.apply(); |
| + return notificationId; |
| + } |
| } |