| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aa7e3acb3354a7f9d314dc6a221d283978b0c024
|
| --- /dev/null
|
| +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarTablet.java
|
| @@ -0,0 +1,189 @@
|
| +// 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.widget.findinpage;
|
| +
|
| +import android.animation.Animator;
|
| +import android.animation.AnimatorListenerAdapter;
|
| +import android.animation.ObjectAnimator;
|
| +import android.content.Context;
|
| +import android.content.res.Resources;
|
| +import android.graphics.Rect;
|
| +import android.util.AttributeSet;
|
| +import android.view.View;
|
| +import android.view.animation.DecelerateInterpolator;
|
| +import android.widget.FrameLayout;
|
| +
|
| +import com.google.android.apps.chrome.R;
|
| +
|
| +/**
|
| + * A tablet specific version of the {@link FindToolbar}.
|
| + */
|
| +public class FindToolbarTablet extends FindToolbar {
|
| + private static final int ENTER_EXIT_ANIMATION_DURATION_MS = 200;
|
| + private static final int MAKE_ROOM_ANIMATION_DURATION_MS = 200;
|
| +
|
| + private static final float Y_INSET_DP = 8.f;
|
| +
|
| + private ObjectAnimator mCurrentAnimation;
|
| +
|
| + private ObjectAnimator mAnimationEnter;
|
| + private ObjectAnimator mAnimationLeave;
|
| +
|
| + private final int mYInsetPx;
|
| +
|
| + /**
|
| + * Creates an instance of a {@link FindToolbarTablet}.
|
| + * @param context The Context to create the {@link FindToolbarTablet} under.
|
| + * @param attrs The AttributeSet used to create the {@link FindToolbarTablet}.
|
| + */
|
| + public FindToolbarTablet(Context context, AttributeSet attrs) {
|
| + super(context, attrs);
|
| +
|
| + mYInsetPx = (int) (context.getResources().getDisplayMetrics().density * Y_INSET_DP);
|
| + }
|
| +
|
| + @Override
|
| + public void onFinishInflate() {
|
| + super.onFinishInflate();
|
| +
|
| + setVisibility(View.GONE);
|
| +
|
| + Resources resources = getContext().getResources();
|
| + int width = resources.getDimensionPixelSize(R.dimen.find_in_page_popup_width);
|
| + int endMargin = resources.getDimensionPixelOffset(R.dimen.find_in_page_popup_margin_end);
|
| + int translateWidth = width + endMargin;
|
| +
|
| + mAnimationEnter = ObjectAnimator.ofFloat(this, "translationX", translateWidth, 0);
|
| + mAnimationEnter.setDuration(ENTER_EXIT_ANIMATION_DURATION_MS);
|
| + mAnimationEnter.setInterpolator(new DecelerateInterpolator());
|
| + mAnimationEnter.addListener(new AnimatorListenerAdapter() {
|
| + @Override
|
| + public void onAnimationStart(Animator animation) {
|
| + setVisibility(View.VISIBLE);
|
| + postInvalidateOnAnimation();
|
| + superActivate();
|
| + }
|
| +
|
| + @Override
|
| + public void onAnimationEnd(Animator animation) {
|
| + mCurrentAnimation = null;
|
| + }
|
| + });
|
| +
|
| + mAnimationLeave = ObjectAnimator.ofFloat(this, "translationX", 0, translateWidth);
|
| + mAnimationLeave.setDuration(ENTER_EXIT_ANIMATION_DURATION_MS);
|
| + mAnimationLeave.setInterpolator(new DecelerateInterpolator());
|
| + mAnimationLeave.addListener(new AnimatorListenerAdapter() {
|
| + @Override
|
| + public void onAnimationStart(Animator animation) {
|
| + setVisibility(View.VISIBLE);
|
| + postInvalidateOnAnimation();
|
| + }
|
| +
|
| + @Override
|
| + public void onAnimationEnd(Animator animation) {
|
| + setVisibility(View.GONE);
|
| + mCurrentAnimation = null;
|
| + }
|
| + });
|
| + }
|
| +
|
| + @Override
|
| + public void activate() {
|
| + if (mCurrentAnimation == mAnimationEnter) return;
|
| +
|
| + if (isViewAvailable()) setShowState(true);
|
| + }
|
| +
|
| + @Override
|
| + public void deactivate() {
|
| + super.deactivate();
|
| +
|
| + if (mCurrentAnimation == mAnimationLeave) return;
|
| +
|
| + setShowState(false);
|
| + }
|
| +
|
| + @Override
|
| + public boolean isAnimating() {
|
| + return mCurrentAnimation != null;
|
| + }
|
| +
|
| + @Override
|
| + public void findResultSelected(Rect rect) {
|
| + super.findResultSelected(rect);
|
| +
|
| + boolean makeRoom = false;
|
| + float density = getContext().getResources().getDisplayMetrics().density;
|
| +
|
| + if (rect != null && rect.intersects((int) (getLeft() / density), 0,
|
| + (int) (getRight() / density), (int) (getHeight() / density))) {
|
| + makeRoom = true;
|
| + }
|
| +
|
| + setMakeRoomForResults(makeRoom);
|
| + }
|
| +
|
| + @Override
|
| + protected void clearResults() {
|
| + super.clearResults();
|
| + setMakeRoomForResults(false);
|
| + }
|
| +
|
| + private void setMakeRoomForResults(boolean makeRoom) {
|
| + float translationY = makeRoom ? -(getHeight() - mYInsetPx) : 0.f;
|
| +
|
| + if (translationY != getTranslationY()) {
|
| + mCurrentAnimation = ObjectAnimator.ofFloat(this, "translationY", getTranslationY(),
|
| + translationY);
|
| + mCurrentAnimation.setDuration(MAKE_ROOM_ANIMATION_DURATION_MS);
|
| + mAnimationLeave.setInterpolator(new DecelerateInterpolator());
|
| + mAnimationLeave.addListener(new AnimatorListenerAdapter() {
|
| + @Override
|
| + public void onAnimationStart(Animator animation) {
|
| + postInvalidateOnAnimation();
|
| + }
|
| +
|
| + @Override
|
| + public void onAnimationEnd(Animator animation) {
|
| + mCurrentAnimation = null;
|
| + }
|
| + });
|
| + mTabModelSelector.getCurrentTab()
|
| + .getWindowAndroid()
|
| + .startAnimationOverContent(mCurrentAnimation);
|
| + }
|
| + }
|
| +
|
| + private void setShowState(boolean show) {
|
| + ObjectAnimator nextAnimator = null;
|
| +
|
| + if (show && getVisibility() != View.VISIBLE && mCurrentAnimation != mAnimationEnter) {
|
| + View anchorView = getRootView().findViewById(R.id.toolbar);
|
| + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
|
| + lp.topMargin = anchorView.getBottom() - mYInsetPx;
|
| + setLayoutParams(lp);
|
| + nextAnimator = mAnimationEnter;
|
| + } else if (!show && getVisibility() != View.GONE && mCurrentAnimation != mAnimationLeave) {
|
| + nextAnimator = mAnimationLeave;
|
| + onHideAnimationStart();
|
| + }
|
| +
|
| + if (nextAnimator != null) {
|
| + mCurrentAnimation = nextAnimator;
|
| + mTabModelSelector.getCurrentTab()
|
| + .getWindowAndroid()
|
| + .startAnimationOverContent(nextAnimator);
|
| + postInvalidateOnAnimation();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * This is here so that Animation inner classes can access the parent activate methods.
|
| + */
|
| + private void superActivate() {
|
| + super.activate();
|
| + }
|
| +}
|
|
|