PhoneStatusBarView.java revision 5a8aefa6c8ab2f129bc6477a49cd0876ec5d72fa
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; 22d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackbornimport android.content.res.Configuration; 231c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandlerimport android.content.res.Resources; 245a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandlerimport android.content.res.Resources.NotFoundException; 25d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackbornimport android.graphics.Canvas; 261c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandlerimport android.graphics.Color; 27119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onoratoimport android.graphics.Rect; 28d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackbornimport android.os.SystemClock; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 30a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackbornimport android.util.Log; 31198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport android.util.Slog; 32c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.view.KeyEvent; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewParent; 376179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.FrameLayout; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratoimport com.android.systemui.R; 410c8275b392344c24bb621b2a8af360f48a6459f9Chris Wrenimport com.android.systemui.statusbar.BaseStatusBar; 42fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.statusbar.policy.FixedSizeDrawable; 4379de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onorato 4408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PhoneStatusBarView extends PanelBar { 45fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private static final String TAG = "PhoneStatusBarView"; 46198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler private static final boolean DEBUG = PhoneStatusBar.DEBUG; 47198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler 4808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler PhoneStatusBar mBar; 491c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler int mScrimColor; 505a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler float mSettingsPanelDragzoneFrac; 515a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler float mSettingsPanelDragzoneMin; 525a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 53b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren boolean mFullWidthNotifications; 548e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler PanelView mFadingPanel = null; 55cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler PanelView mNotificationPanel, mSettingsPanel; 56119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onorato 57fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato public PhoneStatusBarView(Context context, AttributeSet attrs) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void setBar(PhoneStatusBar bar) { 6208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar = bar; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 661c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler public void onAttachedToWindow() { 671c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler Resources res = getContext().getResources(); 681c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler mScrimColor = res.getColor(R.color.notification_panel_scrim_color); 695a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mSettingsPanelDragzoneMin = res.getDimension(R.dimen.settings_panel_dragzone_min); 70b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren try { 715a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mSettingsPanelDragzoneFrac = res.getFraction(R.dimen.settings_panel_dragzone_fraction, 1, 1); 725a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler } catch (NotFoundException ex) { 735a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mSettingsPanelDragzoneFrac = 0f; 74b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren } 755a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 765a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler mFullWidthNotifications = mSettingsPanelDragzoneFrac <= 0f; 771c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler } 781c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler 791c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler @Override 80cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler public void addPanel(PanelView pv) { 81cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler super.addPanel(pv); 82cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler if (pv.getId() == R.id.notification_panel) { 83cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler mNotificationPanel = pv; 84cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } else if (pv.getId() == R.id.settings_panel){ 85cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler mSettingsPanel = pv; 86cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 87cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 88cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler 89cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler @Override 905050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler public boolean panelsEnabled() { 911e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler return ((mBar.mDisabled & StatusBarManager.DISABLE_EXPAND) == 0); 921e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler } 931e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler 941e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler @Override 9508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { 9608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler if (super.onRequestSendAccessibilityEvent(child, event)) { 9708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // The status bar is very small so augment the view that the user is touching 9808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // with the content of the status bar a whole. This way an accessibility service 9908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // may announce the current item as well as the entire content if appropriate. 10008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler AccessibilityEvent record = AccessibilityEvent.obtain(); 10108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler onInitializeAccessibilityEvent(record); 10208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler dispatchPopulateAccessibilityEvent(record); 10308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler event.appendRecord(record); 10408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return true; 105d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn } 10608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return false; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 110cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler public PanelView selectPanelForTouchX(float x) { 1115a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (mFullWidthNotifications) { 1125a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (DEBUG) { 1135a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler Slog.v(TAG, "notif frac=" + mNotificationPanel.getExpandedFraction()); 1145a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler } 1155a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler return (mNotificationPanel.getExpandedFraction() == 1.0f) 1165a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler ? mSettingsPanel : mNotificationPanel; 1175a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler } 1185a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1195a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler // We split the status bar into thirds: the left 2/3 are for notifications, and the 120cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler // right 1/3 for quick settings. If you pull the status bar down a second time you'll 121cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler // toggle panels no matter where you pull it down. 1225a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 123cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler final float w = (float) getMeasuredWidth(); 1245a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler float region = (w * mSettingsPanelDragzoneFrac); 1255a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1265a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (DEBUG) { 1275a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler Slog.v(TAG, String.format( 1285a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler "w=%.1f frac=%.3f region=%.1f min=%.1f x=%.1f w-x=%.1f", 1295a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler w, mSettingsPanelDragzoneFrac, region, mSettingsPanelDragzoneMin, x, (w-x))); 130cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 1315a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1325a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (region < mSettingsPanelDragzoneMin) region = mSettingsPanelDragzoneMin; 1335a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 1345a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler return (w - x < region) ? mSettingsPanel : mNotificationPanel; 135cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler } 136cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler 137cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler @Override 13808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void onPanelPeeked() { 13908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super.onPanelPeeked(); 14008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar.makeExpandedVisible(true); 1418e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler if (mFadingPanel == null) { 1428e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler mFadingPanel = mTouchingPanel; 1438e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 146d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn @Override 14708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void onAllPanelsCollapsed() { 14808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super.onAllPanelsCollapsed(); 14908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar.makeExpandedInvisible(); 1508e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler mFadingPanel = null; 1518e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler } 1528e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler 1538e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler @Override 1548e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler public void onPanelFullyOpened(PanelView openPanel) { 1558e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler mFadingPanel = openPanel; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTouchEvent(MotionEvent event) { 16008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return mBar.interceptTouchEvent(event) || super.onTouchEvent(event); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onInterceptTouchEvent(MotionEvent event) { 16508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1686179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 16908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void panelExpansionChanged(PanelView pv, float frac) { 17008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super.panelExpansionChanged(pv, frac); 17108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 172198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler if (DEBUG) { 173198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler Slog.v(TAG, "panelExpansionChanged: f=" + frac); 174198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler } 175198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler 1765a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler if (mFadingPanel == pv 17798365d7663cbd82979a5700faf0050220b01084dJeff Brown && mScrimColor != 0 && ActivityManager.isHighEndGfx()) { 17808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // woo, special effects 17908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2.2f)))); 1801c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler // attenuate background color alpha by k 1811c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler final int color = (int) ((float)(mScrimColor >>> 24) * k) << 24 | (mScrimColor & 0xFFFFFF); 18208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar.mStatusBarWindow.setBackgroundColor(color); 1836179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 18408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 18508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler mBar.updateCarrierLabelVisibility(false); 1866179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 18708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 18808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 1896179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov} 190