NavigationBarTransitions.java revision 7edfbca5d00cbc376fda790b50a3fedb9c6070ab
17edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock/* 27edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * Copyright (C) 2013 The Android Open Source Project 37edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * 47edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 57edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * you may not use this file except in compliance with the License. 67edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * You may obtain a copy of the License at 77edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * 87edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 97edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * 107edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * Unless required by applicable law or agreed to in writing, software 117edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 127edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * See the License for the specific language governing permissions and 147edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock * limitations under the License. 157edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock */ 167edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 177edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockpackage com.android.systemui.statusbar.phone; 187edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 197edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.animation.Animator; 207edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.animation.AnimatorListenerAdapter; 217edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.content.Context; 227edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.content.res.Resources; 237edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.graphics.drawable.Drawable; 247edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.graphics.drawable.GradientDrawable; 257edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.graphics.drawable.GradientDrawable.Orientation; 267edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.os.ServiceManager; 277edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.view.MotionEvent; 287edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.view.View; 297edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.view.animation.AccelerateInterpolator; 307edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 317edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport com.android.internal.statusbar.IStatusBarService; 327edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport com.android.systemui.R; 337edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport com.android.systemui.statusbar.policy.KeyButtonView; 347edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 357edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockpublic final class NavigationBarTransitions extends BarTransitions { 367edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private static final boolean ENABLE_GRADIENT = false; // until we can smooth transition 377edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 387edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private final NavigationBarView mView; 397edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private final Drawable mTransparentBottom; 407edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private final Drawable mTransparentRight; 417edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private final int mTransparentColor; 427edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private final IStatusBarService mBarService; 437edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 447edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private boolean mLightsOut; 457edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 467edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public NavigationBarTransitions(NavigationBarView view) { 477edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock super(view); 487edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mView = view; 497edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final Resources res = mView.getContext().getResources(); 507edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final int[] gradientColors = new int[] { 517edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock res.getColor(R.color.navigation_bar_background_transparent_start), 527edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock res.getColor(R.color.navigation_bar_background_transparent_end) 537edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock }; 547edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mTransparentBottom = new GradientDrawable(Orientation.BOTTOM_TOP, gradientColors); 557edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mTransparentRight = new GradientDrawable(Orientation.RIGHT_LEFT, gradientColors); 567edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mTransparentColor = res.getColor(R.color.status_bar_background_transparent); 577edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mBarService = IStatusBarService.Stub.asInterface( 587edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock ServiceManager.getService(Context.STATUS_BAR_SERVICE)); 597edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 607edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 617edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public void setVertical(boolean isVertical) { 627edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock if (!ENABLE_GRADIENT) return; 637edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mTransparent = isVertical ? mTransparentRight : mTransparentBottom; 647edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 657edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 667edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock @Override 677edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock protected Integer getBackgroundColor(int mode) { 687edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock if (!ENABLE_GRADIENT && mode == MODE_TRANSPARENT) return mTransparentColor; 697edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock return super.getBackgroundColor(mode); 707edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 717edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 727edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock @Override 737edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock protected void onTransition(int oldMode, int newMode, boolean animate) { 747edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock super.onTransition(oldMode, newMode, animate); 757edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock applyMode(newMode, animate, false /*force*/); 767edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 777edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 787edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public void reapplyMode() { 797edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock applyMode(getMode(), false /*animate*/, true /*force*/); 807edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 817edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 827edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private void applyMode(int mode, boolean animate, boolean force) { 837edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock // apply to key buttons 847edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final boolean isOpaque = mode == MODE_OPAQUE || mode == MODE_LIGHTS_OUT; 857edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final float alpha = isOpaque ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f; 867edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock setKeyButtonViewQuiescentAlpha(mView.getBackButton(), alpha, animate); 877edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock setKeyButtonViewQuiescentAlpha(mView.getHomeButton(), alpha, animate); 887edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock setKeyButtonViewQuiescentAlpha(mView.getRecentsButton(), alpha, animate); 897edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock setKeyButtonViewQuiescentAlpha(mView.getMenuButton(), alpha, animate); 907edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 917edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock // apply to lights out 927edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock applyLightsOut(mode == MODE_LIGHTS_OUT, animate, force); 937edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 947edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 957edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private void setKeyButtonViewQuiescentAlpha(View button, float alpha, boolean animate) { 967edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock if (button instanceof KeyButtonView) { 977edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock ((KeyButtonView) button).setQuiescentAlpha(alpha, animate); 987edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 997edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1007edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1017edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private void applyLightsOut(boolean lightsOut, boolean animate, boolean force) { 1027edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock if (!force && lightsOut == mLightsOut) return; 1037edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1047edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mLightsOut = lightsOut; 1057edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1067edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final View navButtons = mView.getCurrentView().findViewById(R.id.nav_buttons); 1077edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final View lowLights = mView.getCurrentView().findViewById(R.id.lights_out); 1087edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1097edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock // ok, everyone, stop it right there 1107edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock navButtons.animate().cancel(); 1117edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.animate().cancel(); 1127edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1137edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final float navButtonsAlpha = lightsOut ? 0f : 1f; 1147edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final float lowLightsAlpha = lightsOut ? 1f : 0f; 1157edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1167edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock if (!animate) { 1177edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock navButtons.setAlpha(navButtonsAlpha); 1187edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.setAlpha(lowLightsAlpha); 1197edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.setVisibility(lightsOut ? View.VISIBLE : View.GONE); 1207edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } else { 1217edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock final int duration = lightsOut ? LIGHTS_OUT_DURATION : LIGHTS_IN_DURATION; 1227edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock navButtons.animate() 1237edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .alpha(navButtonsAlpha) 1247edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .setDuration(duration) 1257edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .start(); 1267edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1277edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.setOnTouchListener(mLightsOutListener); 1287edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock if (lowLights.getVisibility() == View.GONE) { 1297edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.setAlpha(0f); 1307edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.setVisibility(View.VISIBLE); 1317edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1327edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.animate() 1337edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .alpha(lowLightsAlpha) 1347edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .setDuration(duration) 1357edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .setInterpolator(new AccelerateInterpolator(2.0f)) 1367edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .setListener(lightsOut ? null : new AnimatorListenerAdapter() { 1377edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock @Override 1387edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public void onAnimationEnd(Animator _a) { 1397edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock lowLights.setVisibility(View.GONE); 1407edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1417edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock }) 1427edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock .start(); 1437edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1447edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1457edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1467edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private final View.OnTouchListener mLightsOutListener = new View.OnTouchListener() { 1477edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock @Override 1487edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock public boolean onTouch(View v, MotionEvent ev) { 1497edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock if (ev.getAction() == MotionEvent.ACTION_DOWN) { 1507edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock // even though setting the systemUI visibility below will turn these views 1517edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock // on, we need them to come up faster so that they can catch this motion 1527edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock // event 1537edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock applyLightsOut(false, false, false); 1547edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock 1557edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock try { 1567edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mBarService.setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE); 1577edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } catch (android.os.RemoteException ex) { 1587edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1597edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1607edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock return false; 1617edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock } 1627edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock }; 1637edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock}