| Index: chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerDelegate.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerDelegate.java
|
| index 3e5221e5f0a190ce2e5fb0f4b5e6f70dc23ecdeb..d7e274e3d01eff3411d46bfbb9e337fee13bfb87 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerDelegate.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerDelegate.java
|
| @@ -6,12 +6,14 @@ package org.chromium.chrome.browser.download;
|
|
|
| import android.app.DownloadManager;
|
| import android.content.Context;
|
| +import android.content.SharedPreferences;
|
| import android.database.Cursor;
|
| import android.net.Uri;
|
| import android.os.AsyncTask;
|
| import android.os.Build;
|
| import android.support.v4.app.NotificationManagerCompat;
|
|
|
| +import org.chromium.base.ContextUtils;
|
| import org.chromium.base.Log;
|
|
|
| import java.lang.reflect.InvocationTargetException;
|
| @@ -22,6 +24,8 @@ import java.lang.reflect.Method;
|
| */
|
| public class DownloadManagerDelegate {
|
| private static final String TAG = "DownloadDelegate";
|
| + private static final long INVALID_SYSTEM_DOWNLOAD_ID = -1;
|
| + private static final String DOWNLOAD_ID_MAPPINGS_FILE_NAME = "download_id_mappings";
|
| protected final Context mContext;
|
|
|
| public DownloadManagerDelegate(Context context) {
|
| @@ -29,15 +33,55 @@ public class DownloadManagerDelegate {
|
| }
|
|
|
| /**
|
| + * Inserts a new download ID mapping into the SharedPreferences
|
| + * @param downloadId system download ID from Android DownloadManager.
|
| + * @param downloadGuid Download GUID.
|
| + */
|
| + private void addDownloadIdMapping(long downloadId, String downloadGuid) {
|
| + SharedPreferences sharedPrefs = getSharedPreferences();
|
| + SharedPreferences.Editor editor = sharedPrefs.edit();
|
| + editor.putLong(downloadGuid, downloadId);
|
| + editor.apply();
|
| + }
|
| +
|
| + /**
|
| + * Removes a download Id mapping from the SharedPreferences given the download GUID.
|
| + * @param guid Download GUID.
|
| + * @return the Android DownloadManager's download ID that is removed, or
|
| + * INVALID_SYSTEM_DOWNLOAD_ID if it is not found.
|
| + */
|
| + private long removeDownloadIdMapping(String downloadGuid) {
|
| + SharedPreferences sharedPrefs = getSharedPreferences();
|
| + long downloadId = sharedPrefs.getLong(downloadGuid, INVALID_SYSTEM_DOWNLOAD_ID);
|
| + if (downloadId != INVALID_SYSTEM_DOWNLOAD_ID) {
|
| + SharedPreferences.Editor editor = sharedPrefs.edit();
|
| + editor.remove(downloadGuid);
|
| + editor.apply();
|
| + }
|
| + return downloadId;
|
| + }
|
| +
|
| + /**
|
| + * Lazily retrieve the SharedPreferences when needed. Since download operations are not very
|
| + * frequent, no need to load all SharedPreference entries into a hashmap in the memory.
|
| + * @return the SharedPreferences instance.
|
| + */
|
| + private SharedPreferences getSharedPreferences() {
|
| + return ContextUtils.getApplicationContext().getSharedPreferences(
|
| + DOWNLOAD_ID_MAPPINGS_FILE_NAME, Context.MODE_PRIVATE);
|
| + }
|
| +
|
| + /**
|
| * @see android.app.DownloadManager#addCompletedDownload(String, String, boolean, String,
|
| * String, long, boolean)
|
| */
|
| protected long addCompletedDownload(String fileName, String description, String mimeType,
|
| - String path, long length, String originalUrl, String referer) {
|
| + String path, long length, String originalUrl, String referer, String downloadGuid) {
|
| DownloadManager manager =
|
| (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
|
| NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mContext);
|
| boolean useSystemNotification = !notificationManager.areNotificationsEnabled();
|
| + long downloadId = -1;
|
| if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
|
| Class<?> c = manager.getClass();
|
| try {
|
| @@ -46,8 +90,8 @@ public class DownloadManagerDelegate {
|
| Method method = c.getMethod("addCompletedDownload", args);
|
| Uri originalUri = Uri.parse(originalUrl);
|
| Uri refererUri = referer == null ? Uri.EMPTY : Uri.parse(referer);
|
| - return (Long) method.invoke(manager, fileName, description, true, mimeType, path,
|
| - length, useSystemNotification, originalUri, refererUri);
|
| + downloadId = (Long) method.invoke(manager, fileName, description, true, mimeType,
|
| + path, length, useSystemNotification, originalUri, refererUri);
|
| } catch (SecurityException e) {
|
| Log.e(TAG, "Cannot access the needed method.");
|
| } catch (NoSuchMethodException e) {
|
| @@ -58,8 +102,23 @@ public class DownloadManagerDelegate {
|
| Log.e(TAG, "Error accessing the needed method.");
|
| }
|
| }
|
| - return manager.addCompletedDownload(fileName, description, true, mimeType, path, length,
|
| - useSystemNotification);
|
| + downloadId = manager.addCompletedDownload(fileName, description, true, mimeType, path,
|
| + length, useSystemNotification);
|
| + addDownloadIdMapping(downloadId, downloadGuid);
|
| + return downloadId;
|
| + }
|
| +
|
| + /**
|
| + * Removes a download from Android DownloadManager.
|
| + * @param downloadGuid The GUID of the download.
|
| + */
|
| + void removeCompletedDownload(String downloadGuid) {
|
| + long downloadId = removeDownloadIdMapping(downloadGuid);
|
| + if (downloadId != INVALID_SYSTEM_DOWNLOAD_ID) {
|
| + DownloadManager manager =
|
| + (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
|
| + manager.remove(downloadId);
|
| + }
|
| }
|
|
|
| /**
|
|
|