PhoneStatusBarView.java revision 6a4fa0ec183e20c32e7816f5475e72fa9126356c
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 19058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport static android.content.res.Configuration.ORIENTATION_PORTRAIT; 20058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 216a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roosimport static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection; 226a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roos 23058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport android.annotation.Nullable; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 25058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport android.content.res.Configuration; 26058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport android.graphics.Rect; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 2864161ccb2f3341ebe1675e38a999250c7967d0adChris Wrenimport android.util.EventLog; 29058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport android.view.DisplayCutout; 306a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roosimport android.view.Gravity; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 333e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinekimport android.view.ViewGroup; 346179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 3564161ccb2f3341ebe1675e38a999250c7967d0adChris Wren 36058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport android.widget.FrameLayout; 37058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport android.widget.LinearLayout; 38aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monkimport com.android.systemui.Dependency; 3964161ccb2f3341ebe1675e38a999250c7967d0adChris Wrenimport com.android.systemui.EventLogTags; 403e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinekimport com.android.systemui.R; 41aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monkimport com.android.systemui.statusbar.policy.DarkIconDispatcher; 42aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monkimport com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver; 43058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Lairdimport com.android.systemui.util.leak.RotationUtils; 4479de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onorato 4508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PhoneStatusBarView extends PanelBar { 46fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato private static final String TAG = "PhoneStatusBarView"; 472a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk private static final boolean DEBUG = StatusBar.DEBUG; 48934025e8d79975444d8b93cf6a18c7d98760b3adChristoph Studer private static final boolean DEBUG_GESTURES = false; 49058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private static final int NO_VALUE = Integer.MIN_VALUE; 50198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler 512a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk StatusBar mBar; 525a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler 539f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen boolean mIsFullyOpenedPanel = false; 547edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock private final PhoneStatusBarTransitions mBarTransitions; 55ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private ScrimController mScrimController; 563d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek private float mMinFraction; 573d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek private float mPanelFraction; 5880c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek private Runnable mHideExpandedRunnable = new Runnable() { 5980c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek @Override 6080c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek public void run() { 61529c5325f0e5cd3cf97fd7431d8dc9e79d7a627fSelim Cinek if (mPanelFraction == 0.0f) { 62529c5325f0e5cd3cf97fd7431d8dc9e79d7a627fSelim Cinek mBar.makeExpandedInvisible(); 63529c5325f0e5cd3cf97fd7431d8dc9e79d7a627fSelim Cinek } 6480c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek } 6580c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek }; 66aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk private DarkReceiver mBattery; 67058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private int mLastOrientation; 68cda685dbe377639b2bc3051bac37e7cb0778e2a3Evan Laird @Nullable 69058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private View mCutoutSpace; 70058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird @Nullable 71058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private DisplayCutout mDisplayCutout; 72119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onorato 73fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato public PhoneStatusBarView(Context context, AttributeSet attrs) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 767edfbca5d00cbc376fda790b50a3fedb9c6070abJohn Spurlock mBarTransitions = new PhoneStatusBarTransitions(this); 77e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock } 78e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock 79e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock public BarTransitions getBarTransitions() { 80e932e30eadb5978591316ffe3d21d60604c0cd91John Spurlock return mBarTransitions; 811c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler } 821c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler 832a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk public void setBar(StatusBar bar) { 84efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler mBar = bar; 85efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler } 86efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler 87ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setScrimController(ScrimController scrimController) { 88ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimController = scrimController; 89ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 90ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 91efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler @Override 92acea100015dffbb77d137b0681d6c34992e72ae9Jorim Jaggi public void onFinishInflate() { 93e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock mBarTransitions.init(); 9451efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette mBattery = findViewById(R.id.battery); 95058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird mCutoutSpace = findViewById(R.id.cutout_space_view); 96aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk } 97aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk 98aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk @Override 99aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk protected void onAttachedToWindow() { 100aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk super.onAttachedToWindow(); 101aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk // Always have Battery meters in the status bar observe the dark/light modes. 102aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mBattery); 103058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (updateOrientationAndCutout(getResources().getConfiguration().orientation)) { 104058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird postUpdateLayoutForCutout(); 105058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 106aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk } 107aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk 108aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk @Override 109aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk protected void onDetachedFromWindow() { 110aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk super.onDetachedFromWindow(); 111aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mBattery); 112058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird mDisplayCutout = null; 113058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 114058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 115058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird @Override 116058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird protected void onConfigurationChanged(Configuration newConfig) { 117058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird super.onConfigurationChanged(newConfig); 118058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 119058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird // May trigger cutout space layout-ing 120058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (updateOrientationAndCutout(newConfig.orientation)) { 121058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird postUpdateLayoutForCutout(); 122058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 123058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 124058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 125058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird /** 126058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird * 127058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird * @param newOrientation may pass NO_VALUE for no change 128058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird * @return boolean indicating if we need to update the cutout location / margins 129058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird */ 130058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private boolean updateOrientationAndCutout(int newOrientation) { 131058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird boolean changed = false; 132058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (newOrientation != NO_VALUE) { 133058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (mLastOrientation != newOrientation) { 134058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird changed = true; 135058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird mLastOrientation = newOrientation; 136058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 137058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 138058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 139058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (mDisplayCutout == null) { 140058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird DisplayCutout cutout = getRootWindowInsets().getDisplayCutout(); 141058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (cutout != null) { 142058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird changed = true; 143058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird mDisplayCutout = cutout; 144058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 145058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 146058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 147058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird return changed; 148efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler } 149efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler 1501c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler @Override 1519f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen public boolean panelEnabled() { 1529764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock return mBar.panelsEnabled(); 1531e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler } 1541e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler 1551e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler @Override 156a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) { 1575b0467522c8fd2e17d688e04ec592bdba9f2f012Alan Viverette if (super.onRequestSendAccessibilityEventInternal(child, event)) { 15808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // The status bar is very small so augment the view that the user is touching 15908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // with the content of the status bar a whole. This way an accessibility service 16008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler // may announce the current item as well as the entire content if appropriate. 16108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler AccessibilityEvent record = AccessibilityEvent.obtain(); 16208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler onInitializeAccessibilityEvent(record); 16308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler dispatchPopulateAccessibilityEvent(record); 16408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler event.appendRecord(record); 16508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return true; 166d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn } 16708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return false; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void onPanelPeeked() { 17208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super.onPanelPeeked(); 173fa505a7f26bdf685c701e92b481602eb59d7ff56Jorim Jaggi mBar.makeExpandedVisible(false); 17467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler } 17567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler 17667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler @Override 1779f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen public void onPanelCollapsed() { 1789f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen super.onPanelCollapsed(); 1792580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi // Close the status bar in the next frame so we can show the end of the animation. 18045e2d8faed70252f8c5535ed9dee903b45f60ac1Jorim Jaggi post(mHideExpandedRunnable); 1819f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen mIsFullyOpenedPanel = false; 1828e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler } 1838e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler 18480c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek public void removePendingHideExpandedRunnables() { 18545e2d8faed70252f8c5535ed9dee903b45f60ac1Jorim Jaggi removeCallbacks(mHideExpandedRunnable); 18680c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek } 18780c2abe5bb896bd31509b201428208dd4fce8c76Selim Cinek 1888e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler @Override 1899f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen public void onPanelFullyOpened() { 1909f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen super.onPanelFullyOpened(); 1919f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen if (!mIsFullyOpenedPanel) { 1929f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen mPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 193bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt } 1949f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen mIsFullyOpenedPanel = true; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTouchEvent(MotionEvent event) { 19964161ccb2f3341ebe1675e38a999250c7967d0adChris Wren boolean barConsumedEvent = mBar.interceptTouchEvent(event); 20064161ccb2f3341ebe1675e38a999250c7967d0adChris Wren 20164161ccb2f3341ebe1675e38a999250c7967d0adChris Wren if (DEBUG_GESTURES) { 20264161ccb2f3341ebe1675e38a999250c7967d0adChris Wren if (event.getActionMasked() != MotionEvent.ACTION_MOVE) { 20364161ccb2f3341ebe1675e38a999250c7967d0adChris Wren EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH, 20464161ccb2f3341ebe1675e38a999250c7967d0adChris Wren event.getActionMasked(), (int) event.getX(), (int) event.getY(), 20564161ccb2f3341ebe1675e38a999250c7967d0adChris Wren barConsumedEvent ? 1 : 0); 20664161ccb2f3341ebe1675e38a999250c7967d0adChris Wren } 20764161ccb2f3341ebe1675e38a999250c7967d0adChris Wren } 20864161ccb2f3341ebe1675e38a999250c7967d0adChris Wren 20964161ccb2f3341ebe1675e38a999250c7967d0adChris Wren return barConsumedEvent || super.onTouchEvent(event); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2139f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen public void onTrackingStarted() { 2149f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen super.onTrackingStarted(); 215e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi mBar.onTrackingStarted(); 216ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimController.onTrackingStarted(); 217529c5325f0e5cd3cf97fd7431d8dc9e79d7a627fSelim Cinek removePendingHideExpandedRunnables(); 218e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi } 219e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi 220e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi @Override 221dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek public void onClosingFinished() { 222dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek super.onClosingFinished(); 223dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek mBar.onClosingFinished(); 224dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek } 225dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek 226dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek @Override 2279f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen public void onTrackingStopped(boolean expand) { 2289f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen super.onTrackingStopped(expand); 2292fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mBar.onTrackingStopped(expand); 2302fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi } 2312fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi 2322fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi @Override 2332fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi public void onExpandingFinished() { 2342fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi super.onExpandingFinished(); 2352fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mScrimController.onExpandingFinished(); 236e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi } 237e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi 238e70d31f48d1c123544eb5e72b7b007d81ae8d8c9Jorim Jaggi @Override 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onInterceptTouchEvent(MotionEvent event) { 24008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2436179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 2443d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek public void panelScrimMinFractionChanged(float minFraction) { 2453d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek if (mMinFraction != minFraction) { 2463d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek mMinFraction = minFraction; 2473d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek updateScrimFraction(); 2483d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek } 2493d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek } 2503d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek 2513d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek @Override 2529f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen public void panelExpansionChanged(float frac, boolean expanded) { 2539f96711e1adf4a28f961c440da1626ad40c03bc8Xiaohui Chen super.panelExpansionChanged(frac, expanded); 2543d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek mPanelFraction = frac; 2553d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek updateScrimFraction(); 25678f88d10ba61ebe25457aaeefc88b8a2460998e4Matthew Ng if ((frac == 0 || frac == 1) && mBar.getNavigationBarView() != null) { 25778f88d10ba61ebe25457aaeefc88b8a2460998e4Matthew Ng mBar.getNavigationBarView().onPanelExpandedChange(expanded); 25878f88d10ba61ebe25457aaeefc88b8a2460998e4Matthew Ng } 2593d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek } 2603d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek 2613d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek private void updateScrimFraction() { 262ae76b4c2f71ee6c2ad5f8d5c266f0addaf487f20Selim Cinek float scrimFraction = mPanelFraction; 263ae76b4c2f71ee6c2ad5f8d5c266f0addaf487f20Selim Cinek if (mMinFraction < 1.0f) { 264ae76b4c2f71ee6c2ad5f8d5c266f0addaf487f20Selim Cinek scrimFraction = Math.max((mPanelFraction - mMinFraction) / (1.0f - mMinFraction), 265ae76b4c2f71ee6c2ad5f8d5c266f0addaf487f20Selim Cinek 0); 266ae76b4c2f71ee6c2ad5f8d5c266f0addaf487f20Selim Cinek } 2673d395c69fa67732ceb2c045d03ea81efa3710afaSelim Cinek mScrimController.setPanelExpansion(scrimFraction); 2686179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2693e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek 27022af65082cd9faf7bd689097b87626e6929ab5b0Adrian Roos public void updateResources() { 2713e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek ViewGroup.LayoutParams layoutParams = getLayoutParams(); 2723e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek layoutParams.height = getResources().getDimensionPixelSize( 2733e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek R.dimen.status_bar_height); 2743e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek setLayoutParams(layoutParams); 2753e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek } 276058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 277058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private void updateLayoutForCutout() { 278058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird updateCutoutLocation(); 279058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird updateSafeInsets(); 280058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 281058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 282058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private void postUpdateLayoutForCutout() { 283058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird Runnable r = new Runnable() { 284058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird @Override 285058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird public void run() { 286058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird updateLayoutForCutout(); 287058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 288058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird }; 289058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird // Let the cutout emulation draw first 290058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird postDelayed(r, 0); 291058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 292058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 293058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private void updateCutoutLocation() { 294cda685dbe377639b2bc3051bac37e7cb0778e2a3Evan Laird // Not all layouts have a cutout (e.g., Car) 295cda685dbe377639b2bc3051bac37e7cb0778e2a3Evan Laird if (mCutoutSpace == null) { 296cda685dbe377639b2bc3051bac37e7cb0778e2a3Evan Laird return; 297cda685dbe377639b2bc3051bac37e7cb0778e2a3Evan Laird } 298cda685dbe377639b2bc3051bac37e7cb0778e2a3Evan Laird 299058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (mDisplayCutout == null || mDisplayCutout.isEmpty() 300058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird || mLastOrientation != ORIENTATION_PORTRAIT) { 301058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird mCutoutSpace.setVisibility(View.GONE); 302058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird return; 303058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 304058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 305058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird mCutoutSpace.setVisibility(View.VISIBLE); 306058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mCutoutSpace.getLayoutParams(); 3076a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roos 3086a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roos Rect bounds = new Rect(); 3096a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roos boundsFromDirection(mDisplayCutout, Gravity.TOP, bounds); 3106a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roos 3116a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roos lp.width = bounds.width(); 3126a4fa0ec183e20c32e7816f5475e72fa9126356cAdrian Roos lp.height = bounds.height(); 313058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 314058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 315058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private void updateSafeInsets() { 316058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird // Depending on our rotation, we may have to work around a cutout in the middle of the view, 317058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird // or letterboxing from the right or left sides. 318058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 319058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); 320058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (mDisplayCutout == null || mDisplayCutout.isEmpty()) { 321058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird lp.leftMargin = 0; 322058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird lp.rightMargin = 0; 323058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird return; 324058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 325058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 326058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird int leftMargin = 0; 327058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird int rightMargin = 0; 328058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird switch (RotationUtils.getRotation(getContext())) { 329058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird /* 330058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird * Landscape: <-| 331058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird * Seascape: |-> 332058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird */ 333058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird case RotationUtils.ROTATION_LANDSCAPE: 334058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird leftMargin = getDisplayCutoutHeight(); 335058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird break; 336058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird case RotationUtils.ROTATION_SEASCAPE: 337058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird rightMargin = getDisplayCutoutHeight(); 338058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird break; 339058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird default: 340058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird break; 341058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 342058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 343058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird lp.leftMargin = leftMargin; 344058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird lp.rightMargin = rightMargin; 345058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 346058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 347058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird //TODO: Find a better way 348058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird private int getDisplayCutoutHeight() { 349058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird if (mDisplayCutout == null || mDisplayCutout.isEmpty()) { 350058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird return 0; 351058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 352058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird 353058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird Rect r = mDisplayCutout.getBoundingRect(); 354058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird return r.bottom - r.top; 355058c8aee39927bc9f0df35e0274e7aede59d8b56Evan Laird } 3566179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov} 357