1e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock/* 2e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * Copyright (C) 2013 The Android Open Source Project 3e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * 4e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * you may not use this file except in compliance with the License. 6e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * You may obtain a copy of the License at 7e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * 8e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * 10e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * Unless required by applicable law or agreed to in writing, software 11e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * See the License for the specific language governing permissions and 14e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock * limitations under the License. 15e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock */ 16e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 17e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockpackage com.android.systemui.statusbar.phone; 18e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 19e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.app.ActivityManager; 2042197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.content.Context; 21e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.content.res.Resources; 2242197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.Canvas; 2342197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.Color; 2442197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.ColorFilter; 251b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Leeimport android.graphics.Paint; 2642197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.PixelFormat; 271b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Leeimport android.graphics.PorterDuff; 281b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Leeimport android.graphics.PorterDuffColorFilter; 2942197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.Rect; 301b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Leeimport android.graphics.PorterDuff.Mode; 31e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.graphics.drawable.Drawable; 3242197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.os.SystemClock; 3327735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlockimport android.util.Log; 34e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.view.View; 35e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 3658be7a675b7aa505255f0c91fee755f8290e8363Jason Monkimport com.android.settingslib.Utils; 37c0d7058b14c24cd07912f5629c26b39b7b4673d5Winsonimport com.android.systemui.Interpolators; 38e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport com.android.systemui.R; 39e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 40e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockpublic class BarTransitions { 4127735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock private static final boolean DEBUG = false; 42e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private static final boolean DEBUG_COLORS = false; 43e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 443b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public static final int MODE_OPAQUE = 0; 4589835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock public static final int MODE_SEMI_TRANSPARENT = 1; 46bd95740648372449a4d5c164d7050eee352d4c24John Spurlock public static final int MODE_TRANSLUCENT = 2; 477edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public static final int MODE_LIGHTS_OUT = 3; 48ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos public static final int MODE_TRANSPARENT = 4; 490ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock public static final int MODE_WARNING = 5; 50c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos public static final int MODE_LIGHTS_OUT_TRANSPARENT = 6; 517edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 52e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int LIGHTS_IN_DURATION = 250; 53def8c8da6c32b1f0c9607f6563b93a1702178056Jason Monk public static final int LIGHTS_OUT_DURATION = 1500; 54e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int BACKGROUND_DURATION = 200; 55e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 5627735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock private final String mTag; 57e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private final View mView; 5842197263bc08843ad18a8660887ef540c630c232John Spurlock private final BarBackgroundDrawable mBarBackground; 59e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 60e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock private int mMode; 611b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee private boolean mAlwaysOpaque = false; 623b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 637057d2c3a9a88f1d221bc69780385bd20c5b4999John Spurlock public BarTransitions(View view, int gradientResourceId) { 64e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mTag = "BarTransitions." + view.getClass().getSimpleName(); 65e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mView = view; 6642197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId); 67e6b393b1a9ba88d93b97ba95d8fe13ed25828300Matthew Ng mView.setBackground(mBarBackground); 68e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 69e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 70b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock public int getMode() { 71b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock return mMode; 72b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 73b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock 74c2beef51306e8916f481218c449b9759ce017c09Jason Monk public void setAutoDim(boolean autoDim) { 75c2beef51306e8916f481218c449b9759ce017c09Jason Monk // Default is don't care. 76c2beef51306e8916f481218c449b9759ce017c09Jason Monk } 77c2beef51306e8916f481218c449b9759ce017c09Jason Monk 781b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee /** 791b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee * @param alwaysOpaque if {@code true}, the bar's background will always be opaque, regardless 801b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee * of what mode it is currently set to. 811b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee */ 821b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public void setAlwaysOpaque(boolean alwaysOpaque) { 831b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mAlwaysOpaque = alwaysOpaque; 841b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 851b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 861b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public boolean isAlwaysOpaque() { 871b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee // Low-end devices do not support translucent modes, fallback to opaque 88e6b393b1a9ba88d93b97ba95d8fe13ed25828300Matthew Ng return mAlwaysOpaque; 891b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 901b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 913b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public void transitionTo(int mode, boolean animate) { 921b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (isAlwaysOpaque() && (mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT 93ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos || mode == MODE_TRANSPARENT)) { 94fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock mode = MODE_OPAQUE; 95fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock } 961b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (isAlwaysOpaque() && (mode == MODE_LIGHTS_OUT_TRANSPARENT)) { 97c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos mode = MODE_LIGHTS_OUT; 98c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos } 9989835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock if (mMode == mode) return; 10089835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock int oldMode = mMode; 101e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock mMode = mode; 102e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock if (DEBUG) Log.d(mTag, String.format("%s -> %s animate=%s", 103e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock modeToString(oldMode), modeToString(mode), animate)); 104fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock onTransition(oldMode, mMode, animate); 1053b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 1063b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 1073b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock protected void onTransition(int oldMode, int newMode, boolean animate) { 108e6b393b1a9ba88d93b97ba95d8fe13ed25828300Matthew Ng applyModeBackground(oldMode, newMode, animate); 109e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 110e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 111e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock protected void applyModeBackground(int oldMode, int newMode, boolean animate) { 11242197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG) Log.d(mTag, String.format("applyModeBackground oldMode=%s newMode=%s animate=%s", 11342197263bc08843ad18a8660887ef540c630c232John Spurlock modeToString(oldMode), modeToString(newMode), animate)); 11442197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.applyModeBackground(oldMode, newMode, animate); 11542197263bc08843ad18a8660887ef540c630c232John Spurlock } 11642197263bc08843ad18a8660887ef540c630c232John Spurlock 11742197263bc08843ad18a8660887ef540c630c232John Spurlock public static String modeToString(int mode) { 11842197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; 11942197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; 12042197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT"; 12142197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT"; 122ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT"; 1230ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock if (mode == MODE_WARNING) return "MODE_WARNING"; 124c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos if (mode == MODE_LIGHTS_OUT_TRANSPARENT) return "MODE_LIGHTS_OUT_TRANSPARENT"; 12542197263bc08843ad18a8660887ef540c630c232John Spurlock throw new IllegalArgumentException("Unknown mode " + mode); 12642197263bc08843ad18a8660887ef540c630c232John Spurlock } 12742197263bc08843ad18a8660887ef540c630c232John Spurlock 12842197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimations() { 12942197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.finishAnimation(); 13042197263bc08843ad18a8660887ef540c630c232John Spurlock } 13142197263bc08843ad18a8660887ef540c630c232John Spurlock 132c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos protected boolean isLightsOut(int mode) { 133c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos return mode == MODE_LIGHTS_OUT || mode == MODE_LIGHTS_OUT_TRANSPARENT; 134c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos } 135c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos 13642197263bc08843ad18a8660887ef540c630c232John Spurlock private static class BarBackgroundDrawable extends Drawable { 13742197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mOpaque; 13842197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mSemiTransparent; 139ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos private final int mTransparent; 1400ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private final int mWarning; 14142197263bc08843ad18a8660887ef540c630c232John Spurlock private final Drawable mGradient; 14242197263bc08843ad18a8660887ef540c630c232John Spurlock 14342197263bc08843ad18a8660887ef540c630c232John Spurlock private int mMode = -1; 14442197263bc08843ad18a8660887ef540c630c232John Spurlock private boolean mAnimating; 14542197263bc08843ad18a8660887ef540c630c232John Spurlock private long mStartTime; 14642197263bc08843ad18a8660887ef540c630c232John Spurlock private long mEndTime; 14742197263bc08843ad18a8660887ef540c630c232John Spurlock 14842197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlpha; 14942197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColor; 1501b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee private PorterDuffColorFilter mTintFilter; 1511b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee private Paint mPaint = new Paint(); 15242197263bc08843ad18a8660887ef540c630c232John Spurlock 15342197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlphaStart; 15442197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColorStart; 15542197263bc08843ad18a8660887ef540c630c232John Spurlock 1561b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 15742197263bc08843ad18a8660887ef540c630c232John Spurlock public BarBackgroundDrawable(Context context, int gradientResourceId) { 15842197263bc08843ad18a8660887ef540c630c232John Spurlock final Resources res = context.getResources(); 15942197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG_COLORS) { 16042197263bc08843ad18a8660887ef540c630c232John Spurlock mOpaque = 0xff0000ff; 16142197263bc08843ad18a8660887ef540c630c232John Spurlock mSemiTransparent = 0x7f0000ff; 162ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos mTransparent = 0x2f0000ff; 1630ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock mWarning = 0xffff0000; 16442197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 1654a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mOpaque = context.getColor(R.color.system_bar_background_opaque); 1664fa7892f35268ff7d591928ac9f5a26c267031e3Jorim Jaggi mSemiTransparent = context.getColor( 1674fa7892f35268ff7d591928ac9f5a26c267031e3Jorim Jaggi com.android.internal.R.color.system_bar_background_semi_transparent); 1684a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mTransparent = context.getColor(R.color.system_bar_background_transparent); 16958be7a675b7aa505255f0c91fee755f8290e8363Jason Monk mWarning = Utils.getColorAttr(context, android.R.attr.colorError); 170e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 1714a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mGradient = context.getDrawable(gradientResourceId); 172e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 17342197263bc08843ad18a8660887ef540c630c232John Spurlock 17442197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 17542197263bc08843ad18a8660887ef540c630c232John Spurlock public void setAlpha(int alpha) { 17642197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 17742197263bc08843ad18a8660887ef540c630c232John Spurlock } 17842197263bc08843ad18a8660887ef540c630c232John Spurlock 17942197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 180bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setColorFilter(ColorFilter colorFilter) { 18142197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 18242197263bc08843ad18a8660887ef540c630c232John Spurlock } 18342197263bc08843ad18a8660887ef540c630c232John Spurlock 18442197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 1851b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public void setTint(int color) { 1861b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (mTintFilter == null) { 1871b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN); 1881b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } else { 1891b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter.setColor(color); 1901b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 1911b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee invalidateSelf(); 1921b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 1931b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 1941b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee @Override 1951b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public void setTintMode(Mode tintMode) { 1961b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (mTintFilter == null) { 1971b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter = new PorterDuffColorFilter(0, tintMode); 1981b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } else { 1991b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter.setMode(tintMode); 2001b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 2011b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee invalidateSelf(); 2021b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 2031b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 2041b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee @Override 20542197263bc08843ad18a8660887ef540c630c232John Spurlock protected void onBoundsChange(Rect bounds) { 20642197263bc08843ad18a8660887ef540c630c232John Spurlock super.onBoundsChange(bounds); 20742197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setBounds(bounds); 20842197263bc08843ad18a8660887ef540c630c232John Spurlock } 20942197263bc08843ad18a8660887ef540c630c232John Spurlock 21042197263bc08843ad18a8660887ef540c630c232John Spurlock public void applyModeBackground(int oldMode, int newMode, boolean animate) { 21142197263bc08843ad18a8660887ef540c630c232John Spurlock if (mMode == newMode) return; 21242197263bc08843ad18a8660887ef540c630c232John Spurlock mMode = newMode; 21342197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = animate; 214b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock if (animate) { 21542197263bc08843ad18a8660887ef540c630c232John Spurlock long now = SystemClock.elapsedRealtime(); 21642197263bc08843ad18a8660887ef540c630c232John Spurlock mStartTime = now; 21742197263bc08843ad18a8660887ef540c630c232John Spurlock mEndTime = now + BACKGROUND_DURATION; 21842197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlphaStart = mGradientAlpha; 21942197263bc08843ad18a8660887ef540c630c232John Spurlock mColorStart = mColor; 220b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 22142197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 2223b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 22389835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock 22442197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 22542197263bc08843ad18a8660887ef540c630c232John Spurlock public int getOpacity() { 22642197263bc08843ad18a8660887ef540c630c232John Spurlock return PixelFormat.TRANSLUCENT; 22742197263bc08843ad18a8660887ef540c630c232John Spurlock } 2285b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock 22942197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimation() { 23042197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 23142197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 23242197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 23342197263bc08843ad18a8660887ef540c630c232John Spurlock } 2345b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock } 23527735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock 23642197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 23742197263bc08843ad18a8660887ef540c630c232John Spurlock public void draw(Canvas canvas) { 23842197263bc08843ad18a8660887ef540c630c232John Spurlock int targetGradientAlpha = 0, targetColor = 0; 2390ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock if (mMode == MODE_WARNING) { 2400ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock targetColor = mWarning; 2410ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } else if (mMode == MODE_TRANSLUCENT) { 242ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos targetColor = mSemiTransparent; 24342197263bc08843ad18a8660887ef540c630c232John Spurlock } else if (mMode == MODE_SEMI_TRANSPARENT) { 24442197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mSemiTransparent; 245c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos } else if (mMode == MODE_TRANSPARENT || mMode == MODE_LIGHTS_OUT_TRANSPARENT) { 246ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos targetColor = mTransparent; 24742197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 24842197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mOpaque; 24942197263bc08843ad18a8660887ef540c630c232John Spurlock } 2501b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 25142197263bc08843ad18a8660887ef540c630c232John Spurlock if (!mAnimating) { 25242197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 25342197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 25442197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 25542197263bc08843ad18a8660887ef540c630c232John Spurlock final long now = SystemClock.elapsedRealtime(); 25642197263bc08843ad18a8660887ef540c630c232John Spurlock if (now >= mEndTime) { 25742197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 25842197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 25942197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 26042197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 26142197263bc08843ad18a8660887ef540c630c232John Spurlock final float t = (now - mStartTime) / (float)(mEndTime - mStartTime); 262c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek final float v = Math.max(0, Math.min( 263c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek Interpolators.LINEAR.getInterpolation(t), 1)); 26442197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = (int)(v * targetGradientAlpha + mGradientAlphaStart * (1 - v)); 26542197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = Color.argb( 26642197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.alpha(targetColor) + Color.alpha(mColorStart) * (1 - v)), 26742197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.red(targetColor) + Color.red(mColorStart) * (1 - v)), 26842197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.green(targetColor) + Color.green(mColorStart) * (1 - v)), 26942197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.blue(targetColor) + Color.blue(mColorStart) * (1 - v))); 27042197263bc08843ad18a8660887ef540c630c232John Spurlock } 27142197263bc08843ad18a8660887ef540c630c232John Spurlock } 27242197263bc08843ad18a8660887ef540c630c232John Spurlock if (mGradientAlpha > 0) { 27342197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setAlpha(mGradientAlpha); 27442197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.draw(canvas); 27542197263bc08843ad18a8660887ef540c630c232John Spurlock } 27642197263bc08843ad18a8660887ef540c630c232John Spurlock if (Color.alpha(mColor) > 0) { 2771b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mPaint.setColor(mColor); 2781b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (mTintFilter != null) { 2791b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mPaint.setColorFilter(mTintFilter); 2801b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 2811b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee canvas.drawPaint(mPaint); 28242197263bc08843ad18a8660887ef540c630c232John Spurlock } 28342197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 28442197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); // keep going 28542197263bc08843ad18a8660887ef540c630c232John Spurlock } 28642197263bc08843ad18a8660887ef540c630c232John Spurlock } 28727735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock } 288e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock} 289