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