PhoneStatusBarView.java revision e6f0a716501e57616c8e1d809c0f60b08d21eb0a
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
19e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlockimport static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
20e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlockimport static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
21e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock
22b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlockimport android.animation.Animator;
23b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlockimport android.animation.AnimatorSet;
24e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlockimport android.animation.ObjectAnimator;
2508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.app.ActivityManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
271c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandlerimport android.content.res.Resources;
285a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandlerimport android.content.res.Resources.NotFoundException;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
3064161ccb2f3341ebe1675e38a999250c7967d0adChris Wrenimport android.util.EventLog;
31cd686b5b6d4166b510df8e32138479a9559bc117John Spurlockimport android.util.Log;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
346179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
3564161ccb2f3341ebe1675e38a999250c7967d0adChris Wren
3664161ccb2f3341ebe1675e38a999250c7967d0adChris Wrenimport com.android.systemui.EventLogTags;
3779de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratoimport com.android.systemui.R;
3879de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onorato
3908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PhoneStatusBarView extends PanelBar {
40fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private static final String TAG = "PhoneStatusBarView";
41198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    private static final boolean DEBUG = PhoneStatusBar.DEBUG;
4264161ccb2f3341ebe1675e38a999250c7967d0adChris Wren    private static final boolean DEBUG_GESTURES = true;
43198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
4408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    PhoneStatusBar mBar;
451c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    int mScrimColor;
465a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler    float mSettingsPanelDragzoneFrac;
475a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler    float mSettingsPanelDragzoneMin;
485a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
49b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren    boolean mFullWidthNotifications;
508e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    PanelView mFadingPanel = null;
51bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt    PanelView mLastFullyOpenedPanel = null;
52cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    PanelView mNotificationPanel, mSettingsPanel;
5367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    private boolean mShouldFade;
5489835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock    private final StatusBarTransitions mBarTransitions;
5589835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock
5689835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock    private final class StatusBarTransitions extends BarTransitions {
57b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock        private final int mTransparent;
58e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        private final float mAlphaWhenOpaque;
59e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        private final float mAlphaWhenTransparent = 1;
60e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        private View mLeftSide;
61e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        private View mRightSide;
62b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock
6389835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock        public StatusBarTransitions(Context context) {
6489835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock            super(context, PhoneStatusBarView.this);
6589835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock            final Resources res = context.getResources();
66b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock            mTransparent = res.getColor(R.color.status_bar_background_transparent);
67e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            mAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
68e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        }
69e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock
70e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        public void init() {
71e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            mLeftSide = findViewById(R.id.notification_icon_area);
72e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            mRightSide = findViewById(R.id.system_icon_area);
73e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            applyMode(getMode(), false /*animate*/);
74b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock        }
75b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock
76b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock        @Override
77b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock        protected Integer getBackgroundColor(int mode) {
78b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock            if (mode == MODE_TRANSPARENT) return mTransparent;
79b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock            return super.getBackgroundColor(mode);
80b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock        }
81b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock
82e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        public ObjectAnimator animateTransitionTo(View v, float toAlpha) {
83e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            return ObjectAnimator.ofFloat(v, "alpha", v.getAlpha(), toAlpha);
84e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        }
85e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock
86e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        public float getAlphaFor(int mode) {
87e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            final boolean isTransparent = mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT;
88e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            return isTransparent ? mAlphaWhenTransparent : mAlphaWhenOpaque;
89e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        }
90e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock
91b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock        @Override
92b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock        protected void onTransition(int oldMode, int newMode, boolean animate) {
93b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock            super.onTransition(oldMode, newMode, animate);
94e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            applyMode(newMode, animate);
95e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        }
96e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock
97e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        private void applyMode(int mode, boolean animate) {
98e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock            float newAlpha = getAlphaFor(mode);
99b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock            if (animate) {
100e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock                ObjectAnimator lhs = animateTransitionTo(mLeftSide, newAlpha);
101e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock                ObjectAnimator rhs = animateTransitionTo(mRightSide, newAlpha);
102b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock                AnimatorSet set = new AnimatorSet();
103e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock                set.playTogether(lhs, rhs);
104b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock                set.start();
105b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock            } else {
106e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock                mLeftSide.setAlpha(newAlpha);
107e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock                mRightSide.setAlpha(newAlpha);
108b77edbfdab54531023c8bbea7d89b6cefc42096cJohn Spurlock            }
10989835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock        }
11089835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock    }
111119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onorato
112fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    public PhoneStatusBarView(Context context, AttributeSet attrs) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1151c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler        Resources res = getContext().getResources();
1161c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler        mScrimColor = res.getColor(R.color.notification_panel_scrim_color);
1175a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        mSettingsPanelDragzoneMin = res.getDimension(R.dimen.settings_panel_dragzone_min);
118b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren        try {
1195a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            mSettingsPanelDragzoneFrac = res.getFraction(R.dimen.settings_panel_dragzone_fraction, 1, 1);
1205a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        } catch (NotFoundException ex) {
1215a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            mSettingsPanelDragzoneFrac = 0f;
122b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren        }
1235a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        mFullWidthNotifications = mSettingsPanelDragzoneFrac <= 0f;
12489835ddf327ef256b44d91cf1fd1898c0599eb48John Spurlock        mBarTransitions = new StatusBarTransitions(context);
125e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock    }
126e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock
127e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock    public BarTransitions getBarTransitions() {
128e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock        return mBarTransitions;
1291c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    }
1301c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler
131efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public void setBar(PhoneStatusBar bar) {
132efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        mBar = bar;
133efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
134efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
135efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public boolean hasFullWidthNotifications() {
136efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        return mFullWidthNotifications;
137efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
138efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
139efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    @Override
140efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public void onAttachedToWindow() {
141efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        for (PanelView pv : mPanels) {
142efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            pv.setRubberbandingEnabled(!mFullWidthNotifications);
143efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        }
144e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        mBarTransitions.init();
145efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
146efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
1471c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    @Override
148cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    public void addPanel(PanelView pv) {
149cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        super.addPanel(pv);
150cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        if (pv.getId() == R.id.notification_panel) {
151cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler            mNotificationPanel = pv;
152cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        } else if (pv.getId() == R.id.settings_panel){
153cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler            mSettingsPanel = pv;
154cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        }
155efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        pv.setRubberbandingEnabled(!mFullWidthNotifications);
156cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
157cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
158cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
1595050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler    public boolean panelsEnabled() {
1609764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock        return mBar.panelsEnabled();
1611e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    }
1621e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
1631e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    @Override
16408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
16508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (super.onRequestSendAccessibilityEvent(child, event)) {
16608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // The status bar is very small so augment the view that the user is touching
16708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // with the content of the status bar a whole. This way an accessibility service
16808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // may announce the current item as well as the entire content if appropriate.
16908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            AccessibilityEvent record = AccessibilityEvent.obtain();
17008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            onInitializeAccessibilityEvent(record);
17108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            dispatchPopulateAccessibilityEvent(record);
17208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            event.appendRecord(record);
17308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            return true;
174d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn        }
17508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return false;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
179efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public PanelView selectPanelForTouch(MotionEvent touch) {
180efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        final float x = touch.getX();
1818afcd149970c79054a3a16377834aa0aec35eee0Fabrice Di Meglio        final boolean isLayoutRtl = isLayoutRtl();
182efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
1835a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (mFullWidthNotifications) {
184efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            // No double swiping. If either panel is open, nothing else can be pulled down.
185209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock            return ((mSettingsPanel == null ? 0 : mSettingsPanel.getExpandedHeight())
186209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock                        + mNotificationPanel.getExpandedHeight() > 0)
187209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock                    ? null
188efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                    : mNotificationPanel;
1895a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        }
1905a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1915a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        // We split the status bar into thirds: the left 2/3 are for notifications, and the
192cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        // right 1/3 for quick settings. If you pull the status bar down a second time you'll
193cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        // toggle panels no matter where you pull it down.
1945a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
19567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        final float w = getMeasuredWidth();
1965a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        float region = (w * mSettingsPanelDragzoneFrac);
1975a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1985a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (DEBUG) {
199cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            Log.v(TAG, String.format(
2005a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                "w=%.1f frac=%.3f region=%.1f min=%.1f x=%.1f w-x=%.1f",
2015a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                w, mSettingsPanelDragzoneFrac, region, mSettingsPanelDragzoneMin, x, (w-x)));
202cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        }
2035a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
2045a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (region < mSettingsPanelDragzoneMin) region = mSettingsPanelDragzoneMin;
2055a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
2068afcd149970c79054a3a16377834aa0aec35eee0Fabrice Di Meglio        final boolean showSettings = isLayoutRtl ? (x < region) : (w - region < x);
2078afcd149970c79054a3a16377834aa0aec35eee0Fabrice Di Meglio        return showSettings ? mSettingsPanel : mNotificationPanel;
208cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
209cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
210cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
21108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelPeeked() {
21208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onPanelPeeked();
213a5baf891024888eefdd1d1f6ed1e2923f0600681John Spurlock        mBar.makeExpandedVisible();
21467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    }
21567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler
21667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    @Override
21767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    public void startOpeningPanel(PanelView panel) {
21867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        super.startOpeningPanel(panel);
21967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        // we only want to start fading if this is the "first" or "last" panel,
22067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        // which is kind of tricky to determine
22167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mShouldFade = (mFadingPanel == null || mFadingPanel.isFullyExpanded());
22267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) {
223cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            Log.v(TAG, "start opening: " + panel + " shouldfade=" + mShouldFade);
2248e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        }
22567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mFadingPanel = panel;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
228d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn    @Override
22908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onAllPanelsCollapsed() {
23008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onAllPanelsCollapsed();
2316e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        // give animations time to settle
2326e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        mBar.makeExpandedInvisibleSoon();
2338e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mFadingPanel = null;
234bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        mLastFullyOpenedPanel = null;
2358e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    }
2368e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler
2378e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    @Override
2388e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    public void onPanelFullyOpened(PanelView openPanel) {
239750bb9bff9fccf94f4bbf5945e10ce3f76534e7fDaniel Sandler        super.onPanelFullyOpened(openPanel);
240bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        if (openPanel != mLastFullyOpenedPanel) {
241bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt            openPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
242bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        }
2438e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mFadingPanel = openPanel;
244bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        mLastFullyOpenedPanel = openPanel;
24567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mShouldFade = true; // now you own the fade, mister
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
25064161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        boolean barConsumedEvent = mBar.interceptTouchEvent(event);
25164161ccb2f3341ebe1675e38a999250c7967d0adChris Wren
25264161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        if (DEBUG_GESTURES) {
25364161ccb2f3341ebe1675e38a999250c7967d0adChris Wren            if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
25464161ccb2f3341ebe1675e38a999250c7967d0adChris Wren                EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH,
25564161ccb2f3341ebe1675e38a999250c7967d0adChris Wren                        event.getActionMasked(), (int) event.getX(), (int) event.getY(),
25664161ccb2f3341ebe1675e38a999250c7967d0adChris Wren                        barConsumedEvent ? 1 : 0);
25764161ccb2f3341ebe1675e38a999250c7967d0adChris Wren            }
25864161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        }
25964161ccb2f3341ebe1675e38a999250c7967d0adChris Wren
26064161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        return barConsumedEvent || super.onTouchEvent(event);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onInterceptTouchEvent(MotionEvent event) {
26508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2686179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    @Override
26967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    public void panelExpansionChanged(PanelView panel, float frac) {
27067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        super.panelExpansionChanged(panel, frac);
27108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
272198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        if (DEBUG) {
273cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            Log.v(TAG, "panelExpansionChanged: f=" + frac);
274198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
275198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
27667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (panel == mFadingPanel && mScrimColor != 0 && ActivityManager.isHighEndGfx()) {
27767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            if (mShouldFade) {
27867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler                frac = mPanelExpandedFractionSum; // don't judge me
2793679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                // let's start this 20% of the way down the screen
2803679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                frac = frac * 1.2f - 0.2f;
2813679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                if (frac <= 0) {
2823679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    mBar.mStatusBarWindow.setBackgroundColor(0);
2833679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                } else {
2843679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    // woo, special effects
2853679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f))));
2863679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    // attenuate background color alpha by k
2873679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    final int color = (int) ((mScrimColor >>> 24) * k) << 24 | (mScrimColor & 0xFFFFFF);
2883679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                    mBar.mStatusBarWindow.setBackgroundColor(color);
2893679bf58fb2f59745b416b26126b7e2a673c54d8Daniel Sandler                }
29067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            }
2916179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        }
29208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
293025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        // fade out the panel as it gets buried into the status bar to avoid overdrawing the
294025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        // status bar on the last frame of a close animation
295025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        final int H = mBar.getStatusBarHeight();
296025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        final float ph = panel.getExpandedHeight() + panel.getPaddingBottom();
297025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        float alpha = 1f;
298025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        if (ph < 2*H) {
299025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            if (ph < H) alpha = 0f;
300025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            else alpha = (ph - H) / H;
301025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            alpha = alpha * alpha; // get there faster
302025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        }
303025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        if (panel.getAlpha() != alpha) {
304025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            panel.setAlpha(alpha);
305025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        }
306025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler
3079afc50dedaed6e01644171fa2f17edcb5b29e0c0Chris Wren        mBar.animateHeadsUp(mNotificationPanel == panel, mPanelExpandedFractionSum);
3089afc50dedaed6e01644171fa2f17edcb5b29e0c0Chris Wren
30908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar.updateCarrierLabelVisibility(false);
3106179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    }
3116179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov}
312