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.os.ServiceManager;
237edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.view.MotionEvent;
247edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.view.View;
257edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport android.view.animation.AccelerateInterpolator;
267edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
277edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport com.android.internal.statusbar.IStatusBarService;
287edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockimport com.android.systemui.R;
297edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
307edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlockpublic final class NavigationBarTransitions extends BarTransitions {
317edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
327edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    private final NavigationBarView mView;
337edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    private final IStatusBarService mBarService;
347edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
357edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    private boolean mLightsOut;
367edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
377edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    public NavigationBarTransitions(NavigationBarView view) {
387057d2c3a9a88f1d221bc69780385bd20c5b4999John Spurlock        super(view, R.drawable.nav_background);
397edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        mView = view;
407edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        mBarService = IStatusBarService.Stub.asInterface(
417edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
427edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    }
437edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
448a8ffd4e9b15a04d2af0909205658f08c76bd6b2Adrian Roos    public void init() {
45e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock        applyModeBackground(-1, getMode(), false /*animate*/);
46e631b41d8be2952db48df5838c6fb5d8df4645d1John Spurlock        applyMode(getMode(), false /*animate*/, true /*force*/);
477edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    }
487edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
497edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    @Override
507edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    protected void onTransition(int oldMode, int newMode, boolean animate) {
517edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        super.onTransition(oldMode, newMode, animate);
527edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        applyMode(newMode, animate, false /*force*/);
537edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    }
547edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
557edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    private void applyMode(int mode, boolean animate, boolean force) {
567edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
577edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        // apply to lights out
58c0f0a74762f7b3651d0fcd8371e9eb0c84779b1aAdrian Roos        applyLightsOut(isLightsOut(mode), animate, force);
597edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    }
607edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
617edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    private void applyLightsOut(boolean lightsOut, boolean animate, boolean force) {
627edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        if (!force && lightsOut == mLightsOut) return;
637edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
647edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        mLightsOut = lightsOut;
657edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
667edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        final View navButtons = mView.getCurrentView().findViewById(R.id.nav_buttons);
677edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        final View lowLights = mView.getCurrentView().findViewById(R.id.lights_out);
687edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
697edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        // ok, everyone, stop it right there
707edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        navButtons.animate().cancel();
717edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        lowLights.animate().cancel();
727edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
737edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        final float navButtonsAlpha = lightsOut ? 0f : 1f;
747edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        final float lowLightsAlpha = lightsOut ? 1f : 0f;
757edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
767edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        if (!animate) {
777edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            navButtons.setAlpha(navButtonsAlpha);
787edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            lowLights.setAlpha(lowLightsAlpha);
797edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            lowLights.setVisibility(lightsOut ? View.VISIBLE : View.GONE);
807edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        } else {
817edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            final int duration = lightsOut ? LIGHTS_OUT_DURATION : LIGHTS_IN_DURATION;
827edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            navButtons.animate()
837edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .alpha(navButtonsAlpha)
847edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .setDuration(duration)
857edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .start();
867edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
877edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            lowLights.setOnTouchListener(mLightsOutListener);
887edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            if (lowLights.getVisibility() == View.GONE) {
897edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                lowLights.setAlpha(0f);
907edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                lowLights.setVisibility(View.VISIBLE);
917edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            }
927edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            lowLights.animate()
937edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .alpha(lowLightsAlpha)
947edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .setDuration(duration)
957edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .setInterpolator(new AccelerateInterpolator(2.0f))
967edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .setListener(lightsOut ? null : new AnimatorListenerAdapter() {
977edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                    @Override
987edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                    public void onAnimationEnd(Animator _a) {
997edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                        lowLights.setVisibility(View.GONE);
1007edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                    }
1017edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                })
1027edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                .start();
1037edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        }
1047edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    }
1057edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
1067edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    private final View.OnTouchListener mLightsOutListener = new View.OnTouchListener() {
1077edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        @Override
1087edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        public boolean onTouch(View v, MotionEvent ev) {
1097edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
1107edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                // even though setting the systemUI visibility below will turn these views
1117edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                // on, we need them to come up faster so that they can catch this motion
1127edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                // event
1137edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                applyLightsOut(false, false, false);
1147edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock
1157edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                try {
11653f28eccc546504cb1e894c02176ecce3139264eAdrian Roos                    mBarService.setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE,
11753f28eccc546504cb1e894c02176ecce3139264eAdrian Roos                            "LightsOutListener");
1187edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                } catch (android.os.RemoteException ex) {
1197edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock                }
1207edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            }
1217edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock            return false;
1227edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        }
1237edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    };
124af638c4f9daa74b4c8e0905f07e11290f6845abeJim Miller}
125