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.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 |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |