| 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");
|
| }
|
|
|
|
|