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