Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(772)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java

Issue 2701253006: Download Home : Suggested pages header selection (Closed)
Patch Set: nits and fixed background color Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..673705e9371e56754e74c8a5a43a816c6d0e0c6f 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,78 @@
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.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 {
- private Date mDate;
+public class OfflineGroupHeaderView extends SelectableItemView<TimedItem> {
+ 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;
+
+ private SelectionObserver<DownloadHistoryItemWrapper> mDownloadSelectionObserver =
+ new SelectionObserver<DownloadHistoryItemWrapper>() {
+ @Override
+ public void onSelectionStateChange(List<DownloadHistoryItemWrapper> selectedItems) {
+ if (!mHeader.isExpanded()) {
+ setChecked(mSelectionDelegate.isHeaderSelected(mHeader));
+ return;
+ }
+
+ // The header should get selected if all the associated items are selected.
+ boolean isChecked = true;
+ for (DownloadHistoryItemWrapper subItem : mHeader.getItems()) {
+ if (!selectedItems.contains(subItem)) {
+ isChecked = false;
+ break;
+ }
+ }
+
+ mSelectionDelegate.setSelectionForHeader(mHeader, isChecked);
+ 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 +86,87 @@ 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());
Theresa 2017/03/08 16:08:17 The background also needs to be changed when the h
shaktisahu 2017/03/09 06:03:33 Actually displayHeader is called everytime the ada
}
- 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);
+ updateExpandIcon(newState);
+ }
+
+ @Override
+ protected boolean isSelectionModeActive() {
+ return mSelectionDelegate.isSelectionEnabled();
+ }
+
+ @Override
+ protected boolean toggleSelectionForItem(TimedItem item) {
+ return mSelectionDelegate.toggleSelectionForSubsection(mHeader);
+ }
+
+ /**
+ * Sets the selection delegate and registers |mDownloadSelectionObserver| 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(mDownloadSelectionObserver);
+ }
+
+ mSelectionDelegate = delegate;
+ mSelectionDelegate.addObserver(mDownloadSelectionObserver);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698