BarTransitions.java revision 42197263bc08843ad18a8660887ef540c630c232
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 1942197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.animation.TimeInterpolator; 20e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.app.ActivityManager; 2142197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.content.Context; 22e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.content.res.Resources; 2342197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.Canvas; 2442197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.Color; 2542197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.ColorFilter; 2642197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.PixelFormat; 2742197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.graphics.Rect; 28e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.graphics.drawable.Drawable; 2942197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.os.SystemClock; 3027735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlockimport android.util.Log; 31e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport android.view.View; 3242197263bc08843ad18a8660887ef540c630c232John Spurlockimport android.view.animation.LinearInterpolator; 33e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 34e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockimport com.android.systemui.R; 35e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 36e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlockpublic class BarTransitions { 3727735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock private static final boolean DEBUG = false; 38e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private static final boolean DEBUG_COLORS = false; 39e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 403b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public static final int MODE_OPAQUE = 0; 4189835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock public static final int MODE_SEMI_TRANSPARENT = 1; 42bd95740648372449a4d5c164d7050eee352d4c24John Spurlock public static final int MODE_TRANSLUCENT = 2; 437edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public static final int MODE_LIGHTS_OUT = 3; 447edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 45e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int LIGHTS_IN_DURATION = 250; 46e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int LIGHTS_OUT_DURATION = 750; 47e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int BACKGROUND_DURATION = 200; 48e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 4927735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock private final String mTag; 50e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private final View mView; 51e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private final boolean mSupportsTransitions = ActivityManager.isHighEndGfx(); 5242197263bc08843ad18a8660887ef540c630c232John Spurlock private final BarBackgroundDrawable mBarBackground; 53e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 54e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock private int mMode; 553b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 567057d2c3a9a88f1d221bc69780385bd20c5b4999John Spurlock public BarTransitions(View view, int gradientResourceId) { 57e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mTag = "BarTransitions." + view.getClass().getSimpleName(); 58e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mView = view; 5942197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId); 60e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock if (mSupportsTransitions) { 6142197263bc08843ad18a8660887ef540c630c232John Spurlock mView.setBackground(mBarBackground); 62e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 63e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 64e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 65b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock public int getMode() { 66b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock return mMode; 67b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 68b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock 693b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public void transitionTo(int mode, boolean animate) { 7089835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock if (mMode == mode) return; 7189835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock int oldMode = mMode; 72e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock mMode = mode; 73e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock if (DEBUG) Log.d(mTag, String.format("%s -> %s animate=%s", 74e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock modeToString(oldMode), modeToString(mode), animate)); 75e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock if (mSupportsTransitions) { 76e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock onTransition(oldMode, mMode, animate); 77e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 783b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 793b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 803b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock protected void onTransition(int oldMode, int newMode, boolean animate) { 81e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock applyModeBackground(oldMode, newMode, animate); 82e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 83e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 84e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock protected void applyModeBackground(int oldMode, int newMode, boolean animate) { 8542197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG) Log.d(mTag, String.format("applyModeBackground oldMode=%s newMode=%s animate=%s", 8642197263bc08843ad18a8660887ef540c630c232John Spurlock modeToString(oldMode), modeToString(newMode), animate)); 8742197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.applyModeBackground(oldMode, newMode, animate); 8842197263bc08843ad18a8660887ef540c630c232John Spurlock } 8942197263bc08843ad18a8660887ef540c630c232John Spurlock 9042197263bc08843ad18a8660887ef540c630c232John Spurlock public static String modeToString(int mode) { 9142197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; 9242197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; 9342197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT"; 9442197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT"; 9542197263bc08843ad18a8660887ef540c630c232John Spurlock throw new IllegalArgumentException("Unknown mode " + mode); 9642197263bc08843ad18a8660887ef540c630c232John Spurlock } 9742197263bc08843ad18a8660887ef540c630c232John Spurlock 9842197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimations() { 9942197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.finishAnimation(); 10042197263bc08843ad18a8660887ef540c630c232John Spurlock } 10142197263bc08843ad18a8660887ef540c630c232John Spurlock 10242197263bc08843ad18a8660887ef540c630c232John Spurlock private static class BarBackgroundDrawable extends Drawable { 10342197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mOpaque; 10442197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mSemiTransparent; 10542197263bc08843ad18a8660887ef540c630c232John Spurlock private final Drawable mGradient; 10642197263bc08843ad18a8660887ef540c630c232John Spurlock private final TimeInterpolator mInterpolator; 10742197263bc08843ad18a8660887ef540c630c232John Spurlock 10842197263bc08843ad18a8660887ef540c630c232John Spurlock private int mMode = -1; 10942197263bc08843ad18a8660887ef540c630c232John Spurlock private boolean mAnimating; 11042197263bc08843ad18a8660887ef540c630c232John Spurlock private long mStartTime; 11142197263bc08843ad18a8660887ef540c630c232John Spurlock private long mEndTime; 11242197263bc08843ad18a8660887ef540c630c232John Spurlock 11342197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlpha; 11442197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColor; 11542197263bc08843ad18a8660887ef540c630c232John Spurlock 11642197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlphaStart; 11742197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColorStart; 11842197263bc08843ad18a8660887ef540c630c232John Spurlock 11942197263bc08843ad18a8660887ef540c630c232John Spurlock public BarBackgroundDrawable(Context context, int gradientResourceId) { 12042197263bc08843ad18a8660887ef540c630c232John Spurlock final Resources res = context.getResources(); 12142197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG_COLORS) { 12242197263bc08843ad18a8660887ef540c630c232John Spurlock mOpaque = 0xff0000ff; 12342197263bc08843ad18a8660887ef540c630c232John Spurlock mSemiTransparent = 0x7f0000ff; 12442197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 12542197263bc08843ad18a8660887ef540c630c232John Spurlock mOpaque = res.getColor(R.color.system_bar_background_opaque); 12642197263bc08843ad18a8660887ef540c630c232John Spurlock mSemiTransparent = res.getColor(R.color.system_bar_background_semi_transparent); 127e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 12842197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient = res.getDrawable(gradientResourceId); 12942197263bc08843ad18a8660887ef540c630c232John Spurlock mInterpolator = new LinearInterpolator(); 130e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 13142197263bc08843ad18a8660887ef540c630c232John Spurlock 13242197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 13342197263bc08843ad18a8660887ef540c630c232John Spurlock public void setAlpha(int alpha) { 13442197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 13542197263bc08843ad18a8660887ef540c630c232John Spurlock } 13642197263bc08843ad18a8660887ef540c630c232John Spurlock 13742197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 13842197263bc08843ad18a8660887ef540c630c232John Spurlock public void setColorFilter(ColorFilter cf) { 13942197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 14042197263bc08843ad18a8660887ef540c630c232John Spurlock } 14142197263bc08843ad18a8660887ef540c630c232John Spurlock 14242197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 14342197263bc08843ad18a8660887ef540c630c232John Spurlock protected void onBoundsChange(Rect bounds) { 14442197263bc08843ad18a8660887ef540c630c232John Spurlock super.onBoundsChange(bounds); 14542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setBounds(bounds); 14642197263bc08843ad18a8660887ef540c630c232John Spurlock } 14742197263bc08843ad18a8660887ef540c630c232John Spurlock 14842197263bc08843ad18a8660887ef540c630c232John Spurlock public void applyModeBackground(int oldMode, int newMode, boolean animate) { 14942197263bc08843ad18a8660887ef540c630c232John Spurlock if (mMode == newMode) return; 15042197263bc08843ad18a8660887ef540c630c232John Spurlock mMode = newMode; 15142197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = animate; 152b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock if (animate) { 15342197263bc08843ad18a8660887ef540c630c232John Spurlock long now = SystemClock.elapsedRealtime(); 15442197263bc08843ad18a8660887ef540c630c232John Spurlock mStartTime = now; 15542197263bc08843ad18a8660887ef540c630c232John Spurlock mEndTime = now + BACKGROUND_DURATION; 15642197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlphaStart = mGradientAlpha; 15742197263bc08843ad18a8660887ef540c630c232John Spurlock mColorStart = mColor; 158b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 15942197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 1603b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 16189835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock 16242197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 16342197263bc08843ad18a8660887ef540c630c232John Spurlock public int getOpacity() { 16442197263bc08843ad18a8660887ef540c630c232John Spurlock return PixelFormat.TRANSLUCENT; 16542197263bc08843ad18a8660887ef540c630c232John Spurlock } 1665b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock 16742197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimation() { 16842197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 16942197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 17042197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 17142197263bc08843ad18a8660887ef540c630c232John Spurlock } 1725b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock } 17327735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock 17442197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 17542197263bc08843ad18a8660887ef540c630c232John Spurlock public void draw(Canvas canvas) { 17642197263bc08843ad18a8660887ef540c630c232John Spurlock int targetGradientAlpha = 0, targetColor = 0; 17742197263bc08843ad18a8660887ef540c630c232John Spurlock if (mMode == MODE_TRANSLUCENT) { 17842197263bc08843ad18a8660887ef540c630c232John Spurlock targetGradientAlpha = 0xff; 17942197263bc08843ad18a8660887ef540c630c232John Spurlock } else if (mMode == MODE_SEMI_TRANSPARENT) { 18042197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mSemiTransparent; 18142197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 18242197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mOpaque; 18342197263bc08843ad18a8660887ef540c630c232John Spurlock } 18442197263bc08843ad18a8660887ef540c630c232John Spurlock if (!mAnimating) { 18542197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 18642197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 18742197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 18842197263bc08843ad18a8660887ef540c630c232John Spurlock final long now = SystemClock.elapsedRealtime(); 18942197263bc08843ad18a8660887ef540c630c232John Spurlock if (now >= mEndTime) { 19042197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 19142197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 19242197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 19342197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 19442197263bc08843ad18a8660887ef540c630c232John Spurlock final float t = (now - mStartTime) / (float)(mEndTime - mStartTime); 19542197263bc08843ad18a8660887ef540c630c232John Spurlock final float v = Math.max(0, Math.min(mInterpolator.getInterpolation(t), 1)); 19642197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = (int)(v * targetGradientAlpha + mGradientAlphaStart * (1 - v)); 19742197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = Color.argb( 19842197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.alpha(targetColor) + Color.alpha(mColorStart) * (1 - v)), 19942197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.red(targetColor) + Color.red(mColorStart) * (1 - v)), 20042197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.green(targetColor) + Color.green(mColorStart) * (1 - v)), 20142197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.blue(targetColor) + Color.blue(mColorStart) * (1 - v))); 20242197263bc08843ad18a8660887ef540c630c232John Spurlock } 20342197263bc08843ad18a8660887ef540c630c232John Spurlock } 20442197263bc08843ad18a8660887ef540c630c232John Spurlock if (mGradientAlpha > 0) { 20542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setAlpha(mGradientAlpha); 20642197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.draw(canvas); 20742197263bc08843ad18a8660887ef540c630c232John Spurlock } 20842197263bc08843ad18a8660887ef540c630c232John Spurlock if (Color.alpha(mColor) > 0) { 20942197263bc08843ad18a8660887ef540c630c232John Spurlock canvas.drawColor(mColor); 21042197263bc08843ad18a8660887ef540c630c232John Spurlock } 21142197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 21242197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); // keep going 21342197263bc08843ad18a8660887ef540c630c232John Spurlock } 21442197263bc08843ad18a8660887ef540c630c232John Spurlock } 21527735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock } 216e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock} 217