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; |
+ } |
} |