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. | |
13 */ | |
14 public class DownloadItemGroup extends DateDividedAdapter.ItemGroup { | |
15 private int mNumSuggestedOfflinePages; | |
16 private boolean mIsSuggestedOfflinePagesSectionExpanded; | |
17 | |
18 /** The header representing the offline pages that are automatically downloa ded */ | |
19 private TimedItem mSuggestedOfflinePagesHeader; | |
20 | |
21 public DownloadItemGroup(long timestamp) { | |
22 super(timestamp); | |
23 mNumSuggestedOfflinePages = 0; | |
24 mIsSuggestedOfflinePagesSectionExpanded = false; | |
25 } | |
26 | |
27 public boolean isSuggestedOfflinePagesSectionExpanded() { | |
28 return mIsSuggestedOfflinePagesSectionExpanded; | |
29 } | |
30 | |
31 public void setIsSuggestedOfflinePagesSectionExpanded(boolean expanded) { | |
32 mIsSuggestedOfflinePagesSectionExpanded = expanded; | |
33 } | |
34 | |
35 public int getSuggestedOfflinePageCount() { | |
Theresa
2017/02/03 19:53:06
nit: public methods need JavaDocs
shaktisahu
2017/02/04 18:57:43
Done.
| |
36 return mNumSuggestedOfflinePages; | |
37 } | |
38 | |
39 private TimedItem getSuggestedOfflinePagesHeader() { | |
40 if (mSuggestedOfflinePagesHeader == null) { | |
41 mSuggestedOfflinePagesHeader = new TimedItem() { | |
42 private Long mStableId; | |
43 | |
44 @Override | |
45 public long getTimestamp() { | |
46 return getDate().getTime(); | |
47 } | |
48 | |
49 @Override | |
50 public long getStableId() { | |
51 if (mStableId == null) { | |
52 // Generate a stable ID based on timestamp. | |
53 mStableId = 0xFFFFFFFF00000000L + getTimestamp() & 0x0FF FFFFFF; | |
54 } | |
55 return mStableId; | |
56 } | |
57 }; | |
58 } | |
59 return mSuggestedOfflinePagesHeader; | |
60 } | |
61 | |
62 @Override | |
63 public void addItem(TimedItem item) { | |
64 super.addItem(item); | |
65 if (isSuggestedOfflinePage(item)) { | |
66 mNumSuggestedOfflinePages++; | |
67 } | |
68 } | |
69 | |
70 @Override | |
71 public void removeItem(TimedItem item) { | |
72 super.removeItem(item); | |
73 if (isSuggestedOfflinePage(item)) { | |
74 mNumSuggestedOfflinePages--; | |
75 } | |
76 } | |
77 | |
78 @Override | |
79 protected void setPositionForItems(int startIndex) { | |
80 int index = startIndex; | |
81 boolean firstSuggestedItem = false; | |
82 for (TimedItem item : mItems) { | |
83 if (isSuggestedOfflinePage(item)) { | |
84 if (!firstSuggestedItem) { | |
85 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.
| |
86 firstSuggestedItem = true; | |
87 } | |
88 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.
| |
89 } | |
90 item.setPosition(index); | |
91 index += 1; | |
92 } | |
93 } | |
94 | |
95 @Override | |
96 public int size() { | |
97 int size = super.size(); | |
98 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
| |
99 size += 1; | |
100 if (!isSuggestedOfflinePagesSectionExpanded()) { | |
101 size -= mNumSuggestedOfflinePages; | |
102 } | |
103 } | |
104 | |
105 return size; | |
106 } | |
107 | |
108 public long getSuggestedOfflinePagesFileSize() { | |
109 long size = 0; | |
110 for (TimedItem item : mItems) { | |
111 if (isSuggestedOfflinePage(item)) { | |
112 size += ((DownloadHistoryItemWrapper) item).getFileSize(); | |
113 } | |
114 } | |
115 return size; | |
116 } | |
117 | |
118 private boolean isSuggestedOfflinePagesSectionHeader(int index) { | |
119 return index == (mItems.size() - mNumSuggestedOfflinePages + 1) | |
120 && mNumSuggestedOfflinePages > 0; | |
121 } | |
122 | |
123 @Override | |
124 public TimedItem getItemAt(int index) { | |
125 // 0 is allocated to the date header. The list header has no items. | |
126 if (index == 0) return null; | |
127 | |
128 sortIfNeeded(); | |
129 | |
130 // The suggested pages start at the end of the group. | |
131 if (index <= mItems.size() - mNumSuggestedOfflinePages) { | |
132 return mItems.get(index - 1); | |
133 } else { | |
134 if (mNumSuggestedOfflinePages > 0 | |
135 && index == mItems.size() - mNumSuggestedOfflinePages + 1) { | |
136 return getSuggestedOfflinePagesHeader(); | |
137 } else if (isSuggestedOfflinePagesSectionExpanded()) { | |
138 return mItems.get(index - 2); | |
139 } else { | |
140 assert false; | |
141 return null; | |
142 } | |
143 } | |
144 } | |
145 | |
146 @Override | |
147 public int getItemViewType(int position) { | |
148 if (isSuggestedOfflinePagesSectionHeader(position)) { | |
149 return DateDividedAdapter.TYPE_SUGGESTED_OFFLINE_PAGES_HEADER; | |
150 } else { | |
151 return DateDividedAdapter.TYPE_NORMAL; | |
152 } | |
153 } | |
154 | |
155 @Override | |
156 public int compareItem(TimedItem lhs, TimedItem rhs) { | |
157 if (isSuggestedOfflinePage(lhs) && !isSuggestedOfflinePage(rhs)) return 1; | |
158 if (!isSuggestedOfflinePage(lhs) && isSuggestedOfflinePage(rhs)) return -1; | |
159 | |
160 return super.compareItem(lhs, rhs); | |
161 } | |
162 | |
163 private boolean isSuggestedOfflinePage(TimedItem timedItem) { | |
164 if (timedItem instanceof OfflinePageItemWrapper) { | |
165 return ((OfflinePageItemWrapper) timedItem).isSuggested(); | |
166 } | |
167 | |
168 return false; | |
169 } | |
170 } | |
OLD | NEW |