| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..450f49c7c9cdd26131dac725b39a1edcfa0501fa
|
| --- /dev/null
|
| +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java
|
| @@ -0,0 +1,165 @@
|
| +// 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.newtab;
|
| +
|
| +import android.animation.Animator;
|
| +import android.animation.AnimatorSet;
|
| +import android.animation.ObjectAnimator;
|
| +import android.content.Context;
|
| +import android.graphics.Canvas;
|
| +import android.graphics.drawable.Drawable;
|
| +import android.util.AttributeSet;
|
| +import android.util.Property;
|
| +import android.widget.Button;
|
| +
|
| +import com.google.android.apps.chrome.R;
|
| +
|
| +import org.chromium.base.ApiCompatibilityUtils;
|
| +
|
| +import java.util.ArrayList;
|
| +import java.util.List;
|
| +
|
| +/**
|
| + * Button for creating new tabs.
|
| + */
|
| +public class NewTabButton extends Button implements Drawable.Callback {
|
| +
|
| + private static final Property<Drawable, Integer> DRAWABLE_ALPHA_PROPERTY =
|
| + new Property<Drawable, Integer>(Integer.class, "alpha") {
|
| + @Override
|
| + public Integer get(Drawable d) {
|
| + // getAlpha() is only exposed on drawable in API 19+, so we rely on animations
|
| + // always setting the starting and ending values instead of relying on this
|
| + // property.
|
| + return 0;
|
| + }
|
| +
|
| + @Override
|
| + public void set(Drawable d, Integer alpha) {
|
| + d.setAlpha(alpha);
|
| + }
|
| + };
|
| +
|
| + private final Drawable mNormalDrawable;
|
| + private final Drawable mIncognitoDrawable;
|
| + private boolean mIsIncognito;
|
| + private AnimatorSet mTransitionAnimation;
|
| +
|
| + /**
|
| + * Constructor for inflating from XML.
|
| + */
|
| + public NewTabButton(Context context, AttributeSet attrs) {
|
| + super(context, attrs);
|
| + mNormalDrawable = ApiCompatibilityUtils.getDrawable(
|
| + getResources(), R.drawable.btn_new_tab_white);
|
| + mNormalDrawable.setBounds(
|
| + 0, 0, mNormalDrawable.getIntrinsicWidth(), mNormalDrawable.getIntrinsicHeight());
|
| + mNormalDrawable.setCallback(this);
|
| + mIncognitoDrawable = ApiCompatibilityUtils.getDrawable(
|
| + getResources(), R.drawable.btn_new_tab_incognito);
|
| + mIncognitoDrawable.setBounds(
|
| + 0, 0,
|
| + mIncognitoDrawable.getIntrinsicWidth(), mIncognitoDrawable.getIntrinsicHeight());
|
| + mIncognitoDrawable.setCallback(this);
|
| + mIsIncognito = false;
|
| + }
|
| +
|
| + @Override
|
| + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
| + int desiredWidth = Math.max(
|
| + mIncognitoDrawable.getIntrinsicWidth(), mNormalDrawable.getIntrinsicWidth());
|
| + desiredWidth += getPaddingLeft() + getPaddingRight();
|
| + widthMeasureSpec = MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.EXACTLY);
|
| + super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
| + }
|
| +
|
| + @Override
|
| + protected void onDraw(Canvas canvas) {
|
| + super.onDraw(canvas);
|
| +
|
| + boolean isRtl = ApiCompatibilityUtils.isLayoutRtl(this);
|
| + int paddingStart = ApiCompatibilityUtils.getPaddingStart(this);
|
| + int widthWithoutPadding = getWidth() - paddingStart;
|
| +
|
| + canvas.save();
|
| + if (!isRtl) canvas.translate(paddingStart, 0);
|
| +
|
| + canvas.save();
|
| + canvas.translate(0, (getHeight() - mNormalDrawable.getIntrinsicHeight()) / 2.f);
|
| + if (isRtl) {
|
| + canvas.translate(widthWithoutPadding - mNormalDrawable.getIntrinsicWidth(), 0);
|
| + }
|
| + mNormalDrawable.draw(canvas);
|
| + canvas.restore();
|
| +
|
| + if (mIsIncognito || (mTransitionAnimation != null && mTransitionAnimation.isRunning())) {
|
| + canvas.save();
|
| + canvas.translate(0, (getHeight() - mIncognitoDrawable.getIntrinsicHeight()) / 2.f);
|
| + if (isRtl) {
|
| + canvas.translate(widthWithoutPadding - mIncognitoDrawable.getIntrinsicWidth(), 0);
|
| + }
|
| + mIncognitoDrawable.draw(canvas);
|
| + canvas.restore();
|
| + }
|
| +
|
| + canvas.restore();
|
| + }
|
| +
|
| + @Override
|
| + public void invalidateDrawable(Drawable dr) {
|
| + if (dr == mIncognitoDrawable || dr == mNormalDrawable) {
|
| + invalidate();
|
| + } else {
|
| + super.invalidateDrawable(dr);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Updates the visual state based on whether incognito or normal tabs are being created.
|
| + * @param incognito Whether the button is now used for creating incognito tabs.
|
| + */
|
| + public void setIsIncognito(boolean incognito) {
|
| + if (mIsIncognito == incognito) return;
|
| + mIsIncognito = incognito;
|
| +
|
| + if (mTransitionAnimation != null) {
|
| + mTransitionAnimation.cancel();
|
| + mTransitionAnimation = null;
|
| + }
|
| +
|
| + Drawable fadeOutDrawable = incognito ? mNormalDrawable : mIncognitoDrawable;
|
| + Drawable fadeInDrawable = incognito ? mIncognitoDrawable : mNormalDrawable;
|
| +
|
| + if (getVisibility() != VISIBLE) {
|
| + fadeOutDrawable.setAlpha(0);
|
| + fadeInDrawable.setAlpha(255);
|
| + return;
|
| + }
|
| +
|
| + List<Animator> animations = new ArrayList<Animator>();
|
| + Animator animation = ObjectAnimator.ofInt(
|
| + fadeOutDrawable, DRAWABLE_ALPHA_PROPERTY, 255, 0);
|
| + animation.setDuration(100);
|
| + animations.add(animation);
|
| +
|
| + animation = ObjectAnimator.ofInt(
|
| + fadeInDrawable, DRAWABLE_ALPHA_PROPERTY, 0, 255);
|
| + animation.setStartDelay(150);
|
| + animation.setDuration(100);
|
| + animations.add(animation);
|
| +
|
| + mTransitionAnimation = new AnimatorSet();
|
| + mTransitionAnimation.playTogether(animations);
|
| + mTransitionAnimation.start();
|
| + }
|
| +
|
| + @Override
|
| + protected void drawableStateChanged() {
|
| + super.drawableStateChanged();
|
| +
|
| + mNormalDrawable.setState(getDrawableState());
|
| + mIncognitoDrawable.setState(getDrawableState());
|
| + }
|
| +}
|
|
|