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