summaryrefslogtreecommitdiffstats
path: root/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java')
-rw-r--r--mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java211
1 files changed, 211 insertions, 0 deletions
diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java
new file mode 100644
index 000000000..215934161
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java
@@ -0,0 +1,211 @@
+/* -*- 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 org.mozilla.gecko.R;
+import org.mozilla.gecko.animation.PropertyAnimator;
+import org.mozilla.gecko.animation.ViewHelper;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+
+/**
+ * The toolbar implementation for tablet.
+ */
+class BrowserToolbarTablet extends BrowserToolbarTabletBase {
+
+ private static final int FORWARD_ANIMATION_DURATION = 450;
+
+ private enum ForwardButtonState {
+ HIDDEN,
+ DISPLAYED,
+ TRANSITIONING,
+ }
+
+ private final int forwardButtonTranslationWidth;
+
+ private ForwardButtonState forwardButtonState;
+
+ private boolean backButtonWasEnabledOnStartEditing;
+
+ public BrowserToolbarTablet(final Context context, final AttributeSet attrs) {
+ super(context, attrs);
+
+ forwardButtonTranslationWidth =
+ getResources().getDimensionPixelOffset(R.dimen.tablet_nav_button_width);
+
+ // The forward button is initially expanded (in the layout file)
+ // so translate it for start of the expansion animation; future
+ // iterations translate it to this position when hiding and will already be set up.
+ ViewHelper.setTranslationX(forwardButton, -forwardButtonTranslationWidth);
+
+ // TODO: Move this to *TabletBase when old tablet is removed.
+ // We don't want users clicking the forward button in transitions, but we don't want it to
+ // look disabled to avoid flickering complications (e.g. disabled in editing mode), so undo
+ // the work of the super class' constructor.
+ forwardButton.setEnabled(true);
+
+ updateForwardButtonState(ForwardButtonState.HIDDEN);
+ }
+
+ private void updateForwardButtonState(final ForwardButtonState state) {
+ forwardButtonState = state;
+ forwardButton.setEnabled(forwardButtonState == ForwardButtonState.DISPLAYED);
+ }
+
+ @Override
+ public boolean isAnimating() {
+ return false;
+ }
+
+ @Override
+ protected void triggerStartEditingTransition(final PropertyAnimator animator) {
+ showUrlEditLayout();
+ }
+
+ @Override
+ protected void triggerStopEditingTransition() {
+ hideUrlEditLayout();
+ }
+
+ @Override
+ protected void animateForwardButton(final ForwardButtonAnimation animation) {
+ final boolean willShowForward = (animation == ForwardButtonAnimation.SHOW);
+ if ((forwardButtonState != ForwardButtonState.HIDDEN && willShowForward) ||
+ (forwardButtonState != ForwardButtonState.DISPLAYED && !willShowForward)) {
+ return;
+ }
+ updateForwardButtonState(ForwardButtonState.TRANSITIONING);
+
+ // We want the forward button to show immediately when switching tabs
+ final PropertyAnimator forwardAnim =
+ new PropertyAnimator(isSwitchingTabs ? 10 : FORWARD_ANIMATION_DURATION);
+
+ forwardAnim.addPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() {
+ @Override
+ public void onPropertyAnimationStart() {
+ if (!willShowForward) {
+ // Set the margin before the transition when hiding the forward button. We
+ // have to do this so that the favicon isn't clipped during the transition
+ MarginLayoutParams layoutParams =
+ (MarginLayoutParams) urlDisplayLayout.getLayoutParams();
+ layoutParams.leftMargin = 0;
+
+ // Do the same on the URL edit container
+ layoutParams = (MarginLayoutParams) urlEditLayout.getLayoutParams();
+ layoutParams.leftMargin = 0;
+
+ requestLayout();
+ // Note, we already translated the favicon, site security, and text field
+ // in prepareForwardAnimation, so they should appear to have not moved at
+ // all at this point.
+ }
+ }
+
+ @Override
+ public void onPropertyAnimationEnd() {
+ final ForwardButtonState newForwardButtonState;
+ if (willShowForward) {
+ // Increase the margins to ensure the text does not run outside the View.
+ MarginLayoutParams layoutParams =
+ (MarginLayoutParams) urlDisplayLayout.getLayoutParams();
+ layoutParams.leftMargin = forwardButtonTranslationWidth;
+
+ layoutParams = (MarginLayoutParams) urlEditLayout.getLayoutParams();
+ layoutParams.leftMargin = forwardButtonTranslationWidth;
+
+ newForwardButtonState = ForwardButtonState.DISPLAYED;
+ } else {
+ newForwardButtonState = ForwardButtonState.HIDDEN;
+ }
+
+ urlDisplayLayout.finishForwardAnimation();
+ updateForwardButtonState(newForwardButtonState);
+
+ requestLayout();
+ }
+ });
+
+ prepareForwardAnimation(forwardAnim, animation, forwardButtonTranslationWidth);
+ forwardAnim.start();
+ }
+
+ private void prepareForwardAnimation(PropertyAnimator anim, ForwardButtonAnimation animation, int width) {
+ if (animation == ForwardButtonAnimation.HIDE) {
+ anim.attach(forwardButton,
+ PropertyAnimator.Property.TRANSLATION_X,
+ -width);
+ anim.attach(forwardButton,
+ PropertyAnimator.Property.ALPHA,
+ 0);
+
+ } else {
+ anim.attach(forwardButton,
+ PropertyAnimator.Property.TRANSLATION_X,
+ 0);
+ anim.attach(forwardButton,
+ PropertyAnimator.Property.ALPHA,
+ 1);
+ }
+
+ urlDisplayLayout.prepareForwardAnimation(anim, animation, width);
+ }
+
+ @Override
+ public void triggerTabsPanelTransition(final PropertyAnimator animator, final boolean areTabsShown) {
+ // Do nothing.
+ }
+
+ @Override
+ public void setToolBarButtonsAlpha(float alpha) {
+ // Do nothing.
+ }
+
+
+ @Override
+ public void startEditing(final String url, final PropertyAnimator animator) {
+ // We already know the forward button state - no need to store it here.
+ backButtonWasEnabledOnStartEditing = backButton.isEnabled();
+
+ backButton.setEnabled(false);
+ forwardButton.setEnabled(false);
+
+ super.startEditing(url, animator);
+ }
+
+ @Override
+ public String commitEdit() {
+ stopEditingNewTablet();
+ return super.commitEdit();
+ }
+
+ @Override
+ public String cancelEdit() {
+ // This can get called when we're not editing but we only want
+ // to make these changes when leaving editing mode.
+ if (isEditing()) {
+ stopEditingNewTablet();
+
+ backButton.setEnabled(backButtonWasEnabledOnStartEditing);
+ updateForwardButtonState(forwardButtonState);
+ }
+
+ return super.cancelEdit();
+ }
+
+ private void stopEditingNewTablet() {
+ // Undo the changes caused by calling setEnabled for forwardButton in startEditing.
+ // Note that this should be called first so the enabled state of the
+ // forward button is set to the proper value.
+ forwardButton.setEnabled(true);
+ }
+
+ @Override
+ protected Drawable getLWTDefaultStateSetDrawable() {
+ return BrowserToolbar.getLightweightThemeDrawable(this, getTheme(), R.color.toolbar_grey);
+ }
+}