PhoneStatusBarView.java revision bac221ff0b9e1406f95f23c9a5c3b580ece10eab
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 } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void setBar(PhoneStatusBar bar) { 5108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar = bar; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 551c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler public void onAttachedToWindow() { 561c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler Resources res = getContext().getResources(); 571c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler mScrimColor = res.getColor(R.color.notification_panel_scrim_color); 585a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mSettingsPanelDragzoneMin = res.getDimension(R.dimen.settings_panel_dragzone_min); 59b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren try { 605a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mSettingsPanelDragzoneFrac = res.getFraction(R.dimen.settings_panel_dragzone_fraction, 1, 1); 615a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler } catch (NotFoundException ex) { 625a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mSettingsPanelDragzoneFrac = 0f; 63b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren } 645a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 655a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mFullWidthNotifications = mSettingsPanelDragzoneFrac <= 0f; 661c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler } 671c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler 681c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler @Override 69cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler public void addPanel(PanelView pv) { 70cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler super.addPanel(pv); 71cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler if (pv.getId() == R.id.notification_panel) { 72cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler mNotificationPanel = pv; 73cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } else if (pv.getId() == R.id.settings_panel){ 74cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler mSettingsPanel = pv; 75cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 76cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 77cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler 78cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler @Override 795050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler public boolean panelsEnabled() { 801e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler return ((mBar.mDisabled & StatusBarManager.DISABLE_EXPAND) == 0); 811e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler } 821e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler 831e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler @Override 8408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { 8508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler if (super.onRequestSendAccessibilityEvent(child, event)) { 8608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // The status bar is very small so augment the view that the user is touching 8708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // with the content of the status bar a whole. This way an accessibility service 8808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // may announce the current item as well as the entire content if appropriate. 8908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler AccessibilityEvent record = AccessibilityEvent.obtain(); 9008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler onInitializeAccessibilityEvent(record); 9108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler dispatchPopulateAccessibilityEvent(record); 9208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler event.appendRecord(record); 9308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return true; 94d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn } 9508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return false; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 99cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler public PanelView selectPanelForTouchX(float x) { 1005a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (mFullWidthNotifications) { 1015a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (DEBUG) { 1025a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler Slog.v(TAG, "notif frac=" + mNotificationPanel.getExpandedFraction()); 1035a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler } 10467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler return (mNotificationPanel.getExpandedFraction() > 0f) 1055a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler ? mSettingsPanel : mNotificationPanel; 1065a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler } 1075a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1085a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler // We split the status bar into thirds: the left 2/3 are for notifications, and the 109cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler // right 1/3 for quick settings. If you pull the status bar down a second time you'll 110cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler // toggle panels no matter where you pull it down. 1115a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 11267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler final float w = getMeasuredWidth(); 1135a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler float region = (w * mSettingsPanelDragzoneFrac); 1145a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1155a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (DEBUG) { 1165a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler Slog.v(TAG, String.format( 1175a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler "w=%.1f frac=%.3f region=%.1f min=%.1f x=%.1f w-x=%.1f", 1185a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler w, mSettingsPanelDragzoneFrac, region, mSettingsPanelDragzoneMin, x, (w-x))); 119cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 1205a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1215a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (region < mSettingsPanelDragzoneMin) region = mSettingsPanelDragzoneMin; 1225a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1235a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler return (w - x < region) ? mSettingsPanel : mNotificationPanel; 124cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 125cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler 126cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler @Override 12708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void onPanelPeeked() { 12808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super.onPanelPeeked(); 12908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar.makeExpandedVisible(true); 13067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler } 13167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler 13267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler @Override 13367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler public void startOpeningPanel(PanelView panel) { 13467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler super.startOpeningPanel(panel); 13567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler // we only want to start fading if this is the "first" or "last" panel, 13667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler // which is kind of tricky to determine 13767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler mShouldFade = (mFadingPanel == null || mFadingPanel.isFullyExpanded()); 13867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG) { 13967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler Slog.v(TAG, "start opening: " + panel + " shouldfade=" + mShouldFade); 1408e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler } 14167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler mFadingPanel = panel; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 144d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn @Override 14508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void onAllPanelsCollapsed() { 14608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super.onAllPanelsCollapsed(); 14708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar.makeExpandedInvisible(); 1488e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler mFadingPanel = null; 149bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt mLastFullyOpenedPanel = null; 1508e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler } 1518e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler 1528e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler @Override 1538e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler public void onPanelFullyOpened(PanelView openPanel) { 154750bb9bff9fccf94f4bbf5945e10ce3f76534e7fDaniel Sandler super.onPanelFullyOpened(openPanel); 155bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt if (openPanel != mLastFullyOpenedPanel) { 156bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt openPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 157bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt } 1588e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler mFadingPanel = openPanel; 159bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt mLastFullyOpenedPanel = openPanel; 16067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler mShouldFade = true; // now you own the fade, mister 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTouchEvent(MotionEvent event) { 16508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return mBar.interceptTouchEvent(event) || super.onTouchEvent(event); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onInterceptTouchEvent(MotionEvent event) { 17008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1736179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 17467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler public void panelExpansionChanged(PanelView panel, float frac) { 17567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler super.panelExpansionChanged(panel, frac); 17608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 177198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler if (DEBUG) { 178198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler Slog.v(TAG, "panelExpansionChanged: f=" + frac); 179198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler } 180198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler 18167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (panel == mFadingPanel && mScrimColor != 0 && ActivityManager.isHighEndGfx()) { 18267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (mShouldFade) { 18367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler frac = mPanelExpandedFractionSum; // don't judge me 18467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler // woo, special effects 18567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2.2f)))); 18667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler // attenuate background color alpha by k 18767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler final int color = (int) ((mScrimColor >>> 24) * k) << 24 | (mScrimColor & 0xFFFFFF); 18867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler mBar.mStatusBarWindow.setBackgroundColor(color); 18967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler } 1906179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 19108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 19208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar.updateCarrierLabelVisibility(false); 1936179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 1946179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov} 195