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 
17 package com.android.systemui.shade.transition
18 
19 import com.android.systemui.dagger.SysUISingleton
20 import com.android.systemui.dump.DumpManager
21 import com.android.systemui.shade.PanelState
22 import com.android.systemui.shade.ShadeExpansionChangeEvent
23 import com.android.systemui.statusbar.phone.ScrimController
24 import java.io.PrintWriter
25 import javax.inject.Inject
26 
27 /** Controls the scrim properties during the shade expansion transition on non-lockscreen. */
28 @SysUISingleton
29 class ScrimShadeTransitionController
30 @Inject
31 constructor(
32     dumpManager: DumpManager,
33     private val scrimController: ScrimController,
34 ) {
35 
36     private var lastExpansionFraction: Float? = null
37     private var lastExpansionEvent: ShadeExpansionChangeEvent? = null
38     private var currentPanelState: Int? = null
39 
40     init {
41         dumpManager.registerDumpable(
42             ScrimShadeTransitionController::class.java.simpleName,
43             this::dump
44         )
45     }
46 
47     fun onPanelStateChanged(@PanelState state: Int) {
48         currentPanelState = state
49         onStateChanged()
50     }
51 
52     fun onPanelExpansionChanged(shadeExpansionChangeEvent: ShadeExpansionChangeEvent) {
53         lastExpansionEvent = shadeExpansionChangeEvent
54         onStateChanged()
55     }
56 
57     private fun onStateChanged() {
58         val expansionEvent = lastExpansionEvent ?: return
59         val expansionFraction = calculateScrimExpansionFraction(expansionEvent)
60         scrimController.setRawPanelExpansionFraction(expansionFraction)
61         lastExpansionFraction = expansionFraction
62     }
63 
64     private fun calculateScrimExpansionFraction(expansionEvent: ShadeExpansionChangeEvent): Float {
65         return expansionEvent.fraction
66     }
67 
68     private fun dump(printWriter: PrintWriter, args: Array<String>) {
69         printWriter.println(
70             """
71                 ScrimShadeTransitionController:
72                   State:
73                     currentPanelState: $currentPanelState
74                     lastExpansionFraction: $lastExpansionFraction
75                     lastExpansionEvent: $lastExpansionEvent
76             """
77                 .trimIndent()
78         )
79     }
80 }
81