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

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java

Issue 2837643002: [Bookmarks] Remove side drawer and introduce root folder view (Closed)
Patch Set: Use BookmarkModel::is_permanent_node Created 3 years, 8 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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698