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

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: Modified removeItem 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 }
25
26 /** @return Whether the suggested pages are expanded. */
27 public boolean isSuggestedOfflinePagesSectionExpanded() {
28 return mIsSuggestedOfflinePagesSectionExpanded;
29 }
30
31 /**
32 * Expands or collapses the suggested offline pages.
33 * @param expanded Whether the suggested pages should be shown.
34 */
35 public void setIsSuggestedOfflinePagesSectionExpanded(boolean expanded) {
36 mIsSuggestedOfflinePagesSectionExpanded = expanded;
37 }
38
39 /** @return The total number of suggested pages for this date. */
40 public int getNumSuggestedOfflinePages() {
41 return mNumSuggestedOfflinePages;
42 }
43
44 private TimedItem getSuggestedOfflinePagesHeader() {
45 if (mSuggestedOfflinePagesHeader == null) {
46 mSuggestedOfflinePagesHeader = new TimedItem() {
47 private Long mStableId;
48
49 @Override
50 public long getTimestamp() {
51 return mDate.getTime();
52 }
53
54 @Override
55 public long getStableId() {
56 if (mStableId == null) {
57 // Generate a stable ID based on timestamp.
58 mStableId = 0xFFFFFFFF00000000L + (getTimestamp() & 0x0F FFFFFFF);
59 }
60 return mStableId;
61 }
62 };
63 }
64
65 return mSuggestedOfflinePagesHeader;
66 }
67
68 @Override
69 public void addItem(TimedItem item) {
70 super.addItem(item);
71 if (isSuggestedOfflinePage(item)) {
72 mNumSuggestedOfflinePages++;
73 }
74 }
75
76 @Override
77 public void removeItem(TimedItem item) {
78 super.removeItem(item);
79 if (isSuggestedOfflinePage(item)) {
80 mNumSuggestedOfflinePages--;
Theresa 2017/02/13 19:15:00 This method should be responsible for removing the
81 }
82 }
83
84 /**
85 * The visible items for the group are set to their respective positions in the list view.
86 * Invisible (collpased) items are skipped.
87 */
88 @Override
89 protected void setPositionForItems(int startIndex) {
90 int index = startIndex;
91 boolean isFirstSuggestedItem = true;
92 for (TimedItem item : mItems) {
93 // Skip one position for the header at the beginning of the suggeste d items section.
94 if (isFirstSuggestedItem && isSuggestedOfflinePage(item)) {
95 index += 1;
96 isFirstSuggestedItem = false;
97 }
98 item.setPosition(index);
99 index += 1;
100 }
101 }
102
103 @Override
104 protected void markFirstAndLastItem() {
105 TimedItem first = mItems.get(0);
106 first.setIsFirstInGroup(true);
107
108 TimedItem last = mItems.get(mItems.size() - 1);
109 if (!isSuggestedOfflinePagesSectionExpanded() && mNumSuggestedOfflinePag es > 0) {
110 last = getSuggestedOfflinePagesHeader();
111 }
112
113 last.setIsLastInGroup(true);
114 }
115
116 @Override
117 public int size() {
118 int size = super.size();
119
120 // The size should match the number of rows in the list view. So, adjust the size depending
121 // on whether the suggested items section is expanded or collapsed.
122 if (mNumSuggestedOfflinePages > 0) {
123 // First item of the suggested pages section is the section header.
124 size += 1;
125 if (!isSuggestedOfflinePagesSectionExpanded()) {
126 size -= mNumSuggestedOfflinePages;
127 }
128 }
129
130 return size;
131 }
132
133 /** @return The total file size of the suggested pages for this date. */
134 public long getSuggestedOfflinePagesFileSize() {
135 long size = 0;
136 for (TimedItem item : mItems) {
137 if (isSuggestedOfflinePage(item)) {
138 size += ((DownloadHistoryItemWrapper) item).getFileSize();
139 }
140 }
141 return size;
142 }
143
144 private int getSuggestedOfflinePagesSectionHeaderPosition() {
145 return mItems.size() - mNumSuggestedOfflinePages + 1;
146 }
147
148 private boolean isSuggestedOfflinePagesSectionHeader(int index) {
149 return index == getSuggestedOfflinePagesSectionHeaderPosition()
150 && mNumSuggestedOfflinePages > 0;
151 }
152
153 @Override
154 protected TimedItem getItemAtInternal(int index) {
155 // The suggested pages start at the end of the group.
156 // So, the ordering of the items in this list is :
157 // date header, regular items, suggested pages header, suggested pages ( if expanded).
158 int suggestedSectionHeaderIndex = getSuggestedOfflinePagesSectionHeaderP osition();
159 if (index < suggestedSectionHeaderIndex) {
160 return mItems.get(index - 1);
161 } else if (index == suggestedSectionHeaderIndex) {
162 assert mNumSuggestedOfflinePages > 0;
163 return getSuggestedOfflinePagesHeader();
164 } else {
165 assert isSuggestedOfflinePagesSectionExpanded();
166 return mItems.get(index - 2);
167 }
168 }
169
170 @Override
171 public int getItemViewType(int position) {
172 if (isSuggestedOfflinePagesSectionHeader(position)) {
173 return DateDividedAdapter.TYPE_SUBSECTION_HEADER;
174 } else {
175 return super.getItemViewType(position);
176 }
177 }
178
179 @Override
180 public int compareItem(TimedItem lhs, TimedItem rhs) {
181 if (isSuggestedOfflinePage(lhs) && !isSuggestedOfflinePage(rhs)) return 1;
182 if (!isSuggestedOfflinePage(lhs) && isSuggestedOfflinePage(rhs)) return -1;
183
184 return super.compareItem(lhs, rhs);
185 }
186
187 private boolean isSuggestedOfflinePage(TimedItem timedItem) {
188 if (timedItem instanceof OfflinePageItemWrapper) {
189 return ((OfflinePageItemWrapper) timedItem).isSuggested();
190 }
191
192 return false;
193 }
194
195 @Override
196 public int getNumberOfRowsToBeRemovedForItem(TimedItem item) {
197 int numRowsToRemove = super.getNumberOfRowsToBeRemovedForItem(item);
198
199 // Remove the suggested pages header too if this is the last item.
200 if (mNumSuggestedOfflinePages == 1 && isSuggestedOfflinePage(item)) {
201 numRowsToRemove++;
202 }
203
204 return numRowsToRemove;
205 }
206 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698