diff options
Diffstat (limited to 'mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTabletBase.java')
-rw-r--r-- | mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTabletBase.java | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTabletBase.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTabletBase.java new file mode 100644 index 000000000..e818bb95c --- /dev/null +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTabletBase.java @@ -0,0 +1,182 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.toolbar; + +import java.util.Arrays; + +import android.support.v4.content.ContextCompat; +import org.mozilla.gecko.R; +import org.mozilla.gecko.Tab; +import org.mozilla.gecko.Tabs; +import org.mozilla.gecko.tabs.TabHistoryController; +import org.mozilla.gecko.menu.MenuItemActionBar; +import org.mozilla.gecko.util.HardwareUtils; +import org.mozilla.gecko.widget.themed.ThemedTextView; + +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.LinearLayout; + +/** + * A base implementations of the browser toolbar for tablets. + * This class manages any Views, variables, etc. that are exclusive to tablet. + */ +abstract class BrowserToolbarTabletBase extends BrowserToolbar { + + protected enum ForwardButtonAnimation { + SHOW, + HIDE + } + + protected final LinearLayout actionItemBar; + + protected final BackButton backButton; + protected final ForwardButton forwardButton; + + protected final View menuButtonMarginView; + + private final PorterDuffColorFilter privateBrowsingTabletMenuItemColorFilter; + + protected abstract void animateForwardButton(ForwardButtonAnimation animation); + + public BrowserToolbarTabletBase(final Context context, final AttributeSet attrs) { + super(context, attrs); + + actionItemBar = (LinearLayout) findViewById(R.id.menu_items); + + backButton = (BackButton) findViewById(R.id.back); + backButton.setEnabled(false); + forwardButton = (ForwardButton) findViewById(R.id.forward); + forwardButton.setEnabled(false); + initButtonListeners(); + + focusOrder.addAll(Arrays.asList(tabsButton, (View) backButton, (View) forwardButton, this)); + focusOrder.addAll(urlDisplayLayout.getFocusOrder()); + focusOrder.addAll(Arrays.asList(actionItemBar, menuButton)); + + urlDisplayLayout.updateSiteIdentityAnchor(backButton); + + privateBrowsingTabletMenuItemColorFilter = new PorterDuffColorFilter( + ContextCompat.getColor(context, R.color.tabs_tray_icon_grey), PorterDuff.Mode.SRC_IN); + + menuButtonMarginView = findViewById(R.id.menu_margin); + if (menuButtonMarginView != null) { + menuButtonMarginView.setVisibility(View.VISIBLE); + } + } + + private void initButtonListeners() { + backButton.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View view) { + Tabs.getInstance().getSelectedTab().doBack(); + } + }); + backButton.setOnLongClickListener(new Button.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + return tabHistoryController.showTabHistory(Tabs.getInstance().getSelectedTab(), + TabHistoryController.HistoryAction.BACK); + } + }); + + forwardButton.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View view) { + Tabs.getInstance().getSelectedTab().doForward(); + } + }); + forwardButton.setOnLongClickListener(new Button.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + return tabHistoryController.showTabHistory(Tabs.getInstance().getSelectedTab(), + TabHistoryController.HistoryAction.FORWARD); + } + }); + } + + @Override + protected boolean isTabsButtonOffscreen() { + return false; + } + + @Override + public boolean addActionItem(final View actionItem) { + actionItemBar.addView(actionItem, LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); + return true; + } + + @Override + public void removeActionItem(final View actionItem) { + actionItemBar.removeView(actionItem); + } + + @Override + protected void updateNavigationButtons(final Tab tab) { + backButton.setEnabled(canDoBack(tab)); + animateForwardButton( + canDoForward(tab) ? ForwardButtonAnimation.SHOW : ForwardButtonAnimation.HIDE); + } + + @Override + public void setNextFocusDownId(int nextId) { + super.setNextFocusDownId(nextId); + backButton.setNextFocusDownId(nextId); + forwardButton.setNextFocusDownId(nextId); + } + + @Override + public void setPrivateMode(final boolean isPrivate) { + super.setPrivateMode(isPrivate); + + // If we had backgroundTintList, we could remove the colorFilter + // code in favor of setPrivateMode (bug 1197432). + final PorterDuffColorFilter colorFilter = + isPrivate ? privateBrowsingTabletMenuItemColorFilter : null; + setTabsCounterPrivateMode(isPrivate, colorFilter); + + backButton.setPrivateMode(isPrivate); + forwardButton.setPrivateMode(isPrivate); + menuIcon.setPrivateMode(isPrivate); + for (int i = 0; i < actionItemBar.getChildCount(); ++i) { + final MenuItemActionBar child = (MenuItemActionBar) actionItemBar.getChildAt(i); + child.setPrivateMode(isPrivate); + } + } + + private void setTabsCounterPrivateMode(final boolean isPrivate, final PorterDuffColorFilter colorFilter) { + // The TabsCounter is a TextSwitcher which cycles two views + // to provide animations, hence looping over these two children. + for (int i = 0; i < 2; ++i) { + final ThemedTextView view = (ThemedTextView) tabsCounter.getChildAt(i); + view.setPrivateMode(isPrivate); + view.getBackground().mutate().setColorFilter(colorFilter); + } + + // To prevent animation of the background, + // it is set to a different Drawable. + tabsCounter.getBackground().mutate().setColorFilter(colorFilter); + } + + @Override + public View getDoorHangerAnchor() { + return backButton; + } + + protected boolean canDoBack(final Tab tab) { + return (tab.canDoBack() && !isEditing()); + } + + protected boolean canDoForward(final Tab tab) { + return (tab.canDoForward() && !isEditing()); + } +} |