PhoneStatusBarView.java revision ecc798e6668046c2f67cf30c6ab1db2eba80cab1
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;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
211c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandlerimport android.content.res.Resources;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
2364161ccb2f3341ebe1675e38a999250c7967d0adChris Wrenimport android.util.EventLog;
24cd686b5b6d4166b510df8e32138479a9559bc117John Spurlockimport android.util.Log;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
276179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
2864161ccb2f3341ebe1675e38a999250c7967d0adChris Wren
2964161ccb2f3341ebe1675e38a999250c7967d0adChris Wrenimport com.android.systemui.EventLogTags;
3079de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratoimport com.android.systemui.R;
31ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState;
3279de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onorato
3308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PhoneStatusBarView extends PanelBar {
34fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private static final String TAG = "PhoneStatusBarView";
35198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    private static final boolean DEBUG = PhoneStatusBar.DEBUG;
3664161ccb2f3341ebe1675e38a999250c7967d0adChris Wren    private static final boolean DEBUG_GESTURES = true;
37198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
3808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    PhoneStatusBar mBar;
395a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
40bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt    PanelView mLastFullyOpenedPanel = null;
41507288322b11ae27ab8f47438d3ef4203dad0192John Spurlock    PanelView mNotificationPanel;
427edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock    private final PhoneStatusBarTransitions mBarTransitions;
43ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private ScrimController mScrimController;
44119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onorato
45fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    public PhoneStatusBarView(Context context, AttributeSet attrs) {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
481c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler        Resources res = getContext().getResources();
497edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock        mBarTransitions = new PhoneStatusBarTransitions(this);
50e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock    }
51e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock
52e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock    public BarTransitions getBarTransitions() {
53e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock        return mBarTransitions;
541c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    }
551c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler
56efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public void setBar(PhoneStatusBar bar) {
57efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        mBar = bar;
58efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
59efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
60ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setScrimController(ScrimController scrimController) {
61ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimController = scrimController;
62ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
63ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
64efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    @Override
65acea100015dffbb77d137b0681d6c34992e72ae9Jorim Jaggi    public void onFinishInflate() {
66e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock        mBarTransitions.init();
67efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    }
68efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler
691c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    @Override
70cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    public void addPanel(PanelView pv) {
71cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        super.addPanel(pv);
72cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        if (pv.getId() == R.id.notification_panel) {
73cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler            mNotificationPanel = pv;
74cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        }
75cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
76cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
77cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
785050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler    public boolean panelsEnabled() {
799764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock        return mBar.panelsEnabled();
801e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    }
811e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
821e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    @Override
8308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
8408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (super.onRequestSendAccessibilityEvent(child, event)) {
8508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // The status bar is very small so augment the view that the user is touching
8608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // with the content of the status bar a whole. This way an accessibility service
8708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // may announce the current item as well as the entire content if appropriate.
8808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            AccessibilityEvent record = AccessibilityEvent.obtain();
8908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            onInitializeAccessibilityEvent(record);
9008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            dispatchPopulateAccessibilityEvent(record);
9108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            event.appendRecord(record);
9208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            return true;
93d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn        }
9408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return false;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
98efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public PanelView selectPanelForTouch(MotionEvent touch) {
99507288322b11ae27ab8f47438d3ef4203dad0192John Spurlock        // No double swiping. If either panel is open, nothing else can be pulled down.
100507288322b11ae27ab8f47438d3ef4203dad0192John Spurlock        return mNotificationPanel.getExpandedHeight() > 0
101507288322b11ae27ab8f47438d3ef4203dad0192John Spurlock                ? null
102507288322b11ae27ab8f47438d3ef4203dad0192John Spurlock                : mNotificationPanel;
103cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
104cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
105cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
10608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelPeeked() {
10708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onPanelPeeked();
108fa505a7f26bdf685c701e92b481602eb59d7ff56Jorim Jaggi        mBar.makeExpandedVisible(false);
10967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    }
11067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler
11167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    @Override
11208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onAllPanelsCollapsed() {
11308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onAllPanelsCollapsed();
1146e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        // give animations time to settle
1156e2810bb981582a235f27c70885ee55bf71f0174Daniel Sandler        mBar.makeExpandedInvisibleSoon();
116bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        mLastFullyOpenedPanel = null;
1178e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    }
1188e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler
1198e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    @Override
1208e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    public void onPanelFullyOpened(PanelView openPanel) {
121750bb9bff9fccf94f4bbf5945e10ce3f76534e7fDaniel Sandler        super.onPanelFullyOpened(openPanel);
122bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        if (openPanel != mLastFullyOpenedPanel) {
123bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt            openPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
124bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        }
125bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        mLastFullyOpenedPanel = openPanel;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
13064161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        boolean barConsumedEvent = mBar.interceptTouchEvent(event);
13164161ccb2f3341ebe1675e38a999250c7967d0adChris Wren
13264161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        if (DEBUG_GESTURES) {
13364161ccb2f3341ebe1675e38a999250c7967d0adChris Wren            if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
13464161ccb2f3341ebe1675e38a999250c7967d0adChris Wren                EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH,
13564161ccb2f3341ebe1675e38a999250c7967d0adChris Wren                        event.getActionMasked(), (int) event.getX(), (int) event.getY(),
13664161ccb2f3341ebe1675e38a999250c7967d0adChris Wren                        barConsumedEvent ? 1 : 0);
13764161ccb2f3341ebe1675e38a999250c7967d0adChris Wren            }
13864161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        }
13964161ccb2f3341ebe1675e38a999250c7967d0adChris Wren
14064161ccb2f3341ebe1675e38a999250c7967d0adChris Wren        return barConsumedEvent || super.onTouchEvent(event);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
144e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi    public void onTrackingStarted(PanelView panel) {
145e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi        super.onTrackingStarted(panel);
146e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi        mBar.onTrackingStarted();
147ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimController.onTrackingStarted();
148e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi    }
149e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi
150e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi    @Override
151e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi    public void onTrackingStopped(PanelView panel) {
152e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi        super.onTrackingStopped(panel);
153e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi        mBar.onTrackingStopped();
154e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi    }
155e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi
156e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi    @Override
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onInterceptTouchEvent(MotionEvent event) {
15808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1616179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    @Override
16267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    public void panelExpansionChanged(PanelView panel, float frac) {
16367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        super.panelExpansionChanged(panel, frac);
16408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
165198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        if (DEBUG) {
166cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            Log.v(TAG, "panelExpansionChanged: f=" + frac);
167198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
168198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
169ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimController.setPanelExpansion(frac);
17008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
171025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        // fade out the panel as it gets buried into the status bar to avoid overdrawing the
172025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        // status bar on the last frame of a close animation
173025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        final int H = mBar.getStatusBarHeight();
174025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        final float ph = panel.getExpandedHeight() + panel.getPaddingBottom();
175025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        float alpha = 1f;
176025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        if (ph < 2*H) {
177025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            if (ph < H) alpha = 0f;
178025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            else alpha = (ph - H) / H;
179025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            alpha = alpha * alpha; // get there faster
180025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        }
181025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        if (panel.getAlpha() != alpha) {
182025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler            panel.setAlpha(alpha);
183025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler        }
184025e7cb4a186092692e76456e4c4404ab4103fe8Daniel Sandler
18508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar.updateCarrierLabelVisibility(false);
18603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mBar.userActivity();
1876179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    }
1886179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov}
189