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); |
+ } |
} |