115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.phone;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.app.ActivityManager;
201e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandlerimport android.app.StatusBarManager;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
221c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandlerimport android.content.res.Resources;
235a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandlerimport android.content.res.Resources.NotFoundException;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
25198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport android.util.Slog;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
286179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
2979de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratoimport com.android.systemui.R;
3079de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onorato
3108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PhoneStatusBarView extends PanelBar {
32fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private static final String TAG = "PhoneStatusBarView";
33198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    private static final boolean DEBUG = PhoneStatusBar.DEBUG;
34198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
3508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    PhoneStatusBar mBar;
361c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    int mScrimColor;
375a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler    float mSettingsPanelDragzoneFrac;
385a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler    float mSettingsPanelDragzoneMin;
395a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
40b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren    boolean mFullWidthNotifications;
418e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    PanelView mFadingPanel = null;
42bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt    PanelView mLastFullyOpenedPanel = null;
43cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    PanelView mNotificationPanel, mSettingsPanel;
4467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    private boolean mShouldFade;
45119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onorato
46fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    public PhoneStatusBarView(Context context, AttributeSet attrs) {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
491c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler        Resources res = getContext().getResources();
501c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler        mScrimColor = res.getColor(R.color.notification_panel_scrim_color);
515a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        mSettingsPanelDragzoneMin = res.getDimension(R.dimen.settings_panel_dragzone_min);
52b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren        try {
535a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            mSettingsPanelDragzoneFrac = res.getFraction(R.dimen.settings_panel_dragzone_fraction, 1, 1);
545a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        } catch (NotFoundException ex) {
555a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            mSettingsPanelDragzoneFrac = 0f;
56b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren        }
575a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        mFullWidthNotifications = mSettingsPanelDragzoneFrac <= 0f;
581c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    }
591c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler
60efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public void setBar(PhoneStatusBar bar) {
61efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        mBar = bar;
62efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
63efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
64efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public boolean hasFullWidthNotifications() {
65efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        return mFullWidthNotifications;
66efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
67efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
68efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    @Override
69efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public void onAttachedToWindow() {
70efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        for (PanelView pv : mPanels) {
71efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            pv.setRubberbandingEnabled(!mFullWidthNotifications);
72efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        }
73efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
74efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
751c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    @Override
76cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    public void addPanel(PanelView pv) {
77cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        super.addPanel(pv);
78cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        if (pv.getId() == R.id.notification_panel) {
79cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler            mNotificationPanel = pv;
80cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        } else if (pv.getId() == R.id.settings_panel){
81cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler            mSettingsPanel = pv;
82cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        }
83efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        pv.setRubberbandingEnabled(!mFullWidthNotifications);
84cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
85cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
86cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
875050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler    public boolean panelsEnabled() {
881e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler        return ((mBar.mDisabled & StatusBarManager.DISABLE_EXPAND) == 0);
891e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    }
901e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
911e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    @Override
9208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
9308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (super.onRequestSendAccessibilityEvent(child, event)) {
9408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // The status bar is very small so augment the view that the user is touching
9508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // with the content of the status bar a whole. This way an accessibility service
9608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // may announce the current item as well as the entire content if appropriate.
9708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            AccessibilityEvent record = AccessibilityEvent.obtain();
9808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            onInitializeAccessibilityEvent(record);
9908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            dispatchPopulateAccessibilityEvent(record);
10008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            event.appendRecord(record);
10108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            return true;
102d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn        }
10308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return false;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
107efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public PanelView selectPanelForTouch(MotionEvent touch) {
108efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        final float x = touch.getX();
109efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
1105a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (mFullWidthNotifications) {
111efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            // No double swiping. If either panel is open, nothing else can be pulled down.
112e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            return ((mSettingsPanel == null ? 0 : mSettingsPanel.getExpandedHeight())
113e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                        + mNotificationPanel.getExpandedHeight() > 0)
114efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                    ? null
115efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                    : mNotificationPanel;
1165a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        }
1175a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1185a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        // We split the status bar into thirds: the left 2/3 are for notifications, and the
119cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        // right 1/3 for quick settings. If you pull the status bar down a second time you'll
120cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        // toggle panels no matter where you pull it down.
1215a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
12267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        final float w = getMeasuredWidth();
1235a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        float region = (w * mSettingsPanelDragzoneFrac);
1245a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1255a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (DEBUG) {
1265a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            Slog.v(TAG, String.format(
1275a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                "w=%.1f frac=%.3f region=%.1f min=%.1f x=%.1f w-x=%.1f",
1285a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                w, mSettingsPanelDragzoneFrac, region, mSettingsPanelDragzoneMin, x, (w-x)));
129cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        }
1305a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1315a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (region < mSettingsPanelDragzoneMin) region = mSettingsPanelDragzoneMin;
1325a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1335a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        return (w - x < region) ? mSettingsPanel : mNotificationPanel;
134cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
135cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
136cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
13708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelPeeked() {
13808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onPanelPeeked();
13908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar.makeExpandedVisible(true);
14067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    }
14167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler
14267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    @Override
14367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    public void startOpeningPanel(PanelView panel) {
14467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        super.startOpeningPanel(panel);
14567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        // we only want to start fading if this is the "first" or "last" panel,
14667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        // which is kind of tricky to determine
14767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mShouldFade = (mFadingPanel == null || mFadingPanel.isFullyExpanded());
14867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) {
14967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            Slog.v(TAG, "start opening: " + panel + " shouldfade=" + mShouldFade);
1508e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        }
15167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mFadingPanel = panel;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
154d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn    @Override
15508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onAllPanelsCollapsed() {
15608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onAllPanelsCollapsed();
1576e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        // give animations time to settle
1586e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        mBar.makeExpandedInvisibleSoon();
1598e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mFadingPanel = null;
160bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        mLastFullyOpenedPanel = null;
1618e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    }
1628e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler
1638e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    @Override
1648e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    public void onPanelFullyOpened(PanelView openPanel) {
165750bb9bff9fccf94f4bbf5945e10ce3f76534e7fDaniel Sandler        super.onPanelFullyOpened(openPanel);
166bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        if (openPanel != mLastFullyOpenedPanel) {
167bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt            openPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
168bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        }
1698e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mFadingPanel = openPanel;
170bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        mLastFullyOpenedPanel = openPanel;
17167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mShouldFade = true; // now you own the fade, mister
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
17608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return mBar.interceptTouchEvent(event) || super.onTouchEvent(event);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onInterceptTouchEvent(MotionEvent event) {
18108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1846179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    @Override
18567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    public void panelExpansionChanged(PanelView panel, float frac) {
18667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        super.panelExpansionChanged(panel, frac);
18708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
188198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        if (DEBUG) {
189198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            Slog.v(TAG, "panelExpansionChanged: f=" + frac);
190198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
191198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
19267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (panel == mFadingPanel && mScrimColor != 0 && ActivityManager.isHighEndGfx()) {
19367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            if (mShouldFade) {
19467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler                frac = mPanelExpandedFractionSum; // don't judge me
1953679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                // let's start this 20% of the way down the screen
1963679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                frac = frac * 1.2f - 0.2f;
1973679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                if (frac <= 0) {
1983679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    mBar.mStatusBarWindow.setBackgroundColor(0);
1993679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                } else {
2003679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    // woo, special effects
2013679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f))));
2023679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    // attenuate background color alpha by k
2033679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    final int color = (int) ((mScrimColor >>> 24) * k) << 24 | (mScrimColor & 0xFFFFFF);
2043679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    mBar.mStatusBarWindow.setBackgroundColor(color);
2053679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                }
20667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            }
2076179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        }
20808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
209025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        // fade out the panel as it gets buried into the status bar to avoid overdrawing the
210025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        // status bar on the last frame of a close animation
211025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        final int H = mBar.getStatusBarHeight();
212025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        final float ph = panel.getExpandedHeight() + panel.getPaddingBottom();
213025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        float alpha = 1f;
214025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        if (ph < 2*H) {
215025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            if (ph < H) alpha = 0f;
216025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            else alpha = (ph - H) / H;
217025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            alpha = alpha * alpha; // get there faster
218025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        }
219025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        if (panel.getAlpha() != alpha) {
220025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            panel.setAlpha(alpha);
221025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        }
222025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler
22308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar.updateCarrierLabelVisibility(false);
2246179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    }
2256179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov}
226