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