blob: 575f354c66201e46ea37fd8e9669f2bad1b63d01 [file] [log] [blame]
package com.android.systemui.statusbar
import android.content.Context
import android.content.res.Configuration
import android.util.MathUtils
import com.android.systemui.R
import com.android.systemui.animation.Interpolators
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.policy.ConfigurationController
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
class SingleShadeLockScreenOverScroller
@AssistedInject
constructor(
configurationController: ConfigurationController,
private val context: Context,
private val statusBarStateController: SysuiStatusBarStateController,
@Assisted private val nsslController: NotificationStackScrollLayoutController
) : LockScreenShadeOverScroller {
private var maxOverScrollAmount = 0
private var totalDistanceForFullShadeTransition = 0
init {
updateResources()
configurationController.addCallback(
object : ConfigurationController.ConfigurationListener {
override fun onConfigChanged(newConfig: Configuration?) {
updateResources()
}
})
}
private fun updateResources() {
val resources = context.resources
totalDistanceForFullShadeTransition =
resources.getDimensionPixelSize(R.dimen.lockscreen_shade_qs_transition_distance)
maxOverScrollAmount =
resources.getDimensionPixelSize(R.dimen.lockscreen_shade_max_over_scroll_amount)
}
override var expansionDragDownAmount: Float = 0f
set(value) {
if (value == field) {
return
}
field = value
overScroll()
}
private fun overScroll() {
var extraTopInset = 0.0f
if (statusBarStateController.state == StatusBarState.KEYGUARD) {
val viewHeight = nsslController.height
val overallProgress = MathUtils.saturate(expansionDragDownAmount / viewHeight)
val transitionProgress =
Interpolators.getOvershootInterpolation(
overallProgress,
0.6f,
totalDistanceForFullShadeTransition.toFloat() / viewHeight.toFloat())
extraTopInset = transitionProgress * maxOverScrollAmount
}
nsslController.setOverScrollAmount(extraTopInset.toInt())
}
@AssistedFactory
fun interface Factory {
fun create(
nsslController: NotificationStackScrollLayoutController
): SingleShadeLockScreenOverScroller
}
}