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;
import org.chromium.components.offline_items_collection.OfflineContentProvider;
import org.chromium.components.offline_items_collection.OfflineItem;
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 java.io.Closeable;
......@@ -245,6 +246,10 @@ class DateOrderedListMediator {
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) {
// Calculate the real offline items we are going to remove here.
final Collection<OfflineItem> itemsToDelete =
......@@ -254,7 +259,11 @@ class DateOrderedListMediator {
mDeleteController.canDelete(items, delete -> {
if (delete) {
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
// glue layer is no longer needed.
......
......@@ -107,13 +107,17 @@ class DateOrderedListMutator implements OfflineItemFilterObserver {
onItemsRemoved(CollectionUtil.newArrayList(oldItem));
onItemsAdded(CollectionUtil.newArrayList(item));
} else {
int sectionHeaderIndex = -1;
for (int i = 0; i < mModel.size(); i++) {
ListItem listItem = mModel.get(i);
if (listItem instanceof SectionHeaderListItem) sectionHeaderIndex = i;
if (!(listItem instanceof OfflineItemListItem)) continue;
OfflineItem offlineListItem = ((OfflineItemListItem) listItem).item;
if (item.id.equals(offlineListItem.id)) {
mModel.update(i, new OfflineItemListItem(item));
if (oldItem.state != item.state) updateSectionHeader(sectionHeaderIndex, i);
break;
}
}
}
......@@ -121,11 +125,20 @@ class DateOrderedListMutator implements OfflineItemFilterObserver {
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
// 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
// computed.
// TODO(shaktisahu): Write a version having no headers for the prefetch tab.
private void pushItemsToModel() {
List<ListItem> listItems = new ArrayList<>();
int dateIndex = 0;
......
......@@ -12,12 +12,19 @@ import android.view.ViewGroup;
import android.widget.TextView;
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.ListUtils;
import org.chromium.chrome.browser.modelutil.PropertyModel;
import org.chromium.chrome.browser.widget.ListMenuButton;
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.OfflineItemState;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* A {@link ViewHolder} specifically meant to display a section header.
......@@ -32,7 +39,8 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
private Runnable mDeleteAllCallback;
private Runnable mSelectCallback;
private boolean mListHasMultipleItems;
private boolean mHasMultipleItems;
private boolean mCanSelectItems;
/** Create a new {@link SectionTitleViewHolder} instance. */
public static SectionTitleViewHolder create(ViewGroup parent) {
......@@ -51,7 +59,7 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
// ListItemViewHolder implementation.
@Override
public void bind(PropertyModel properties, ListItem item) {
ListItem.SectionHeaderListItem sectionItem = (ListItem.SectionHeaderListItem) item;
SectionHeaderListItem sectionItem = (SectionHeaderListItem) item;
mTitle.setText(ListUtils.getTextForSection(sectionItem.filter));
boolean isPhoto = sectionItem.filter == OfflineItemFilter.FILTER_IMAGE;
......@@ -74,7 +82,8 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
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) {
assert sectionItem.items.size() > 0;
......@@ -87,7 +96,7 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
mShareAllCallback = ()
-> properties.get(ListProperties.CALLBACK_SHARE_ALL)
.onResult(sectionItem.items);
.onResult(getCompletedItems(sectionItem.items));
mDeleteAllCallback = ()
-> properties.get(ListProperties.CALLBACK_REMOVE_ALL)
.onResult(sectionItem.items);
......@@ -101,14 +110,14 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
@Override
public ListMenuButton.Item[] getItems() {
Context context = itemView.getContext();
if (mListHasMultipleItems) {
if (mHasMultipleItems) {
return new ListMenuButton.Item[] {
new ListMenuButton.Item(context, R.string.select, true),
new ListMenuButton.Item(context, R.string.share_group, true),
new ListMenuButton.Item(context, R.string.select, mCanSelectItems),
new ListMenuButton.Item(context, R.string.share_group, mCanSelectItems),
new ListMenuButton.Item(context, R.string.delete_group, true)};
} else {
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)};
}
}
......@@ -127,4 +136,14 @@ public class SectionTitleViewHolder extends ListItemViewHolder implements ListMe
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