summaryrefslogtreecommitdiffstats
path: root/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTabletBase.java
diff options
context:
space:
mode:
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.java182
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());
+ }
+}