Chromium Code Reviews| 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.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.Callback; | |
| 14 import org.chromium.base.annotations.SuppressFBWarnings; | 15 import org.chromium.base.annotations.SuppressFBWarnings; |
| 15 import org.chromium.base.metrics.RecordHistogram; | 16 import org.chromium.base.metrics.RecordHistogram; |
| 16 import org.chromium.chrome.R; | 17 import org.chromium.chrome.R; |
| 17 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; | 18 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; |
| 18 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve r; | 19 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve r; |
| 19 import org.chromium.chrome.browser.bookmarks.BookmarkPromoHeader.PromoHeaderShow ingChangeListener; | 20 import org.chromium.chrome.browser.bookmarks.BookmarkPromoHeader.PromoHeaderShow ingChangeListener; |
| 20 import org.chromium.chrome.browser.offlinepages.ClientId; | 21 import org.chromium.chrome.browser.offlinepages.ClientId; |
| 21 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; | 22 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; |
| 22 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageMod elObserver; | 23 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageMod elObserver; |
| 23 import org.chromium.chrome.browser.offlinepages.OfflinePageFreeUpSpaceCallback; | 24 import org.chromium.chrome.browser.offlinepages.OfflinePageFreeUpSpaceCallback; |
| 24 import org.chromium.chrome.browser.offlinepages.OfflinePageFreeUpSpaceDialog; | 25 import org.chromium.chrome.browser.offlinepages.OfflinePageFreeUpSpaceDialog; |
| 25 import org.chromium.chrome.browser.offlinepages.OfflinePageStorageSpaceHeader; | 26 import org.chromium.chrome.browser.offlinepages.OfflinePageStorageSpaceHeader; |
| 27 import org.chromium.chrome.browser.offlinepages.OfflinePageStorageSpacePolicy; | |
| 26 import org.chromium.components.bookmarks.BookmarkId; | 28 import org.chromium.components.bookmarks.BookmarkId; |
| 27 | 29 |
| 28 import java.util.ArrayList; | 30 import java.util.ArrayList; |
| 29 import java.util.List; | 31 import java.util.List; |
| 30 | 32 |
| 31 /** | 33 /** |
| 32 * BaseAdapter for {@link BookmarkRecyclerView}. It manages bookmarks to list th ere. | 34 * BaseAdapter for {@link BookmarkRecyclerView}. It manages bookmarks to list th ere. |
| 33 */ | 35 */ |
| 34 class BookmarkItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements | 36 class BookmarkItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements |
| 35 BookmarkUIObserver, PromoHeaderShowingChangeListener { | 37 BookmarkUIObserver, PromoHeaderShowingChangeListener { |
| 36 private static final int PROMO_HEADER_VIEW = 0; | 38 private static final int PROMO_HEADER_VIEW = 0; |
| 37 private static final int FOLDER_VIEW = 1; | 39 private static final int FOLDER_VIEW = 1; |
| 38 private static final int DIVIDER_VIEW = 2; | 40 private static final int DIVIDER_VIEW = 2; |
| 39 private static final int BOOKMARK_VIEW = 3; | 41 private static final int BOOKMARK_VIEW = 3; |
| 40 private static final int OFFLINE_PAGES_STORAGE_VIEW = 4; | 42 private static final int OFFLINE_PAGES_STORAGE_VIEW = 4; |
| 41 | 43 |
| 44 private boolean mDestroyed = false; | |
| 42 private BookmarkDelegate mDelegate; | 45 private BookmarkDelegate mDelegate; |
| 43 private Context mContext; | 46 private Context mContext; |
| 44 private BookmarkPromoHeader mPromoHeaderManager; | 47 private BookmarkPromoHeader mPromoHeaderManager; |
| 45 private OfflinePageStorageSpaceHeader mOfflineStorageHeader; | 48 private OfflinePageStorageSpaceHeader mOfflineStorageHeader; |
| 46 | 49 |
| 47 private List<List<? extends Object>> mSections; | 50 private List<List<? extends Object>> mSections; |
| 48 private List<Object> mPromoHeaderSection = new ArrayList<>(); | 51 private List<Object> mPromoHeaderSection = new ArrayList<>(); |
| 49 private List<Object> mOfflineStorageSection = new ArrayList<>(); | 52 private List<Object> mOfflineStorageSection = new ArrayList<>(); |
| 50 private List<Object> mFolderDividerSection = new ArrayList<>(); | 53 private List<Object> mFolderDividerSection = new ArrayList<>(); |
| 51 private List<BookmarkId> mFolderSection = new ArrayList<>(); | 54 private List<BookmarkId> mFolderSection = new ArrayList<>(); |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 267 } | 270 } |
| 268 | 271 |
| 269 // BookmarkUIObserver implementations. | 272 // BookmarkUIObserver implementations. |
| 270 | 273 |
| 271 @Override | 274 @Override |
| 272 public void onBookmarkDelegateInitialized(BookmarkDelegate delegate) { | 275 public void onBookmarkDelegateInitialized(BookmarkDelegate delegate) { |
| 273 mDelegate = delegate; | 276 mDelegate = delegate; |
| 274 mDelegate.addUIObserver(this); | 277 mDelegate.addUIObserver(this); |
| 275 mDelegate.getModel().addObserver(mBookmarkModelObserver); | 278 mDelegate.getModel().addObserver(mBookmarkModelObserver); |
| 276 mPromoHeaderManager = new BookmarkPromoHeader(mContext, this); | 279 mPromoHeaderManager = new BookmarkPromoHeader(mContext, this); |
| 277 OfflinePageBridge offlinePageBridge = mDelegate.getModel().getOfflinePag eBridge(); | 280 final OfflinePageBridge offlinePageBridge = mDelegate.getModel().getOffl inePageBridge(); |
| 278 if (offlinePageBridge != null) { | 281 if (offlinePageBridge != null) { |
| 279 mOfflinePageModelObserver = new OfflinePageModelObserver() { | 282 mOfflinePageModelObserver = new OfflinePageModelObserver() { |
| 280 @Override | 283 @Override |
| 281 public void offlinePageModelChanged() { | 284 public void offlinePageModelChanged() { |
| 282 mDelegate.notifyStateChange(BookmarkItemsAdapter.this); | 285 mDelegate.notifyStateChange(BookmarkItemsAdapter.this); |
| 283 } | 286 } |
| 284 | 287 |
| 285 @Override | 288 @Override |
| 286 public void offlinePageDeleted(long offlineId, ClientId clientId ) { | 289 public void offlinePageDeleted(long offlineId, ClientId clientId ) { |
| 287 if (mDelegate.getCurrentState() == BookmarkUIState.STATE_FIL TER) { | 290 if (mDelegate.getCurrentState() == BookmarkUIState.STATE_FIL TER) { |
| 288 BookmarkId id = BookmarkModel.getBookmarkIdForOfflineCli entId(clientId); | 291 BookmarkId id = BookmarkModel.getBookmarkIdForOfflineCli entId(clientId); |
| 289 int deletedPosition = getPositionForBookmark(id); | 292 int deletedPosition = getPositionForBookmark(id); |
| 290 if (deletedPosition >= 0) { | 293 if (deletedPosition >= 0) { |
| 291 removeItem(deletedPosition); | 294 removeItem(deletedPosition); |
| 292 } | 295 } |
| 293 } | 296 } |
| 294 } | 297 } |
| 295 }; | 298 }; |
| 296 offlinePageBridge.addObserver(mOfflinePageModelObserver); | 299 offlinePageBridge.addObserver(mOfflinePageModelObserver); |
| 297 | 300 |
| 298 mOfflineStorageHeader = new OfflinePageStorageSpaceHeader( | 301 OfflinePageStorageSpacePolicy.create( |
| 299 mContext, offlinePageBridge, new OfflinePageFreeUpSpaceCallb ack() { | 302 offlinePageBridge, new Callback<OfflinePageStorageSpacePolic y>() { |
| 300 @Override | 303 @Override |
| 301 public void onFreeUpSpaceDone() { | 304 public void onResult(OfflinePageStorageSpacePolicy polic y) { |
| 302 refreshOfflinePagesFilterView(); | 305 if (!mDestroyed) { |
| 303 mDelegate.getSnackbarManager().showSnackbar( | 306 setOfflineStorageHeader(offlinePageBridge, polic y); |
| 304 OfflinePageFreeUpSpaceDialog.createStorageCl earedSnackbar( | 307 } |
| 305 mContext)); | |
| 306 } | |
| 307 | |
| 308 @Override | |
| 309 public void onFreeUpSpaceCancelled() { | |
| 310 // No need to refresh, as result outcome should be t he same here. | |
| 311 } | 308 } |
| 312 }); | 309 }); |
| 313 } | 310 } |
| 314 } | 311 } |
| 315 | 312 |
| 316 @Override | 313 @Override |
| 317 public void onDestroy() { | 314 public void onDestroy() { |
| 315 mDestroyed = true; | |
| 316 | |
| 318 mDelegate.removeUIObserver(this); | 317 mDelegate.removeUIObserver(this); |
| 319 mDelegate.getModel().removeObserver(mBookmarkModelObserver); | 318 mDelegate.getModel().removeObserver(mBookmarkModelObserver); |
| 320 mPromoHeaderManager.destroy(); | 319 mPromoHeaderManager.destroy(); |
| 321 | 320 |
| 322 OfflinePageBridge offlinePageBridge = mDelegate.getModel().getOfflinePag eBridge(); | 321 OfflinePageBridge offlinePageBridge = mDelegate.getModel().getOfflinePag eBridge(); |
| 323 if (offlinePageBridge != null) { | 322 if (offlinePageBridge != null) { |
| 324 offlinePageBridge.removeObserver(mOfflinePageModelObserver); | 323 offlinePageBridge.removeObserver(mOfflinePageModelObserver); |
| 324 } | |
| 325 | |
| 326 if (mOfflineStorageHeader != null) { | |
| 325 mOfflineStorageHeader.destroy(); | 327 mOfflineStorageHeader.destroy(); |
| 326 } | 328 } |
| 327 } | 329 } |
| 328 | 330 |
| 329 @Override | 331 @Override |
| 330 public void onAllBookmarksStateSet() { | 332 public void onAllBookmarksStateSet() { |
| 331 List<BookmarkId> bookmarkIds = | 333 List<BookmarkId> bookmarkIds = |
| 332 mDelegate.getModel().getAllBookmarkIDsOrderedByCreationDate(); | 334 mDelegate.getModel().getAllBookmarkIDsOrderedByCreationDate(); |
| 333 RecordHistogram.recordCountHistogram("EnhancedBookmarks.AllBookmarksCoun t", | 335 RecordHistogram.recordCountHistogram("EnhancedBookmarks.AllBookmarksCoun t", |
| 334 bookmarkIds.size()); | 336 bookmarkIds.size()); |
| 335 setBookmarks(null, bookmarkIds); | 337 setBookmarks(null, bookmarkIds); |
| 336 } | 338 } |
| 337 | 339 |
| 338 @Override | 340 @Override |
| 339 public void onFolderStateSet(BookmarkId folder) { | 341 public void onFolderStateSet(BookmarkId folder) { |
| 340 setBookmarks(mDelegate.getModel().getChildIDs(folder, true, false), | 342 setBookmarks(mDelegate.getModel().getChildIDs(folder, true, false), |
| 341 mDelegate.getModel().getChildIDs(folder, false, true)); | 343 mDelegate.getModel().getChildIDs(folder, false, true)); |
| 342 } | 344 } |
| 343 | 345 |
| 344 @Override | 346 @Override |
| 345 public void onFilterStateSet(BookmarkFilter filter) { | 347 public void onFilterStateSet(BookmarkFilter filter) { |
| 346 assert filter == BookmarkFilter.OFFLINE_PAGES; | 348 assert filter == BookmarkFilter.OFFLINE_PAGES; |
| 347 List<BookmarkId> bookmarkIds = mDelegate.getModel().getBookmarkIDsByFilt er(filter); | 349 setBookmarks(null, new ArrayList<BookmarkId>()); |
| 348 RecordHistogram.recordCountHistogram("OfflinePages.OfflinePageCount", bo okmarkIds.size()); | 350 BookmarkModel bookmarkModel = mDelegate.getModel(); |
| 349 setBookmarks(null, mDelegate.getModel().getBookmarkIDsByFilter(filter)); | 351 bookmarkModel.getOfflinePageBridge().checkOfflinePageMetadata(); |
| 350 mDelegate.getModel().getOfflinePageBridge().checkOfflinePageMetadata(); | 352 bookmarkModel.getOfflineBookmarkIds(new BookmarkModel.GetOfflineBookmark IdsCallback() { |
|
fgorski
2016/03/28 17:58:46
perhaps extract method?
dewittj
2016/03/31 18:43:17
This callback really only calls one method + UMA,
| |
| 353 @Override | |
| 354 public void onGetOfflineBookmarkIdsDone(List<BookmarkId> bookmarkIds ) { | |
| 355 RecordHistogram.recordCountHistogram( | |
| 356 "OfflinePages.OfflinePageCount", bookmarkIds.size()); | |
| 357 if (mDestroyed) { | |
| 358 return; | |
| 359 } | |
| 360 | |
| 361 setBookmarks(null, bookmarkIds); | |
| 362 } | |
| 363 }); | |
| 351 } | 364 } |
| 352 | 365 |
| 353 @Override | 366 @Override |
| 354 public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} | 367 public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} |
| 355 | 368 |
| 356 private static class ItemViewHolder extends RecyclerView.ViewHolder { | 369 private static class ItemViewHolder extends RecyclerView.ViewHolder { |
| 357 private ItemViewHolder(View view) { | 370 private ItemViewHolder(View view) { |
| 358 super(view); | 371 super(view); |
| 359 } | 372 } |
| 360 } | 373 } |
| 361 | 374 |
| 375 private void setOfflineStorageHeader( | |
| 376 OfflinePageBridge offlinePageBridge, OfflinePageStorageSpacePolicy p olicy) { | |
| 377 mOfflineStorageHeader = new OfflinePageStorageSpaceHeader( | |
| 378 mContext, offlinePageBridge, policy, new OfflinePageFreeUpSpaceC allback() { | |
| 379 @Override | |
| 380 public void onFreeUpSpaceDone() { | |
| 381 if (!mDestroyed) { | |
| 382 refreshOfflinePagesFilterView(); | |
| 383 } | |
| 384 mDelegate.getSnackbarManager().showSnackbar( | |
| 385 OfflinePageFreeUpSpaceDialog.createStorageCleare dSnackbar( | |
| 386 mContext)); | |
| 387 } | |
| 388 | |
| 389 @Override | |
| 390 public void onFreeUpSpaceCancelled() { | |
| 391 // No need to refresh, as result outcome should | |
| 392 // be the same here. | |
| 393 } | |
| 394 }); | |
| 395 | |
| 396 updateHeader(); | |
| 397 } | |
| 398 | |
| 362 private void updateHeader() { | 399 private void updateHeader() { |
| 363 int currentUIState = mDelegate.getCurrentState(); | 400 int currentUIState = mDelegate.getCurrentState(); |
| 364 if (currentUIState == BookmarkUIState.STATE_LOADING) return; | 401 if (currentUIState == BookmarkUIState.STATE_LOADING) return; |
| 365 | 402 |
| 366 mPromoHeaderSection.clear(); | 403 mPromoHeaderSection.clear(); |
| 367 mOfflineStorageSection.clear(); | 404 mOfflineStorageSection.clear(); |
| 368 if (currentUIState == BookmarkUIState.STATE_FILTER) { | 405 if (currentUIState == BookmarkUIState.STATE_FILTER) { |
| 369 if (mOfflineStorageHeader != null && mOfflineStorageHeader.shouldSho w()) { | 406 if (mOfflineStorageHeader != null && mOfflineStorageHeader.shouldSho w()) { |
| 370 mOfflineStorageSection.add(null); | 407 mOfflineStorageSection.add(null); |
| 371 } | 408 } |
| 372 } else { | 409 } else { |
| 373 assert currentUIState == BookmarkUIState.STATE_ALL_BOOKMARKS | 410 assert currentUIState == BookmarkUIState.STATE_ALL_BOOKMARKS |
| 374 || currentUIState == BookmarkUIState.STATE_FOLDER | 411 || currentUIState == BookmarkUIState.STATE_FOLDER |
| 375 : "Unexpected UI state"; | 412 : "Unexpected UI state"; |
| 376 if (mPromoHeaderManager.shouldShow()) { | 413 if (mPromoHeaderManager.shouldShow()) { |
| 377 mPromoHeaderSection.add(null); | 414 mPromoHeaderSection.add(null); |
| 378 } | 415 } |
| 379 } | 416 } |
| 380 } | 417 } |
| 381 | 418 |
| 382 private void refreshOfflinePagesFilterView() { | 419 private void refreshOfflinePagesFilterView() { |
| 383 if (mDelegate.getCurrentState() != BookmarkUIState.STATE_FILTER) return; | 420 if (mDelegate.getCurrentState() != BookmarkUIState.STATE_FILTER) return; |
| 384 setBookmarks(null, | 421 setBookmarks(null, new ArrayList<BookmarkId>()); |
| 385 mDelegate.getModel().getBookmarkIDsByFilter(BookmarkFilter.OFFLI NE_PAGES)); | 422 mDelegate.getModel().getOfflineBookmarkIds( |
| 423 new BookmarkModel.GetOfflineBookmarkIdsCallback() { | |
| 424 @Override | |
| 425 public void onGetOfflineBookmarkIdsDone(List<BookmarkId> boo kmarkIds) { | |
| 426 if (mDestroyed) { | |
| 427 return; | |
| 428 } | |
| 429 setBookmarks(null, bookmarkIds); | |
| 430 } | |
| 431 }); | |
| 386 } | 432 } |
| 387 } | 433 } |
| OLD | NEW |