BarTransitions.java revision 1b268cbca63f4b36ed0b048ee8dec27896005cca
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 36c0d7058b14c24cd07912f5629c26b39b7b4673d5Winsonimport com.android.systemui.Interpolators; 37e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport com.android.systemui.R; 38e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 39e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockpublic class BarTransitions { 4027735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock private static final boolean DEBUG = false; 41e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private static final boolean DEBUG_COLORS = false; 42e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 43fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock public static final boolean HIGH_END = ActivityManager.isHighEndGfx(); 44fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock 453b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public static final int MODE_OPAQUE = 0; 4689835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock public static final int MODE_SEMI_TRANSPARENT = 1; 47bd95740648372449a4d5c164d7050eee352d4c24John Spurlock public static final int MODE_TRANSLUCENT = 2; 487edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public static final int MODE_LIGHTS_OUT = 3; 49ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos public static final int MODE_TRANSPARENT = 4; 500ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock public static final int MODE_WARNING = 5; 51c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos public static final int MODE_LIGHTS_OUT_TRANSPARENT = 6; 527edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 53e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int LIGHTS_IN_DURATION = 250; 54e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int LIGHTS_OUT_DURATION = 750; 55e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int BACKGROUND_DURATION = 200; 56e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 5727735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock private final String mTag; 58e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private final View mView; 5942197263bc08843ad18a8660887ef540c630c232John Spurlock private final BarBackgroundDrawable mBarBackground; 60e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 61e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock private int mMode; 621b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee private boolean mAlwaysOpaque = false; 633b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 647057d2c3a9a88f1d221bc69780385bd20c5b4999John Spurlock public BarTransitions(View view, int gradientResourceId) { 65e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mTag = "BarTransitions." + view.getClass().getSimpleName(); 66e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mView = view; 6742197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId); 68fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock if (HIGH_END) { 6942197263bc08843ad18a8660887ef540c630c232John Spurlock mView.setBackground(mBarBackground); 70e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 71e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 72e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 73b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock public int getMode() { 74b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock return mMode; 75b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 76b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock 771b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee /** 781b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee * @param alwaysOpaque if {@code true}, the bar's background will always be opaque, regardless 791b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee * of what mode it is currently set to. 801b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee */ 811b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public void setAlwaysOpaque(boolean alwaysOpaque) { 821b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mAlwaysOpaque = alwaysOpaque; 831b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 841b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 851b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public boolean isAlwaysOpaque() { 861b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee // Low-end devices do not support translucent modes, fallback to opaque 871b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee return !HIGH_END || mAlwaysOpaque; 881b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 891b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 903b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public void transitionTo(int mode, boolean animate) { 911b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (isAlwaysOpaque() && (mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT 92ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos || mode == MODE_TRANSPARENT)) { 93fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock mode = MODE_OPAQUE; 94fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock } 951b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (isAlwaysOpaque() && (mode == MODE_LIGHTS_OUT_TRANSPARENT)) { 96c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos mode = MODE_LIGHTS_OUT; 97c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos } 9889835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock if (mMode == mode) return; 9989835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock int oldMode = mMode; 100e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock mMode = mode; 101e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock if (DEBUG) Log.d(mTag, String.format("%s -> %s animate=%s", 102e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock modeToString(oldMode), modeToString(mode), animate)); 103fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock onTransition(oldMode, mMode, animate); 1043b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 1053b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 1063b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock protected void onTransition(int oldMode, int newMode, boolean animate) { 107fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock if (HIGH_END) { 108fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock applyModeBackground(oldMode, newMode, animate); 109fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock } 110e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 111e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 112e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock protected void applyModeBackground(int oldMode, int newMode, boolean animate) { 11342197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG) Log.d(mTag, String.format("applyModeBackground oldMode=%s newMode=%s animate=%s", 11442197263bc08843ad18a8660887ef540c630c232John Spurlock modeToString(oldMode), modeToString(newMode), animate)); 11542197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.applyModeBackground(oldMode, newMode, animate); 11642197263bc08843ad18a8660887ef540c630c232John Spurlock } 11742197263bc08843ad18a8660887ef540c630c232John Spurlock 11842197263bc08843ad18a8660887ef540c630c232John Spurlock public static String modeToString(int mode) { 11942197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; 12042197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; 12142197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT"; 12242197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT"; 123ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT"; 1240ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock if (mode == MODE_WARNING) return "MODE_WARNING"; 125c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos if (mode == MODE_LIGHTS_OUT_TRANSPARENT) return "MODE_LIGHTS_OUT_TRANSPARENT"; 12642197263bc08843ad18a8660887ef540c630c232John Spurlock throw new IllegalArgumentException("Unknown mode " + mode); 12742197263bc08843ad18a8660887ef540c630c232John Spurlock } 12842197263bc08843ad18a8660887ef540c630c232John Spurlock 12942197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimations() { 13042197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.finishAnimation(); 13142197263bc08843ad18a8660887ef540c630c232John Spurlock } 13242197263bc08843ad18a8660887ef540c630c232John Spurlock 133c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos protected boolean isLightsOut(int mode) { 134c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos return mode == MODE_LIGHTS_OUT || mode == MODE_LIGHTS_OUT_TRANSPARENT; 135c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos } 136c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos 13742197263bc08843ad18a8660887ef540c630c232John Spurlock private static class BarBackgroundDrawable extends Drawable { 13842197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mOpaque; 13942197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mSemiTransparent; 140ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos private final int mTransparent; 1410ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock private final int mWarning; 14242197263bc08843ad18a8660887ef540c630c232John Spurlock private final Drawable mGradient; 14342197263bc08843ad18a8660887ef540c630c232John Spurlock 14442197263bc08843ad18a8660887ef540c630c232John Spurlock private int mMode = -1; 14542197263bc08843ad18a8660887ef540c630c232John Spurlock private boolean mAnimating; 14642197263bc08843ad18a8660887ef540c630c232John Spurlock private long mStartTime; 14742197263bc08843ad18a8660887ef540c630c232John Spurlock private long mEndTime; 14842197263bc08843ad18a8660887ef540c630c232John Spurlock 14942197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlpha; 15042197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColor; 1511b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee private PorterDuffColorFilter mTintFilter; 1521b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee private Paint mPaint = new Paint(); 15342197263bc08843ad18a8660887ef540c630c232John Spurlock 15442197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlphaStart; 15542197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColorStart; 15642197263bc08843ad18a8660887ef540c630c232John Spurlock 1571b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 15842197263bc08843ad18a8660887ef540c630c232John Spurlock public BarBackgroundDrawable(Context context, int gradientResourceId) { 15942197263bc08843ad18a8660887ef540c630c232John Spurlock final Resources res = context.getResources(); 16042197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG_COLORS) { 16142197263bc08843ad18a8660887ef540c630c232John Spurlock mOpaque = 0xff0000ff; 16242197263bc08843ad18a8660887ef540c630c232John Spurlock mSemiTransparent = 0x7f0000ff; 163ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos mTransparent = 0x2f0000ff; 1640ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock mWarning = 0xffff0000; 16542197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 1664a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mOpaque = context.getColor(R.color.system_bar_background_opaque); 1674fa7892f35268ff7d591928ac9f5a26c267031e3Jorim Jaggi mSemiTransparent = context.getColor( 1684fa7892f35268ff7d591928ac9f5a26c267031e3Jorim Jaggi com.android.internal.R.color.system_bar_background_semi_transparent); 1694a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mTransparent = context.getColor(R.color.system_bar_background_transparent); 1704a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mWarning = context.getColor(com.android.internal.R.color.battery_saver_mode_color); 171e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 1724a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mGradient = context.getDrawable(gradientResourceId); 173e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 17442197263bc08843ad18a8660887ef540c630c232John Spurlock 17542197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 17642197263bc08843ad18a8660887ef540c630c232John Spurlock public void setAlpha(int alpha) { 17742197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 17842197263bc08843ad18a8660887ef540c630c232John Spurlock } 17942197263bc08843ad18a8660887ef540c630c232John Spurlock 18042197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 181bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setColorFilter(ColorFilter colorFilter) { 18242197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 18342197263bc08843ad18a8660887ef540c630c232John Spurlock } 18442197263bc08843ad18a8660887ef540c630c232John Spurlock 18542197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 1861b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public void setTint(int color) { 1871b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (mTintFilter == null) { 1881b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN); 1891b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } else { 1901b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter.setColor(color); 1911b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 1921b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee invalidateSelf(); 1931b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 1941b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 1951b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee @Override 1961b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee public void setTintMode(Mode tintMode) { 1971b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (mTintFilter == null) { 1981b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter = new PorterDuffColorFilter(0, tintMode); 1991b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } else { 2001b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mTintFilter.setMode(tintMode); 2011b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 2021b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee invalidateSelf(); 2031b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 2041b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 2051b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee @Override 20642197263bc08843ad18a8660887ef540c630c232John Spurlock protected void onBoundsChange(Rect bounds) { 20742197263bc08843ad18a8660887ef540c630c232John Spurlock super.onBoundsChange(bounds); 20842197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setBounds(bounds); 20942197263bc08843ad18a8660887ef540c630c232John Spurlock } 21042197263bc08843ad18a8660887ef540c630c232John Spurlock 21142197263bc08843ad18a8660887ef540c630c232John Spurlock public void applyModeBackground(int oldMode, int newMode, boolean animate) { 21242197263bc08843ad18a8660887ef540c630c232John Spurlock if (mMode == newMode) return; 21342197263bc08843ad18a8660887ef540c630c232John Spurlock mMode = newMode; 21442197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = animate; 215b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock if (animate) { 21642197263bc08843ad18a8660887ef540c630c232John Spurlock long now = SystemClock.elapsedRealtime(); 21742197263bc08843ad18a8660887ef540c630c232John Spurlock mStartTime = now; 21842197263bc08843ad18a8660887ef540c630c232John Spurlock mEndTime = now + BACKGROUND_DURATION; 21942197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlphaStart = mGradientAlpha; 22042197263bc08843ad18a8660887ef540c630c232John Spurlock mColorStart = mColor; 221b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 22242197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 2233b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 22489835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock 22542197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 22642197263bc08843ad18a8660887ef540c630c232John Spurlock public int getOpacity() { 22742197263bc08843ad18a8660887ef540c630c232John Spurlock return PixelFormat.TRANSLUCENT; 22842197263bc08843ad18a8660887ef540c630c232John Spurlock } 2295b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock 23042197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimation() { 23142197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 23242197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 23342197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 23442197263bc08843ad18a8660887ef540c630c232John Spurlock } 2355b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock } 23627735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock 23742197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 23842197263bc08843ad18a8660887ef540c630c232John Spurlock public void draw(Canvas canvas) { 23942197263bc08843ad18a8660887ef540c630c232John Spurlock int targetGradientAlpha = 0, targetColor = 0; 2400ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock if (mMode == MODE_WARNING) { 2410ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock targetColor = mWarning; 2420ff62e09116dd125fc36f7af5de7a0b60aaa789bJohn Spurlock } else if (mMode == MODE_TRANSLUCENT) { 243ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos targetColor = mSemiTransparent; 24442197263bc08843ad18a8660887ef540c630c232John Spurlock } else if (mMode == MODE_SEMI_TRANSPARENT) { 24542197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mSemiTransparent; 246c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos } else if (mMode == MODE_TRANSPARENT || mMode == MODE_LIGHTS_OUT_TRANSPARENT) { 247ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos targetColor = mTransparent; 24842197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 24942197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mOpaque; 25042197263bc08843ad18a8660887ef540c630c232John Spurlock } 2511b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee 25242197263bc08843ad18a8660887ef540c630c232John Spurlock if (!mAnimating) { 25342197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 25442197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 25542197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 25642197263bc08843ad18a8660887ef540c630c232John Spurlock final long now = SystemClock.elapsedRealtime(); 25742197263bc08843ad18a8660887ef540c630c232John Spurlock if (now >= mEndTime) { 25842197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 25942197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 26042197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 26142197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 26242197263bc08843ad18a8660887ef540c630c232John Spurlock final float t = (now - mStartTime) / (float)(mEndTime - mStartTime); 263c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek final float v = Math.max(0, Math.min( 264c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek Interpolators.LINEAR.getInterpolation(t), 1)); 26542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = (int)(v * targetGradientAlpha + mGradientAlphaStart * (1 - v)); 26642197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = Color.argb( 26742197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.alpha(targetColor) + Color.alpha(mColorStart) * (1 - v)), 26842197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.red(targetColor) + Color.red(mColorStart) * (1 - v)), 26942197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.green(targetColor) + Color.green(mColorStart) * (1 - v)), 27042197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.blue(targetColor) + Color.blue(mColorStart) * (1 - v))); 27142197263bc08843ad18a8660887ef540c630c232John Spurlock } 27242197263bc08843ad18a8660887ef540c630c232John Spurlock } 27342197263bc08843ad18a8660887ef540c630c232John Spurlock if (mGradientAlpha > 0) { 27442197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setAlpha(mGradientAlpha); 27542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.draw(canvas); 27642197263bc08843ad18a8660887ef540c630c232John Spurlock } 27742197263bc08843ad18a8660887ef540c630c232John Spurlock if (Color.alpha(mColor) > 0) { 2781b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mPaint.setColor(mColor); 2791b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee if (mTintFilter != null) { 2801b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee mPaint.setColorFilter(mTintFilter); 2811b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee } 2821b268cbca63f4b36ed0b048ee8dec27896005ccaYorke Lee canvas.drawPaint(mPaint); 28342197263bc08843ad18a8660887ef540c630c232John Spurlock } 28442197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 28542197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); // keep going 28642197263bc08843ad18a8660887ef540c630c232John Spurlock } 28742197263bc08843ad18a8660887ef540c630c232John Spurlock } 28827735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock } 289e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock} 290