BarTransitions.java revision fd0e6c0d6fd17c7a5949ae581bf2355268545fd4
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 40fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock public static final boolean HIGH_END = ActivityManager.isHighEndGfx(); 41fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock 423b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public static final int MODE_OPAQUE = 0; 4389835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock public static final int MODE_SEMI_TRANSPARENT = 1; 44bd95740648372449a4d5c164d7050eee352d4c24John Spurlock public static final int MODE_TRANSLUCENT = 2; 457edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public static final int MODE_LIGHTS_OUT = 3; 467edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 47e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int LIGHTS_IN_DURATION = 250; 48e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int LIGHTS_OUT_DURATION = 750; 49e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock public static final int BACKGROUND_DURATION = 200; 50e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 5127735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock private final String mTag; 52e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock private final View mView; 5342197263bc08843ad18a8660887ef540c630c232John Spurlock private final BarBackgroundDrawable mBarBackground; 54e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 55e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock private int mMode; 563b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 577057d2c3a9a88f1d221bc69780385bd20c5b4999John Spurlock public BarTransitions(View view, int gradientResourceId) { 58e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mTag = "BarTransitions." + view.getClass().getSimpleName(); 59e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock mView = view; 6042197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId); 61fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock if (HIGH_END) { 6242197263bc08843ad18a8660887ef540c630c232John Spurlock mView.setBackground(mBarBackground); 63e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 64e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 65e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 66b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock public int getMode() { 67b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock return mMode; 68b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 69b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock 703b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock public void transitionTo(int mode, boolean animate) { 71fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock // low-end devices do not support translucent modes, fallback to opaque 72fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock if (!HIGH_END && (mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT)) { 73fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock mode = MODE_OPAQUE; 74fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock } 7589835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock if (mMode == mode) return; 7689835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock int oldMode = mMode; 77e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock mMode = mode; 78e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock if (DEBUG) Log.d(mTag, String.format("%s -> %s animate=%s", 79e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock modeToString(oldMode), modeToString(mode), animate)); 80fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock onTransition(oldMode, mMode, animate); 813b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 823b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock 833b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock protected void onTransition(int oldMode, int newMode, boolean animate) { 84fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock if (HIGH_END) { 85fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock applyModeBackground(oldMode, newMode, animate); 86fd0e6c0d6fd17c7a5949ae581bf2355268545fd4John Spurlock } 87e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 88e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock 89e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock protected void applyModeBackground(int oldMode, int newMode, boolean animate) { 9042197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG) Log.d(mTag, String.format("applyModeBackground oldMode=%s newMode=%s animate=%s", 9142197263bc08843ad18a8660887ef540c630c232John Spurlock modeToString(oldMode), modeToString(newMode), animate)); 9242197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.applyModeBackground(oldMode, newMode, animate); 9342197263bc08843ad18a8660887ef540c630c232John Spurlock } 9442197263bc08843ad18a8660887ef540c630c232John Spurlock 9542197263bc08843ad18a8660887ef540c630c232John Spurlock public static String modeToString(int mode) { 9642197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; 9742197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; 9842197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT"; 9942197263bc08843ad18a8660887ef540c630c232John Spurlock if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT"; 10042197263bc08843ad18a8660887ef540c630c232John Spurlock throw new IllegalArgumentException("Unknown mode " + mode); 10142197263bc08843ad18a8660887ef540c630c232John Spurlock } 10242197263bc08843ad18a8660887ef540c630c232John Spurlock 10342197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimations() { 10442197263bc08843ad18a8660887ef540c630c232John Spurlock mBarBackground.finishAnimation(); 10542197263bc08843ad18a8660887ef540c630c232John Spurlock } 10642197263bc08843ad18a8660887ef540c630c232John Spurlock 10756d007b99841f7f603e5d5bc5c23b94c010f1945John Spurlock public void setContentVisible(boolean visible) { 10856d007b99841f7f603e5d5bc5c23b94c010f1945John Spurlock // for subclasses 10956d007b99841f7f603e5d5bc5c23b94c010f1945John Spurlock } 11056d007b99841f7f603e5d5bc5c23b94c010f1945John Spurlock 11142197263bc08843ad18a8660887ef540c630c232John Spurlock private static class BarBackgroundDrawable extends Drawable { 11242197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mOpaque; 11342197263bc08843ad18a8660887ef540c630c232John Spurlock private final int mSemiTransparent; 11442197263bc08843ad18a8660887ef540c630c232John Spurlock private final Drawable mGradient; 11542197263bc08843ad18a8660887ef540c630c232John Spurlock private final TimeInterpolator mInterpolator; 11642197263bc08843ad18a8660887ef540c630c232John Spurlock 11742197263bc08843ad18a8660887ef540c630c232John Spurlock private int mMode = -1; 11842197263bc08843ad18a8660887ef540c630c232John Spurlock private boolean mAnimating; 11942197263bc08843ad18a8660887ef540c630c232John Spurlock private long mStartTime; 12042197263bc08843ad18a8660887ef540c630c232John Spurlock private long mEndTime; 12142197263bc08843ad18a8660887ef540c630c232John Spurlock 12242197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlpha; 12342197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColor; 12442197263bc08843ad18a8660887ef540c630c232John Spurlock 12542197263bc08843ad18a8660887ef540c630c232John Spurlock private int mGradientAlphaStart; 12642197263bc08843ad18a8660887ef540c630c232John Spurlock private int mColorStart; 12742197263bc08843ad18a8660887ef540c630c232John Spurlock 12842197263bc08843ad18a8660887ef540c630c232John Spurlock public BarBackgroundDrawable(Context context, int gradientResourceId) { 12942197263bc08843ad18a8660887ef540c630c232John Spurlock final Resources res = context.getResources(); 13042197263bc08843ad18a8660887ef540c630c232John Spurlock if (DEBUG_COLORS) { 13142197263bc08843ad18a8660887ef540c630c232John Spurlock mOpaque = 0xff0000ff; 13242197263bc08843ad18a8660887ef540c630c232John Spurlock mSemiTransparent = 0x7f0000ff; 13342197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 13442197263bc08843ad18a8660887ef540c630c232John Spurlock mOpaque = res.getColor(R.color.system_bar_background_opaque); 13542197263bc08843ad18a8660887ef540c630c232John Spurlock mSemiTransparent = res.getColor(R.color.system_bar_background_semi_transparent); 136e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 13742197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient = res.getDrawable(gradientResourceId); 13842197263bc08843ad18a8660887ef540c630c232John Spurlock mInterpolator = new LinearInterpolator(); 139e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock } 14042197263bc08843ad18a8660887ef540c630c232John Spurlock 14142197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 14242197263bc08843ad18a8660887ef540c630c232John Spurlock public void setAlpha(int alpha) { 14342197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 14442197263bc08843ad18a8660887ef540c630c232John Spurlock } 14542197263bc08843ad18a8660887ef540c630c232John Spurlock 14642197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 14742197263bc08843ad18a8660887ef540c630c232John Spurlock public void setColorFilter(ColorFilter cf) { 14842197263bc08843ad18a8660887ef540c630c232John Spurlock // noop 14942197263bc08843ad18a8660887ef540c630c232John Spurlock } 15042197263bc08843ad18a8660887ef540c630c232John Spurlock 15142197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 15242197263bc08843ad18a8660887ef540c630c232John Spurlock protected void onBoundsChange(Rect bounds) { 15342197263bc08843ad18a8660887ef540c630c232John Spurlock super.onBoundsChange(bounds); 15442197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setBounds(bounds); 15542197263bc08843ad18a8660887ef540c630c232John Spurlock } 15642197263bc08843ad18a8660887ef540c630c232John Spurlock 15742197263bc08843ad18a8660887ef540c630c232John Spurlock public void applyModeBackground(int oldMode, int newMode, boolean animate) { 15842197263bc08843ad18a8660887ef540c630c232John Spurlock if (mMode == newMode) return; 15942197263bc08843ad18a8660887ef540c630c232John Spurlock mMode = newMode; 16042197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = animate; 161b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock if (animate) { 16242197263bc08843ad18a8660887ef540c630c232John Spurlock long now = SystemClock.elapsedRealtime(); 16342197263bc08843ad18a8660887ef540c630c232John Spurlock mStartTime = now; 16442197263bc08843ad18a8660887ef540c630c232John Spurlock mEndTime = now + BACKGROUND_DURATION; 16542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlphaStart = mGradientAlpha; 16642197263bc08843ad18a8660887ef540c630c232John Spurlock mColorStart = mColor; 167b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock } 16842197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 1693b139a9ed06fdaad694ca97b8f99e7038007a054John Spurlock } 17089835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock 17142197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 17242197263bc08843ad18a8660887ef540c630c232John Spurlock public int getOpacity() { 17342197263bc08843ad18a8660887ef540c630c232John Spurlock return PixelFormat.TRANSLUCENT; 17442197263bc08843ad18a8660887ef540c630c232John Spurlock } 1755b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock 17642197263bc08843ad18a8660887ef540c630c232John Spurlock public void finishAnimation() { 17742197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 17842197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 17942197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); 18042197263bc08843ad18a8660887ef540c630c232John Spurlock } 1815b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock } 18227735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock 18342197263bc08843ad18a8660887ef540c630c232John Spurlock @Override 18442197263bc08843ad18a8660887ef540c630c232John Spurlock public void draw(Canvas canvas) { 18542197263bc08843ad18a8660887ef540c630c232John Spurlock int targetGradientAlpha = 0, targetColor = 0; 18642197263bc08843ad18a8660887ef540c630c232John Spurlock if (mMode == MODE_TRANSLUCENT) { 18742197263bc08843ad18a8660887ef540c630c232John Spurlock targetGradientAlpha = 0xff; 18842197263bc08843ad18a8660887ef540c630c232John Spurlock } else if (mMode == MODE_SEMI_TRANSPARENT) { 18942197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mSemiTransparent; 19042197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 19142197263bc08843ad18a8660887ef540c630c232John Spurlock targetColor = mOpaque; 19242197263bc08843ad18a8660887ef540c630c232John Spurlock } 19342197263bc08843ad18a8660887ef540c630c232John Spurlock if (!mAnimating) { 19442197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 19542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 19642197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 19742197263bc08843ad18a8660887ef540c630c232John Spurlock final long now = SystemClock.elapsedRealtime(); 19842197263bc08843ad18a8660887ef540c630c232John Spurlock if (now >= mEndTime) { 19942197263bc08843ad18a8660887ef540c630c232John Spurlock mAnimating = false; 20042197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = targetColor; 20142197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = targetGradientAlpha; 20242197263bc08843ad18a8660887ef540c630c232John Spurlock } else { 20342197263bc08843ad18a8660887ef540c630c232John Spurlock final float t = (now - mStartTime) / (float)(mEndTime - mStartTime); 20442197263bc08843ad18a8660887ef540c630c232John Spurlock final float v = Math.max(0, Math.min(mInterpolator.getInterpolation(t), 1)); 20542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradientAlpha = (int)(v * targetGradientAlpha + mGradientAlphaStart * (1 - v)); 20642197263bc08843ad18a8660887ef540c630c232John Spurlock mColor = Color.argb( 20742197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.alpha(targetColor) + Color.alpha(mColorStart) * (1 - v)), 20842197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.red(targetColor) + Color.red(mColorStart) * (1 - v)), 20942197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.green(targetColor) + Color.green(mColorStart) * (1 - v)), 21042197263bc08843ad18a8660887ef540c630c232John Spurlock (int)(v * Color.blue(targetColor) + Color.blue(mColorStart) * (1 - v))); 21142197263bc08843ad18a8660887ef540c630c232John Spurlock } 21242197263bc08843ad18a8660887ef540c630c232John Spurlock } 21342197263bc08843ad18a8660887ef540c630c232John Spurlock if (mGradientAlpha > 0) { 21442197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.setAlpha(mGradientAlpha); 21542197263bc08843ad18a8660887ef540c630c232John Spurlock mGradient.draw(canvas); 21642197263bc08843ad18a8660887ef540c630c232John Spurlock } 21742197263bc08843ad18a8660887ef540c630c232John Spurlock if (Color.alpha(mColor) > 0) { 21842197263bc08843ad18a8660887ef540c630c232John Spurlock canvas.drawColor(mColor); 21942197263bc08843ad18a8660887ef540c630c232John Spurlock } 22042197263bc08843ad18a8660887ef540c630c232John Spurlock if (mAnimating) { 22142197263bc08843ad18a8660887ef540c630c232John Spurlock invalidateSelf(); // keep going 22242197263bc08843ad18a8660887ef540c630c232John Spurlock } 22342197263bc08843ad18a8660887ef540c630c232John Spurlock } 22427735a4ba50d42df64eb82acc3f64fa2d68fd505John Spurlock } 225e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock} 226