OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.enhancedbookmarks; | 5 package org.chromium.chrome.browser.enhancedbookmarks; |
6 | 6 |
7 import android.content.Context; | 7 import android.content.Context; |
8 import android.support.v7.widget.RecyclerView; | 8 import android.support.v7.widget.RecyclerView; |
9 import android.support.v7.widget.RecyclerView.ViewHolder; | 9 import android.support.v7.widget.RecyclerView.ViewHolder; |
10 import android.view.LayoutInflater; | 10 import android.view.LayoutInflater; |
11 import android.view.View; | 11 import android.view.View; |
12 import android.view.ViewGroup; | 12 import android.view.ViewGroup; |
13 | 13 |
14 import org.chromium.base.annotations.SuppressFBWarnings; | 14 import org.chromium.base.annotations.SuppressFBWarnings; |
15 import org.chromium.chrome.R; | 15 import org.chromium.chrome.R; |
16 import org.chromium.chrome.browser.BookmarksBridge.BookmarkItem; | 16 import org.chromium.chrome.browser.BookmarksBridge.BookmarkItem; |
17 import org.chromium.chrome.browser.BookmarksBridge.BookmarkModelObserver; | 17 import org.chromium.chrome.browser.BookmarksBridge.BookmarkModelObserver; |
18 import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkManager.UIS tate; | |
18 import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkPromoHeader .PromoHeaderShowingChangeListener; | 19 import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkPromoHeader .PromoHeaderShowingChangeListener; |
20 import org.chromium.chrome.browser.offline_pages.OfflinePageStorageSpaceHeader; | |
21 import org.chromium.chrome.browser.offline_pages.OfflinePageStorageSpaceHeader.S torageSpaceHeaderCallback; | |
19 import org.chromium.components.bookmarks.BookmarkId; | 22 import org.chromium.components.bookmarks.BookmarkId; |
20 | 23 |
21 import java.util.ArrayList; | 24 import java.util.ArrayList; |
22 import java.util.List; | 25 import java.util.List; |
23 | 26 |
24 /** | 27 /** |
25 * BaseAdapter for EnhancedBookmarkItemsContainer. It manages bookmarks to list there. | 28 * BaseAdapter for EnhancedBookmarkItemsContainer. It manages bookmarks to list there. |
26 */ | 29 */ |
27 class EnhancedBookmarkItemsAdapter extends RecyclerView.Adapter<RecyclerView.Vie wHolder> implements | 30 class EnhancedBookmarkItemsAdapter extends RecyclerView.Adapter<RecyclerView.Vie wHolder> implements |
28 EnhancedBookmarkUIObserver, PromoHeaderShowingChangeListener { | 31 EnhancedBookmarkUIObserver, PromoHeaderShowingChangeListener { |
29 | 32 |
30 private static final int PROMO_HEADER_VIEW = 0; | 33 private static final int PROMO_HEADER_VIEW = 0; |
31 private static final int FOLDER_VIEW = 1; | 34 private static final int FOLDER_VIEW = 1; |
32 private static final int DIVIDER_VIEW = 2; | 35 private static final int DIVIDER_VIEW = 2; |
33 private static final int BOOKMARK_VIEW = 3; | 36 private static final int BOOKMARK_VIEW = 3; |
37 private static final int OFFLINE_PAGES_STORAGE_VIEW = 4; | |
34 | 38 |
35 private EnhancedBookmarkDelegate mDelegate; | 39 private EnhancedBookmarkDelegate mDelegate; |
36 private Context mContext; | 40 private Context mContext; |
37 private EnhancedBookmarkPromoHeader mPromoHeaderManager; | 41 private EnhancedBookmarkPromoHeader mPromoHeaderManager; |
42 private OfflinePageStorageSpaceHeader mOfflineStorageHeader; | |
38 | 43 |
39 private List<List<? extends Object>> mSections; | 44 private List<List<? extends Object>> mSections; |
40 private List<Object> mPromoHeaderSection = new ArrayList<>(); | 45 private List<Object> mPromoHeaderSection = new ArrayList<>(); |
46 private List<Object> mOfflineStorageSection = new ArrayList<>(); | |
41 private List<Object> mFolderDividerSection = new ArrayList<>(); | 47 private List<Object> mFolderDividerSection = new ArrayList<>(); |
42 private List<BookmarkId> mFolderSection = new ArrayList<>(); | 48 private List<BookmarkId> mFolderSection = new ArrayList<>(); |
43 private List<Object> mBookmarkDividerSection = new ArrayList<>(); | 49 private List<Object> mBookmarkDividerSection = new ArrayList<>(); |
44 private List<BookmarkId> mBookmarkSection = new ArrayList<>(); | 50 private List<BookmarkId> mBookmarkSection = new ArrayList<>(); |
45 | 51 |
46 private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObse rver() { | 52 private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObse rver() { |
47 @Override | 53 @Override |
48 public void bookmarkNodeChanged(BookmarkItem node) { | 54 public void bookmarkNodeChanged(BookmarkItem node) { |
49 int position = getPositionForBookmark(node.getId()); | 55 int position = getPositionForBookmark(node.getId()); |
50 if (position >= 0) notifyItemChanged(position); | 56 if (position >= 0) notifyItemChanged(position); |
(...skipping 16 matching lines...) Expand all Loading... | |
67 public void bookmarkModelChanged() { | 73 public void bookmarkModelChanged() { |
68 mDelegate.notifyStateChange(EnhancedBookmarkItemsAdapter.this); | 74 mDelegate.notifyStateChange(EnhancedBookmarkItemsAdapter.this); |
69 } | 75 } |
70 }; | 76 }; |
71 | 77 |
72 EnhancedBookmarkItemsAdapter(Context context) { | 78 EnhancedBookmarkItemsAdapter(Context context) { |
73 mContext = context; | 79 mContext = context; |
74 | 80 |
75 mSections = new ArrayList<>(); | 81 mSections = new ArrayList<>(); |
76 mSections.add(mPromoHeaderSection); | 82 mSections.add(mPromoHeaderSection); |
83 mSections.add(mOfflineStorageSection); | |
77 mSections.add(mFolderDividerSection); | 84 mSections.add(mFolderDividerSection); |
78 mSections.add(mFolderSection); | 85 mSections.add(mFolderSection); |
79 mSections.add(mBookmarkDividerSection); | 86 mSections.add(mBookmarkDividerSection); |
80 mSections.add(mBookmarkSection); | 87 mSections.add(mBookmarkSection); |
81 } | 88 } |
82 | 89 |
83 BookmarkId getItem(int position) { | 90 BookmarkId getItem(int position) { |
84 return (BookmarkId) getSection(position).get(toSectionPosition(position) ); | 91 return (BookmarkId) getSection(position).get(toSectionPosition(position) ); |
85 } | 92 } |
86 | 93 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
124 * @param folders This can be null if there is no folders to show. | 131 * @param folders This can be null if there is no folders to show. |
125 */ | 132 */ |
126 private void setBookmarks(List<BookmarkId> folders, List<BookmarkId> bookmar ks) { | 133 private void setBookmarks(List<BookmarkId> folders, List<BookmarkId> bookmar ks) { |
127 if (folders == null) folders = new ArrayList<BookmarkId>(); | 134 if (folders == null) folders = new ArrayList<BookmarkId>(); |
128 | 135 |
129 mFolderSection.clear(); | 136 mFolderSection.clear(); |
130 mFolderSection.addAll(folders); | 137 mFolderSection.addAll(folders); |
131 mBookmarkSection.clear(); | 138 mBookmarkSection.clear(); |
132 mBookmarkSection.addAll(bookmarks); | 139 mBookmarkSection.addAll(bookmarks); |
133 | 140 |
141 updateHeader(); | |
134 updateDividerSections(); | 142 updateDividerSections(); |
135 | 143 |
136 // TODO(kkimlabs): Animation is disabled due to a performance issue on b ookmark undo. | 144 // TODO(kkimlabs): Animation is disabled due to a performance issue on b ookmark undo. |
137 // http://crbug.com/484174 | 145 // http://crbug.com/484174 |
138 notifyDataSetChanged(); | 146 notifyDataSetChanged(); |
139 } | 147 } |
140 | 148 |
141 private void updateDividerSections() { | 149 private void updateDividerSections() { |
142 mFolderDividerSection.clear(); | 150 mFolderDividerSection.clear(); |
143 mBookmarkDividerSection.clear(); | 151 mBookmarkDividerSection.clear(); |
144 if (!mPromoHeaderSection.isEmpty() && !mFolderSection.isEmpty()) { | 152 |
153 boolean isHeaderPresent = | |
154 !mPromoHeaderSection.isEmpty() || !mOfflineStorageSection.isEmpt y(); | |
155 | |
156 if (isHeaderPresent && !mFolderSection.isEmpty()) { | |
145 mFolderDividerSection.add(null); | 157 mFolderDividerSection.add(null); |
146 } | 158 } |
147 if ((!mPromoHeaderSection.isEmpty() || !mFolderSection.isEmpty()) | 159 if ((isHeaderPresent || !mFolderSection.isEmpty()) && !mBookmarkSection. isEmpty()) { |
148 && !mBookmarkSection.isEmpty()) { | |
149 mBookmarkDividerSection.add(null); | 160 mBookmarkDividerSection.add(null); |
150 } | 161 } |
151 } | 162 } |
152 | 163 |
153 private void removeItem(int position) { | 164 private void removeItem(int position) { |
154 List<?> section = getSection(position); | 165 List<?> section = getSection(position); |
155 assert section == mFolderSection || section == mBookmarkSection; | 166 assert section == mFolderSection || section == mBookmarkSection; |
156 section.remove(toSectionPosition(position)); | 167 section.remove(toSectionPosition(position)); |
157 notifyItemRemoved(position); | 168 notifyItemRemoved(position); |
158 } | 169 } |
159 | 170 |
160 // RecyclerView.Adapter implementation. | 171 // RecyclerView.Adapter implementation. |
161 | 172 |
162 @Override | 173 @Override |
163 public int getItemCount() { | 174 public int getItemCount() { |
164 int count = 0; | 175 int count = 0; |
165 for (List<?> section : mSections) { | 176 for (List<?> section : mSections) { |
166 count += section.size(); | 177 count += section.size(); |
167 } | 178 } |
168 return count; | 179 return count; |
169 } | 180 } |
170 | 181 |
171 @Override | 182 @Override |
172 public int getItemViewType(int position) { | 183 public int getItemViewType(int position) { |
173 List<?> section = getSection(position); | 184 List<?> section = getSection(position); |
174 | 185 |
175 if (section == mPromoHeaderSection) { | 186 if (section == mPromoHeaderSection) { |
176 return PROMO_HEADER_VIEW; | 187 return PROMO_HEADER_VIEW; |
188 } else if (section == mOfflineStorageSection) { | |
189 return OFFLINE_PAGES_STORAGE_VIEW; | |
177 } else if (section == mFolderDividerSection | 190 } else if (section == mFolderDividerSection |
178 || section == mBookmarkDividerSection) { | 191 || section == mBookmarkDividerSection) { |
179 return DIVIDER_VIEW; | 192 return DIVIDER_VIEW; |
180 } else if (section == mFolderSection) { | 193 } else if (section == mFolderSection) { |
181 return FOLDER_VIEW; | 194 return FOLDER_VIEW; |
182 } else if (section == mBookmarkSection) { | 195 } else if (section == mBookmarkSection) { |
183 return BOOKMARK_VIEW; | 196 return BOOKMARK_VIEW; |
184 } | 197 } |
185 | 198 |
186 assert false : "Invalid position requested"; | 199 assert false : "Invalid position requested"; |
187 return -1; | 200 return -1; |
188 } | 201 } |
189 | 202 |
190 @Override | 203 @Override |
191 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | 204 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
192 switch (viewType) { | 205 switch (viewType) { |
193 case PROMO_HEADER_VIEW: | 206 case PROMO_HEADER_VIEW: |
194 return mPromoHeaderManager.createHolder(parent); | 207 return mPromoHeaderManager.createHolder(parent); |
208 case OFFLINE_PAGES_STORAGE_VIEW: | |
209 return mOfflineStorageHeader.createHolder(parent); | |
195 case DIVIDER_VIEW: | 210 case DIVIDER_VIEW: |
196 return new ViewHolder(LayoutInflater.from(parent.getContext()).i nflate( | 211 return new ViewHolder(LayoutInflater.from(parent.getContext()).i nflate( |
197 R.layout.eb_divider, parent, false)) {}; | 212 R.layout.eb_divider, parent, false)) {}; |
198 case FOLDER_VIEW: | 213 case FOLDER_VIEW: |
199 EnhancedBookmarkFolderRow folder = (EnhancedBookmarkFolderRow) L ayoutInflater | 214 EnhancedBookmarkFolderRow folder = (EnhancedBookmarkFolderRow) L ayoutInflater |
200 .from(parent.getContext()).inflate(R.layout.eb_folder_ro w, parent, false); | 215 .from(parent.getContext()).inflate(R.layout.eb_folder_ro w, parent, false); |
201 folder.onEnhancedBookmarkDelegateInitialized(mDelegate); | 216 folder.onEnhancedBookmarkDelegateInitialized(mDelegate); |
202 return new ItemViewHolder(folder); | 217 return new ItemViewHolder(folder); |
203 case BOOKMARK_VIEW: | 218 case BOOKMARK_VIEW: |
204 EnhancedBookmarkBookmarkRow item = (EnhancedBookmarkBookmarkRow) LayoutInflater | 219 EnhancedBookmarkBookmarkRow item = (EnhancedBookmarkBookmarkRow) LayoutInflater |
205 .from(parent.getContext()).inflate(R.layout.eb_bookmark_ row, parent, false); | 220 .from(parent.getContext()).inflate(R.layout.eb_bookmark_ row, parent, false); |
206 item.onEnhancedBookmarkDelegateInitialized(mDelegate); | 221 item.onEnhancedBookmarkDelegateInitialized(mDelegate); |
207 return new ItemViewHolder(item); | 222 return new ItemViewHolder(item); |
208 default: | 223 default: |
209 assert false; | 224 assert false; |
210 return null; | 225 return null; |
211 } | 226 } |
212 } | 227 } |
213 | 228 |
214 @SuppressFBWarnings("BC_UNCONFIRMED_CAST") | 229 @SuppressFBWarnings("BC_UNCONFIRMED_CAST") |
215 @Override | 230 @Override |
216 public void onBindViewHolder(ViewHolder holder, int position) { | 231 public void onBindViewHolder(ViewHolder holder, int position) { |
217 BookmarkId id = getItem(position); | 232 BookmarkId id = getItem(position); |
218 switch (getItemViewType(position)) { | 233 switch (getItemViewType(position)) { |
219 case PROMO_HEADER_VIEW: | 234 case PROMO_HEADER_VIEW: |
235 case OFFLINE_PAGES_STORAGE_VIEW: | |
220 case DIVIDER_VIEW: | 236 case DIVIDER_VIEW: |
221 break; | 237 break; |
222 case FOLDER_VIEW: | 238 case FOLDER_VIEW: |
223 ((EnhancedBookmarkRow) holder.itemView).setBookmarkId(id); | 239 ((EnhancedBookmarkRow) holder.itemView).setBookmarkId(id); |
224 break; | 240 break; |
225 case BOOKMARK_VIEW: | 241 case BOOKMARK_VIEW: |
226 ((EnhancedBookmarkRow) holder.itemView).setBookmarkId(id); | 242 ((EnhancedBookmarkRow) holder.itemView).setBookmarkId(id); |
227 break; | 243 break; |
228 default: | 244 default: |
229 assert false : "View type not supported!"; | 245 assert false : "View type not supported!"; |
230 } | 246 } |
231 } | 247 } |
232 | 248 |
233 // PromoHeaderShowingChangeListener implementation. | 249 // PromoHeaderShowingChangeListener implementation. |
234 | 250 |
235 @Override | 251 @Override |
236 public void onPromoHeaderShowingChanged(boolean isShowing) { | 252 public void onPromoHeaderShowingChanged(boolean isShowing) { |
237 mPromoHeaderSection.clear(); | 253 if (mDelegate.getCurrentState() != UIState.STATE_ALL_BOOKMARKS |
238 if (isShowing) mPromoHeaderSection.add(null); | 254 && mDelegate.getCurrentState() != UIState.STATE_FOLDER) { |
255 return; | |
256 } | |
239 | 257 |
258 updateHeader(); | |
240 updateDividerSections(); | 259 updateDividerSections(); |
241 notifyDataSetChanged(); | 260 notifyDataSetChanged(); |
242 } | 261 } |
243 | 262 |
244 // EnhancedBookmarkUIObserver implementations. | 263 // EnhancedBookmarkUIObserver implementations. |
245 | 264 |
246 @Override | 265 @Override |
247 public void onEnhancedBookmarkDelegateInitialized(EnhancedBookmarkDelegate d elegate) { | 266 public void onEnhancedBookmarkDelegateInitialized(EnhancedBookmarkDelegate d elegate) { |
248 mDelegate = delegate; | 267 mDelegate = delegate; |
249 mDelegate.addUIObserver(this); | 268 mDelegate.addUIObserver(this); |
250 mDelegate.getModel().addObserver(mBookmarkModelObserver); | 269 mDelegate.getModel().addObserver(mBookmarkModelObserver); |
251 mPromoHeaderManager = new EnhancedBookmarkPromoHeader(mContext, this); | 270 mPromoHeaderManager = new EnhancedBookmarkPromoHeader(mContext, this); |
252 if (mPromoHeaderManager.shouldShow()) mPromoHeaderSection.add(null); | 271 if (mDelegate.getModel().getOfflinePageBridge() != null) { |
jianli
2015/08/21 23:39:21
nit: cache mDelegate.getModel().getOfflinePageBrid
fgorski
2015/08/24 18:47:14
Done.
| |
253 | 272 mOfflineStorageHeader = new OfflinePageStorageSpaceHeader(mContext, |
254 updateDividerSections(); | 273 mDelegate.getModel().getOfflinePageBridge(), new StorageSpac eHeaderCallback() { |
274 @Override | |
275 public void onStorageSpaceCleanUpDone() { | |
276 refreshOfflinePagesFilterView(); | |
277 } | |
278 }); | |
279 } | |
255 } | 280 } |
256 | 281 |
257 @Override | 282 @Override |
258 public void onDestroy() { | 283 public void onDestroy() { |
259 mDelegate.removeUIObserver(this); | 284 mDelegate.removeUIObserver(this); |
260 mDelegate.getModel().removeObserver(mBookmarkModelObserver); | 285 mDelegate.getModel().removeObserver(mBookmarkModelObserver); |
261 mPromoHeaderManager.destroy(); | 286 mPromoHeaderManager.destroy(); |
262 } | 287 } |
263 | 288 |
264 @Override | 289 @Override |
(...skipping 14 matching lines...) Expand all Loading... | |
279 } | 304 } |
280 | 305 |
281 @Override | 306 @Override |
282 public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} | 307 public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} |
283 | 308 |
284 private static class ItemViewHolder extends RecyclerView.ViewHolder { | 309 private static class ItemViewHolder extends RecyclerView.ViewHolder { |
285 private ItemViewHolder(View view) { | 310 private ItemViewHolder(View view) { |
286 super(view); | 311 super(view); |
287 } | 312 } |
288 } | 313 } |
314 | |
315 private void updateHeader() { | |
316 int currentUIState = mDelegate.getCurrentState(); | |
317 if (currentUIState == UIState.STATE_LOADING) return; | |
318 | |
319 mPromoHeaderSection.clear(); | |
320 mOfflineStorageSection.clear(); | |
321 if (currentUIState == UIState.STATE_FILTER) { | |
322 if (mOfflineStorageHeader != null && mOfflineStorageHeader.shouldSho w()) { | |
323 mOfflineStorageSection.add(null); | |
324 } | |
325 } else { | |
326 assert currentUIState == UIState.STATE_ALL_BOOKMARKS | |
327 || currentUIState == UIState.STATE_FOLDER : "Unexpected UI s tate"; | |
328 if (mPromoHeaderManager.shouldShow()) { | |
329 mPromoHeaderSection.add(null); | |
330 } | |
331 } | |
332 } | |
333 | |
334 private void refreshOfflinePagesFilterView() { | |
335 if (mDelegate.getCurrentState() != UIState.STATE_FILTER) return; | |
336 setBookmarks(null, | |
337 mDelegate.getModel().getBookmarkIDsByFilter(EnhancedBookmarkFilt er.OFFLINE_PAGES)); | |
338 } | |
289 } | 339 } |
OLD | NEW |