blob: a0bc2c254b06bd6510a2b4d6d5a00f7b44a73296 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.bookmarks;
import android.app.Activity;
import android.content.Context;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver;
import org.chromium.chrome.browser.widget.NumberRollView;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.bookmarks.BookmarkType;
import java.util.List;
/**
* Main action bar of bookmark UI. It is responsible for displaying title and buttons
* associated with the current context.
*/
public class BookmarkActionBar extends Toolbar implements BookmarkUIObserver,
OnMenuItemClickListener, OnClickListener {
private static final int NAVIGATION_BUTTON_NONE = 0;
private static final int NAVIGATION_BUTTON_MENU = 1;
private static final int NAVIGATION_BUTTON_BACK = 2;
private static final int NAVIGATION_BUTTON_SELECTION_BACK = 3;
private int mNavigationButton;
private BookmarkItem mCurrentFolder;
private BookmarkDelegate mDelegate;
private ActionBarDrawerToggle mActionBarDrawerToggle;
private boolean mIsSelectionEnabled;
private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() {
@Override
public void bookmarkModelChanged() {
onSelectionStateChange(mDelegate.getSelectedBookmarks());
}
};
public BookmarkActionBar(Context context, AttributeSet attrs) {
super(context, attrs);
setNavigationOnClickListener(this);
inflateMenu(R.menu.bookmark_action_bar_menu);
setOnMenuItemClickListener(this);
getMenu().findItem(R.id.search_menu_id).setTitle(R.string.bookmark_action_bar_search);
getMenu().findItem(R.id.selection_mode_edit_menu_id).setTitle(R.string.edit_bookmark);
getMenu().findItem(R.id.selection_mode_move_menu_id)
.setTitle(R.string.bookmark_action_bar_move);
getMenu().findItem(R.id.selection_mode_delete_menu_id)
.setTitle(R.string.bookmark_action_bar_delete);
}
@Override
public void onClick(View view) {
switch (mNavigationButton) {
case NAVIGATION_BUTTON_NONE:
break;
case NAVIGATION_BUTTON_MENU:
// ActionBarDrawerToggle handles this.
break;
case NAVIGATION_BUTTON_BACK:
mDelegate.openFolder(mCurrentFolder.getParentId());
break;
case NAVIGATION_BUTTON_SELECTION_BACK:
mDelegate.clearSelection();
break;
default:
assert false : "Incorrect navigation button state";
}
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
if (menuItem.getItemId() == R.id.edit_menu_id) {
BookmarkAddEditFolderActivity.startEditFolderActivity(getContext(),
mCurrentFolder.getId());
return true;
} else if (menuItem.getItemId() == R.id.close_menu_id) {
BookmarkUtils.finishActivityOnPhone(getContext());
return true;
} else if (menuItem.getItemId() == R.id.search_menu_id) {
mDelegate.openSearchUI();
return true;
} else if (menuItem.getItemId() == R.id.selection_mode_edit_menu_id) {
List<BookmarkId> list = mDelegate.getSelectedBookmarks();
assert list.size() == 1;
BookmarkItem item = mDelegate.getModel().getBookmarkById(list.get(0));
if (item.isFolder()) {
BookmarkAddEditFolderActivity.startEditFolderActivity(getContext(), item.getId());
} else {
BookmarkUtils.startEditActivity(getContext(), item.getId());
}
return true;
} else if (menuItem.getItemId() == R.id.selection_mode_move_menu_id) {
List<BookmarkId> list = mDelegate.getSelectedBookmarks();
if (list.size() >= 1) {
BookmarkFolderSelectActivity.startFolderSelectActivity(getContext(),
list.toArray(new BookmarkId[list.size()]));
}
return true;
} else if (menuItem.getItemId() == R.id.selection_mode_delete_menu_id) {
mDelegate.getModel().deleteBookmarks(
mDelegate.getSelectedBookmarks().toArray(new BookmarkId[0]));
return true;
}
assert false : "Unhandled menu click.";
return false;
}
/**
* Update the current navigation button (the top-left icon on LTR)
* @param navigationButton one of NAVIGATION_BUTTON_* constants.
*/
private void setNavigationButton(int navigationButton) {
int iconResId = 0;
int contentDescriptionId = 0;
if (navigationButton == NAVIGATION_BUTTON_MENU && !mDelegate.doesDrawerExist()) {
mNavigationButton = NAVIGATION_BUTTON_NONE;
} else {
mNavigationButton = navigationButton;
}
if (mNavigationButton == NAVIGATION_BUTTON_MENU) {
initActionBarDrawerToggle();
// ActionBarDrawerToggle will take care of icon and content description, so just return.
return;
}
if (mActionBarDrawerToggle != null) {
mActionBarDrawerToggle.setDrawerIndicatorEnabled(false);
mDelegate.getDrawerLayout().setDrawerListener(null);
}
setNavigationOnClickListener(this);
switch (mNavigationButton) {
case NAVIGATION_BUTTON_NONE:
break;
case NAVIGATION_BUTTON_BACK:
iconResId = R.drawable.bookmark_back_normal;
contentDescriptionId = R.string.accessibility_toolbar_btn_back;
break;
case NAVIGATION_BUTTON_SELECTION_BACK:
iconResId = R.drawable.bookmark_cancel_active;
contentDescriptionId = R.string.accessibility_bookmark_cancel_selection;
break;
default:
assert false : "Incorrect navigationButton argument";
}
if (iconResId == 0) {
setNavigationIcon(null);
} else {
setNavigationIcon(iconResId);
}
setNavigationContentDescription(contentDescriptionId);
}
/**
* Set up ActionBarDrawerToggle, a.k.a. hamburger button.
*/
private void initActionBarDrawerToggle() {
// Sadly, the only way to set correct toolbar button listener for ActionBarDrawerToggle
// is constructing, so we will need to construct every time we re-show this button.
mActionBarDrawerToggle = new ActionBarDrawerToggle((Activity) getContext(),
mDelegate.getDrawerLayout(), this,
R.string.accessibility_bookmark_drawer_toggle_btn_open,
R.string.accessibility_bookmark_drawer_toggle_btn_close);
mDelegate.getDrawerLayout().setDrawerListener(mActionBarDrawerToggle);
mActionBarDrawerToggle.syncState();
}
void showLoadingUi() {
setTitle(null);
setNavigationButton(NAVIGATION_BUTTON_NONE);
getMenu().findItem(R.id.search_menu_id).setVisible(false);
getMenu().findItem(R.id.edit_menu_id).setVisible(false);
}
// BookmarkUIObserver implementations.
@Override
public void onBookmarkDelegateInitialized(BookmarkDelegate delegate) {
mDelegate = delegate;
mDelegate.addUIObserver(this);
if (!delegate.isDialogUi()) getMenu().removeItem(R.id.close_menu_id);
delegate.getModel().addObserver(mBookmarkModelObserver);
}
@Override
public void onDestroy() {
mDelegate.removeUIObserver(this);
mDelegate.getModel().removeObserver(mBookmarkModelObserver);
}
@Override
public void onAllBookmarksStateSet() {
setTitle(R.string.bookmark_title_bar_all_items);
setNavigationButton(NAVIGATION_BUTTON_MENU);
getMenu().findItem(R.id.search_menu_id).setVisible(true);
getMenu().findItem(R.id.edit_menu_id).setVisible(false);
}
@Override
public void onFolderStateSet(BookmarkId folder) {
mCurrentFolder = mDelegate.getModel().getBookmarkById(folder);
getMenu().findItem(R.id.search_menu_id).setVisible(false);
getMenu().findItem(R.id.edit_menu_id).setVisible(mCurrentFolder.isEditable());
// If the parent folder is a top level node, we don't go up anymore.
if (mDelegate.getModel().getTopLevelFolderParentIDs().contains(
mCurrentFolder.getParentId())) {
if (TextUtils.isEmpty(mCurrentFolder.getTitle())) {
setTitle(R.string.bookmark_title_bar_all_items);
} else {
setTitle(mCurrentFolder.getTitle());
}
setNavigationButton(NAVIGATION_BUTTON_MENU);
} else {
setTitle(mCurrentFolder.getTitle());
setNavigationButton(NAVIGATION_BUTTON_BACK);
}
}
@Override
public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {
boolean wasSelectionEnabled = mIsSelectionEnabled;
mIsSelectionEnabled = mDelegate.isSelectionEnabled();
NumberRollView numberRollView = (NumberRollView) findViewById(R.id.selection_mode_number);
if (mIsSelectionEnabled) {
setNavigationButton(NAVIGATION_BUTTON_SELECTION_BACK);
setTitle(null);
getMenu().setGroupVisible(R.id.normal_menu_group, false);
getMenu().setGroupVisible(R.id.selection_mode_menu_group, true);
// Editing a bookmark action on multiple selected items doesn't make sense. So disable.
getMenu().findItem(R.id.selection_mode_edit_menu_id).setVisible(
selectedBookmarks.size() == 1);
// Partner bookmarks can't move, so if the selection includes a partner bookmark,
// disable the move button.
for (BookmarkId bookmark : selectedBookmarks) {
if (bookmark.getType() == BookmarkType.PARTNER) {
getMenu().findItem(R.id.selection_mode_move_menu_id).setVisible(false);
break;
}
}
setBackgroundColor(
ApiCompatibilityUtils.getColor(getResources(), R.color.light_active_color));
numberRollView.setVisibility(View.VISIBLE);
if (!wasSelectionEnabled) numberRollView.setNumber(0, false);
numberRollView.setNumber(selectedBookmarks.size(), true);
} else {
getMenu().setGroupVisible(R.id.normal_menu_group, true);
getMenu().setGroupVisible(R.id.selection_mode_menu_group, false);
setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(),
R.color.bookmark_appbar_background));
numberRollView.setVisibility(View.GONE);
numberRollView.setNumber(0, false);
mDelegate.notifyStateChange(this);
}
}
}