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