blob: 2762b9a38e9225afe8aad629be131c70d924c9ee [file] [log] [blame]
package com.android.systemui.statusbar.phone.shade.transition
import android.content.Context
import android.content.res.Configuration
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.plugins.qs.QS
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager
import com.android.systemui.statusbar.phone.panelstate.PanelState
import com.android.systemui.statusbar.policy.ConfigurationController
import javax.inject.Inject
/** Controls the shade expansion transition on non-lockscreen. */
@SysUISingleton
class ShadeTransitionController
@Inject
constructor(
configurationController: ConfigurationController,
panelExpansionStateManager: PanelExpansionStateManager,
private val context: Context,
private val splitShadeOverScrollerFactory: SplitShadeOverScroller.Factory,
private val noOpOverScroller: NoOpOverScroller
) {
lateinit var notificationPanelViewController: NotificationPanelViewController
lateinit var notificationStackScrollLayoutController: NotificationStackScrollLayoutController
lateinit var qs: QS
private var inSplitShade = false
private val splitShadeOverScroller by lazy {
splitShadeOverScrollerFactory.create(qs, notificationStackScrollLayoutController)
}
private val shadeOverScroller: ShadeOverScroller
get() =
if (inSplitShade && propertiesInitialized()) {
splitShadeOverScroller
} else {
noOpOverScroller
}
init {
updateResources()
configurationController.addCallback(
object : ConfigurationController.ConfigurationListener {
override fun onConfigChanged(newConfig: Configuration?) {
updateResources()
}
})
panelExpansionStateManager.addExpansionListener(this::onPanelExpansionChanged)
panelExpansionStateManager.addStateListener(this::onPanelStateChanged)
}
private fun updateResources() {
inSplitShade = context.resources.getBoolean(R.bool.config_use_split_notification_shade)
}
private fun onPanelStateChanged(@PanelState state: Int) {
shadeOverScroller.onPanelStateChanged(state)
}
private fun onPanelExpansionChanged(event: PanelExpansionChangeEvent) {
shadeOverScroller.onDragDownAmountChanged(event.dragDownPxAmount)
}
private fun propertiesInitialized() =
this::qs.isInitialized &&
this::notificationPanelViewController.isInitialized &&
this::notificationStackScrollLayoutController.isInitialized
}