1 package com.android.systemui.statusbar
2 
3 import android.content.Context
4 import android.util.IndentingPrintWriter
5 import android.util.MathUtils
6 import com.android.systemui.R
7 import com.android.systemui.dump.DumpManager
8 import com.android.systemui.statusbar.phone.ScrimController
9 import com.android.systemui.statusbar.policy.ConfigurationController
10 import javax.inject.Inject
11 
12 /** Controls the lockscreen to shade transition for scrims. */
13 class LockscreenShadeScrimTransitionController
14 @Inject
15 constructor(
16     private val scrimController: ScrimController,
17     context: Context,
18     configurationController: ConfigurationController,
19     dumpManager: DumpManager
20 ) : AbstractLockscreenShadeTransitionController(context, configurationController, dumpManager) {
21 
22     /**
23      * Distance that the full shade transition takes in order for scrim to fully transition to the
24      * shade (in alpha)
25      */
26     private var scrimTransitionDistance = 0
27 
28     /** Distance it takes in order for the notifications scrim fade in to start. */
29     private var notificationsScrimTransitionDelay = 0
30 
31     /** Distance it takes for the notifications scrim to fully fade if after it started. */
32     private var notificationsScrimTransitionDistance = 0
33 
34     /** The latest progress [0,1] the scrims transition. */
35     var scrimProgress = 0f
36 
37     /** The latest progress [0,1] specifically of the notifications scrim transition. */
38     var notificationsScrimProgress = 0f
39 
40     /**
41      * The last drag amount specifically for the notifications scrim. It is different to the normal
42      * [dragDownAmount] as the notifications scrim transition starts relative to the other scrims'
43      * progress.
44      */
45     var notificationsScrimDragAmount = 0f
46 
47     override fun updateResources() {
48         scrimTransitionDistance =
49             context.resources.getDimensionPixelSize(
50                 R.dimen.lockscreen_shade_scrim_transition_distance)
51         notificationsScrimTransitionDelay =
52             context.resources.getDimensionPixelSize(
53                 R.dimen.lockscreen_shade_notifications_scrim_transition_delay)
54         notificationsScrimTransitionDistance =
55             context.resources.getDimensionPixelSize(
56                 R.dimen.lockscreen_shade_notifications_scrim_transition_distance)
57     }
58 
59     override fun onDragDownAmountChanged(dragDownAmount: Float) {
60         scrimProgress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance)
61         notificationsScrimDragAmount = dragDownAmount - notificationsScrimTransitionDelay
62         notificationsScrimProgress =
63             MathUtils.saturate(notificationsScrimDragAmount / notificationsScrimTransitionDistance)
64         scrimController.setTransitionToFullShadeProgress(scrimProgress, notificationsScrimProgress)
65     }
66 
67     override fun dump(indentingPrintWriter: IndentingPrintWriter) {
68         indentingPrintWriter.let {
69             it.println("LockscreenShadeScrimTransitionController:")
70             it.increaseIndent()
71             it.println("Resources:")
72             it.increaseIndent()
73             it.println("scrimTransitionDistance: $scrimTransitionDistance")
74             it.println("notificationsScrimTransitionDelay: $notificationsScrimTransitionDelay")
75             it.println(
76                 "notificationsScrimTransitionDistance: $notificationsScrimTransitionDistance")
77             it.decreaseIndent()
78             it.println("State")
79             it.increaseIndent()
80             it.println("dragDownAmount: $dragDownAmount")
81             it.println("scrimProgress: $scrimProgress")
82             it.println("notificationsScrimProgress: $notificationsScrimProgress")
83             it.println("notificationsScrimDragAmount: $notificationsScrimDragAmount")
84         }
85     }
86 }
87