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.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 |