Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java |
| index 94a7f3df7f0e7521d7ddb30dcf304a1a0a6a6cda..d64a4da58ebf5fc11bedf7409941db1899cd4bc1 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/LogoView.java |
| @@ -8,15 +8,18 @@ import android.animation.Animator; |
| import android.animation.ObjectAnimator; |
| import android.content.Context; |
| import android.graphics.Bitmap; |
| +import android.graphics.Bitmap.Config; |
| import android.graphics.BitmapFactory; |
| import android.graphics.Canvas; |
| import android.graphics.Matrix; |
| import android.graphics.Paint; |
| +import android.graphics.drawable.Drawable; |
| import android.text.TextUtils; |
| import android.util.AttributeSet; |
| import android.util.Property; |
| import android.view.View; |
| import android.view.View.OnClickListener; |
| +import android.widget.ImageView; |
| import org.chromium.chrome.R; |
| import org.chromium.chrome.browser.ntp.LogoBridge.Logo; |
| @@ -24,6 +27,9 @@ import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; |
| import java.lang.ref.WeakReference; |
| +import jp.tomorrowkey.android.gifplayer.BaseGifDrawable; |
| +import jp.tomorrowkey.android.gifplayer.BaseGifImage; |
| + |
| /** |
| * This view shows the default search provider's logo and fades in a new logo if one becomes |
| * available. |
|
newt (away)
2015/09/18 20:46:02
update javadoc
Ian Wen
2015/09/22 21:39:05
Done.
|
| @@ -36,14 +42,20 @@ public class LogoView extends View implements OnClickListener { |
| // The default logo is shared across all NTPs. |
| private static WeakReference<Bitmap> sDefaultLogo; |
| - private Paint mPaint; |
| + // mLogo and mNewLogo are remembered for cross fading animation. |
| private Bitmap mLogo; |
|
newt (away)
2015/09/18 20:46:02
Be sure to set mLogo and mNewLogo to null once the
Ian Wen
2015/09/22 21:39:05
Done.
|
| private Bitmap mNewLogo; |
| + private ObjectAnimator mAnimation; |
| + |
| + private BaseGifDrawable mGifDrawable; |
| + private Paint mPaint; |
| private Matrix mLogoMatrix; |
| private Matrix mNewLogoMatrix; |
| private boolean mLogoIsDefault; |
| private boolean mNewLogoIsDefault; |
| - private ObjectAnimator mAnimation; |
| + |
| + // The Logo object representing the latest logo this view is showing. |
| + private Logo mCurrentLogo; |
| /** |
| * A measure from 0 to 1 of how much the new logo has faded in. 0 shows the old logo, 1 shows |
| @@ -114,6 +126,9 @@ public class LogoView extends View implements OnClickListener { |
| * @param logo The new logo to fade in. May be null to reset to the default logo. |
| */ |
| public void updateLogo(Logo logo) { |
| + if (mCurrentLogo != null && mCurrentLogo.equals(logo)) return; |
|
newt (away)
2015/09/18 20:46:02
Why is this needed? To prevent the non-animated lo
Ian Wen
2015/09/22 21:39:05
Talked offline. This is trying to fix an imaginary
|
| + mCurrentLogo = logo; |
| + |
| if (logo == null) { |
| updateLogo(getDefaultLogo(), null, true); |
| } else { |
| @@ -165,6 +180,23 @@ public class LogoView extends View implements OnClickListener { |
| } |
| /** |
| + * Updates the GIF contained in this View and starts playing it. |
| + */ |
| + void updateGif(BaseGifImage gifImage) { |
|
newt (away)
2015/09/18 20:46:02
Make this public as with the method below. Let's t
Ian Wen
2015/09/22 21:39:05
Done.
|
| + mGifDrawable = new BaseGifDrawable(gifImage, Config.ARGB_8888); |
| + // Set callback here to ensure #invalidateDrawable() is called. |
| + mGifDrawable.setCallback(this); |
| + mGifDrawable.start(); |
| + } |
| + |
| + /** |
| + * @return Whether the GIF animation is playing and the first frame is ready. |
| + */ |
| + boolean isGifPlaying() { |
|
newt (away)
2015/09/18 20:46:02
What does this return after the gif stops animatin
Ian Wen
2015/09/22 21:39:05
BaseGifDrawable will always be running unless we c
|
| + return mGifDrawable == null ? false : mGifDrawable.isRunning() && mGifDrawable.isValid(); |
|
newt (away)
2015/09/18 20:46:02
Simpler: "return mGifDrawable != null && mGifDrawa
Ian Wen
2015/09/22 21:39:06
Done.
|
| + } |
| + |
| + /** |
| * @return Whether a new logo is currently fading in over the old logo. |
| */ |
| private boolean isTransitioning() { |
| @@ -194,6 +226,11 @@ public class LogoView extends View implements OnClickListener { |
| matrix.postTranslate(imageOffsetX, imageOffsetY); |
| } |
| + @Override |
| + protected boolean verifyDrawable(Drawable who) { |
|
newt (away)
2015/09/18 20:46:01
Move this down next to invalidateDrawable(). In ge
Ian Wen
2015/09/22 21:39:05
Done.
|
| + return (who == mGifDrawable) || super.verifyDrawable(who); |
| + } |
| + |
| /** |
| * @return The default logo. |
| */ |
| @@ -206,22 +243,39 @@ public class LogoView extends View implements OnClickListener { |
| return defaultLogo; |
| } |
| + /** |
| + * @see ImageView#invalidateDrawable(Drawable) |
|
newt (away)
2015/09/18 20:46:02
Remove this javadoc comment and instead add an imp
Ian Wen
2015/09/22 21:39:05
Done.
|
| + */ |
| + @Override |
| + public void invalidateDrawable(Drawable drawable) { |
| + if (drawable == mGifDrawable) invalidate(); |
| + else super.invalidateDrawable(drawable); |
| + } |
| + |
| @Override |
| protected void onDraw(Canvas canvas) { |
| - if (mLogo != null && mTransitionAmount < 0.5f) { |
| - mPaint.setAlpha((int) (255 * 2 * (0.5f - mTransitionAmount))); |
| + if (isGifPlaying()) { |
| + // Gif drawable is present, draw animation instead. |
|
newt (away)
2015/09/18 20:46:02
At this point we should set mLogo and mNewLogo to
Ian Wen
2015/09/22 21:39:05
Done.
|
| canvas.save(); |
| canvas.concat(mLogoMatrix); |
|
newt (away)
2015/09/18 20:46:01
Rather than piggy backing on mLogoMatrix, I'd use
Ian Wen
2015/09/22 21:39:05
Done.
|
| - canvas.drawBitmap(mLogo, 0, 0, mPaint); |
| + mGifDrawable.draw(canvas); |
| canvas.restore(); |
| - } |
| + } else { |
| + if (mLogo != null && mTransitionAmount < 0.5f) { |
| + mPaint.setAlpha((int) (255 * 2 * (0.5f - mTransitionAmount))); |
| + canvas.save(); |
| + canvas.concat(mLogoMatrix); |
| + canvas.drawBitmap(mLogo, 0, 0, mPaint); |
| + canvas.restore(); |
| + } |
| - if (mNewLogo != null && mTransitionAmount > 0.5f) { |
| - mPaint.setAlpha((int) (255 * 2 * (mTransitionAmount - 0.5f))); |
| - canvas.save(); |
| - canvas.concat(mNewLogoMatrix); |
| - canvas.drawBitmap(mNewLogo, 0, 0, mPaint); |
| - canvas.restore(); |
| + if (mNewLogo != null && mTransitionAmount > 0.5f) { |
| + mPaint.setAlpha((int) (255 * 2 * (mTransitionAmount - 0.5f))); |
| + canvas.save(); |
| + canvas.concat(mNewLogoMatrix); |
| + canvas.drawBitmap(mNewLogo, 0, 0, mPaint); |
| + canvas.restore(); |
| + } |
| } |
| } |