| 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 c9d9fc70ac56882be2a4b6551764d03df3691ecd..c668870e565f22a2adc7f00e86463325f615ca73 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
|
| @@ -22,19 +22,23 @@ 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.Log;
|
| import org.chromium.base.ObserverList;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.BasicNativePage;
|
| +import org.chromium.chrome.browser.download.DownloadManagerService;
|
| import org.chromium.chrome.browser.download.ui.DownloadHistoryItemWrapper.OfflinePageItemWrapper;
|
| import org.chromium.chrome.browser.widget.FadingShadow;
|
| import org.chromium.chrome.browser.widget.FadingShadowView;
|
| import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
|
| import org.chromium.ui.base.DeviceFormFactor;
|
| +import org.chromium.ui.widget.Toast;
|
|
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| +import java.util.concurrent.atomic.AtomicInteger;
|
|
|
| /**
|
| * Displays and manages the UI for the download manager.
|
| @@ -72,6 +76,7 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
|
| private final ObserverList<DownloadUiObserver> mObservers = new ObserverList<>();
|
|
|
| private final Activity mActivity;
|
| + private final boolean mIsOffTheRecord;
|
| private final ViewGroup mMainView;
|
| private final DownloadManagerToolbar mToolbar;
|
| private final SpaceDisplay mSpaceDisplay;
|
| @@ -79,12 +84,13 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
|
| private final RecyclerView mRecyclerView;
|
|
|
| private BasicNativePage mNativePage;
|
| -
|
| private SelectionDelegate<DownloadHistoryItemWrapper> mSelectionDelegate;
|
| + private final AtomicInteger mNumberOfFilesBeingDeleted = new AtomicInteger();
|
|
|
| public DownloadManagerUi(
|
| Activity activity, boolean isOffTheRecord, ComponentName parentComponent) {
|
| mActivity = activity;
|
| + mIsOffTheRecord = isOffTheRecord;
|
| mMainView = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.download_main, null);
|
|
|
| mSelectionDelegate = new SelectionDelegate<DownloadHistoryItemWrapper>();
|
| @@ -259,24 +265,23 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
|
| ArrayList<Uri> itemUris = new ArrayList<Uri>();
|
| StringBuilder offlinePagesString = new StringBuilder();
|
|
|
| - String intentMimeType = Intent.normalizeMimeType(selectedItems.get(0).getMimeType());
|
| + String intentMimeType = "";
|
| String[] intentMimeParts = {"", ""};
|
| - if (!TextUtils.isEmpty(intentMimeType)) {
|
| - intentMimeParts = intentMimeType.split(MIME_TYPE_DELIMITER);
|
| - if (intentMimeParts.length != 2) intentMimeType = DEFAULT_MIME_TYPE;
|
| - }
|
|
|
| - for (DownloadHistoryItemWrapper itemWrapper : mSelectionDelegate.getSelectedItems()) {
|
| - if (itemWrapper instanceof OfflinePageItemWrapper) {
|
| + for (int i = 0; i < selectedItems.size(); i++) {
|
| + DownloadHistoryItemWrapper wrappedItem = selectedItems.get(i);
|
| + if (wrappedItem.hasBeenExternallyRemoved()) continue;
|
| +
|
| + if (wrappedItem instanceof OfflinePageItemWrapper) {
|
| if (offlinePagesString.length() != 0) {
|
| offlinePagesString.append("\n");
|
| }
|
| - offlinePagesString.append(itemWrapper.getUrl());
|
| + offlinePagesString.append(wrappedItem.getUrl());
|
| } else {
|
| - itemUris.add(getUriForItem(itemWrapper));
|
| + itemUris.add(getUriForItem(wrappedItem));
|
| }
|
|
|
| - String mimeType = Intent.normalizeMimeType(itemWrapper.getMimeType());
|
| + String mimeType = Intent.normalizeMimeType(wrappedItem.getMimeType());
|
|
|
| // If a mime type was not retrieved from the backend or could not be normalized,
|
| // set the mime type to the default.
|
| @@ -285,8 +290,19 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
|
| continue;
|
| }
|
|
|
| - // Either the mime type is already the default or it matches the current intent
|
| - // mime type. In either case, intentMimeType is already the correct value.
|
| + // If the intent mime type has not been set yet, set it to the mime type for this item.
|
| + if (TextUtils.isEmpty(intentMimeType)) {
|
| + intentMimeType = mimeType;
|
| + if (!TextUtils.isEmpty(intentMimeType)) {
|
| + intentMimeParts = intentMimeType.split(MIME_TYPE_DELIMITER);
|
| + // Guard against invalid mime types.
|
| + if (intentMimeParts.length != 2) intentMimeType = DEFAULT_MIME_TYPE;
|
| + }
|
| + continue;
|
| + }
|
| +
|
| + // Either the mime type is already the default or it matches the current item's mime
|
| + // type. In either case, intentMimeType is already the correct value.
|
| if (TextUtils.equals(intentMimeType, DEFAULT_MIME_TYPE)
|
| || TextUtils.equals(intentMimeType, mimeType)) {
|
| continue;
|
| @@ -302,6 +318,13 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
|
| }
|
| }
|
|
|
| + // If there are no non-deleted items to share, return early.
|
| + if (itemUris.size() == 0 && offlinePagesString.length() == 0) {
|
| + Toast.makeText(mActivity, mActivity.getString(R.string.download_cant_share_deleted),
|
| + Toast.LENGTH_SHORT).show();
|
| + return;
|
| + }
|
| +
|
| // Use Action_SEND if there is only one downloaded item or only text to share.
|
| if (itemUris.size() == 0 || (itemUris.size() == 1 && offlinePagesString.length() == 0)) {
|
| intentAction = Intent.ACTION_SEND;
|
| @@ -351,8 +374,27 @@ public class DownloadManagerUi implements OnMenuItemClickListener {
|
| }
|
|
|
| private void deleteSelectedItems() {
|
| - for (DownloadHistoryItemWrapper wrappedItem : mSelectionDelegate.getSelectedItems()) {
|
| - wrappedItem.delete();
|
| + List<DownloadHistoryItemWrapper> selectedItems = mSelectionDelegate.getSelectedItems();
|
| + mNumberOfFilesBeingDeleted.addAndGet(selectedItems.size());
|
| +
|
| + 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;
|
| +
|
| + DownloadManagerService service =
|
| + DownloadManagerService.getDownloadManagerService(
|
| + mActivity.getApplicationContext());
|
| + service.checkForExternallyRemovedDownloads(mIsOffTheRecord);
|
| + }
|
| + });
|
| }
|
| mSelectionDelegate.clearSelection();
|
| }
|
|
|