1 /* 2 * Copyright (C) 2022 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 package com.android.systemui.shade 17 18 import androidx.constraintlayout.widget.ConstraintSet 19 20 typealias ConstraintChange = ConstraintSet.() -> Unit 21 22 operator fun ConstraintChange?.plus(other: ConstraintChange?): ConstraintChange? { 23 // Prevent wrapping 24 if (this == null) return other 25 if (other == null) return this 26 else return { 27 this@plus() 28 other() 29 } 30 } 31 32 /** 33 * Contains all changes that need to be performed to the different [ConstraintSet] in 34 * [ShadeHeaderController]. 35 */ 36 data class ConstraintsChanges( 37 val qqsConstraintsChanges: ConstraintChange? = null, 38 val qsConstraintsChanges: ConstraintChange? = null, 39 val largeScreenConstraintsChanges: ConstraintChange? = null 40 ) { 41 operator fun plus(other: ConstraintsChanges) = ConstraintsChanges( 42 qqsConstraintsChanges + other.qqsConstraintsChanges, 43 qsConstraintsChanges + other.qsConstraintsChanges, 44 largeScreenConstraintsChanges + other.largeScreenConstraintsChanges 45 ) 46 } 47 48 /** 49 * Determines [ConstraintChanges] for [ShadeHeaderController] based on configurations. 50 * 51 * Given that the number of different scenarios is not that large, having specific methods instead 52 * of a full map between state and [ConstraintSet] was preferred. 53 */ 54 interface CombinedShadeHeadersConstraintManager { 55 /** 56 * Changes for when the visibility of the privacy chip changes 57 */ 58 fun privacyChipVisibilityConstraints(visible: Boolean): ConstraintsChanges 59 60 /** 61 * Changes for situations with no top center cutout (there may be a corner cutout) 62 */ 63 fun emptyCutoutConstraints(): ConstraintsChanges 64 65 /** 66 * Changes to incorporate side insets due to rounded corners/corner cutouts 67 */ 68 fun edgesGuidelinesConstraints( 69 cutoutStart: Int, 70 paddingStart: Int, 71 cutoutEnd: Int, 72 paddingEnd: Int 73 ): ConstraintsChanges 74 75 /** 76 * Changes for situations with top center cutout (in this case, there are no corner cutouts). 77 */ 78 fun centerCutoutConstraints(rtl: Boolean, offsetFromEdge: Int): ConstraintsChanges 79 } 80