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

Side by Side 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: rebase and style changes 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.chrome.browser.download.ui;
6
7 import org.chromium.chrome.browser.download.ui.DownloadHistoryItemWrapper.Offlin ePageItemWrapper;
8 import org.chromium.chrome.browser.widget.DateDividedAdapter;
9 import org.chromium.chrome.browser.widget.DateDividedAdapter.TimedItem;
10
11 /**
12 * A bucket of downloaded items with the same date. It also holds the suggested offline items which
13 * are shown at the end of the list for that date.
14 */
15 public class DownloadItemGroup extends DateDividedAdapter.ItemGroup {
16 private int mNumSuggestedOfflinePages;
17 private boolean mIsSuggestedOfflinePagesSectionExpanded;
18
19 /** The header representing the offline pages that are automatically downloa ded */
20 private TimedItem mSuggestedOfflinePagesHeader;
21
22 public DownloadItemGroup(long timestamp) {
23 super(timestamp);
24 mNumSuggestedOfflinePages = 0;
25 mIsSuggestedOfflinePagesSectionExpanded = false;
26 }
27
28 /** @return Whether the suggested pages are expanded. */
29 public boolean isSuggestedOfflinePagesSectionExpanded() {
30 return mIsSuggestedOfflinePagesSectionExpanded;
31 }
32
33 /**
34 * Expands or collapses the suggested offline pages.
35 * @param expanded Whether the suggested pages should be shown.
36 */
37 public void setIsSuggestedOfflinePagesSectionExpanded(boolean expanded) {
38 mIsSuggestedOfflinePagesSectionExpanded = expanded;
39 }
40
41 /** @return The total number of suggested pages for this date. */
42 public int getSuggestedOfflinePageCount() {
43 return mNumSuggestedOfflinePages;
44 }
45
46 private TimedItem getSuggestedOfflinePagesHeader() {
47 if (mSuggestedOfflinePagesHeader == null) {
48 mSuggestedOfflinePagesHeader = new TimedItem() {
49 private Long mStableId;
50
51 @Override
52 public long getTimestamp() {
53 return getDate().getTime();
54 }
55
56 @Override
57 public long getStableId() {
58 if (mStableId == null) {
59 // Generate a stable ID based on timestamp.
60 mStableId = 0xFFFFFFFF00000000L + getTimestamp() & 0x0FF FFFFFF;
61 }
62 return mStableId;
63 }
64 };
65 }
66
67 return mSuggestedOfflinePagesHeader;
68 }
69
70 @Override
71 public void addItem(TimedItem item) {
72 super.addItem(item);
73 if (isSuggestedOfflinePage(item)) {
74 mNumSuggestedOfflinePages++;
75 }
76 }
77
78 @Override
79 public void removeItem(TimedItem item) {
80 super.removeItem(item);
81 if (isSuggestedOfflinePage(item)) {
82 mNumSuggestedOfflinePages--;
83 }
84 }
85
86 /**
87 * The visible items for the group are set to their respective positions in the list view.
88 * Invisible (collpased) items are skipped.
89 */
90 @Override
91 protected void setPositionForItems(int startIndex) {
92 int index = startIndex;
93 boolean firstSuggestedItem = true;
94 for (TimedItem item : mItems) {
95 if (isSuggestedOfflinePage(item)) {
96 // Skip one position for the header at the beginning of the sugg ested items section.
97 if (firstSuggestedItem) {
98 index += 1;
99 firstSuggestedItem = false;
100 }
101 if (!isSuggestedOfflinePagesSectionExpanded()) break;
102 }
103 item.setPosition(index);
104 index += 1;
105 }
106 }
107
108 @Override
109 protected void setPositionForFirstAndLastInGroup() {
110 TimedItem first = mItems.get(0);
111 first.setIsFirstInGroup(true);
112
113 TimedItem last = mItems.get(mItems.size() - 1);
114 if (!isSuggestedOfflinePagesSectionExpanded() && mNumSuggestedOfflinePag es > 0) {
115 last = getSuggestedOfflinePagesHeader();
116 }
117
118 last.setIsLastInGroup(true);
119 }
120
121 @Override
122 public int size() {
123 int size = super.size();
124
125 // The size should match the number of rows in the list view. So, adjust the size depending
126 // on whether the suggested items section is expanded or collapsed.
127 if (mNumSuggestedOfflinePages > 0) {
128 // First item of the suggested pages section is the section header.
129 size += 1;
130 if (!isSuggestedOfflinePagesSectionExpanded()) {
131 size -= mNumSuggestedOfflinePages;
132 }
133 }
134
135 return size;
136 }
137
138 /** @return The total file size of the suggested pages for this date. */
139 public long getSuggestedOfflinePagesFileSize() {
140 long size = 0;
141 for (TimedItem item : mItems) {
142 if (isSuggestedOfflinePage(item)) {
143 size += ((DownloadHistoryItemWrapper) item).getFileSize();
144 }
145 }
146 return size;
147 }
148
149 private boolean isSuggestedOfflinePagesSectionHeader(int index) {
150 return index == (mItems.size() - mNumSuggestedOfflinePages + 1)
151 && mNumSuggestedOfflinePages > 0;
152 }
153
154 @Override
155 public TimedItem getItemAt(int index) {
156 // 0 is allocated to the date header. The list header has no items.
157 if (index == 0) return null;
Theresa 2017/02/07 00:09:05 The history view is going to have a list header vi
shaktisahu 2017/02/07 23:35:12 Done.
158
159 sortIfNeeded();
160
161 // The suggested pages start at the end of the group.
162 if (index <= mItems.size() - mNumSuggestedOfflinePages) {
163 return mItems.get(index - 1);
164 } else {
165 if (mNumSuggestedOfflinePages > 0
166 && index == mItems.size() - mNumSuggestedOfflinePages + 1) {
Theresa 2017/02/07 00:09:05 Could this be extracted to something like getOffli
shaktisahu 2017/02/07 23:35:12 Done.
167 return getSuggestedOfflinePagesHeader();
168 } else if (isSuggestedOfflinePagesSectionExpanded()) {
169 return mItems.get(index - 2);
170 } else {
171 assert false;
172 return null;
173 }
174 }
175 }
176
177 @Override
178 public int getItemViewType(int position) {
179 if (isSuggestedOfflinePagesSectionHeader(position)) {
180 return DateDividedAdapter.TYPE_SUBSECTION_HEADER;
181 } else {
182 return super.getItemViewType(position);
183 }
184 }
185
186 @Override
187 public int compareItem(TimedItem lhs, TimedItem rhs) {
188 if (isSuggestedOfflinePage(lhs) && !isSuggestedOfflinePage(rhs)) return 1;
189 if (!isSuggestedOfflinePage(lhs) && isSuggestedOfflinePage(rhs)) return -1;
190
191 return super.compareItem(lhs, rhs);
192 }
193
194 private boolean isSuggestedOfflinePage(TimedItem timedItem) {
195 if (timedItem instanceof OfflinePageItemWrapper) {
196 return ((OfflinePageItemWrapper) timedItem).isSuggested();
197 }
198
199 return false;
200 }
201 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698