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