Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelAnimation.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelAnimation.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelAnimation.java |
deleted file mode 100644 |
index 4c919608c91e2f4693047bfebe71e4f522e5268d..0000000000000000000000000000000000000000 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelAnimation.java |
+++ /dev/null |
@@ -1,518 +0,0 @@ |
-// 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.compositor.bottombar.contextualsearch; |
- |
-import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.AnimatableAnimation.createAnimation; |
- |
-import android.content.Context; |
-import android.view.animation.Interpolator; |
- |
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState; |
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason; |
-import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation; |
-import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable; |
-import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animation; |
-import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; |
-import org.chromium.chrome.browser.util.MathUtils; |
- |
-/** |
- * Base abstract class for animating the Contextual Search Panel. |
- */ |
-public abstract class ContextualSearchPanelAnimation extends ContextualSearchPanelBase |
- implements Animatable<ContextualSearchPanelAnimation.Property> { |
- |
- /** |
- * Animation properties. |
- */ |
- protected enum Property { |
- PANEL_HEIGHT, |
- PROMO_VISIBILITY, |
- BOTTOM_BAR_TEXT_VISIBILITY |
- } |
- |
- /** |
- * The base duration of animations in milliseconds. This value is based on |
- * the Kennedy specification for slow animations. |
- */ |
- protected static final long BASE_ANIMATION_DURATION_MS = 218; |
- |
- /** |
- * The maximum animation duration in milliseconds. |
- */ |
- static final long MAXIMUM_ANIMATION_DURATION_MS = 350; |
- |
- /** |
- * The minimum animation duration in milliseconds. |
- */ |
- private static final long MINIMUM_ANIMATION_DURATION_MS = Math.round(7 * 1000 / 60); |
- |
- /** |
- * Average animation velocity in dps per second. |
- */ |
- private static final float INITIAL_ANIMATION_VELOCITY_DP_PER_SECOND = 1750f; |
- |
- /** |
- * The PanelState to which the Panel is being animated. |
- */ |
- private PanelState mAnimatingState; |
- |
- /** |
- * The StateChangeReason for which the Panel is being animated. |
- */ |
- private StateChangeReason mAnimatingStateReason; |
- |
- /** |
- * The animation set. |
- */ |
- private ChromeAnimation<Animatable<?>> mLayoutAnimations; |
- |
- /** |
- * Whether the Promo's acceptance animation is running. |
- */ |
- private boolean mIsAnimatingPromoAcceptance; |
- |
- /** |
- * The {@link LayoutUpdateHost} used to request a new frame to be updated and rendered. |
- */ |
- private final LayoutUpdateHost mUpdateHost; |
- |
- /** |
- * Whether the panel's close animation is running. |
- */ |
- private boolean mIsAnimatingPanelClosing; |
- |
- // ============================================================================================ |
- // Constructor |
- // ============================================================================================ |
- |
- /** |
- * @param context The current Android {@link Context}. |
- * @param updateHost The {@link LayoutUpdateHost} used to request updates in the Layout. |
- */ |
- public ContextualSearchPanelAnimation(Context context, LayoutUpdateHost updateHost) { |
- super(context); |
- mUpdateHost = updateHost; |
- } |
- |
- // ============================================================================================ |
- // Animation API |
- // ============================================================================================ |
- |
- /** |
- * Notifies that the acceptance animation has finished. |
- */ |
- protected void onPromoAcceptanceAnimationFinished() { |
- } |
- |
- /** |
- * Animates the Contextual Search Panel to its maximized state. |
- * |
- * @param reason The reason for the change of panel state. |
- */ |
- protected void maximizePanel(StateChangeReason reason) { |
- animatePanelToState(PanelState.MAXIMIZED, reason); |
- } |
- |
- /** |
- * Animates the Contextual Search Panel to its intermediary state. |
- * |
- * @param reason The reason for the change of panel state. |
- */ |
- protected void expandPanel(StateChangeReason reason) { |
- animatePanelToState(PanelState.EXPANDED, reason); |
- } |
- |
- /** |
- * Animates the Contextual Search Panel to its peeked state. |
- * |
- * @param reason The reason for the change of panel state. |
- */ |
- protected void peekPanel(StateChangeReason reason) { |
- // Indicate to the Compositor that for now on the Panel should be |
- // rendered, until it's closed. |
- startShowing(); |
- |
- // TODO(pedrosimonetti): Implement custom animation with the following values. |
- // int SEARCH_BAR_ANIMATION_DURATION_MS = 218; |
- // float SEARCH_BAR_SLIDE_OFFSET_DP = 40; |
- // float mSearchBarHeightDp; |
- // setTranslationY(mIsShowingFirstRunFlow |
- // ? mSearchBarHeightDp : SEARCH_BAR_SLIDE_OFFSET_DP); |
- // setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); |
- animatePanelToState(PanelState.PEEKED, reason); |
- } |
- |
- @Override |
- protected void closePanel(StateChangeReason reason, boolean animate) { |
- // If close without animation is called while the panel is already animating closed, cancel |
- // the animation and finish closing immediately. |
- if (mIsAnimatingPanelClosing) { |
- if (!animate) { |
- cancelAnimation(this, Property.PANEL_HEIGHT); |
- } else { |
- return; |
- } |
- } |
- |
- if (animate) { |
- mIsAnimatingPanelClosing = true; |
- animatePanelToState(PanelState.CLOSED, reason); |
- } else { |
- resizePanelToState(PanelState.CLOSED, reason); |
- } |
- } |
- |
- /** |
- * Animates the Contextual Search Panel to a given |state| with a default duration. |
- * |
- * @param state The state to animate to. |
- * @param reason The reason for the change of panel state. |
- */ |
- private void animatePanelToState(PanelState state, StateChangeReason reason) { |
- animatePanelToState(state, reason, BASE_ANIMATION_DURATION_MS); |
- } |
- |
- /** |
- * Animates the Contextual Search Panel to a given |state| with a custom |duration|. |
- * |
- * @param state The state to animate to. |
- * @param reason The reason for the change of panel state. |
- * @param duration The animation duration in milliseconds. |
- */ |
- protected void animatePanelToState(PanelState state, StateChangeReason reason, long duration) { |
- mAnimatingState = state; |
- mAnimatingStateReason = reason; |
- |
- final float height = getPanelHeightFromState(state); |
- animatePanelTo(height, duration); |
- } |
- |
- /** |
- * Resizes the Contextual Search Panel to a given |state|. |
- * |
- * @param state The state to resize to. |
- * @param reason The reason for the change of panel state. |
- */ |
- protected void resizePanelToState(PanelState state, StateChangeReason reason) { |
- cancelHeightAnimation(); |
- |
- final float height = getPanelHeightFromState(state); |
- setPanelHeight(height); |
- setPanelState(state, reason); |
- requestUpdate(); |
- } |
- |
- // ============================================================================================ |
- // Animation Helpers |
- // ============================================================================================ |
- |
- @Override |
- protected void animatePromoAcceptance() { |
- hidePromoView(); |
- mIsAnimatingPromoAcceptance = true; |
- animateProperty(Property.PROMO_VISIBILITY, 1.f, 0.f, BASE_ANIMATION_DURATION_MS); |
- } |
- |
- @Override |
- protected void animateSearchTermResolution() { |
- animateProperty(Property.BOTTOM_BAR_TEXT_VISIBILITY, 0.f, 1.f, |
- MAXIMUM_ANIMATION_DURATION_MS); |
- } |
- |
- @Override |
- protected void cancelSearchTermResolutionAnimation() { |
- if (animationIsRunning()) { |
- cancelAnimation(this, Property.BOTTOM_BAR_TEXT_VISIBILITY); |
- } |
- } |
- |
- /** |
- * Animates the Panel to its nearest state. |
- */ |
- protected void animateToNearestState() { |
- // Calculate the nearest state from the current position, and then calculate the duration |
- // of the animation that will start with a desired initial velocity and move the desired |
- // amount of dps (displacement). |
- final PanelState nearestState = findNearestPanelStateFromHeight(getHeight()); |
- final float displacement = getPanelHeightFromState(nearestState) - getHeight(); |
- final long duration = calculateAnimationDuration( |
- INITIAL_ANIMATION_VELOCITY_DP_PER_SECOND, displacement); |
- |
- animatePanelToState(nearestState, StateChangeReason.SWIPE, duration); |
- } |
- |
- /** |
- * Animates the Panel to its projected state, given a particular vertical |velocity|. |
- * |
- * @param velocity The velocity of the gesture in dps per second. |
- */ |
- protected void animateToProjectedState(float velocity) { |
- final float kickY = calculateAnimationDisplacement(velocity, BASE_ANIMATION_DURATION_MS); |
- final float projectedHeight = getHeight() - kickY; |
- |
- // Calculate the projected state the Panel will be at the end of the fling movement and the |
- // duration of the animation given the current velocity and the projected displacement. |
- PanelState projectedState = findNearestPanelStateFromHeight(projectedHeight); |
- |
- // Prevent the fling gesture from moving the Panel from PEEKED to MAXIMIZED if the Panel |
- // Promo is available and we are running in full screen panel mode. This is to make sure |
- // the Promo will be visible, considering that the EXPANDED state is the only one that will |
- // show the Promo in full screen panel mode. In narrow panel UI the Promo is visible in |
- // maximized so this project state change is not needed. |
- if (projectedState == PanelState.MAXIMIZED |
- && getPanelState() == PanelState.PEEKED |
- && isPromoVisible()) { |
- projectedState = PanelState.EXPANDED; |
- } |
- |
- final float displacement = getPanelHeightFromState(projectedState) - getHeight(); |
- final long duration = calculateAnimationDuration(velocity, displacement); |
- |
- animatePanelToState(projectedState, StateChangeReason.FLING, duration); |
- } |
- |
- /** |
- * Calculates the animation displacement given the |initialVelocity| and a |
- * desired |duration|. |
- * |
- * @param initialVelocity The initial velocity of the animation in dps per second. |
- * @param duration The desired duration of the animation in milliseconds. |
- * @return The animation displacement in dps. |
- */ |
- protected float calculateAnimationDisplacement(float initialVelocity, float duration) { |
- // NOTE(pedrosimonetti): This formula assumes the deceleration curve is |
- // quadratic (t^2), |
- // hence the displacement formula should be: |
- // displacement = initialVelocity * duration / 2 |
- // |
- // We are also converting the duration from milliseconds to seconds, |
- // which explains why |
- // we are dividing by 2000 (2 * 1000) instead of 2. |
- return initialVelocity * duration / 2000; |
- } |
- |
- /** |
- * Calculates the animation duration given the |initialVelocity| and a |
- * desired |displacement|. |
- * |
- * @param initialVelocity The initial velocity of the animation in dps per second. |
- * @param displacement The displacement of the animation in dps. |
- * @return The animation duration in milliseconds. |
- */ |
- private long calculateAnimationDuration(float initialVelocity, float displacement) { |
- // NOTE(pedrosimonetti): This formula assumes the deceleration curve is |
- // quadratic (t^2), |
- // hence the duration formula should be: |
- // duration = 2 * displacement / initialVelocity |
- // |
- // We are also converting the duration from seconds to milliseconds, |
- // which explains why |
- // we are multiplying by 2000 (2 * 1000) instead of 2. |
- return MathUtils.clamp(Math.round(Math.abs(2000 * displacement / initialVelocity)), |
- MINIMUM_ANIMATION_DURATION_MS, MAXIMUM_ANIMATION_DURATION_MS); |
- } |
- |
- /** |
- * Cancels any height animation in progress. |
- */ |
- protected void cancelHeightAnimation() { |
- cancelAnimation(this, Property.PANEL_HEIGHT); |
- } |
- |
- // ============================================================================================ |
- // Layout Integration |
- // ============================================================================================ |
- |
- /** |
- * Requests a new frame to be updated and rendered. |
- */ |
- protected void requestUpdate() { |
- // NOTE(pedrosimonetti): mUpdateHost will be null in the ContextualSearchEventFilterTest, |
- // so we always need to check if it's null before calling requestUpdate. |
- if (mUpdateHost != null) { |
- mUpdateHost.requestUpdate(); |
- } |
- } |
- |
- // ============================================================================================ |
- // Animation Framework |
- // ============================================================================================ |
- |
- /** |
- * Animates the Contextual Search Panel to a given |height| with a custom |duration|. |
- * |
- * @param height The height to animate to. |
- * @param duration The animation duration in milliseconds. |
- */ |
- private void animatePanelTo(float height, long duration) { |
- animateProperty(Property.PANEL_HEIGHT, getHeight(), height, duration); |
- } |
- |
- /** |
- * Animates the Contextual Search Panel. |
- * |
- * @param property The property which will be animated. |
- * @param start The initial value. |
- * @param end The final value. |
- * @param duration The animation duration in milliseconds. |
- */ |
- protected void animateProperty(Property property, float start, float end, long duration) { |
- if (duration > 0) { |
- if (animationIsRunning()) { |
- cancelAnimation(this, property); |
- } |
- addToAnimation(this, property, start, end, duration, 0); |
- } |
- } |
- |
- /** |
- * Sets a property for an animation. |
- * |
- * @param prop The property to update. |
- * @param value New value of the property. |
- */ |
- @Override |
- public void setProperty(Property prop, float value) { |
- if (prop == Property.PANEL_HEIGHT) { |
- setPanelHeight(value); |
- } else if (prop == Property.PROMO_VISIBILITY) { |
- setPromoVisibilityForOptInAnimation(value); |
- } |
- } |
- |
- /** |
- * Steps the animation forward and updates all the animated values. |
- * @param time The current time of the app in ms. |
- * @param jumpToEnd Whether to finish the animation. |
- * @return Whether the animation was finished. |
- */ |
- public boolean onUpdateAnimation(long time, boolean jumpToEnd) { |
- boolean finished = true; |
- if (mLayoutAnimations != null) { |
- if (jumpToEnd) { |
- finished = mLayoutAnimations.finished(); |
- mLayoutAnimations.updateAndFinish(); |
- } else { |
- finished = mLayoutAnimations.update(time); |
- } |
- |
- if (finished || jumpToEnd) { |
- mLayoutAnimations = null; |
- onAnimationFinished(); |
- } |
- requestUpdate(); |
- } |
- return finished; |
- } |
- |
- /** |
- * Called when layout-specific actions are needed after the animation finishes. |
- */ |
- protected void onAnimationStarted() { |
- } |
- |
- /** |
- * Called when layout-specific actions are needed after the animation finishes. |
- */ |
- protected void onAnimationFinished() { |
- if (mIsAnimatingPromoAcceptance) { |
- mIsAnimatingPromoAcceptance = false; |
- onPromoAcceptanceAnimationFinished(); |
- } |
- |
- if (mIsAnimatingPanelClosing) { |
- mIsAnimatingPanelClosing = false; |
- } |
- |
- // If animating to a particular PanelState, and after completing |
- // resizing the Panel to its desired state, then the Panel's state |
- // should be updated. This method also is called when an animation |
- // is cancelled (which can happen by a subsequent gesture while |
- // an animation is happening). That's why the actual height should |
- // be checked. |
- if (mAnimatingState != PanelState.UNDEFINED |
- && getHeight() == getPanelHeightFromState(mAnimatingState)) { |
- setPanelState(mAnimatingState, mAnimatingStateReason); |
- } |
- |
- mAnimatingState = PanelState.UNDEFINED; |
- mAnimatingStateReason = StateChangeReason.UNKNOWN; |
- } |
- |
- /** |
- * Creates an {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable} |
- * and adds it to the animation. |
- * Automatically sets the start value at the beginning of the animation. |
- */ |
- protected <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop, float start, |
- float end, long duration, long startTime) { |
- addToAnimation(object, prop, start, end, duration, startTime, false); |
- } |
- |
- /** |
- * Creates an {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable} |
- * and adds it to the animation. Uses a deceleration interpolator by default. |
- */ |
- protected <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop, float start, |
- float end, long duration, long startTime, boolean setStartValueAfterDelay) { |
- addToAnimation(object, prop, start, end, duration, startTime, setStartValueAfterDelay, |
- ChromeAnimation.getDecelerateInterpolator()); |
- } |
- |
- /** |
- * Creates an {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable} |
- * and adds it to the animation. |
- * |
- * @param <T> The Enum type of the Property being used |
- * @param object The object being animated |
- * @param prop The property being animated |
- * @param start The starting value of the animation |
- * @param end The ending value of the animation |
- * @param duration The duration of the animation in ms |
- * @param startTime The start time in ms |
- * @param setStartValueAfterDelay See {@link Animation#setStartValueAfterStartDelay(boolean)} |
- * @param interpolator The interpolator to use for the animation |
- */ |
- protected <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop, float start, |
- float end, long duration, long startTime, boolean setStartValueAfterDelay, |
- Interpolator interpolator) { |
- ChromeAnimation.Animation<Animatable<?>> component = createAnimation(object, prop, start, |
- end, duration, startTime, setStartValueAfterDelay, interpolator); |
- addToAnimation(component); |
- } |
- |
- /** |
- * Appends an Animation to the current animation set and starts it immediately. If the set is |
- * already finished or doesn't exist, the animation set is also started. |
- */ |
- protected void addToAnimation(ChromeAnimation.Animation<Animatable<?>> component) { |
- if (mLayoutAnimations == null || mLayoutAnimations.finished()) { |
- onAnimationStarted(); |
- mLayoutAnimations = new ChromeAnimation<Animatable<?>>(); |
- mLayoutAnimations.start(); |
- } |
- component.start(); |
- mLayoutAnimations.add(component); |
- requestUpdate(); |
- } |
- |
- /** |
- * @return whether or not the animation is currently being run. |
- */ |
- protected boolean animationIsRunning() { |
- return mLayoutAnimations != null && !mLayoutAnimations.finished(); |
- } |
- |
- /** |
- * Cancels any animation for the given object and property. |
- * @param object The object being animated. |
- * @param prop The property to search for. |
- */ |
- protected <T extends Enum<?>> void cancelAnimation(Animatable<T> object, T prop) { |
- if (mLayoutAnimations != null) { |
- mLayoutAnimations.cancel(object, prop); |
- } |
- } |
-} |