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}