OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.chrome.browser.enhancedbookmarks; |
| 6 |
| 7 import android.app.Activity; |
| 8 import android.content.Context; |
| 9 import android.support.v7.app.ActionBarDrawerToggle; |
| 10 import android.support.v7.widget.Toolbar; |
| 11 import android.support.v7.widget.Toolbar.OnMenuItemClickListener; |
| 12 import android.text.TextUtils; |
| 13 import android.util.AttributeSet; |
| 14 import android.view.MenuItem; |
| 15 import android.view.View; |
| 16 import android.view.View.OnClickListener; |
| 17 |
| 18 import com.google.android.apps.chrome.R; |
| 19 |
| 20 import org.chromium.chrome.browser.BookmarksBridge.BookmarkItem; |
| 21 import org.chromium.chrome.browser.BookmarksBridge.BookmarkModelObserver; |
| 22 import org.chromium.chrome.browser.enhanced_bookmarks.EnhancedBookmarksModel; |
| 23 import org.chromium.chrome.browser.widget.NumberRollView; |
| 24 import org.chromium.components.bookmarks.BookmarkId; |
| 25 import org.chromium.components.bookmarks.BookmarkType; |
| 26 import org.chromium.ui.base.DeviceFormFactor; |
| 27 |
| 28 import java.util.List; |
| 29 |
| 30 /** |
| 31 * Main action bar of Enhanced Bookmark UI. It is responsible for displaying tit
le and buttons |
| 32 * associated with the current context. |
| 33 */ |
| 34 public class EnhancedBookmarkActionBar extends Toolbar implements EnhancedBookma
rkUIObserver, |
| 35 OnMenuItemClickListener, OnClickListener { |
| 36 private static final int NAVIGATION_BUTTON_NONE = 0; |
| 37 private static final int NAVIGATION_BUTTON_MENU = 1; |
| 38 private static final int NAVIGATION_BUTTON_BACK = 2; |
| 39 private static final int NAVIGATION_BUTTON_SELECTION_BACK = 3; |
| 40 |
| 41 private int mNavigationButton; |
| 42 private BookmarkItem mCurrentFolder; |
| 43 private EnhancedBookmarkDelegate mDelegate; |
| 44 private ActionBarDrawerToggle mActionBarDrawerToggle; |
| 45 private boolean mIsSelectionEnabled; |
| 46 |
| 47 private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObse
rver() { |
| 48 @Override |
| 49 public void bookmarkModelChanged() { |
| 50 onSelectionStateChange(mDelegate.getSelectedBookmarks()); |
| 51 } |
| 52 }; |
| 53 |
| 54 public EnhancedBookmarkActionBar(Context context, AttributeSet attrs) { |
| 55 super(context, attrs); |
| 56 setNavigationOnClickListener(this); |
| 57 inflateMenu(R.menu.eb_action_bar_menu); |
| 58 if (DeviceFormFactor.isTablet(context)) getMenu().removeItem(R.id.close_
menu_id); |
| 59 setOnMenuItemClickListener(this); |
| 60 } |
| 61 |
| 62 @Override |
| 63 public void onClick(View view) { |
| 64 switch (mNavigationButton) { |
| 65 case NAVIGATION_BUTTON_NONE: |
| 66 break; |
| 67 case NAVIGATION_BUTTON_MENU: |
| 68 // ActionBarDrawerToggle handles this. |
| 69 break; |
| 70 case NAVIGATION_BUTTON_BACK: |
| 71 mDelegate.openFolder(mCurrentFolder.getParentId()); |
| 72 break; |
| 73 case NAVIGATION_BUTTON_SELECTION_BACK: |
| 74 mDelegate.clearSelection(); |
| 75 break; |
| 76 default: |
| 77 assert false : "Incorrect navigation button state"; |
| 78 } |
| 79 } |
| 80 |
| 81 @Override |
| 82 public boolean onMenuItemClick(MenuItem menuItem) { |
| 83 EnhancedBookmarksModel model = mDelegate.getModel(); |
| 84 if (menuItem.getItemId() == R.id.edit_menu_id) { |
| 85 EnhancedBookmarkAddEditFolderActivity.startEditFolderActivity(getCon
text(), |
| 86 mCurrentFolder.getId()); |
| 87 } else if (menuItem.getItemId() == R.id.list_toggle_menu_id) { |
| 88 mDelegate.setListModeEnabled(!mDelegate.isListModeEnabled()); |
| 89 return true; |
| 90 } else if (menuItem.getItemId() == R.id.search_menu_id) { |
| 91 mDelegate.openSearchUI(); |
| 92 return true; |
| 93 } else if (menuItem.getItemId() == R.id.close_menu_id) { |
| 94 mDelegate.finishActivityOnPhone(); |
| 95 return true; |
| 96 } else if (menuItem.getItemId() == R.id.selection_mode_edit_menu_id) { |
| 97 List<BookmarkId> list = mDelegate.getSelectedBookmarks(); |
| 98 assert list.size() == 1; |
| 99 BookmarkItem item = model.getBookmarkById(list.get(0)); |
| 100 if (item.isFolder()) { |
| 101 EnhancedBookmarkAddEditFolderActivity.startEditFolderActivity(ge
tContext(), |
| 102 item.getId()); |
| 103 } else { |
| 104 mDelegate.startDetailActivity(item.getId(), null); |
| 105 } |
| 106 return true; |
| 107 } else if (menuItem.getItemId() == R.id.selection_mode_move_menu_id) { |
| 108 List<BookmarkId> list = mDelegate.getSelectedBookmarks(); |
| 109 if (list.size() >= 1) { |
| 110 EnhancedBookmarkFolderSelectActivity.startFolderSelectActivity(g
etContext(), |
| 111 list.toArray(new BookmarkId[list.size()])); |
| 112 } |
| 113 return true; |
| 114 } else if (menuItem.getItemId() == R.id.selection_mode_delete_menu_id) { |
| 115 mDelegate.getModel().deleteBookmarks( |
| 116 mDelegate.getSelectedBookmarks().toArray(new BookmarkId[0]))
; |
| 117 return true; |
| 118 } |
| 119 |
| 120 assert false : "Unhandled menu click."; |
| 121 return false; |
| 122 } |
| 123 |
| 124 /** |
| 125 * Update the current navigation button (the top-left icon on LTR) |
| 126 * @param navigationButton one of NAVIGATION_BUTTON_* constants. |
| 127 */ |
| 128 private void setNavigationButton(int navigationButton) { |
| 129 int iconResId = 0; |
| 130 int contentDescriptionId = 0; |
| 131 |
| 132 if (navigationButton == NAVIGATION_BUTTON_MENU && !mDelegate.doesDrawerE
xist()) { |
| 133 mNavigationButton = NAVIGATION_BUTTON_NONE; |
| 134 } else { |
| 135 mNavigationButton = navigationButton; |
| 136 } |
| 137 |
| 138 if (mNavigationButton == NAVIGATION_BUTTON_MENU) { |
| 139 initActionBarDrawerToggle(); |
| 140 // ActionBarDrawerToggle will take care of icon and content descript
ion, so just return. |
| 141 return; |
| 142 } |
| 143 |
| 144 if (mActionBarDrawerToggle != null) { |
| 145 mActionBarDrawerToggle.setDrawerIndicatorEnabled(false); |
| 146 mDelegate.getDrawerLayout().setDrawerListener(null); |
| 147 } |
| 148 |
| 149 setNavigationOnClickListener(this); |
| 150 |
| 151 switch (mNavigationButton) { |
| 152 case NAVIGATION_BUTTON_NONE: |
| 153 break; |
| 154 case NAVIGATION_BUTTON_BACK: |
| 155 iconResId = R.drawable.eb_back_normal; |
| 156 contentDescriptionId = R.string.accessibility_toolbar_btn_back; |
| 157 break; |
| 158 case NAVIGATION_BUTTON_SELECTION_BACK: |
| 159 iconResId = R.drawable.eb_cancel_active; |
| 160 contentDescriptionId = R.string.accessibility_enhanced_bookmark_
cancel_selection; |
| 161 break; |
| 162 default: |
| 163 assert false : "Incorrect navigationButton argument"; |
| 164 } |
| 165 |
| 166 if (iconResId == 0) { |
| 167 setNavigationIcon(null); |
| 168 } else { |
| 169 setNavigationIcon(iconResId); |
| 170 } |
| 171 setNavigationContentDescription(contentDescriptionId); |
| 172 } |
| 173 |
| 174 /** |
| 175 * Set up ActionBarDrawerToggle, a.k.a. hamburger button. |
| 176 */ |
| 177 private void initActionBarDrawerToggle() { |
| 178 // Sadly, the only way to set correct toolbar button listener for Action
BarDrawerToggle |
| 179 // is constructing, so we will need to construct every time we re-show t
his button. |
| 180 mActionBarDrawerToggle = new ActionBarDrawerToggle((Activity) getContext
(), |
| 181 mDelegate.getDrawerLayout(), this, |
| 182 R.string.accessibility_enhanced_bookmark_drawer_toggle_btn_open, |
| 183 R.string.accessibility_enhanced_bookmark_drawer_toggle_btn_close
); |
| 184 mDelegate.getDrawerLayout().setDrawerListener(mActionBarDrawerToggle); |
| 185 mActionBarDrawerToggle.syncState(); |
| 186 } |
| 187 |
| 188 void showLoadingUi() { |
| 189 setTitle(null); |
| 190 setNavigationButton(NAVIGATION_BUTTON_NONE); |
| 191 getMenu().findItem(R.id.search_menu_id).setVisible(false); |
| 192 getMenu().findItem(R.id.edit_menu_id).setVisible(false); |
| 193 getMenu().findItem(R.id.list_toggle_menu_id).setVisible(false); |
| 194 } |
| 195 |
| 196 // EnhancedBookmarkUIObserver implementations. |
| 197 |
| 198 @Override |
| 199 public void onEnhancedBookmarkDelegateInitialized(EnhancedBookmarkDelegate d
elegate) { |
| 200 mDelegate = delegate; |
| 201 mDelegate.addUIObserver(this); |
| 202 delegate.getModel().addModelObserver(mBookmarkModelObserver); |
| 203 getMenu().findItem(R.id.list_toggle_menu_id).setVisible(true); |
| 204 } |
| 205 |
| 206 @Override |
| 207 public void onDestroy() { |
| 208 mDelegate.removeUIObserver(this); |
| 209 mDelegate.getModel().removeModelObserver(mBookmarkModelObserver); |
| 210 } |
| 211 |
| 212 @Override |
| 213 public void onAllBookmarksStateSet() { |
| 214 setTitle(R.string.enhanced_bookmark_title_bar_all_items); |
| 215 setNavigationButton(NAVIGATION_BUTTON_MENU); |
| 216 getMenu().findItem(R.id.search_menu_id).setVisible(true); |
| 217 getMenu().findItem(R.id.edit_menu_id).setVisible(false); |
| 218 } |
| 219 |
| 220 @Override |
| 221 public void onFolderStateSet(BookmarkId folder) { |
| 222 mCurrentFolder = mDelegate.getModel().getBookmarkById(folder); |
| 223 |
| 224 getMenu().findItem(R.id.search_menu_id).setVisible(false); |
| 225 getMenu().findItem(R.id.edit_menu_id).setVisible(mCurrentFolder.isEditab
le()); |
| 226 |
| 227 // If the parent folder is a top level node, we don't go up anymore. |
| 228 if (mDelegate.getModel().getTopLevelFolderParentIDs().contains( |
| 229 mCurrentFolder.getParentId())) { |
| 230 if (TextUtils.isEmpty(mCurrentFolder.getTitle())) { |
| 231 setTitle(R.string.enhanced_bookmark_title_bar_all_items); |
| 232 } else { |
| 233 setTitle(mCurrentFolder.getTitle()); |
| 234 } |
| 235 setNavigationButton(NAVIGATION_BUTTON_MENU); |
| 236 } else { |
| 237 setTitle(mCurrentFolder.getTitle()); |
| 238 setNavigationButton(NAVIGATION_BUTTON_BACK); |
| 239 } |
| 240 } |
| 241 |
| 242 @Override |
| 243 public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) { |
| 244 boolean wasSelectionEnabled = mIsSelectionEnabled; |
| 245 mIsSelectionEnabled = mDelegate.isSelectionEnabled(); |
| 246 NumberRollView numberRollView = (NumberRollView) findViewById(R.id.selec
tion_mode_number); |
| 247 if (mIsSelectionEnabled) { |
| 248 setNavigationButton(NAVIGATION_BUTTON_SELECTION_BACK); |
| 249 setTitle(null); |
| 250 |
| 251 getMenu().setGroupVisible(R.id.normal_menu_group, false); |
| 252 getMenu().setGroupVisible(R.id.selection_mode_menu_group, true); |
| 253 // Editing a bookmark action on multiple selected items doesn't make
sense. So disable. |
| 254 getMenu().findItem(R.id.selection_mode_edit_menu_id).setVisible( |
| 255 selectedBookmarks.size() == 1); |
| 256 // Partner bookmarks can't move, so if the selection includes a part
ner bookmark, |
| 257 // disable the move button. |
| 258 for (BookmarkId bookmark : selectedBookmarks) { |
| 259 if (bookmark.getType() == BookmarkType.PARTNER) { |
| 260 getMenu().findItem(R.id.selection_mode_move_menu_id).setVisi
ble(false); |
| 261 break; |
| 262 } |
| 263 } |
| 264 |
| 265 setBackgroundColor(getResources().getColor( |
| 266 R.color.enhanced_bookmark_selection_action_bar_background)); |
| 267 |
| 268 numberRollView.setVisibility(View.VISIBLE); |
| 269 if (!wasSelectionEnabled) numberRollView.setNumber(0, false); |
| 270 numberRollView.setNumber(selectedBookmarks.size(), true); |
| 271 } else { |
| 272 getMenu().setGroupVisible(R.id.normal_menu_group, true); |
| 273 getMenu().setGroupVisible(R.id.selection_mode_menu_group, false); |
| 274 setBackgroundColor(getResources().getColor(R.color.default_primary_c
olor)); |
| 275 |
| 276 numberRollView.setVisibility(View.GONE); |
| 277 numberRollView.setNumber(0, false); |
| 278 |
| 279 mDelegate.notifyStateChange(this); |
| 280 } |
| 281 } |
| 282 |
| 283 @Override |
| 284 public void onFilterStateSet(String filter) { |
| 285 setTitle(filter); |
| 286 setNavigationButton(NAVIGATION_BUTTON_MENU); |
| 287 getMenu().findItem(R.id.search_menu_id).setVisible(false); |
| 288 getMenu().findItem(R.id.edit_menu_id).setVisible(false); |
| 289 } |
| 290 |
| 291 @Override |
| 292 public void onListModeChange(boolean isListModeEnabled) { |
| 293 MenuItem menuItem = getMenu().findItem(R.id.list_toggle_menu_id); |
| 294 menuItem.getIcon().setLevel(isListModeEnabled ? 1 : 0); |
| 295 } |
| 296 } |
OLD | NEW |