Commit 72847dac authored by Shakti Sahu's avatar Shakti Sahu Committed by Commit Bot

Download Home : Disable image menu options when all items are in-progress

With this CL, select/share/share all context menu options will be disabled
when we don't have any completed items. Delete/delete all will be always
enabled and will cancel the incomplete downloads.

Bug: 890537
Change-Id: I7a8cd4b5a8fea2e6daeae7a10b79a023c7f0b5a0
Reviewed-on: https://chromium-review.googlesource.com/c/1257680
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#596045}
parent 5fe586fb
...@@ -34,6 +34,7 @@ import org.chromium.chrome.browser.widget.selection.SelectionDelegate; ...@@ -34,6 +34,7 @@ import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
import org.chromium.components.offline_items_collection.OfflineContentProvider; import org.chromium.components.offline_items_collection.OfflineContentProvider;
import org.chromium.components.offline_items_collection.OfflineItem; import org.chromium.components.offline_items_collection.OfflineItem;
import org.chromium.components.offline_items_collection.OfflineItemShareInfo; import org.chromium.components.offline_items_collection.OfflineItemShareInfo;
import org.chromium.components.offline_items_collection.OfflineItemState;
import org.chromium.components.offline_items_collection.VisualsCallback; import org.chromium.components.offline_items_collection.VisualsCallback;
import java.io.Closeable; import java.io.Closeable;
...@@ -245,6 +246,10 @@ class DateOrderedListMediator { ...@@ -245,6 +246,10 @@ class DateOrderedListMediator {
onDeleteItems(CollectionUtil.newArrayList(item)); onDeleteItems(CollectionUtil.newArrayList(item));
} }
/**
* Deletes a given list of items. If the items are not completed yet, they would be cancelled.
* @param items The list of items to delete.
*/
private void onDeleteItems(List<OfflineItem> items) { private void onDeleteItems(List<OfflineItem> items) {
// Calculate the real offline items we are going to remove here. // Calculate the real offline items we are going to remove here.
final Collection<OfflineItem> itemsToDelete = final Collection<OfflineItem> itemsToDelete =
...@@ -254,7 +259,11 @@ class DateOrderedListMediator { ...@@ -254,7 +259,11 @@ class DateOrderedListMediator {
mDeleteController.canDelete(items, delete -> { mDeleteController.canDelete(items, delete -> {
if (delete) { if (delete) {
for (OfflineItem item : itemsToDelete) { for (OfflineItem item : itemsToDelete) {
mProvider.removeItem(item); if (item.state != OfflineItemState.COMPLETE) {
mProvider.cancelDownload(item);
} else {
mProvider.removeItem(item);
}
// Remove and have a single decision path for cleaning up thumbnails when the // Remove and have a single decision path for cleaning up thumbnails when the
// glue layer is no longer needed. // glue layer is no longer needed.
......
...@@ -107,13 +107,17 @@ class DateOrderedListMutator implements OfflineItemFilterObserver { ...@@ -107,13 +107,17 @@ class DateOrderedListMutator implements OfflineItemFilterObserver {
onItemsRemoved(CollectionUtil.newArrayList(oldItem)); onItemsRemoved(CollectionUtil.newArrayList(oldItem));
onItemsAdded(CollectionUtil.newArrayList(item)); onItemsAdded(CollectionUtil.newArrayList(item));
} else { } else {
int sectionHeaderIndex = -1;
for (int i = 0; i < mModel.size(); i++) { for (int i = 0; i < mModel.size(); i++) {
ListItem listItem = mModel.get(i); ListItem listItem = mModel.get(i);
if (listItem instanceof SectionHeaderListItem) sectionHeaderIndex = i;
if (!(listItem instanceof OfflineItemListItem)) continue; if (!(listItem instanceof OfflineItemListItem)) continue;
OfflineItem offlineListItem = ((OfflineItemListItem) listItem).item; OfflineItem offlineListItem = ((OfflineItemListItem) listItem).item;
if (item.id.equals(offlineListItem.id)) { if (item.id.equals(offlineListItem.id)) {
mModel.update(i, new OfflineItemListItem(item)); mModel.update(i, new OfflineItemListItem(item));
if (oldItem.state != item.state) updateSectionHeader(sectionHeaderIndex, i);
break;
} }
} }
} }
...@@ -121,11 +125,20 @@ class DateOrderedListMutator implements OfflineItemFilterObserver { ...@@ -121,11 +125,20 @@ class DateOrderedListMutator implements OfflineItemFilterObserver {
mModel.dispatchLastEvent(); mModel.dispatchLastEvent();
} }
private void updateSectionHeader(int sectionHeaderIndex, int offlineItemIndex) {
if (sectionHeaderIndex < 0) return;
SectionHeaderListItem sectionHeader =
(SectionHeaderListItem) mModel.get(sectionHeaderIndex);
OfflineItem offlineItem = ((OfflineItemListItem) mModel.get(offlineItemIndex)).item;
sectionHeader.items.set(offlineItemIndex - sectionHeaderIndex - 1, offlineItem);
mModel.update(sectionHeaderIndex, sectionHeader);
}
// Flattens out the hierarchical data and adds items to the model in the order they should be // Flattens out the hierarchical data and adds items to the model in the order they should be
// displayed. Date header, section header, date separator and section separators are added // displayed. Date header, section header, date separator and section separators are added
// wherever necessary. The existing items in the model are replaced by the new set of items // wherever necessary. The existing items in the model are replaced by the new set of items
// computed. // computed.
// TODO(shaktisahu): Write a version having no headers for the prefetch tab.
private void pushItemsToModel() { private void pushItemsToModel() {
List<ListItem> listItems = new ArrayList<>(); List<ListItem> listItems = new ArrayList<>();
int dateIndex = 0; int dateIndex = 0;
......
...@@ -12,12 +12,19 @@ import android.view.ViewGroup; ...@@ -12,12 +12,19 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import org.chromium.chrome.browser.download.home.list.ListItem; import org.chromium.chrome.browser.download.home.list.ListItem;
import org.chromium.chrome.browser.download.home.list.ListItem.SectionHeaderListItem;
import org.chromium.chrome.browser.download.home.list.ListProperties; import org.chromium.chrome.browser.download.home.list.ListProperties;
import org.chromium.chrome.browser.download.home.list.ListUtils; import org.chromium.chrome.browser.download.home.list.ListUtils;
import org.chromium.chrome.browser.modelutil.PropertyModel; import org.chromium.chrome.browser.modelutil.PropertyModel;
import org.chromium.chrome.browser.widget.ListMenuButton; import org.chromium.chrome.browser.widget.ListMenuButton;
import org.chromium.chrome.download.R; import org.chromium.chrome.download.R;
import org.chromium.components.offline_items_collection.OfflineItem;
import org.chromium.components.offline_items_collection.OfflineItemFilter; import org.chromium.components.offline_items_collection.OfflineItemFilter;
import org.chromium.components.offline_items_collection.OfflineItemState;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/** /**
* A {@link ViewHolder} specifically meant to display a section header. * A {@link ViewHolder} specifically meant to display a section header.
...@@ -32,7 +39,8 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe ...@@ -32,7 +39,8 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
private Runnable mDeleteAllCallback; private Runnable mDeleteAllCallback;
private Runnable mSelectCallback; private Runnable mSelectCallback;
private boolean mListHasMultipleItems; private boolean mHasMultipleItems;
private boolean mCanSelectItems;
/** Create a new {@link SectionTitleViewHolder} instance. */ /** Create a new {@link SectionTitleViewHolder} instance. */
public static SectionTitleViewHolder create(ViewGroup parent) { public static SectionTitleViewHolder create(ViewGroup parent) {
...@@ -51,7 +59,7 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe ...@@ -51,7 +59,7 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
// ListItemViewHolder implementation. // ListItemViewHolder implementation.
@Override @Override
public void bind(PropertyModel properties, ListItem item) { public void bind(PropertyModel properties, ListItem item) {
ListItem.SectionHeaderListItem sectionItem = (ListItem.SectionHeaderListItem) item; SectionHeaderListItem sectionItem = (SectionHeaderListItem) item;
mTitle.setText(ListUtils.getTextForSection(sectionItem.filter)); mTitle.setText(ListUtils.getTextForSection(sectionItem.filter));
boolean isPhoto = sectionItem.filter == OfflineItemFilter.FILTER_IMAGE; boolean isPhoto = sectionItem.filter == OfflineItemFilter.FILTER_IMAGE;
...@@ -74,7 +82,8 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe ...@@ -74,7 +82,8 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
if (mMore != null) mMore.setVisibility(isPhoto ? View.VISIBLE : View.GONE); if (mMore != null) mMore.setVisibility(isPhoto ? View.VISIBLE : View.GONE);
mListHasMultipleItems = sectionItem.items.size() > 1; mHasMultipleItems = sectionItem.items.size() > 1;
mCanSelectItems = !getCompletedItems(sectionItem.items).isEmpty();
if (isPhoto && mMore != null) { if (isPhoto && mMore != null) {
assert sectionItem.items.size() > 0; assert sectionItem.items.size() > 0;
...@@ -87,7 +96,7 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe ...@@ -87,7 +96,7 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
mShareAllCallback = () mShareAllCallback = ()
-> properties.get(ListProperties.CALLBACK_SHARE_ALL) -> properties.get(ListProperties.CALLBACK_SHARE_ALL)
.onResult(sectionItem.items); .onResult(getCompletedItems(sectionItem.items));
mDeleteAllCallback = () mDeleteAllCallback = ()
-> properties.get(ListProperties.CALLBACK_REMOVE_ALL) -> properties.get(ListProperties.CALLBACK_REMOVE_ALL)
.onResult(sectionItem.items); .onResult(sectionItem.items);
...@@ -101,14 +110,14 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe ...@@ -101,14 +110,14 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
@Override @Override
public ListMenuButton.Item[] getItems() { public ListMenuButton.Item[] getItems() {
Context context = itemView.getContext(); Context context = itemView.getContext();
if (mListHasMultipleItems) { if (mHasMultipleItems) {
return new ListMenuButton.Item[] { return new ListMenuButton.Item[] {
new ListMenuButton.Item(context, R.string.select, true), new ListMenuButton.Item(context, R.string.select, mCanSelectItems),
new ListMenuButton.Item(context, R.string.share_group, true), new ListMenuButton.Item(context, R.string.share_group, mCanSelectItems),
new ListMenuButton.Item(context, R.string.delete_group, true)}; new ListMenuButton.Item(context, R.string.delete_group, true)};
} else { } else {
return new ListMenuButton.Item[] { return new ListMenuButton.Item[] {
new ListMenuButton.Item(context, R.string.share, true), new ListMenuButton.Item(context, R.string.share, mCanSelectItems),
new ListMenuButton.Item(context, R.string.delete, true)}; new ListMenuButton.Item(context, R.string.delete, true)};
} }
} }
...@@ -127,4 +136,14 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe ...@@ -127,4 +136,14 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
mDeleteAllCallback.run(); mDeleteAllCallback.run();
} }
} }
private static List<OfflineItem> getCompletedItems(Collection<OfflineItem> items) {
List<OfflineItem> completedItems = new ArrayList<>();
for (OfflineItem item : items) {
if (item.state != OfflineItemState.COMPLETE) continue;
completedItems.add(item);
}
return completedItems;
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment