NotificationsQuickSettingsContainer.java revision 46767b77c004a3541c614f8e21d6a871dd148e54
1d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi/* 2d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * Copyright (C) 2014 The Android Open Source Project 3d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * 4d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * you may not use this file except in compliance with the License. 6d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * You may obtain a copy of the License at 7d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * 8d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * 10d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * Unless required by applicable law or agreed to in writing, software 11d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * See the License for the specific language governing permissions and 14d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * limitations under the License 15d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi */ 16d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi 17d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggipackage com.android.systemui.statusbar.phone; 18d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi 19d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggiimport android.content.Context; 20bef6de8b3fafea4453e28ecd419561563fcae771Jason Monkimport android.content.res.Configuration; 21bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggiimport android.graphics.Canvas; 22d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggiimport android.util.AttributeSet; 23bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggiimport android.view.View; 24bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggiimport android.view.ViewStub; 25e070018b3e26371e1260229060d022808e43837eJorim Jaggiimport android.view.WindowInsets; 26d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggiimport android.widget.FrameLayout; 2746767b77c004a3541c614f8e21d6a871dd148e54Jason Monk 289b1fdff2e70e695a0104dbc63fc26e434dc7f188Clara Bayarriimport com.android.systemui.AutoReinflateContainer; 29bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggiimport com.android.systemui.R; 3046767b77c004a3541c614f8e21d6a871dd148e54Jason Monkimport com.android.systemui.plugins.qs.QSContainer; 31bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi 32d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi/** 33d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi * The container with notification stack scroller and quick settings inside. 34d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi */ 35bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggipublic class NotificationsQuickSettingsContainer extends FrameLayout 369b1fdff2e70e695a0104dbc63fc26e434dc7f188Clara Bayarri implements ViewStub.OnInflateListener, AutoReinflateContainer.InflateListener { 37bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi 38428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk 399b1fdff2e70e695a0104dbc63fc26e434dc7f188Clara Bayarri private AutoReinflateContainer mQsContainer; 40bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi private View mUserSwitcher; 41bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi private View mStackScroller; 42bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi private View mKeyguardStatusBar; 43bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi private boolean mInflated; 44b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek private boolean mQsExpanded; 458b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk private boolean mCustomizerAnimating; 46d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi 47428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk private int mBottomPadding; 48428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk private int mStackScrollerMargin; 49428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk 50d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi public NotificationsQuickSettingsContainer(Context context, AttributeSet attrs) { 51d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi super(context, attrs); 52d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi } 53d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi 54d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi @Override 55bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi protected void onFinishInflate() { 56bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi super.onFinishInflate(); 579b1fdff2e70e695a0104dbc63fc26e434dc7f188Clara Bayarri mQsContainer = (AutoReinflateContainer) findViewById(R.id.qs_auto_reinflate_container); 588b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk mQsContainer.addInflateListener(this); 59bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi mStackScroller = findViewById(R.id.notification_stack_scroller); 60428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk mStackScrollerMargin = ((LayoutParams) mStackScroller.getLayoutParams()).bottomMargin; 61bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi mKeyguardStatusBar = findViewById(R.id.keyguard_header); 62bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi ViewStub userSwitcher = (ViewStub) findViewById(R.id.keyguard_user_switcher); 63bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi userSwitcher.setOnInflateListener(this); 64bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi mUserSwitcher = userSwitcher; 65bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi } 66bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi 67bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi @Override 68bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk protected void onConfigurationChanged(Configuration newConfig) { 69bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk super.onConfigurationChanged(newConfig); 7016ac3774e394d50600079697ea867a3c847ebd95Jason Monk reloadWidth(mQsContainer); 71bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk reloadWidth(mStackScroller); 72bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk } 73bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk 74bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk private void reloadWidth(View view) { 75bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk LayoutParams params = (LayoutParams) view.getLayoutParams(); 76bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk params.width = getContext().getResources().getDimensionPixelSize( 77bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk R.dimen.notification_panel_width); 78bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk view.setLayoutParams(params); 79bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk } 80bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk 81bef6de8b3fafea4453e28ecd419561563fcae771Jason Monk @Override 82e070018b3e26371e1260229060d022808e43837eJorim Jaggi public WindowInsets onApplyWindowInsets(WindowInsets insets) { 83428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk mBottomPadding = insets.getStableInsetBottom(); 84428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk setPadding(0, 0, 0, mBottomPadding); 85e070018b3e26371e1260229060d022808e43837eJorim Jaggi return insets; 86d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi } 87bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi 88bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi @Override 89bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi protected boolean drawChild(Canvas canvas, View child, long drawingTime) { 90bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi boolean userSwitcherVisible = mInflated && mUserSwitcher.getVisibility() == View.VISIBLE; 91bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi boolean statusBarVisible = mKeyguardStatusBar.getVisibility() == View.VISIBLE; 92bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi 938b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk final boolean qsBottom = mQsExpanded && !mCustomizerAnimating; 948b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk View stackQsTop = qsBottom ? mStackScroller : mQsContainer; 958b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk View stackQsBottom = !qsBottom ? mStackScroller : mQsContainer; 96bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi // Invert the order of the scroll view and user switcher such that the notifications receive 97bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi // touches first but the panel gets drawn above. 9816ac3774e394d50600079697ea867a3c847ebd95Jason Monk if (child == mQsContainer) { 99b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek return super.drawChild(canvas, userSwitcherVisible && statusBarVisible ? mUserSwitcher 100bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi : statusBarVisible ? mKeyguardStatusBar 101bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi : userSwitcherVisible ? mUserSwitcher 102b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek : stackQsBottom, drawingTime); 103b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek } else if (child == mStackScroller) { 104b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek return super.drawChild(canvas, 105b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek userSwitcherVisible && statusBarVisible ? mKeyguardStatusBar 106b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek : statusBarVisible || userSwitcherVisible ? stackQsBottom 107b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek : stackQsTop, 108bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi drawingTime); 109bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi } else if (child == mUserSwitcher) { 110bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi return super.drawChild(canvas, 111b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek userSwitcherVisible && statusBarVisible ? stackQsBottom 112b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek : stackQsTop, 113bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi drawingTime); 114bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi } else if (child == mKeyguardStatusBar) { 115bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi return super.drawChild(canvas, 116b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek stackQsTop, 117bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi drawingTime); 11816ac3774e394d50600079697ea867a3c847ebd95Jason Monk } else { 119bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi return super.drawChild(canvas, child, drawingTime); 120bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi } 121bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi } 122bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi 123bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi @Override 124bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi public void onInflate(ViewStub stub, View inflated) { 125bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi if (stub == mUserSwitcher) { 126bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi mUserSwitcher = inflated; 127bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi mInflated = true; 128bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi } 129bc976e3f4c79a8565ec625564c92d316825f26a7Jorim Jaggi } 130b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek 1318b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk @Override 1328b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk public void onInflated(View v) { 13346767b77c004a3541c614f8e21d6a871dd148e54Jason Monk QSContainer container = (QSContainer) v; 13446767b77c004a3541c614f8e21d6a871dd148e54Jason Monk container.setContainer(this); 1358b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk } 1368b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk 137b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek public void setQsExpanded(boolean expanded) { 138b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek if (mQsExpanded != expanded) { 139b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek mQsExpanded = expanded; 140b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek invalidate(); 141b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek } 142b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek } 1438b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk 1448b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk public void setCustomizerAnimating(boolean isAnimating) { 1458b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk if (mCustomizerAnimating != isAnimating) { 1468b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk mCustomizerAnimating = isAnimating; 1478b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk invalidate(); 1488b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk } 1498b9d67fb636a89fe6537e7affb9d01a75f263d93Jason Monk } 150428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk 151428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk public void setCustomizerShowing(boolean isShowing) { 152428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk if (isShowing) { 153428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk // Clear out bottom paddings/margins so the qs customization can be full height. 154428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk setPadding(0, 0, 0, 0); 155428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk setBottomMargin(mStackScroller, 0); 156428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk } else { 157428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk setPadding(0, 0, 0, mBottomPadding); 158428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk setBottomMargin(mStackScroller, mStackScrollerMargin); 159428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk } 160428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk 161428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk } 162428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk 163428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk private void setBottomMargin(View v, int bottomMargin) { 164428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk LayoutParams params = (LayoutParams) v.getLayoutParams(); 165428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk params.bottomMargin = bottomMargin; 166428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk v.setLayoutParams(params); 167428914d0f07f4a0d5b55c4de7ec30708505bd21fJason Monk } 168d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi} 169