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

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

Issue 2768663002: [Bookmarks] Refactor search view to use SelectableListLayout paradigm (Closed)
Patch Set: Created 3 years, 9 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.app.Activity; 7 import android.app.Activity;
8 import android.app.ActivityManager; 8 import android.app.ActivityManager;
9 import android.content.Context; 9 import android.content.Context;
10 import android.support.v4.view.GravityCompat;
10 import android.support.v4.widget.DrawerLayout; 11 import android.support.v4.widget.DrawerLayout;
11 import android.support.v7.widget.RecyclerView; 12 import android.support.v7.widget.RecyclerView;
12 import android.support.v7.widget.Toolbar; 13 import android.support.v7.widget.Toolbar;
13 import android.text.TextUtils; 14 import android.text.TextUtils;
14 import android.view.Gravity;
15 import android.view.View; 15 import android.view.View;
16 import android.view.ViewGroup; 16 import android.view.ViewGroup;
17 import android.widget.ViewSwitcher;
18 17
19 import org.chromium.base.ApiCompatibilityUtils; 18 import org.chromium.base.ApiCompatibilityUtils;
20 import org.chromium.base.ContextUtils; 19 import org.chromium.base.ContextUtils;
21 import org.chromium.base.ObserverList; 20 import org.chromium.base.ObserverList;
22 import org.chromium.base.metrics.RecordUserAction; 21 import org.chromium.base.metrics.RecordUserAction;
23 import org.chromium.chrome.R; 22 import org.chromium.chrome.R;
24 import org.chromium.chrome.browser.BasicNativePage; 23 import org.chromium.chrome.browser.BasicNativePage;
25 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; 24 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
26 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve r; 25 import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve r;
27 import org.chromium.chrome.browser.favicon.LargeIconBridge; 26 import org.chromium.chrome.browser.favicon.LargeIconBridge;
28 import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim; 27 import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim;
29 import org.chromium.chrome.browser.profiles.Profile; 28 import org.chromium.chrome.browser.profiles.Profile;
30 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable; 29 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
31 import org.chromium.chrome.browser.widget.selection.SelectableListLayout; 30 import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
31 import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.Search Delegate;
32 import org.chromium.chrome.browser.widget.selection.SelectionDelegate; 32 import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
33 import org.chromium.components.bookmarks.BookmarkId; 33 import org.chromium.components.bookmarks.BookmarkId;
34 34
35 import java.util.Stack; 35 import java.util.Stack;
36 36
37 /** 37 /**
38 * The new bookmark manager that is planned to replace the existing bookmark man ager. It holds all 38 * The new bookmark manager that is planned to replace the existing bookmark man ager. It holds all
39 * views and shared logics between tablet and phone. For tablet/phone specific l ogics, see 39 * views and shared logics between tablet and phone. For tablet/phone specific l ogics, see
40 * {@link BookmarkActivity} (phone) and {@link BookmarkPage} (tablet). 40 * {@link BookmarkActivity} (phone) and {@link BookmarkPage} (tablet).
41 */ 41 */
42 public class BookmarkManager implements BookmarkDelegate { 42 public class BookmarkManager implements BookmarkDelegate, SearchDelegate {
43 private static final int FAVICON_MAX_CACHE_SIZE_BYTES = 10 * 1024 * 1024; // 10MB 43 private static final int FAVICON_MAX_CACHE_SIZE_BYTES = 10 * 1024 * 1024; // 10MB
44 44
45 /**
46 * This shared preference used to be used to save a list of recent searches. That feature
47 * has been removed, so this string is now used solely to clear the shared p reference.
48 */
49 private static final String PREF_SEARCH_HISTORY = "bookmark_search_history";
50
gone 2017/03/23 00:56:36 We should really have a central place for this.
Theresa 2017/03/23 15:49:38 "bookmark_search_history" was previously in Bookma
gone 2017/03/23 17:12:03 Yeah, common place for removing deprecated prefs.
45 private Activity mActivity; 51 private Activity mActivity;
46 private ViewGroup mMainView; 52 private ViewGroup mMainView;
47 private BookmarkModel mBookmarkModel; 53 private BookmarkModel mBookmarkModel;
48 private BookmarkUndoController mUndoController; 54 private BookmarkUndoController mUndoController;
49 private final ObserverList<BookmarkUIObserver> mUIObservers = 55 private final ObserverList<BookmarkUIObserver> mUIObservers =
50 new ObserverList<BookmarkUIObserver>(); 56 new ObserverList<BookmarkUIObserver>();
51 private BasicNativePage mNativePage; 57 private BasicNativePage mNativePage;
52 private SelectableListLayout<BookmarkId> mSelectableListLayout; 58 private SelectableListLayout<BookmarkId> mSelectableListLayout;
53 private RecyclerView mRecyclerView; 59 private RecyclerView mRecyclerView;
54 private BookmarkItemsAdapter mAdapter; 60 private BookmarkItemsAdapter mAdapter;
55 private BookmarkActionBar mToolbar; 61 private BookmarkActionBar mToolbar;
56 private BookmarkSearchView mSearchView;
57 private ViewSwitcher mViewSwitcher;
58 private DrawerLayout mDrawer; 62 private DrawerLayout mDrawer;
59 private BookmarkDrawerListView mDrawerListView; 63 private BookmarkDrawerListView mDrawerListView;
60 private SelectionDelegate<BookmarkId> mSelectionDelegate; 64 private SelectionDelegate<BookmarkId> mSelectionDelegate;
61 private final Stack<BookmarkUIState> mStateStack = new Stack<>(); 65 private final Stack<BookmarkUIState> mStateStack = new Stack<>();
62 private LargeIconBridge mLargeIconBridge; 66 private LargeIconBridge mLargeIconBridge;
63 private String mInitialUrl; 67 private String mInitialUrl;
64 private boolean mIsDialogUi; 68 private boolean mIsDialogUi;
65 69
66 private final BookmarkModelObserver mBookmarkModelObserver = new BookmarkMod elObserver() { 70 private final BookmarkModelObserver mBookmarkModelObserver = new BookmarkMod elObserver() {
67 71
(...skipping 27 matching lines...) Expand all
95 if (getCurrentState() == BookmarkUIState.STATE_FOLDER) { 99 if (getCurrentState() == BookmarkUIState.STATE_FOLDER) {
96 setState(mStateStack.peek()); 100 setState(mStateStack.peek());
97 } 101 }
98 mSelectionDelegate.clearSelection(); 102 mSelectionDelegate.clearSelection();
99 } 103 }
100 }; 104 };
101 105
102 private final Runnable mModelLoadedRunnable = new Runnable() { 106 private final Runnable mModelLoadedRunnable = new Runnable() {
103 @Override 107 @Override
104 public void run() { 108 public void run() {
105 mSearchView.onBookmarkDelegateInitialized(BookmarkManager.this);
106 mDrawerListView.onBookmarkDelegateInitialized(BookmarkManager.this); 109 mDrawerListView.onBookmarkDelegateInitialized(BookmarkManager.this);
107 mAdapter.onBookmarkDelegateInitialized(BookmarkManager.this); 110 mAdapter.onBookmarkDelegateInitialized(BookmarkManager.this);
108 mToolbar.onBookmarkDelegateInitialized(BookmarkManager.this); 111 mToolbar.onBookmarkDelegateInitialized(BookmarkManager.this);
109 if (!TextUtils.isEmpty(mInitialUrl)) { 112 if (!TextUtils.isEmpty(mInitialUrl)) {
110 setState(BookmarkUIState.createStateFromUrl(mInitialUrl, 113 setState(BookmarkUIState.createStateFromUrl(mInitialUrl,
111 mBookmarkModel)); 114 mBookmarkModel));
112 } 115 }
113 } 116 }
114 }; 117 };
115 118
(...skipping 21 matching lines...) Expand all
137 mDrawerListView = (BookmarkDrawerListView) mMainView.findViewById( 140 mDrawerListView = (BookmarkDrawerListView) mMainView.findViewById(
138 R.id.bookmark_drawer_list); 141 R.id.bookmark_drawer_list);
139 142
140 @SuppressWarnings("unchecked") 143 @SuppressWarnings("unchecked")
141 SelectableListLayout<BookmarkId> selectableList = 144 SelectableListLayout<BookmarkId> selectableList =
142 (SelectableListLayout<BookmarkId>) mMainView.findViewById(R.id.s electable_list); 145 (SelectableListLayout<BookmarkId>) mMainView.findViewById(R.id.s electable_list);
143 mSelectableListLayout = selectableList; 146 mSelectableListLayout = selectableList;
144 mSelectableListLayout.initializeEmptyView( 147 mSelectableListLayout.initializeEmptyView(
145 ApiCompatibilityUtils.getDrawable( 148 ApiCompatibilityUtils.getDrawable(
146 mActivity.getResources(), R.drawable.bookmark_logo_large ), 149 mActivity.getResources(), R.drawable.bookmark_logo_large ),
147 R.string.bookmarks_folder_empty, 150 R.string.bookmarks_folder_empty, R.string.bookmark_no_result);
148 0 /* Bookmarks search is not yet controlled by the SelectableLis tLayout. */);
149 151
150 mAdapter = new BookmarkItemsAdapter(activity); 152 mAdapter = new BookmarkItemsAdapter(activity);
151 153
152 mRecyclerView = mSelectableListLayout.initializeRecyclerView(mAdapter); 154 mRecyclerView = mSelectableListLayout.initializeRecyclerView(mAdapter);
153 155
154 mToolbar = (BookmarkActionBar) mSelectableListLayout.initializeToolbar( 156 mToolbar = (BookmarkActionBar) mSelectableListLayout.initializeToolbar(
155 R.layout.bookmark_action_bar, mSelectionDelegate, 0, mDrawer, 157 R.layout.bookmark_action_bar, mSelectionDelegate, 0, mDrawer,
156 R.id.normal_menu_group, R.id.selection_mode_menu_group, null, tr ue, null); 158 R.id.normal_menu_group, R.id.selection_mode_menu_group, null, tr ue, null);
159 mToolbar.initializeSearchView(
160 this, R.string.bookmark_action_bar_search, R.id.search_menu_id);
157 161
158 mViewSwitcher = (ViewSwitcher) mMainView.findViewById(R.id.bookmark_view _switcher);
159 mUndoController = new BookmarkUndoController(activity, mBookmarkModel, 162 mUndoController = new BookmarkUndoController(activity, mBookmarkModel,
160 ((SnackbarManageable) activity).getSnackbarManager()); 163 ((SnackbarManageable) activity).getSnackbarManager());
161 mSearchView = (BookmarkSearchView) getView().findViewById(R.id.bookmark_ search_view);
162 mBookmarkModel.addObserver(mBookmarkModelObserver); 164 mBookmarkModel.addObserver(mBookmarkModelObserver);
163 initializeToLoadingState(); 165 initializeToLoadingState();
164 mBookmarkModel.runAfterBookmarkModelLoaded(mModelLoadedRunnable); 166 mBookmarkModel.runAfterBookmarkModelLoaded(mModelLoadedRunnable);
165 167
166 // Load partner bookmarks explicitly. We load partner bookmarks in the d eferred startup 168 // Load partner bookmarks explicitly. We load partner bookmarks in the d eferred startup
167 // code, but that might be executed much later. Especially on L, showing loading 169 // code, but that might be executed much later. Especially on L, showing loading
168 // progress bar blocks that so it won't be loaded. http://crbug.com/4293 83 170 // progress bar blocks that so it won't be loaded. http://crbug.com/4293 83
169 PartnerBookmarksShim.kickOffReading(activity); 171 PartnerBookmarksShim.kickOffReading(activity);
170 172
171 mLargeIconBridge = new LargeIconBridge(Profile.getLastUsedProfile().getO riginalProfile()); 173 mLargeIconBridge = new LargeIconBridge(Profile.getLastUsedProfile().getO riginalProfile());
172 ActivityManager activityManager = ((ActivityManager) ContextUtils 174 ActivityManager activityManager = ((ActivityManager) ContextUtils
173 .getApplicationContext().getSystemService(Context.ACTIVITY_SERVI CE)); 175 .getApplicationContext().getSystemService(Context.ACTIVITY_SERVI CE));
174 int maxSize = Math.min(activityManager.getMemoryClass() / 4 * 1024 * 102 4, 176 int maxSize = Math.min(activityManager.getMemoryClass() / 4 * 1024 * 102 4,
175 FAVICON_MAX_CACHE_SIZE_BYTES); 177 FAVICON_MAX_CACHE_SIZE_BYTES);
176 mLargeIconBridge.createCache(maxSize); 178 mLargeIconBridge.createCache(maxSize);
177 179
178 RecordUserAction.record("MobileBookmarkManagerOpen"); 180 RecordUserAction.record("MobileBookmarkManagerOpen");
179 if (!isDialogUi) { 181 if (!isDialogUi) {
180 RecordUserAction.record("MobileBookmarkManagerPageOpen"); 182 RecordUserAction.record("MobileBookmarkManagerPageOpen");
181 } 183 }
184
185 // TODO(twellington): Remove this when Chrome version 59 is a distant me mory and users
186 // are unlikely to have the old PREF_SEARCH_HISTORY in shared preference s.
187 ContextUtils.getAppSharedPreferences().edit().remove(PREF_SEARCH_HISTORY ).apply();
182 } 188 }
183 189
184 /** 190 /**
185 * Destroys and cleans up itself. This must be called after done using this class. 191 * Destroys and cleans up itself. This must be called after done using this class.
186 */ 192 */
187 public void destroy() { 193 public void destroy() {
188 for (BookmarkUIObserver observer : mUIObservers) { 194 for (BookmarkUIObserver observer : mUIObservers) {
189 observer.onDestroy(); 195 observer.onDestroy();
190 } 196 }
191 assert mUIObservers.size() == 0; 197 assert mUIObservers.size() == 0;
192 198
193 if (mUndoController != null) { 199 if (mUndoController != null) {
194 mUndoController.destroy(); 200 mUndoController.destroy();
195 mUndoController = null; 201 mUndoController = null;
196 } 202 }
197 mBookmarkModel.removeObserver(mBookmarkModelObserver); 203 mBookmarkModel.removeObserver(mBookmarkModelObserver);
198 mBookmarkModel.destroy(); 204 mBookmarkModel.destroy();
199 mBookmarkModel = null; 205 mBookmarkModel = null;
200 mLargeIconBridge.destroy(); 206 mLargeIconBridge.destroy();
201 mLargeIconBridge = null; 207 mLargeIconBridge = null;
202 } 208 }
203 209
204 /** 210 /**
205 * Called when the user presses the back key. This is only going to be calle d on Phone. 211 * Called when the user presses the back key. This is only going to be calle d on Phone.
206 * @return True if manager handles this event, false if it decides to ignore . 212 * @return True if manager handles this event, false if it decides to ignore .
207 */ 213 */
208 public boolean onBackPressed() { 214 public boolean onBackPressed() {
209 if (doesDrawerExist()) { 215 if (doesDrawerExist()) {
210 if (mDrawer.isDrawerVisible(Gravity.START)) { 216 if (mDrawer.isDrawerVisible(GravityCompat.START)) {
211 mDrawer.closeDrawer(Gravity.START); 217 mDrawer.closeDrawer(GravityCompat.START);
212 return true; 218 return true;
213 } 219 }
214 } 220 }
215 221
216 // TODO(twellington): replicate this behavior for other list UIs during unification. 222 // TODO(twellington): replicate this behavior for other list UIs during unification.
217 if (mSelectionDelegate.isSelectionEnabled()) { 223 if (mSelectionDelegate.isSelectionEnabled()) {
218 mSelectionDelegate.clearSelection(); 224 mSelectionDelegate.clearSelection();
219 return true; 225 return true;
220 } 226 }
221 227
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 346
341 // BookmarkDelegate implementations. 347 // BookmarkDelegate implementations.
342 348
343 @Override 349 @Override
344 public boolean isDialogUi() { 350 public boolean isDialogUi() {
345 return mIsDialogUi; 351 return mIsDialogUi;
346 } 352 }
347 353
348 @Override 354 @Override
349 public void openFolder(BookmarkId folder) { 355 public void openFolder(BookmarkId folder) {
350 closeSearchUI(); 356 mToolbar.hideSearchView();
351 setState(BookmarkUIState.createFolderState(folder, mBookmarkModel)); 357 setState(BookmarkUIState.createFolderState(folder, mBookmarkModel));
352 mRecyclerView.scrollToPosition(0); 358 mRecyclerView.scrollToPosition(0);
353 } 359 }
354 360
355 @Override 361 @Override
356 public SelectionDelegate<BookmarkId> getSelectionDelegate() { 362 public SelectionDelegate<BookmarkId> getSelectionDelegate() {
357 return mSelectionDelegate; 363 return mSelectionDelegate;
358 } 364 }
359 365
360 @Override 366 @Override
361 public void notifyStateChange(BookmarkUIObserver observer) { 367 public void notifyStateChange(BookmarkUIObserver observer) {
362 int state = getCurrentState(); 368 int state = getCurrentState();
363 switch (state) { 369 switch (state) {
364 case BookmarkUIState.STATE_FOLDER: 370 case BookmarkUIState.STATE_FOLDER:
365 observer.onFolderStateSet(mStateStack.peek().mFolder); 371 observer.onFolderStateSet(mStateStack.peek().mFolder);
366 break; 372 break;
367 case BookmarkUIState.STATE_LOADING: 373 case BookmarkUIState.STATE_LOADING:
368 // In loading state, onBookmarkDelegateInitialized() is not call ed for all 374 // In loading state, onBookmarkDelegateInitialized() is not call ed for all
369 // UIObservers, which means that there will be no observers at t he time. Do nothing. 375 // UIObservers, which means that there will be no observers at t he time. Do nothing.
370 assert mUIObservers.isEmpty(); 376 assert mUIObservers.isEmpty();
371 break; 377 break;
378 case BookmarkUIState.STATE_SEARCHING:
379 observer.onSearchStateSet();
380 break;
372 default: 381 default:
373 assert false : "State not valid"; 382 assert false : "State not valid";
374 break; 383 break;
375 } 384 }
376 } 385 }
377 386
378 @Override 387 @Override
379 public boolean doesDrawerExist() { 388 public boolean doesDrawerExist() {
380 return mDrawer != null; 389 return mDrawer != null;
381 } 390 }
382 391
383 @Override 392 @Override
384 public void closeDrawer() { 393 public void closeDrawer() {
385 if (!doesDrawerExist()) return; 394 if (!doesDrawerExist()) return;
386 395
387 mDrawer.closeDrawer(Gravity.START); 396 mDrawer.closeDrawer(GravityCompat.START);
388 } 397 }
389 398
390 @Override 399 @Override
391 public DrawerLayout getDrawerLayout() { 400 public DrawerLayout getDrawerLayout() {
392 return mDrawer; 401 return mDrawer;
393 } 402 }
394 403
395 @Override 404 @Override
396 public void openBookmark(BookmarkId bookmark, int launchLocation) { 405 public void openBookmark(BookmarkId bookmark, int launchLocation) {
397 mSelectionDelegate.clearSelection(); 406 mSelectionDelegate.clearSelection();
398 if (BookmarkUtils.openBookmark( 407 if (BookmarkUtils.openBookmark(
399 mBookmarkModel, mActivity, bookmark, launchLocation)) { 408 mBookmarkModel, mActivity, bookmark, launchLocation)) {
400 BookmarkUtils.finishActivityOnPhone(mActivity); 409 BookmarkUtils.finishActivityOnPhone(mActivity);
401 } 410 }
402 } 411 }
403 412
404 @Override 413 @Override
405 public void openSearchUI() { 414 public void openSearchUI() {
406 // Give search view focus, because it needs to handle back key event. 415 mSelectableListLayout.onStartSearch();
407 mViewSwitcher.showNext(); 416 mToolbar.showSearchView();
417 setState(BookmarkUIState.createSearchState());
408 } 418 }
409 419
410 @Override 420 @Override
411 public void closeSearchUI() { 421 public void closeSearchUI() {
412 if (mSearchView.getVisibility() != View.VISIBLE) return; 422 mSelectableListLayout.onEndSearch();
413 mViewSwitcher.showPrevious(); 423
424 // Pop the search state off the stack.
425 mStateStack.pop();
426
427 // Set the state back to the folder that was previously being viewed. Li steners, including
428 // the BookmarkItemsAdapter, will be notified of the change and the list of bookmarks will
429 // be updated.
430 setState(mStateStack.pop());
414 } 431 }
415 432
416 @Override 433 @Override
417 public void addUIObserver(BookmarkUIObserver observer) { 434 public void addUIObserver(BookmarkUIObserver observer) {
418 mUIObservers.addObserver(observer); 435 mUIObservers.addObserver(observer);
419 } 436 }
420 437
421 @Override 438 @Override
422 public void removeUIObserver(BookmarkUIObserver observer) { 439 public void removeUIObserver(BookmarkUIObserver observer) {
423 mUIObservers.removeObserver(observer); 440 mUIObservers.removeObserver(observer);
424 } 441 }
425 442
426 @Override 443 @Override
427 public BookmarkModel getModel() { 444 public BookmarkModel getModel() {
428 return mBookmarkModel; 445 return mBookmarkModel;
429 } 446 }
430 447
431 @Override 448 @Override
432 public int getCurrentState() { 449 public int getCurrentState() {
433 if (mStateStack.isEmpty()) return BookmarkUIState.STATE_LOADING; 450 if (mStateStack.isEmpty()) return BookmarkUIState.STATE_LOADING;
434 return mStateStack.peek().mState; 451 return mStateStack.peek().mState;
435 } 452 }
436 453
437 @Override 454 @Override
438 public LargeIconBridge getLargeIconBridge() { 455 public LargeIconBridge getLargeIconBridge() {
439 return mLargeIconBridge; 456 return mLargeIconBridge;
440 } 457 }
458
459 // SearchDelegate overrides
460
461 @Override
462 public void onSearchTextChanged(String query) {
463 mAdapter.search(query);
464 }
465
466 @Override
467 public void onEndSearch() {
468 closeSearchUI();
469 }
441 } 470 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698