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

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

Issue 2456593002: Delete download in Android DownloadManager when download is deleted from download home (Closed)
Patch Set: use SharedPreference as hashmap directly Created 4 years, 2 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
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+ }
}
/**
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698