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

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

Issue 2271913002: [Downloads] Remove externally deleted items from downloads history (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: dfalcantara@ review changes 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/ui/DownloadHistoryAdapter.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java
index 02885751589a2cf7b4c077e6e0722fef5387ce4e..fb091e3e5ea4894cffc4a1ab3a7c5aa319a9dd78 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java
@@ -6,8 +6,6 @@ package org.chromium.chrome.browser.download.ui;
import android.content.ComponentName;
import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Paint;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.TextUtils;
@@ -18,8 +16,8 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
-import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.download.DownloadItem;
import org.chromium.chrome.browser.download.ui.BackendProvider.DownloadDelegate;
@@ -34,7 +32,10 @@ import org.chromium.chrome.browser.widget.DateDividedAdapter;
import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
/** Bridges the user's download history and the UI used to display it. */
public class DownloadHistoryAdapter extends DateDividedAdapter implements DownloadUiObserver {
@@ -63,6 +64,23 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
/** See {@link #findItemIndex}. */
private static final int INVALID_INDEX = -1;
+ /**
+ * Externally deleted items that have been removed from downloads history.
+ * Shared across instances.
+ */
+ private static Map<String, Boolean> sExternallyDeletedItems = new HashMap<>();
+
+ /**
+ * Externally deleted off-the-record items that have been removed from downloads history.
+ * Shared across instances.
+ */
+ private static Map<String, Boolean> sExternallyDeletedOffTheRecordItems = new HashMap<>();
+
+ /**
+ * The number of DownloadHistoryAdapater instances in existence that have been initialized.
+ */
+ private static final AtomicInteger sNumInstancesInitialized = new AtomicInteger();
+
private final List<DownloadItemWrapper> mDownloadItems = new ArrayList<>();
private final List<DownloadItemWrapper> mDownloadOffTheRecordItems = new ArrayList<>();
private final List<OfflinePageItemWrapper> mOfflinePageItems = new ArrayList<>();
@@ -90,6 +108,8 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
if (mShowOffTheRecord) downloadManager.getAllDownloads(true);
initializeOfflinePageBridge();
+
+ sNumInstancesInitialized.getAndIncrement();
}
/** Called when the user's download history has been gathered. */
@@ -99,11 +119,22 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
List<DownloadItemWrapper> list = getDownloadItemList(isOffTheRecord);
list.clear();
int[] mItemCounts = new int[DownloadFilter.FILTER_BOUNDARY];
+
for (DownloadItem item : result) {
DownloadItemWrapper wrapper = createDownloadItemWrapper(item, isOffTheRecord);
- list.add(wrapper);
- mItemCounts[wrapper.getFilterType()]++;
+
+ // TODO(twellington): The native downloads service should remove externally deleted
+ // downloads rather than passing them to Java.
+ if (getExternallyDeletedItemsMap(isOffTheRecord).containsKey(wrapper.getId())) {
+ continue;
+ } else if (wrapper.hasBeenExternallyRemoved()) {
+ removeExternallyDeletedItem(wrapper, isOffTheRecord);
+ } else {
+ list.add(wrapper);
+ mItemCounts[wrapper.getFilterType()]++;
+ }
}
+
filter(DownloadFilter.FILTER_ALL);
if (!isOffTheRecord) recordDownloadCountHistograms(mItemCounts, result.size());
}
@@ -128,12 +159,12 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
for (DownloadHistoryItemWrapper wrapper : mDownloadItems) {
assert wrapper instanceof DownloadItemWrapper;
DownloadItemWrapper downloadWrapper = (DownloadItemWrapper) wrapper;
- if (!downloadWrapper.hasBeenExternallyRemoved()) totalSize += wrapper.getFileSize();
+ totalSize += wrapper.getFileSize();
}
for (DownloadHistoryItemWrapper wrapper : mDownloadOffTheRecordItems) {
assert wrapper instanceof DownloadItemWrapper;
DownloadItemWrapper downloadWrapper = (DownloadItemWrapper) wrapper;
- if (!downloadWrapper.hasBeenExternallyRemoved()) totalSize += wrapper.getFileSize();
+ totalSize += wrapper.getFileSize();
}
for (DownloadHistoryItemWrapper wrapper : mOfflinePageItems) {
totalSize += wrapper.getFileSize();
@@ -159,7 +190,6 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
final DownloadHistoryItemWrapper item = (DownloadHistoryItemWrapper) timedItem;
ItemViewHolder holder = (ItemViewHolder) current;
- DownloadHistoryItemWrapper previousItem = holder.mItemView.mItem;
Context context = holder.mFilesizeView.getContext();
holder.mFilenameView.setText(item.getDisplayFileName());
holder.mHostnameView.setText(
@@ -191,12 +221,6 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
}
holder.mIconView.setImageResource(iconResource);
-
- // Externally removed items have a different style. Update the item's style if necessary.
- if (previousItem == null
- || previousItem.hasBeenExternallyRemoved() != item.hasBeenExternallyRemoved()) {
- setItemViewStyle(holder, item);
- }
}
/**
@@ -207,12 +231,24 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
List<DownloadItemWrapper> list = getDownloadItemList(isOffTheRecord);
int index = findItemIndex(list, item.getId());
+
+ DownloadItemWrapper wrapper = createDownloadItemWrapper(item, isOffTheRecord);
+
+ // If an externally deleted item has already been removed from the history service, it
+ // shouldn't be removed again.
+ if (getExternallyDeletedItemsMap(isOffTheRecord).containsKey(wrapper.getId())) return;
+
+ if (wrapper.hasBeenExternallyRemoved()) {
+ removeExternallyDeletedItem(wrapper, isOffTheRecord);
+ return;
+ }
+
if (index == INVALID_INDEX) {
// Add a new entry.
- list.add(createDownloadItemWrapper(item, isOffTheRecord));
+ list.add(wrapper);
} else {
// Update the old one.
- list.set(index, createDownloadItemWrapper(item, isOffTheRecord));
+ list.set(index, wrapper);
}
filter(mFilter);
@@ -237,6 +273,13 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
public void onManagerDestroyed() {
getDownloadDelegate().removeDownloadHistoryAdapter(this);
getOfflinePageBridge().removeObserver(mOfflinePageObserver);
+
+ // If there are no more instances, clear out externally deleted items maps so that they stop
+ // taking up space.
+ if (sNumInstancesInitialized.decrementAndGet() == 0) {
+ sExternallyDeletedItems.clear();
+ sExternallyDeletedOffTheRecordItems.clear();
+ }
}
private DownloadDelegate getDownloadDelegate() {
@@ -330,31 +373,6 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
return INVALID_INDEX;
}
- private void setItemViewStyle(ItemViewHolder holder, DownloadHistoryItemWrapper item) {
- Context context = holder.itemView.getContext();
- Resources res = context.getResources();
- if (item.hasBeenExternallyRemoved()) {
- int disabledColor = ApiCompatibilityUtils.getColor(res, R.color.google_grey_300);
-
- holder.mHostnameView.setTextColor(disabledColor);
- holder.mIconView.setBackgroundColor(disabledColor);
- holder.mFilenameView.setTextColor(disabledColor);
- holder.mFilenameView.setPaintFlags(holder.mFilenameView.getPaintFlags()
- | Paint.STRIKE_THRU_TEXT_FLAG);
- holder.mFilesizeView.setText(context.getString(R.string.download_manager_ui_deleted));
- } else {
- int sublabelColor = ApiCompatibilityUtils.getColor(res, R.color.google_grey_600);
-
- holder.mHostnameView.setTextColor(sublabelColor);
- holder.mIconView.setBackgroundColor(ApiCompatibilityUtils.getColor(res,
- R.color.light_active_color));
- holder.mFilenameView.setTextColor(ApiCompatibilityUtils.getColor(res,
- R.color.default_text_color));
- holder.mFilenameView.setPaintFlags(holder.mFilenameView.getPaintFlags()
- & ~Paint.STRIKE_THRU_TEXT_FLAG);
- }
- }
-
/**
* Removes the item matching the given |guid|.
* @param list List of the users downloads of a specific type.
@@ -397,4 +415,14 @@ public class DownloadHistoryAdapter extends DateDividedAdapter implements Downlo
RecordHistogram.recordCountHistogram("Android.DownloadManager.InitialCount.Total",
totalCount);
}
+
+ private void removeExternallyDeletedItem(DownloadItemWrapper wrapper, boolean isOffTheRecord) {
+ getExternallyDeletedItemsMap(isOffTheRecord).put(wrapper.getId(), true);
+ wrapper.delete(null);
+ RecordUserAction.record("Android.DownloadManager.Item.ExternallyDeleted");
+ }
+
+ private Map<String, Boolean> getExternallyDeletedItemsMap(boolean isOffTheRecord) {
+ return isOffTheRecord ? sExternallyDeletedOffTheRecordItems : sExternallyDeletedItems;
+ }
}

Powered by Google App Engine
This is Rietveld 408576698