Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1743)

Unified Diff: chrome/android/java_staging/src/org/chromium/chrome/browser/ContextualMenuBar.java

Issue 1141283003: Upstream oodles of Chrome for Android code into Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: final patch? Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java_staging/src/org/chromium/chrome/browser/ContextualMenuBar.java
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/ContextualMenuBar.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/ContextualMenuBar.java
new file mode 100644
index 0000000000000000000000000000000000000000..44a14e07371e4ebb7ffb5aadee7caedbd6f1102e
--- /dev/null
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/ContextualMenuBar.java
@@ -0,0 +1,190 @@
+// 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;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.support.v7.app.ActionBar;
+import android.util.Property;
+
+import com.google.android.apps.chrome.R;
+
+/**
+ * This class handles the animation for the contextual menu bar and adds a custom
+ * ActionMode.Callback to the menu bar.
+ */
+public class ContextualMenuBar {
+
+ private static final int SLIDE_DURATION_MS = 200;
+
+ private CustomSelectionActionModeCallback mCustomSelectionActionModeCallback;
+ private ObjectAnimator mCurrentAnimation = null;
+ private boolean mShowingContextualActionBar = false;
+ private float mTabStripHeight;
+ private final Context mContext;
+ private final ActionBarDelegate mActionBarDelegate;
+
+ /** Property for animating the top margin of ActionBarDelegate. */
+ public static final Property<ActionBarDelegate, Integer> TOP_MARGIN_ANIM_PROPERTY =
+ new Property<ActionBarDelegate, Integer>(Integer.class, "controlTopMargin") {
+ @Override
+ public Integer get(ActionBarDelegate delegate) {
+ return delegate.getControlTopMargin();
+ }
+ @Override
+ public void set(ActionBarDelegate delegate, Integer value) {
+ delegate.setControlTopMargin(value);
+ }
+ };
+
+ /**
+ * This is an interface for objects that the contextualMenuBar can use for animating the action
+ * bar.
+ */
+ public interface ActionBarDelegate {
+
+ /**
+ * Sets the top margin of the control container.
+ * @param margin The new top margin of the control container.
+ */
+ public void setControlTopMargin(int margin);
+
+ /**
+ * @return The top margin of the control container.
+ */
+ public int getControlTopMargin();
+
+ /**
+ * @return The action bar that will be animated in and out.
+ */
+ public ActionBar getSupportActionBar();
+
+ /**
+ * Change the background visibility for the action bar.
+ * @param visible Whether the background should be visible.
+ */
+ public void setActionBarBackgroundVisibility(boolean visible);
+ }
+
+ /**
+ * Creates the contextual menu bar and ties it to an action bar using the given action bar
+ * delegate.
+ * @param context The context which the contextual action menu bar should be using for accessing
+ * resources.
+ * @param actionBarDelegate The delegate for communicating with the action bar while animating
+ * it.
+ */
+ public ContextualMenuBar(Context context, ActionBarDelegate actionBarDelegate) {
+ mActionBarDelegate = actionBarDelegate;
+ mContext = context;
+ mTabStripHeight = mContext.getResources().getDimension(R.dimen.tab_strip_height);
+ }
+
+ /**
+ * @return The delegate handling action bar positioning for the contextual menu bar.
+ */
+ public ActionBarDelegate getActionBarDelegate() {
+ return mActionBarDelegate;
+ }
+
+ /**
+ * Sets the custom ActionMode.Callback
+ * @param customSelectionActionModeCallback
+ */
+ public void setCustomSelectionActionModeCallback(
+ CustomSelectionActionModeCallback customSelectionActionModeCallback) {
+ if (customSelectionActionModeCallback.equals(mCustomSelectionActionModeCallback)) return;
+ mCustomSelectionActionModeCallback = customSelectionActionModeCallback;
+ mCustomSelectionActionModeCallback.setContextualMenuBar(this);
+ }
+
+ /**
+ * @return The custom ActionMode.Callback.
+ */
+ public CustomSelectionActionModeCallback getCustomSelectionActionModeCallback() {
+ return mCustomSelectionActionModeCallback;
+ }
+
+ /**
+ * @return The current action bar height.
+ */
+ private int queryCurrentActionBarHeight() {
+ ActionBar actionBar = mActionBarDelegate.getSupportActionBar();
+ if (actionBar != null) return actionBar.getHeight();
+
+ TypedArray styledAttributes =
+ mContext.obtainStyledAttributes(new int[] {R.attr.actionBarSize});
+ int height = styledAttributes.getDimensionPixelSize(0, 0);
+ styledAttributes.recycle();
+ return height;
+ }
+
+ /**
+ * Show controls after orientation change if previously visible.
+ */
+ public void showControlsOnOrientationChange() {
+ if (mShowingContextualActionBar && mCurrentAnimation == null) {
+ showControls();
+ }
+ }
+
+ /**
+ * Animation for the textview if the action bar is visible.
+ */
+ public void showControls() {
+ if (mCurrentAnimation != null) mCurrentAnimation.cancel();
+
+ mCurrentAnimation = ObjectAnimator.ofInt(mActionBarDelegate, TOP_MARGIN_ANIM_PROPERTY,
+ (int) (Math.max(0, queryCurrentActionBarHeight() - mTabStripHeight))).setDuration(
+ SLIDE_DURATION_MS);
+
+ mCurrentAnimation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mCurrentAnimation = null;
+ }
+ });
+
+ mCurrentAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ ActionBar actionBar = mActionBarDelegate.getSupportActionBar();
+ if (actionBar != null) {
+ animation.setIntValues((int) (Math.max(0,
+ queryCurrentActionBarHeight() - mTabStripHeight)));
+ }
+ }
+ });
+
+ mActionBarDelegate.setActionBarBackgroundVisibility(true);
+ mCurrentAnimation.start();
+ mShowingContextualActionBar = true;
+ }
+
+ /**
+ * Hide animation for the textview if the action bar is not visible.
+ */
+ public void hideControls() {
+ if (mCurrentAnimation != null) mCurrentAnimation.cancel();
+
+ mCurrentAnimation = ObjectAnimator.ofInt(mActionBarDelegate, TOP_MARGIN_ANIM_PROPERTY,
+ 0).setDuration(SLIDE_DURATION_MS);
+
+ mCurrentAnimation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mCurrentAnimation = null;
+ mActionBarDelegate.setActionBarBackgroundVisibility(false);
+ }
+ });
+
+ mCurrentAnimation.start();
+ mShowingContextualActionBar = false;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698