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

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

Issue 2305123002: [Downloads UI] Batch delete selected items (Closed)
Patch Set: foreach Created 4 years, 3 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 | « chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java ('k') | no next file » | 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/ui/DownloadManagerUi.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
index cd5ac30dc2b5052a2f3b007592834faf498ec824..352378b9f4d654df61bf4ada717be25d144241e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
@@ -9,6 +9,7 @@ import android.content.ComponentName;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.StrictMode;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
@@ -26,9 +27,9 @@ import android.view.ViewGroup;
import android.widget.ListView;
import org.chromium.base.ApiCompatibilityUtils;
-import org.chromium.base.Callback;
import org.chromium.base.ContentUriUtils;
import org.chromium.base.ContextUtils;
+import org.chromium.base.FileUtils;
import org.chromium.base.Log;
import org.chromium.base.ObserverList;
import org.chromium.base.VisibleForTesting;
@@ -47,9 +48,9 @@ import org.chromium.chrome.browser.widget.LoadingView;
import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
import org.chromium.ui.base.DeviceFormFactor;
+import java.io.File;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* Displays and manages the UI for the download manager.
@@ -140,7 +141,6 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
private final LoadingView mLoadingView;
private BasicNativePage mNativePage;
- private final AtomicInteger mNumberOfFilesBeingDeleted = new AtomicInteger();
private final AdapterDataObserver mAdapterObserver = new AdapterDataObserver() {
@Override
@@ -475,27 +475,38 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
private void deleteSelectedItems() {
List<DownloadHistoryItemWrapper> selectedItems =
mBackendProvider.getSelectionDelegate().getSelectedItems();
- mNumberOfFilesBeingDeleted.addAndGet(selectedItems.size());
+ final ArrayList<File> filesToDelete = new ArrayList<>();
for (int i = 0; i < selectedItems.size(); i++) {
DownloadHistoryItemWrapper wrappedItem = selectedItems.get(i);
-
- // More than one download item may be associated with the same file path. After all
- // files have been deleted, initiate a check for removed download files so that any
- // download items associated with the same path as a deleted item are updated.
- wrappedItem.delete(new Callback<Void>() {
- @Override
- public void onResult(Void unused) {
- int remaining = mNumberOfFilesBeingDeleted.decrementAndGet();
- if (remaining != 0) return;
-
- DownloadUtils.checkForExternallyRemovedDownloads(mBackendProvider,
- mIsOffTheRecord);
- }
- });
+ if (!wrappedItem.remove()) {
+ filesToDelete.add(wrappedItem.getFile());
+ }
+ // Delete the files associated with the download items (if necessary) using a single
+ // AsyncTask that batch deletes all of the files. The thread pool has a finite number
+ // of tasks that can be queued at once. If too many tasks are queued an exception is
+ // thrown. See crbug.com/643811.
+ if (filesToDelete.size() != 0) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ public Void doInBackground(Void... params) {
+ FileUtils.batchDeleteFiles(filesToDelete);
+ return null;
+ }
+
+ @Override
+ public void onPostExecute(Void unused) {
+ // More than one download item may be associated with the same file path.
+ // Initiate a check for removed download files so that any download items
+ // associated with the same path as a deleted item are updated.
+ DownloadUtils.checkForExternallyRemovedDownloads(
+ mBackendProvider, mIsOffTheRecord);
+ }
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
}
- mBackendProvider.getSelectionDelegate().clearSelection();
+ mBackendProvider.getSelectionDelegate().clearSelection();
RecordUserAction.record("Android.DownloadManager.Delete");
}
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698