PageRenderTime 52ms CodeModel.GetById 10ms app.highlight 37ms RepoModel.GetById 2ms app.codeStats 0ms

/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java

https://github.com/aizuzi/platform_frameworks_base
Java | 198 lines | 145 code | 31 blank | 22 comment | 22 complexity | 27ff690754e977ea233129bc834fa4d1 MD5 | raw file
  1/*
  2 * Copyright (C) 2013 The Android Open Source Project
  3 *
  4 * Licensed under the Apache License, Version 2.0 (the "License");
  5 * you may not use this file except in compliance with the License.
  6 * You may obtain a copy of the License at
  7 *
  8 *      http://www.apache.org/licenses/LICENSE-2.0
  9 *
 10 * Unless required by applicable law or agreed to in writing, software
 11 * distributed under the License is distributed on an "AS IS" BASIS,
 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13 * See the License for the specific language governing permissions and
 14 * limitations under the License.
 15 */
 16
 17package com.android.systemui.statusbar.phone;
 18
 19import android.animation.Animator;
 20import android.animation.AnimatorListenerAdapter;
 21import android.content.Context;
 22import android.os.ServiceManager;
 23import android.view.MotionEvent;
 24import android.view.View;
 25import android.view.animation.AccelerateInterpolator;
 26
 27import com.android.internal.statusbar.IStatusBarService;
 28import com.android.systemui.R;
 29import com.android.systemui.statusbar.policy.KeyButtonView;
 30
 31public final class NavigationBarTransitions extends BarTransitions {
 32
 33    private static final float KEYGUARD_QUIESCENT_ALPHA = 0.5f;
 34    private static final int CONTENT_FADE_DURATION = 200;
 35
 36    private final NavigationBarView mView;
 37    private final IStatusBarService mBarService;
 38
 39    private boolean mLightsOut;
 40    private boolean mVertical;
 41    private int mRequestedMode;
 42
 43    public NavigationBarTransitions(NavigationBarView view) {
 44        super(view, R.drawable.nav_background);
 45        mView = view;
 46        mBarService = IStatusBarService.Stub.asInterface(
 47                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
 48    }
 49
 50    public void init(boolean isVertical) {
 51        setVertical(isVertical);
 52        applyModeBackground(-1, getMode(), false /*animate*/);
 53        applyMode(getMode(), false /*animate*/, true /*force*/);
 54    }
 55
 56    public void setVertical(boolean isVertical) {
 57        mVertical = isVertical;
 58        transitionTo(mRequestedMode, false /*animate*/);
 59    }
 60
 61    @Override
 62    public void transitionTo(int mode, boolean animate) {
 63        mRequestedMode = mode;
 64        if (mVertical && mode == MODE_TRANSLUCENT) {
 65            // translucent mode not allowed when vertical
 66            mode = MODE_OPAQUE;
 67        }
 68        super.transitionTo(mode, animate);
 69    }
 70
 71    @Override
 72    protected void onTransition(int oldMode, int newMode, boolean animate) {
 73        super.onTransition(oldMode, newMode, animate);
 74        applyMode(newMode, animate, false /*force*/);
 75    }
 76
 77    private void applyMode(int mode, boolean animate, boolean force) {
 78        // apply to key buttons
 79        final float alpha = alphaForMode(mode);
 80        setKeyButtonViewQuiescentAlpha(mView.getHomeButton(), alpha, animate);
 81        setKeyButtonViewQuiescentAlpha(mView.getRecentsButton(), alpha, animate);
 82        setKeyButtonViewQuiescentAlpha(mView.getMenuButton(), alpha, animate);
 83
 84        setKeyButtonViewQuiescentAlpha(mView.getSearchLight(), KEYGUARD_QUIESCENT_ALPHA, animate);
 85        setKeyButtonViewQuiescentAlpha(mView.getCameraButton(), KEYGUARD_QUIESCENT_ALPHA, animate);
 86
 87        applyBackButtonQuiescentAlpha(mode, animate);
 88
 89        // apply to lights out
 90        applyLightsOut(mode == MODE_LIGHTS_OUT, animate, force);
 91    }
 92
 93    private float alphaForMode(int mode) {
 94        final boolean isOpaque = mode == MODE_OPAQUE || mode == MODE_LIGHTS_OUT;
 95        return isOpaque ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f;
 96    }
 97
 98    public void applyBackButtonQuiescentAlpha(int mode, boolean animate) {
 99        float backAlpha = 0;
100        backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getSearchLight());
101        backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getCameraButton());
102        backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getHomeButton());
103        backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getRecentsButton());
104        backAlpha = maxVisibleQuiescentAlpha(backAlpha, mView.getMenuButton());
105        if (backAlpha > 0) {
106            setKeyButtonViewQuiescentAlpha(mView.getBackButton(), backAlpha, animate);
107        }
108    }
109
110    private static float maxVisibleQuiescentAlpha(float max, View v) {
111        if ((v instanceof KeyButtonView) && v.isShown()) {
112            return Math.max(max, ((KeyButtonView)v).getQuiescentAlpha());
113        }
114        return max;
115    }
116
117    @Override
118    public void setContentVisible(boolean visible) {
119        final float alpha = visible ? 1 : 0;
120        fadeContent(mView.getCameraButton(), alpha);
121        fadeContent(mView.getSearchLight(), alpha);
122    }
123
124    private void fadeContent(View v, float alpha) {
125        if (v != null) {
126            v.animate().alpha(alpha).setDuration(CONTENT_FADE_DURATION);
127        }
128    }
129
130    private void setKeyButtonViewQuiescentAlpha(View button, float alpha, boolean animate) {
131        if (button instanceof KeyButtonView) {
132            ((KeyButtonView) button).setQuiescentAlpha(alpha, animate);
133        }
134    }
135
136    private void applyLightsOut(boolean lightsOut, boolean animate, boolean force) {
137        if (!force && lightsOut == mLightsOut) return;
138
139        mLightsOut = lightsOut;
140
141        final View navButtons = mView.getCurrentView().findViewById(R.id.nav_buttons);
142        final View lowLights = mView.getCurrentView().findViewById(R.id.lights_out);
143
144        // ok, everyone, stop it right there
145        navButtons.animate().cancel();
146        lowLights.animate().cancel();
147
148        final float navButtonsAlpha = lightsOut ? 0f : 1f;
149        final float lowLightsAlpha = lightsOut ? 1f : 0f;
150
151        if (!animate) {
152            navButtons.setAlpha(navButtonsAlpha);
153            lowLights.setAlpha(lowLightsAlpha);
154            lowLights.setVisibility(lightsOut ? View.VISIBLE : View.GONE);
155        } else {
156            final int duration = lightsOut ? LIGHTS_OUT_DURATION : LIGHTS_IN_DURATION;
157            navButtons.animate()
158                .alpha(navButtonsAlpha)
159                .setDuration(duration)
160                .start();
161
162            lowLights.setOnTouchListener(mLightsOutListener);
163            if (lowLights.getVisibility() == View.GONE) {
164                lowLights.setAlpha(0f);
165                lowLights.setVisibility(View.VISIBLE);
166            }
167            lowLights.animate()
168                .alpha(lowLightsAlpha)
169                .setDuration(duration)
170                .setInterpolator(new AccelerateInterpolator(2.0f))
171                .setListener(lightsOut ? null : new AnimatorListenerAdapter() {
172                    @Override
173                    public void onAnimationEnd(Animator _a) {
174                        lowLights.setVisibility(View.GONE);
175                    }
176                })
177                .start();
178        }
179    }
180
181    private final View.OnTouchListener mLightsOutListener = new View.OnTouchListener() {
182        @Override
183        public boolean onTouch(View v, MotionEvent ev) {
184            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
185                // even though setting the systemUI visibility below will turn these views
186                // on, we need them to come up faster so that they can catch this motion
187                // event
188                applyLightsOut(false, false, false);
189
190                try {
191                    mBarService.setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE);
192                } catch (android.os.RemoteException ex) {
193                }
194            }
195            return false;
196        }
197    };
198}