• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 package com.android.systemui.statusbar.notification.stack.ui.view
18 
19 import android.content.Context
20 import android.util.AttributeSet
21 import android.view.View
22 import androidx.constraintlayout.core.widgets.Optimizer
23 import androidx.constraintlayout.widget.ConstraintLayout
24 import androidx.constraintlayout.widget.ConstraintSet
25 import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
26 import androidx.constraintlayout.widget.ConstraintSet.END
27 import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
28 import androidx.constraintlayout.widget.ConstraintSet.START
29 import androidx.constraintlayout.widget.ConstraintSet.TOP
30 import androidx.constraintlayout.widget.ConstraintSet.VERTICAL
31 import com.android.systemui.res.R
32 import com.android.systemui.scene.shared.flag.SceneContainerFlag
33 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel.HorizontalPosition
34 
35 /**
36  * Container for the stack scroller, so that the bounds can be externally specified, such as from
37  * the keyguard or shade scenes.
38  */
39 class SharedNotificationContainer(context: Context, attrs: AttributeSet?) :
40     ConstraintLayout(context, attrs) {
41 
42     private val baseConstraintSet = ConstraintSet()
43 
44     init {
45         optimizationLevel = optimizationLevel or Optimizer.OPTIMIZATION_GRAPH
<lambda>null46         baseConstraintSet.apply {
47             create(R.id.nssl_guideline, VERTICAL)
48             setGuidelinePercent(R.id.nssl_guideline, 0.5f)
49         }
50         baseConstraintSet.applyTo(this)
51     }
52 
addNotificationStackScrollLayoutnull53     fun addNotificationStackScrollLayout(nssl: View) {
54         addView(nssl)
55     }
56 
updateConstraintsnull57     fun updateConstraints(
58         horizontalPosition: HorizontalPosition,
59         marginStart: Int,
60         marginTop: Int,
61         marginEnd: Int,
62         marginBottom: Int,
63         nsslAlpha: Float,
64     ) {
65         val constraintSet = ConstraintSet()
66         constraintSet.clone(baseConstraintSet)
67 
68         val startConstraintId =
69             if (horizontalPosition is HorizontalPosition.MiddleToEdge) {
70                 R.id.nssl_guideline
71             } else {
72                 PARENT_ID
73             }
74 
75         val nsslId = R.id.notification_stack_scroller
76         constraintSet.apply {
77             if (SceneContainerFlag.isEnabled) {
78                 when (horizontalPosition) {
79                     is HorizontalPosition.FloatAtStart ->
80                         constrainWidth(nsslId, horizontalPosition.width)
81                     is HorizontalPosition.MiddleToEdge ->
82                         setGuidelinePercent(R.id.nssl_guideline, horizontalPosition.ratio)
83                     else -> Unit
84                 }
85             }
86 
87             // Constraint layout sets the alpha to 1 if it's not set explicitly in the constraint
88             // set. Let's keep the current nssl alpha instead, otherwise this might interfere with
89             // animations.
90             setAlpha(nsslId, nsslAlpha)
91             connect(nsslId, START, startConstraintId, START, marginStart)
92             if (
93                 !SceneContainerFlag.isEnabled ||
94                     horizontalPosition !is HorizontalPosition.FloatAtStart
95             ) {
96                 connect(nsslId, END, PARENT_ID, END, marginEnd)
97             }
98             connect(nsslId, BOTTOM, PARENT_ID, BOTTOM, marginBottom)
99             connect(nsslId, TOP, PARENT_ID, TOP, marginTop)
100         }
101         constraintSet.applyTo(this)
102     }
103 }
104