Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java |
| index 762b815b22c47362c62736749a1b4555384a65c0..90fbd446d73ab41001453197c68088f171b0a7bf 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java |
| @@ -5,47 +5,86 @@ |
| package org.chromium.chrome.browser.download.ui; |
| import android.content.Context; |
| +import android.content.res.ColorStateList; |
| import android.text.format.Formatter; |
| import android.util.AttributeSet; |
| -import android.view.View; |
| -import android.widget.FrameLayout; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| +import org.chromium.base.ApiCompatibilityUtils; |
| import org.chromium.chrome.R; |
| +import org.chromium.chrome.browser.download.DownloadUtils; |
| +import org.chromium.chrome.browser.download.ui.DownloadHistoryAdapter.DownloadItemSelectionDelegate; |
| +import org.chromium.chrome.browser.download.ui.DownloadHistoryAdapter.SubsectionHeader; |
| +import org.chromium.chrome.browser.download.ui.DownloadHistoryItemWrapper.OfflinePageItemWrapper; |
| +import org.chromium.chrome.browser.widget.DateDividedAdapter.TimedItem; |
| +import org.chromium.chrome.browser.widget.TintedImageView; |
| +import org.chromium.chrome.browser.widget.selection.SelectableItemView; |
| +import org.chromium.chrome.browser.widget.selection.SelectionDelegate.SelectionObserver; |
| import java.util.Date; |
| +import java.util.List; |
| /** |
| * A header that presents users the option to view or hide the suggested offline pages. |
| - * TODO(shaktisahu): Make this layout selectable. |
| */ |
| -public class OfflineGroupHeaderView extends FrameLayout { |
| +public class OfflineGroupHeaderView extends SelectableItemView<TimedItem> { |
| private Date mDate; |
| + private SubsectionHeader mHeader; |
| private DownloadHistoryAdapter mAdapter; |
| + private DownloadItemSelectionDelegate mSelectionDelegate; |
| private TextView mPageCountHeader; |
| private TextView mFileSizeView; |
| - private ImageView mImageView; |
| + private ImageView mExpandImage; |
| + private TintedImageView mIconView; |
| + |
| + private final int mIconBackgroundColorSelected; |
| + private final ColorStateList mIconForegroundColorList; |
| + |
| + private SelectionObserver<DownloadHistoryItemWrapper> mDownloadSelectionObserver = |
| + new SelectionObserver<DownloadHistoryItemWrapper>() { |
| + @Override |
| + public void onSelectionStateChange(List<DownloadHistoryItemWrapper> selectedItems) { |
| + if (!mAdapter.isSubsectionExpanded(new Date(mHeader.getTimestamp()))) { |
| + setChecked(mSelectionDelegate.isHeaderSelected(mHeader)); |
| + return; |
| + } |
| + |
| + // The header should get selected if all the associated items are selected. |
| + int numChecked = 0; |
| + for (DownloadHistoryItemWrapper selectedItem : selectedItems) { |
| + if (DownloadUtils.isSameDay( |
| + selectedItem.getTimestamp(), mHeader.getTimestamp()) |
| + && selectedItem instanceof OfflinePageItemWrapper |
| + && ((OfflinePageItemWrapper) selectedItem).isSuggested()) { |
| + numChecked++; |
| + } |
| + } |
| + |
| + int groupSize = |
| + mAdapter.getSuggestedItemsForDate(mHeader.getTimestamp()).size(); |
| + boolean isChecked = (numChecked == groupSize); |
| + mSelectionDelegate.setSelectionForHeader(mHeader, numChecked == groupSize); |
| + setChecked(isChecked); |
| + } |
| + }; |
| public OfflineGroupHeaderView(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| - setOnClickListener(new View.OnClickListener() { |
| - @Override |
| - public void onClick(View v) { |
| - boolean newState = !mAdapter.isSubsectionExpanded(mDate); |
| - mAdapter.setSubsectionExpanded(mDate, newState); |
| - updateImageView(newState); |
| - } |
| - }); |
| + mIconBackgroundColorSelected = |
| + ApiCompatibilityUtils.getColor(getResources(), R.color.google_grey_600); |
| + mIconForegroundColorList = DownloadUtils.getIconForegroundColorList(context); |
| } |
| @Override |
| protected void onFinishInflate() { |
| super.onFinishInflate(); |
| + |
| + mIconView = (TintedImageView) findViewById(R.id.icon_view); |
| mPageCountHeader = (TextView) findViewById(R.id.page_count_text); |
| mFileSizeView = (TextView) findViewById(R.id.filesize_view); |
| - mImageView = (ImageView) findViewById(R.id.expand_icon); |
| + mExpandImage = (ImageView) findViewById(R.id.expand_icon); |
| } |
| /** |
| @@ -55,25 +94,75 @@ public class OfflineGroupHeaderView extends FrameLayout { |
| mAdapter = adapter; |
| } |
| + @Override |
| + public void setChecked(boolean checked) { |
| + super.setChecked(checked); |
| + updateCheckIcon(checked); |
| + } |
| + |
| /** |
| - * Updates the properties of this header. |
| - * @param date The date associated with this header. |
| - * @param expanded Whether the items should be expanded or not. |
| - * @param pageCount The total number of associated pages. |
| - * @param fileSize The total file size of all the associated pages. |
| + * Updates the properties of this view. |
| + * @param header The associated header. |
| */ |
| - public void update(Date date, boolean expanded, int pageCount, long fileSize) { |
| - mDate = new Date(date.getTime()); |
| + public void displayHeader(SubsectionHeader header) { |
| + this.mHeader = header; |
| + mDate = new Date(header.getTimestamp()); |
| mPageCountHeader.setText(getResources().getString( |
| - R.string.download_manager_offline_header_title, pageCount)); |
| - mFileSizeView.setText(Formatter.formatFileSize(getContext(), fileSize)); |
| - updateImageView(expanded); |
| + R.string.download_manager_offline_header_title, header.getItemCount())); |
| + mFileSizeView.setText(Formatter.formatFileSize(getContext(), header.getTotalFileSize())); |
| + updateExpandIcon(header.isExpanded()); |
| + setChecked(mSelectionDelegate.isHeaderSelected(header)); |
| } |
| - private void updateImageView(boolean expanded) { |
| - mImageView.setImageResource(expanded ? R.drawable.ic_collapsed : R.drawable.ic_expanded); |
| - mImageView.setContentDescription( |
| + private void updateExpandIcon(boolean expanded) { |
| + mExpandImage.setImageResource(expanded ? R.drawable.ic_collapsed : R.drawable.ic_expanded); |
| + mExpandImage.setContentDescription( |
| getResources().getString(expanded ? R.string.accessibility_collapse_offline_pages |
| : R.string.accessibility_expand_offline_pages)); |
| } |
| + |
| + private void updateCheckIcon(boolean checked) { |
| + if (checked) { |
| + mIconView.setBackgroundColor(mIconBackgroundColorSelected); |
| + mIconView.setImageResource(R.drawable.ic_check_googblue_24dp); |
| + mIconView.setTint(mIconForegroundColorList); |
| + } else { |
| + mIconView.setBackgroundResource(R.color.light_active_color); |
| + mIconView.setImageResource(R.drawable.ic_chrome); |
| + mIconView.setTint(null); |
| + } |
| + } |
| + |
| + @Override |
| + public void onClick() { |
| + boolean newState = !mAdapter.isSubsectionExpanded(mDate); |
| + mAdapter.setSubsectionExpanded(mDate, newState); |
| + updateExpandIcon(newState); |
| + } |
| + |
| + @Override |
| + protected boolean isSelectionEnabled() { |
| + return mSelectionDelegate.isSelectionEnabled(); |
| + } |
| + |
| + @Override |
| + protected boolean toggleSelectionForItem(TimedItem item) { |
| + return mSelectionDelegate.toggleSelectionForHeader(mHeader); |
| + } |
| + |
| + /** |
| + * Sets the SelectionDelegate and registers |mDownloadSelectionObserver| as an observer. The |
| + * SelectionDelegate must be set before the item can respond to click events. |
| + * @param delegate The SelectionDelegate that will inform this item of selection changes. |
| + */ |
| + public void setSelectionDelegate(DownloadItemSelectionDelegate delegate) { |
|
shaktisahu
2017/03/02 19:26:24
I had to replicate/override some of the functions
|
| + if (mSelectionDelegate == delegate) return; |
| + |
| + if (mSelectionDelegate != null) { |
| + mSelectionDelegate.removeObserver(mDownloadSelectionObserver); |
| + } |
| + |
| + mSelectionDelegate = delegate; |
| + mSelectionDelegate.addObserver(mDownloadSelectionObserver); |
| + } |
| } |