Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7eb5e110 authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge "Fix NPE in LockscreenShadeTransitionController" into main

parents 0c4a2515 0827a052
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -84,6 +84,10 @@ interface QSSceneAdapter {
     */
    val qsHeight: Int

    /** Compatibility for use by LockscreenShadeTransitionController. Matches default from [QS] */
    val isQsFullyCollapsed: Boolean
        get() = true

    sealed interface State {

        val isVisible: Boolean
@@ -165,6 +169,10 @@ constructor(
    override val qsHeight: Int
        get() = qsImpl.value?.qsHeight ?: 0

    // If value is null, there's no QS and therefore it's fully collapsed.
    override val isQsFullyCollapsed: Boolean
        get() = qsImpl.value?.isFullyCollapsed ?: true

    // Same config changes as in FragmentHostManager
    private val interestingChanges =
        InterestingConfigChanges(
+5 −5
Original line number Diff line number Diff line
@@ -21,9 +21,9 @@ import android.util.IndentingPrintWriter
import android.util.MathUtils
import androidx.annotation.FloatRange
import androidx.annotation.Px
import com.android.systemui.res.R
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.qs.QS
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.SplitShadeStateController
import dagger.assisted.Assisted
@@ -38,7 +38,7 @@ constructor(
    context: Context,
    configurationController: ConfigurationController,
    dumpManager: DumpManager,
    @Assisted private val qsProvider: () -> QS,
    @Assisted private val qsProvider: () -> QS?,
    splitShadeStateController: SplitShadeStateController
) :
    AbstractLockscreenShadeTransitionController(
@@ -48,7 +48,7 @@ constructor(
        splitShadeStateController
    ) {

    private val qs: QS
    private val qs: QS?
        get() = qsProvider()

    /**
@@ -135,7 +135,7 @@ constructor(
                /* amount= */ MathUtils.saturate(qsDragDownAmount / qsSquishTransitionDistance)
            )
        isTransitioningToFullShade = dragDownAmount > 0.0f
        qs.setTransitionToFullShadeProgress(
        qs?.setTransitionToFullShadeProgress(
            isTransitioningToFullShade,
            qsTransitionFraction,
            qsSquishTransitionFraction
@@ -163,6 +163,6 @@ constructor(

    @AssistedFactory
    fun interface Factory {
        fun create(qsProvider: () -> QS): LockscreenShadeQsTransitionController
        fun create(qsProvider: () -> QS?): LockscreenShadeQsTransitionController
    }
}
+10 −3
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.systemui.plugins.ActivityStarter.OnDismissAction
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.qs.QS
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.res.R
import com.android.systemui.shade.ShadeLockscreenInteractor
import com.android.systemui.shade.data.repository.ShadeRepository
@@ -84,6 +85,7 @@ constructor(
    private val splitShadeStateController: SplitShadeStateController,
    private val shadeLockscreenInteractorLazy: Lazy<ShadeLockscreenInteractor>,
    naturalScrollingSettingObserver: NaturalScrollingSettingObserver,
    private val lazyQSSceneAdapter: Lazy<QSSceneAdapter>,
) : Dumpable {
    private var pulseHeight: Float = 0f

@@ -93,7 +95,11 @@ constructor(
    private var useSplitShade: Boolean = false
    private lateinit var nsslController: NotificationStackScrollLayoutController
    lateinit var centralSurfaces: CentralSurfaces
    lateinit var qS: QS

    // When in scene container mode, this will be null. In that case, we use the adapter if needed
    var qS: QS? = null
    private val isQsFullyCollapsed: Boolean
        get() = qS?.isFullyCollapsed ?: lazyQSSceneAdapter.get().isQsFullyCollapsed

    /** A handler that handles the next keyguard dismiss animation. */
    private var animationHandlerOnKeyguardDismiss: ((Long) -> Unit)? = null
@@ -286,7 +292,8 @@ constructor(
    /** @return true if the interaction is accepted, false if it should be cancelled */
    internal fun canDragDown(): Boolean {
        return (statusBarStateController.state == StatusBarState.KEYGUARD ||
            nsslController.isInLockedDownShade()) && (qS.isFullyCollapsed || useSplitShade)
            nsslController.isInLockedDownShade()) &&
                (isQsFullyCollapsed || useSplitShade)
    }

    /** Called by the touch helper when when a gesture has completed all the way and released. */
@@ -410,7 +417,7 @@ constructor(
        get() =
            (statusBarStateController.getState() == StatusBarState.KEYGUARD &&
                !keyguardBypassController.bypassEnabled &&
                (qS.isFullyCollapsed || useSplitShade))
                (isQsFullyCollapsed || useSplitShade))

    /** The amount in pixels that the user has dragged down. */
    internal var dragDownAmount = 0f
+5 −5
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ constructor(
    private val context: Context,
    private val scrimController: ScrimController,
    private val statusBarStateController: SysuiStatusBarStateController,
    @Assisted private val qSProvider: () -> QS,
    @Assisted private val qSProvider: () -> QS?,
    @Assisted private val nsslControllerProvider: () -> NotificationStackScrollLayoutController
) : LockScreenShadeOverScroller {

@@ -37,7 +37,7 @@ constructor(
    private var maxOverScrollAmount = 0
    private var previousOverscrollAmount = 0

    private val qS: QS
    private val qS: QS?
        get() = qSProvider()

    private val nsslController: NotificationStackScrollLayoutController
@@ -90,7 +90,7 @@ constructor(
    }

    private fun applyOverscroll(overscrollAmount: Int) {
        qS.setOverScrollAmount(overscrollAmount)
        qS?.setOverScrollAmount(overscrollAmount)
        scrimController.setNotificationsOverScrollAmount(overscrollAmount)
        nsslController.setOverScrollAmount(overscrollAmount)
    }
@@ -109,7 +109,7 @@ constructor(
        val animator = ValueAnimator.ofInt(previousOverscrollAmount, 0)
        animator.addUpdateListener {
            val overScrollAmount = it.animatedValue as Int
            qS.setOverScrollAmount(overScrollAmount)
            qS?.setOverScrollAmount(overScrollAmount)
            scrimController.setNotificationsOverScrollAmount(overScrollAmount)
            nsslController.setOverScrollAmount(overScrollAmount)
        }
@@ -143,7 +143,7 @@ constructor(
    @AssistedFactory
    fun interface Factory {
        fun create(
            qSProvider: () -> QS,
            qSProvider: () -> QS?,
            nsslControllerProvider: () -> NotificationStackScrollLayoutController
        ): SplitShadeLockScreenOverScroller
    }
+15 −3
Original line number Diff line number Diff line
@@ -18,12 +18,13 @@ package com.android.systemui.statusbar

import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.qs.QS
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Expect
import com.google.common.truth.Truth.assertThat
import org.junit.Before
@@ -43,13 +44,15 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() {
    @get:Rule val expect: Expect = Expect.create()

    @Mock private lateinit var dumpManager: DumpManager
    @Mock private lateinit var qS: QS
    private var qS: QS? = null

    private lateinit var controller: LockscreenShadeQsTransitionController

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        qS = mock()

        setTransitionDistance(TRANSITION_DISTANCE)
        setTransitionDelay(TRANSITION_DELAY)
        setSquishTransitionDistance(SQUISH_TRANSITION_DISTANCE)
@@ -220,7 +223,7 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() {

        controller.dragDownAmount = rawDragAmount

        verify(qS)
        verify(qS!!)
            .setTransitionToFullShadeProgress(
                /* isTransitioningToFullShade= */ true,
                /* transitionFraction= */ controller.qsTransitionFraction,
@@ -228,6 +231,15 @@ class LockscreenShadeQsTransitionControllerTest : SysuiTestCase() {
            )
    }

    @Test
    fun nullQS_onDragAmountChanged_doesNotCrash() {
        qS = null

        val rawDragAmount = 200f

        controller.dragDownAmount = rawDragAmount
    }

    private fun setTransitionDistance(value: Int) {
        overrideResource(R.dimen.lockscreen_shade_qs_transition_distance, value)
        configurationController.notifyConfigurationChanged()
Loading