| 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..c2ba6904d78b8f17c71c58ba6bb0305fb9e0f81d 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,56 @@
|
| 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.SubsectionHeader;
|
| +import org.chromium.chrome.browser.download.ui.DownloadItemSelectionDelegate.SubsectionHeaderSelectionObserver;
|
| +import org.chromium.chrome.browser.widget.DateDividedAdapter.TimedItem;
|
| +import org.chromium.chrome.browser.widget.TintedImageView;
|
| +import org.chromium.chrome.browser.widget.selection.SelectableItemView;
|
|
|
| import java.util.Date;
|
| +import java.util.Set;
|
|
|
| /**
|
| * 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 {
|
| - private Date mDate;
|
| +public class OfflineGroupHeaderView
|
| + extends SelectableItemView<TimedItem> implements SubsectionHeaderSelectionObserver {
|
| + private final int mIconBackgroundColorSelected;
|
| + private final ColorStateList mIconForegroundColorList;
|
| +
|
| + private SubsectionHeader mHeader;
|
| private DownloadHistoryAdapter mAdapter;
|
| + private DownloadItemSelectionDelegate mSelectionDelegate;
|
|
|
| private TextView mPageCountHeader;
|
| private TextView mFileSizeView;
|
| - private ImageView mImageView;
|
| + private ImageView mExpandImage;
|
| + private TintedImageView mIconView;
|
|
|
| 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 +64,91 @@ public class OfflineGroupHeaderView extends FrameLayout {
|
| mAdapter = adapter;
|
| }
|
|
|
| + @Override
|
| + public void setChecked(boolean checked) {
|
| + super.setChecked(checked);
|
| + updateCheckIcon(checked);
|
| + }
|
| +
|
| + @Override
|
| + protected void onAttachedToWindow() {
|
| + super.onAttachedToWindow();
|
| + if (mSelectionDelegate != null) {
|
| + setChecked(mSelectionDelegate.isHeaderSelected(mHeader));
|
| + }
|
| + }
|
| +
|
| /**
|
| - * 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 {@link SubsectionHeader}.
|
| */
|
| - public void update(Date date, boolean expanded, int pageCount, long fileSize) {
|
| - mDate = new Date(date.getTime());
|
| + public void displayHeader(SubsectionHeader header) {
|
| + this.mHeader = header;
|
| 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));
|
| + setBackgroundResourceForGroupPosition(mHeader.isFirstInGroup(), mHeader.isLastInGroup());
|
| }
|
|
|
| - 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 = !mHeader.isExpanded();
|
| + mAdapter.setSubsectionExpanded(new Date(mHeader.getTimestamp()), newState);
|
| + }
|
| +
|
| + @Override
|
| + protected boolean isSelectionModeActive() {
|
| + return mSelectionDelegate.isSelectionEnabled();
|
| + }
|
| +
|
| + @Override
|
| + protected boolean toggleSelectionForItem(TimedItem item) {
|
| + return mSelectionDelegate.toggleSelectionForSubsection(mHeader);
|
| + }
|
| +
|
| + /**
|
| + * Sets the selection delegate and registers |this| as
|
| + * an observer. The delegate must be set before the item can respond to click events.
|
| + * {@link SelectionDelegate} expects all the views to be of same type i.e.
|
| + * SelectableItemView<DownloadHistoryItemWrapper>, whereas DownloadItemSelectionDelegate can
|
| + * handle multiple types. This view being of type SelectableItemView<TimedItem>, we need
|
| + * to use a DownloadItemSelectionDelegate instead of SelectionDelegate.
|
| + * @param delegate The selection delegate that will inform this item of selection changes.
|
| + */
|
| + public void setSelectionDelegate(DownloadItemSelectionDelegate delegate) {
|
| + if (mSelectionDelegate == delegate) return;
|
| +
|
| + if (mSelectionDelegate != null) {
|
| + mSelectionDelegate.removeObserver(this);
|
| + }
|
| + mSelectionDelegate = delegate;
|
| + mSelectionDelegate.addObserver(this);
|
| + }
|
| +
|
| + @Override
|
| + public void onSubsectionHeaderSelectionStateChanged(Set<SubsectionHeader> selectedHeaders) {
|
| + boolean isChecked = selectedHeaders.contains(mHeader);
|
| + setChecked(isChecked);
|
| + }
|
| }
|
|
|