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

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

Issue 2670083002: [Download Home] Displaying offline page bundle per day (Closed)
Patch Set: Some fix Created 3 years, 10 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/DownloadItemGroup.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemGroup.java
new file mode 100644
index 0000000000000000000000000000000000000000..19f949b7ee1a13f9aed3b0c13a39c237deb7a571
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemGroup.java
@@ -0,0 +1,170 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.download.ui;
+
+import org.chromium.chrome.browser.download.ui.DownloadHistoryItemWrapper.OfflinePageItemWrapper;
+import org.chromium.chrome.browser.widget.DateDividedAdapter;
+import org.chromium.chrome.browser.widget.DateDividedAdapter.TimedItem;
+
+/**
+ * A bucket of downloaded items with the same date.
+ */
+public class DownloadItemGroup extends DateDividedAdapter.ItemGroup {
+ private int mNumSuggestedOfflinePages;
+ private boolean mIsSuggestedOfflinePagesSectionExpanded;
+
+ /** The header representing the offline pages that are automatically downloaded */
+ private TimedItem mSuggestedOfflinePagesHeader;
+
+ public DownloadItemGroup(long timestamp) {
+ super(timestamp);
+ mNumSuggestedOfflinePages = 0;
+ mIsSuggestedOfflinePagesSectionExpanded = false;
+ }
+
+ public boolean isSuggestedOfflinePagesSectionExpanded() {
+ return mIsSuggestedOfflinePagesSectionExpanded;
+ }
+
+ public void setIsSuggestedOfflinePagesSectionExpanded(boolean expanded) {
+ mIsSuggestedOfflinePagesSectionExpanded = expanded;
+ }
+
+ public int getSuggestedOfflinePageCount() {
Theresa 2017/02/03 19:53:06 nit: public methods need JavaDocs
shaktisahu 2017/02/04 18:57:43 Done.
+ return mNumSuggestedOfflinePages;
+ }
+
+ private TimedItem getSuggestedOfflinePagesHeader() {
+ if (mSuggestedOfflinePagesHeader == null) {
+ mSuggestedOfflinePagesHeader = new TimedItem() {
+ private Long mStableId;
+
+ @Override
+ public long getTimestamp() {
+ return getDate().getTime();
+ }
+
+ @Override
+ public long getStableId() {
+ if (mStableId == null) {
+ // Generate a stable ID based on timestamp.
+ mStableId = 0xFFFFFFFF00000000L + getTimestamp() & 0x0FFFFFFFF;
+ }
+ return mStableId;
+ }
+ };
+ }
+ return mSuggestedOfflinePagesHeader;
+ }
+
+ @Override
+ public void addItem(TimedItem item) {
+ super.addItem(item);
+ if (isSuggestedOfflinePage(item)) {
+ mNumSuggestedOfflinePages++;
+ }
+ }
+
+ @Override
+ public void removeItem(TimedItem item) {
+ super.removeItem(item);
+ if (isSuggestedOfflinePage(item)) {
+ mNumSuggestedOfflinePages--;
+ }
+ }
+
+ @Override
+ protected void setPositionForItems(int startIndex) {
+ int index = startIndex;
+ boolean firstSuggestedItem = false;
+ for (TimedItem item : mItems) {
+ if (isSuggestedOfflinePage(item)) {
+ if (!firstSuggestedItem) {
+ index += 1;
Theresa 2017/02/03 19:53:06 A comment here explaining why we skip a position f
shaktisahu 2017/02/04 18:57:43 Done.
+ firstSuggestedItem = true;
+ }
+ if (!isSuggestedOfflinePagesSectionExpanded()) continue;
Theresa 2017/02/03 19:53:06 Should we break if the suggested offline page sect
shaktisahu 2017/02/04 18:57:43 Done. Yes.
+ }
+ item.setPosition(index);
+ index += 1;
+ }
+ }
+
+ @Override
+ public int size() {
+ int size = super.size();
+ if (mNumSuggestedOfflinePages > 0) {
Theresa 2017/02/03 19:53:06 Do we add everything to the adapter whether or not
shaktisahu 2017/02/04 18:57:43 We only add the visible items to the adapter. The
+ size += 1;
+ if (!isSuggestedOfflinePagesSectionExpanded()) {
+ size -= mNumSuggestedOfflinePages;
+ }
+ }
+
+ return size;
+ }
+
+ public long getSuggestedOfflinePagesFileSize() {
+ long size = 0;
+ for (TimedItem item : mItems) {
+ if (isSuggestedOfflinePage(item)) {
+ size += ((DownloadHistoryItemWrapper) item).getFileSize();
+ }
+ }
+ return size;
+ }
+
+ private boolean isSuggestedOfflinePagesSectionHeader(int index) {
+ return index == (mItems.size() - mNumSuggestedOfflinePages + 1)
+ && mNumSuggestedOfflinePages > 0;
+ }
+
+ @Override
+ public TimedItem getItemAt(int index) {
+ // 0 is allocated to the date header. The list header has no items.
+ if (index == 0) return null;
+
+ sortIfNeeded();
+
+ // The suggested pages start at the end of the group.
+ if (index <= mItems.size() - mNumSuggestedOfflinePages) {
+ return mItems.get(index - 1);
+ } else {
+ if (mNumSuggestedOfflinePages > 0
+ && index == mItems.size() - mNumSuggestedOfflinePages + 1) {
+ return getSuggestedOfflinePagesHeader();
+ } else if (isSuggestedOfflinePagesSectionExpanded()) {
+ return mItems.get(index - 2);
+ } else {
+ assert false;
+ return null;
+ }
+ }
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ if (isSuggestedOfflinePagesSectionHeader(position)) {
+ return DateDividedAdapter.TYPE_SUGGESTED_OFFLINE_PAGES_HEADER;
+ } else {
+ return DateDividedAdapter.TYPE_NORMAL;
+ }
+ }
+
+ @Override
+ public int compareItem(TimedItem lhs, TimedItem rhs) {
+ if (isSuggestedOfflinePage(lhs) && !isSuggestedOfflinePage(rhs)) return 1;
+ if (!isSuggestedOfflinePage(lhs) && isSuggestedOfflinePage(rhs)) return -1;
+
+ return super.compareItem(lhs, rhs);
+ }
+
+ private boolean isSuggestedOfflinePage(TimedItem timedItem) {
+ if (timedItem instanceof OfflinePageItemWrapper) {
+ return ((OfflinePageItemWrapper) timedItem).isSuggested();
+ }
+
+ return false;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698