OLD | NEW |
---|---|
(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 } | |
OLD | NEW |