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.bookmarks; | 5 package org.chromium.chrome.browser.bookmarks; |
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.text.TextUtils; | 10 import android.text.TextUtils; |
11 import android.view.LayoutInflater; | 11 import android.view.LayoutInflater; |
12 import android.view.View; | 12 import android.view.View; |
13 import android.view.ViewGroup; | 13 import android.view.ViewGroup; |
14 | 14 |
15 import org.chromium.base.VisibleForTesting; | 15 import org.chromium.base.VisibleForTesting; |
16 import org.chromium.base.annotations.SuppressFBWarnings; | 16 import org.chromium.base.annotations.SuppressFBWarnings; |
17 import org.chromium.chrome.R; | 17 import org.chromium.chrome.R; |
18 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; | 18 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; |
19 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve
r; | 19 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve
r; |
20 import org.chromium.chrome.browser.bookmarks.BookmarkPromoHeader.PromoHeaderShow
ingChangeListener; | 20 import org.chromium.chrome.browser.bookmarks.BookmarkPromoHeader.PromoHeaderShow
ingChangeListener; |
21 import org.chromium.components.bookmarks.BookmarkId; | 21 import org.chromium.components.bookmarks.BookmarkId; |
22 import org.chromium.ui.base.DeviceFormFactor; | |
23 | 22 |
24 import java.util.ArrayList; | 23 import java.util.ArrayList; |
25 import java.util.List; | 24 import java.util.List; |
26 | 25 |
27 /** | 26 /** |
28 * BaseAdapter for {@link RecyclerView}. It manages bookmarks to list there. | 27 * BaseAdapter for {@link RecyclerView}. It manages bookmarks to list there. |
29 */ | 28 */ |
30 class BookmarkItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements | 29 class BookmarkItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements |
31 BookmarkUIObserver, PromoHeaderShowingChangeListener { | 30 BookmarkUIObserver, PromoHeaderShowingChangeListener { |
32 private static final int PROMO_HEADER_VIEW = 0; | 31 private static final int PROMO_HEADER_VIEW = 0; |
33 private static final int FOLDER_VIEW = 1; | 32 private static final int FOLDER_VIEW = 1; |
34 private static final int DIVIDER_VIEW = 2; | 33 private static final int BOOKMARK_VIEW = 2; |
35 private static final int BOOKMARK_VIEW = 3; | |
36 | 34 |
37 private static final int MAXIMUM_NUMBER_OF_SEARCH_RESULTS = 500; | 35 private static final int MAXIMUM_NUMBER_OF_SEARCH_RESULTS = 500; |
38 private static final String EMPTY_QUERY = null; | 36 private static final String EMPTY_QUERY = null; |
39 | 37 |
| 38 private final List<List<? extends Object>> mSections; |
| 39 private final List<Object> mPromoHeaderSection = new ArrayList<>(); |
| 40 private final List<BookmarkId> mFolderSection = new ArrayList<>(); |
| 41 private final List<BookmarkId> mBookmarkSection = new ArrayList<>(); |
| 42 |
| 43 private final List<BookmarkRow> mBookmarkRows = new ArrayList<>(); |
| 44 private final List<BookmarkRow> mFolderRows = new ArrayList<>(); |
| 45 |
| 46 private final List<BookmarkId> mTopLevelFolders = new ArrayList<>(); |
| 47 |
40 private BookmarkDelegate mDelegate; | 48 private BookmarkDelegate mDelegate; |
41 private Context mContext; | 49 private Context mContext; |
42 private BookmarkPromoHeader mPromoHeaderManager; | 50 private BookmarkPromoHeader mPromoHeaderManager; |
43 private boolean mShouldShowDividers; | |
44 private String mSearchText; | 51 private String mSearchText; |
45 | 52 |
46 private List<List<? extends Object>> mSections; | |
47 private List<Object> mPromoHeaderSection = new ArrayList<>(); | |
48 private List<Object> mFolderDividerSection; | |
49 private List<BookmarkId> mFolderSection = new ArrayList<>(); | |
50 private List<Object> mBookmarkDividerSection; | |
51 private List<BookmarkId> mBookmarkSection = new ArrayList<>(); | |
52 | |
53 private List<BookmarkRow> mBookmarkRows = new ArrayList<>(); | |
54 private List<BookmarkRow> mFolderRows = new ArrayList<>(); | |
55 | |
56 private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObse
rver() { | 53 private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObse
rver() { |
57 @Override | 54 @Override |
58 public void bookmarkNodeChanged(BookmarkItem node) { | 55 public void bookmarkNodeChanged(BookmarkItem node) { |
59 assert mDelegate != null; | 56 assert mDelegate != null; |
60 int position = getPositionForBookmark(node.getId()); | 57 int position = getPositionForBookmark(node.getId()); |
61 if (position >= 0) notifyItemChanged(position); | 58 if (position >= 0) notifyItemChanged(position); |
62 } | 59 } |
63 | 60 |
64 @Override | 61 @Override |
65 public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, Bookm
arkItem node, | 62 public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, Bookm
arkItem node, |
(...skipping 17 matching lines...) Expand all Loading... |
83 if (mDelegate.getCurrentState() == BookmarkUIState.STATE_SEARCHING | 80 if (mDelegate.getCurrentState() == BookmarkUIState.STATE_SEARCHING |
84 && !TextUtils.equals(mSearchText, EMPTY_QUERY)) { | 81 && !TextUtils.equals(mSearchText, EMPTY_QUERY)) { |
85 search(mSearchText); | 82 search(mSearchText); |
86 } | 83 } |
87 } | 84 } |
88 }; | 85 }; |
89 | 86 |
90 BookmarkItemsAdapter(Context context) { | 87 BookmarkItemsAdapter(Context context) { |
91 mContext = context; | 88 mContext = context; |
92 | 89 |
93 // TODO(twellington): remove dividers entirely after the bookmarks 720dp
layout is restyled | |
94 // to match the < 720dp style. | |
95 mShouldShowDividers = DeviceFormFactor.isLargeTablet(context); | |
96 | |
97 mSections = new ArrayList<>(); | 90 mSections = new ArrayList<>(); |
98 mSections.add(mPromoHeaderSection); | 91 mSections.add(mPromoHeaderSection); |
99 | |
100 if (mShouldShowDividers) { | |
101 mFolderDividerSection = new ArrayList<>(); | |
102 mSections.add(mFolderDividerSection); | |
103 } | |
104 | |
105 mSections.add(mFolderSection); | 92 mSections.add(mFolderSection); |
106 | |
107 if (mShouldShowDividers) { | |
108 mBookmarkDividerSection = new ArrayList<>(); | |
109 mSections.add(mBookmarkDividerSection); | |
110 } | |
111 | |
112 mSections.add(mBookmarkSection); | 93 mSections.add(mBookmarkSection); |
113 } | 94 } |
114 | 95 |
115 BookmarkId getItem(int position) { | 96 BookmarkId getItem(int position) { |
116 return (BookmarkId) getSection(position).get(toSectionPosition(position)
); | 97 return (BookmarkId) getSection(position).get(toSectionPosition(position)
); |
117 } | 98 } |
118 | 99 |
119 private int toSectionPosition(int globalPosition) { | 100 private int toSectionPosition(int globalPosition) { |
120 int sectionPosition = globalPosition; | 101 int sectionPosition = globalPosition; |
121 for (List<?> section : mSections) { | 102 for (List<?> section : mSections) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 if (folders == null) folders = new ArrayList<BookmarkId>(); | 140 if (folders == null) folders = new ArrayList<BookmarkId>(); |
160 | 141 |
161 mFolderSection.clear(); | 142 mFolderSection.clear(); |
162 mFolderSection.addAll(folders); | 143 mFolderSection.addAll(folders); |
163 mBookmarkSection.clear(); | 144 mBookmarkSection.clear(); |
164 mBookmarkSection.addAll(bookmarks); | 145 mBookmarkSection.addAll(bookmarks); |
165 | 146 |
166 updateHeaderAndNotify(); | 147 updateHeaderAndNotify(); |
167 } | 148 } |
168 | 149 |
169 private void updateDividerSections() { | |
170 if (!mShouldShowDividers) return; | |
171 | |
172 mFolderDividerSection.clear(); | |
173 mBookmarkDividerSection.clear(); | |
174 | |
175 boolean isHeaderPresent = !mPromoHeaderSection.isEmpty(); | |
176 | |
177 if (isHeaderPresent && !mFolderSection.isEmpty()) { | |
178 mFolderDividerSection.add(null); | |
179 } | |
180 if ((isHeaderPresent || !mFolderSection.isEmpty()) && !mBookmarkSection.
isEmpty()) { | |
181 mBookmarkDividerSection.add(null); | |
182 } | |
183 } | |
184 | |
185 private void removeItem(int position) { | 150 private void removeItem(int position) { |
186 List<?> section = getSection(position); | 151 List<?> section = getSection(position); |
187 assert section == mFolderSection || section == mBookmarkSection; | 152 assert section == mFolderSection || section == mBookmarkSection; |
188 section.remove(toSectionPosition(position)); | 153 section.remove(toSectionPosition(position)); |
189 notifyItemRemoved(position); | 154 notifyItemRemoved(position); |
190 | 155 |
191 if (section == mBookmarkSection && !mBookmarkSection.isEmpty()) { | 156 if (section == mBookmarkSection && !mBookmarkSection.isEmpty()) { |
192 for (BookmarkRow row : mBookmarkRows) { | 157 for (BookmarkRow row : mBookmarkRows) { |
193 BookmarkId id = row.getItem(); | 158 BookmarkId id = row.getItem(); |
194 setBackgroundResourceForBookmarkRow(row, id); | 159 setBackgroundResourceForBookmarkRow(row, id); |
(...skipping 16 matching lines...) Expand all Loading... |
211 } | 176 } |
212 return count; | 177 return count; |
213 } | 178 } |
214 | 179 |
215 @Override | 180 @Override |
216 public int getItemViewType(int position) { | 181 public int getItemViewType(int position) { |
217 List<?> section = getSection(position); | 182 List<?> section = getSection(position); |
218 | 183 |
219 if (section == mPromoHeaderSection) { | 184 if (section == mPromoHeaderSection) { |
220 return PROMO_HEADER_VIEW; | 185 return PROMO_HEADER_VIEW; |
221 } else if (section == mFolderDividerSection | |
222 || section == mBookmarkDividerSection) { | |
223 return DIVIDER_VIEW; | |
224 } else if (section == mFolderSection) { | 186 } else if (section == mFolderSection) { |
225 return FOLDER_VIEW; | 187 return FOLDER_VIEW; |
226 } else if (section == mBookmarkSection) { | 188 } else if (section == mBookmarkSection) { |
227 return BOOKMARK_VIEW; | 189 return BOOKMARK_VIEW; |
228 } | 190 } |
229 | 191 |
230 assert false : "Invalid position requested"; | 192 assert false : "Invalid position requested"; |
231 return -1; | 193 return -1; |
232 } | 194 } |
233 | 195 |
234 @Override | 196 @Override |
235 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | 197 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
236 assert mDelegate != null; | 198 assert mDelegate != null; |
237 | 199 |
238 switch (viewType) { | 200 switch (viewType) { |
239 case PROMO_HEADER_VIEW: | 201 case PROMO_HEADER_VIEW: |
240 return mPromoHeaderManager.createHolder(parent); | 202 return mPromoHeaderManager.createHolder(parent); |
241 case DIVIDER_VIEW: | |
242 return new ViewHolder(LayoutInflater.from(parent.getContext()).i
nflate( | |
243 R.layout.bookmark_divider, parent, false)) {}; | |
244 case FOLDER_VIEW: | 203 case FOLDER_VIEW: |
245 BookmarkFolderRow folder = (BookmarkFolderRow) LayoutInflater.fr
om( | 204 BookmarkFolderRow folder = (BookmarkFolderRow) LayoutInflater.fr
om( |
246 parent.getContext()).inflate(R.layout.bookmark_folder_ro
w, parent, false); | 205 parent.getContext()).inflate(R.layout.bookmark_folder_ro
w, parent, false); |
247 folder.onBookmarkDelegateInitialized(mDelegate); | 206 folder.onBookmarkDelegateInitialized(mDelegate); |
248 mFolderRows.add(folder); | 207 mFolderRows.add(folder); |
249 return new ItemViewHolder(folder); | 208 return new ItemViewHolder(folder); |
250 case BOOKMARK_VIEW: | 209 case BOOKMARK_VIEW: |
251 BookmarkItemRow item = (BookmarkItemRow) LayoutInflater.from( | 210 BookmarkItemRow item = (BookmarkItemRow) LayoutInflater.from( |
252 parent.getContext()).inflate(R.layout.bookmark_item_row,
parent, false); | 211 parent.getContext()).inflate(R.layout.bookmark_item_row,
parent, false); |
253 item.onBookmarkDelegateInitialized(mDelegate); | 212 item.onBookmarkDelegateInitialized(mDelegate); |
254 mBookmarkRows.add(item); | 213 mBookmarkRows.add(item); |
255 return new ItemViewHolder(item); | 214 return new ItemViewHolder(item); |
256 default: | 215 default: |
257 assert false; | 216 assert false; |
258 return null; | 217 return null; |
259 } | 218 } |
260 } | 219 } |
261 | 220 |
262 @SuppressFBWarnings("BC_UNCONFIRMED_CAST") | 221 @SuppressFBWarnings("BC_UNCONFIRMED_CAST") |
263 @Override | 222 @Override |
264 public void onBindViewHolder(ViewHolder holder, int position) { | 223 public void onBindViewHolder(ViewHolder holder, int position) { |
265 BookmarkId id = getItem(position); | 224 BookmarkId id = getItem(position); |
266 | 225 |
267 switch (getItemViewType(position)) { | 226 switch (getItemViewType(position)) { |
268 case PROMO_HEADER_VIEW: | 227 case PROMO_HEADER_VIEW: |
269 case DIVIDER_VIEW: | |
270 break; | 228 break; |
271 case FOLDER_VIEW: | 229 case FOLDER_VIEW: |
272 ((BookmarkRow) holder.itemView).setBookmarkId(id); | 230 ((BookmarkRow) holder.itemView).setBookmarkId(id); |
273 setBackgroundResourceForFolderRow(((BookmarkRow) holder.itemView
), id); | 231 setBackgroundResourceForFolderRow(((BookmarkRow) holder.itemView
), id); |
274 break; | 232 break; |
275 case BOOKMARK_VIEW: | 233 case BOOKMARK_VIEW: |
276 ((BookmarkRow) holder.itemView).setBookmarkId(id); | 234 ((BookmarkRow) holder.itemView).setBookmarkId(id); |
277 setBackgroundResourceForBookmarkRow((BookmarkRow) holder.itemVie
w, id); | 235 setBackgroundResourceForBookmarkRow((BookmarkRow) holder.itemVie
w, id); |
278 break; | 236 break; |
279 default: | 237 default: |
(...skipping 14 matching lines...) Expand all Loading... |
294 } | 252 } |
295 | 253 |
296 // BookmarkUIObserver implementations. | 254 // BookmarkUIObserver implementations. |
297 | 255 |
298 @Override | 256 @Override |
299 public void onBookmarkDelegateInitialized(BookmarkDelegate delegate) { | 257 public void onBookmarkDelegateInitialized(BookmarkDelegate delegate) { |
300 mDelegate = delegate; | 258 mDelegate = delegate; |
301 mDelegate.addUIObserver(this); | 259 mDelegate.addUIObserver(this); |
302 mDelegate.getModel().addObserver(mBookmarkModelObserver); | 260 mDelegate.getModel().addObserver(mBookmarkModelObserver); |
303 mPromoHeaderManager = new BookmarkPromoHeader(mContext, this); | 261 mPromoHeaderManager = new BookmarkPromoHeader(mContext, this); |
| 262 populateTopLevelFoldersList(); |
304 } | 263 } |
305 | 264 |
306 @Override | 265 @Override |
307 public void onDestroy() { | 266 public void onDestroy() { |
308 mDelegate.removeUIObserver(this); | 267 mDelegate.removeUIObserver(this); |
309 mDelegate.getModel().removeObserver(mBookmarkModelObserver); | 268 mDelegate.getModel().removeObserver(mBookmarkModelObserver); |
310 mDelegate = null; | 269 mDelegate = null; |
311 | 270 |
312 mPromoHeaderManager.destroy(); | 271 mPromoHeaderManager.destroy(); |
313 } | 272 } |
314 | 273 |
315 @Override | 274 @Override |
316 public void onFolderStateSet(BookmarkId folder) { | 275 public void onFolderStateSet(BookmarkId folder) { |
317 assert mDelegate != null; | 276 assert mDelegate != null; |
318 setBookmarks(mDelegate.getModel().getChildIDs(folder, true, false), | |
319 mDelegate.getModel().getChildIDs(folder, false, true)); | |
320 | 277 |
321 mSearchText = EMPTY_QUERY; | 278 mSearchText = EMPTY_QUERY; |
| 279 |
| 280 if (folder.equals(mDelegate.getModel().getRootFolderId())) { |
| 281 setBookmarks(mTopLevelFolders, new ArrayList<BookmarkId>()); |
| 282 } else { |
| 283 setBookmarks(mDelegate.getModel().getChildIDs(folder, true, false), |
| 284 mDelegate.getModel().getChildIDs(folder, false, true)); |
| 285 } |
322 } | 286 } |
323 | 287 |
324 @Override | 288 @Override |
325 public void onSearchStateSet() { | 289 public void onSearchStateSet() { |
326 updateHeaderAndNotify(); | 290 updateHeaderAndNotify(); |
327 } | 291 } |
328 | 292 |
329 @Override | 293 @Override |
330 public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} | 294 public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} |
331 | 295 |
332 /** | 296 /** |
333 * Synchronously searches for the given query. | 297 * Synchronously searches for the given query. |
334 * @param query The query text to search for. | 298 * @param query The query text to search for. |
335 */ | 299 */ |
336 void search(String query) { | 300 void search(String query) { |
337 mSearchText = query.toString().trim(); | 301 mSearchText = query.toString().trim(); |
338 List<BookmarkId> results = | 302 List<BookmarkId> results = |
339 mDelegate.getModel().searchBookmarks(mSearchText, MAXIMUM_NUMBER
_OF_SEARCH_RESULTS); | 303 mDelegate.getModel().searchBookmarks(mSearchText, MAXIMUM_NUMBER
_OF_SEARCH_RESULTS); |
340 setBookmarks(null, results); | 304 setBookmarks(null, results); |
341 } | 305 } |
342 | 306 |
343 private static class ItemViewHolder extends RecyclerView.ViewHolder { | 307 private static class ItemViewHolder extends RecyclerView.ViewHolder { |
344 private ItemViewHolder(View view) { | 308 private ItemViewHolder(View view) { |
345 super(view); | 309 super(view); |
346 } | 310 } |
347 } | 311 } |
348 | 312 |
349 private void updateHeaderAndNotify() { | 313 private void updateHeaderAndNotify() { |
350 updateHeader(); | 314 updateHeader(); |
351 updateDividerSections(); | |
352 notifyDataSetChanged(); | 315 notifyDataSetChanged(); |
353 } | 316 } |
354 | 317 |
355 private void updateHeader() { | 318 private void updateHeader() { |
356 if (mDelegate == null) return; | 319 if (mDelegate == null) return; |
357 | 320 |
358 int currentUIState = mDelegate.getCurrentState(); | 321 int currentUIState = mDelegate.getCurrentState(); |
359 if (currentUIState == BookmarkUIState.STATE_LOADING) return; | 322 if (currentUIState == BookmarkUIState.STATE_LOADING) return; |
360 | 323 |
361 mPromoHeaderSection.clear(); | 324 mPromoHeaderSection.clear(); |
362 | 325 |
363 if (currentUIState == BookmarkUIState.STATE_SEARCHING) return; | 326 if (currentUIState == BookmarkUIState.STATE_SEARCHING) return; |
364 | 327 |
365 assert currentUIState == BookmarkUIState.STATE_FOLDER : "Unexpected UI s
tate"; | 328 assert currentUIState == BookmarkUIState.STATE_FOLDER : "Unexpected UI s
tate"; |
366 if (mPromoHeaderManager.shouldShow()) { | 329 if (mPromoHeaderManager.shouldShow()) { |
367 mPromoHeaderSection.add(null); | 330 mPromoHeaderSection.add(null); |
368 } | 331 } |
369 } | 332 } |
370 | 333 |
| 334 private void populateTopLevelFoldersList() { |
| 335 BookmarkId desktopNodeId = mDelegate.getModel().getDesktopFolderId(); |
| 336 BookmarkId mobileNodeId = mDelegate.getModel().getMobileFolderId(); |
| 337 BookmarkId othersNodeId = mDelegate.getModel().getOtherFolderId(); |
| 338 |
| 339 if (mDelegate.getModel().isFolderVisible(mobileNodeId)) { |
| 340 mTopLevelFolders.add(mobileNodeId); |
| 341 } |
| 342 if (mDelegate.getModel().isFolderVisible(desktopNodeId)) { |
| 343 mTopLevelFolders.add(desktopNodeId); |
| 344 } |
| 345 if (mDelegate.getModel().isFolderVisible(othersNodeId)) { |
| 346 mTopLevelFolders.add(othersNodeId); |
| 347 } |
| 348 } |
| 349 |
371 @VisibleForTesting | 350 @VisibleForTesting |
372 public BookmarkDelegate getDelegateForTesting() { | 351 public BookmarkDelegate getDelegateForTesting() { |
373 return mDelegate; | 352 return mDelegate; |
374 } | 353 } |
375 | 354 |
376 private void setBackgroundResourceForBookmarkRow(BookmarkRow row, BookmarkId
id) { | 355 private void setBackgroundResourceForBookmarkRow(BookmarkRow row, BookmarkId
id) { |
377 row.setBackgroundResourceForGroupPosition(id.equals(mBookmarkSection.get
(0)), | 356 row.setBackgroundResourceForGroupPosition(id.equals(mBookmarkSection.get
(0)), |
378 id.equals(mBookmarkSection.get(mBookmarkSection.size() - 1))); | 357 id.equals(mBookmarkSection.get(mBookmarkSection.size() - 1))); |
379 } | 358 } |
380 | 359 |
381 private void setBackgroundResourceForFolderRow(BookmarkRow row, BookmarkId i
d) { | 360 private void setBackgroundResourceForFolderRow(BookmarkRow row, BookmarkId i
d) { |
382 row.setBackgroundResourceForGroupPosition(id.equals(mFolderSection.get(0
)), | 361 row.setBackgroundResourceForGroupPosition(id.equals(mFolderSection.get(0
)), |
383 id.equals(mFolderSection.get(mFolderSection.size() - 1))); | 362 id.equals(mFolderSection.get(mFolderSection.size() - 1))); |
384 } | 363 } |
385 } | 364 } |
OLD | NEW |