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

Commit c2b05606 authored by Matt Pietal's avatar Matt Pietal
Browse files

Run screen off controller on rotation

The screen off controller is responsible for setting up the correct
status bar state prior to any animation running. Without this,
the device will flash notifications on power off from landscape
(app or launcher). The actual animations continue to run
in GoneToAodTransitionViewModel.

Just remove some existing code.

Fixes: 409716096
Test: atest UnlockedScreenOffAnimationControllerTest
Test: manual - Open YouTube/Launcher in landscape, lock the device,
ensure no flashing notifications
Flag: EXEMPT bugfix
Change-Id: I5e281ec9ff7bfce480d4e1c671e5b0e448f318a3
parent 558e6e77
Loading
Loading
Loading
Loading
+29 −46
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractor
import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.statusbar.StatusBarStateControllerImpl
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.settings.GlobalSettings
@@ -56,48 +55,32 @@ import org.mockito.MockitoAnnotations
class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() {

    private lateinit var controller: UnlockedScreenOffAnimationController
    @Mock
    private lateinit var keyguardViewMediator: KeyguardViewMediator
    @Mock
    private lateinit var dozeParameters: DozeParameters
    @Mock
    private lateinit var keyguardStateController: KeyguardStateController
    @Mock
    private lateinit var globalSettings: GlobalSettings
    @Mock
    private lateinit var centralSurfaces: CentralSurfaces
    @Mock
    private lateinit var shadeViewController: ShadeViewController
    @Mock
    private lateinit var shadeLockscreenInteractor: ShadeLockscreenInteractor
    @Mock
    private lateinit var panelExpansionInteractor: PanelExpansionInteractor
    @Mock
    private lateinit var notifShadeWindowController: NotificationShadeWindowController
    @Mock
    private lateinit var lightRevealScrim: LightRevealScrim
    @Mock
    private lateinit var wakefulnessLifecycle: WakefulnessLifecycle
    @Mock
    private lateinit var statusBarStateController: StatusBarStateControllerImpl
    @Mock
    private lateinit var interactionJankMonitor: InteractionJankMonitor
    @Mock
    private lateinit var powerManager: PowerManager
    @Mock
    private lateinit var handler: Handler
    @Mock private lateinit var keyguardViewMediator: KeyguardViewMediator
    @Mock private lateinit var dozeParameters: DozeParameters
    @Mock private lateinit var globalSettings: GlobalSettings
    @Mock private lateinit var centralSurfaces: CentralSurfaces
    @Mock private lateinit var shadeViewController: ShadeViewController
    @Mock private lateinit var shadeLockscreenInteractor: ShadeLockscreenInteractor
    @Mock private lateinit var panelExpansionInteractor: PanelExpansionInteractor
    @Mock private lateinit var notifShadeWindowController: NotificationShadeWindowController
    @Mock private lateinit var lightRevealScrim: LightRevealScrim
    @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle
    @Mock private lateinit var statusBarStateController: StatusBarStateControllerImpl
    @Mock private lateinit var interactionJankMonitor: InteractionJankMonitor
    @Mock private lateinit var powerManager: PowerManager
    @Mock private lateinit var handler: Handler

    val kosmos = testKosmos()

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        controller = UnlockedScreenOffAnimationController(
        controller =
            UnlockedScreenOffAnimationController(
                context,
                wakefulnessLifecycle,
                statusBarStateController,
                { keyguardViewMediator },
            keyguardStateController,
                { dozeParameters },
                globalSettings,
                { notifShadeWindowController },
+5 −30
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@ import android.os.Handler
import android.os.PowerManager
import android.provider.Settings
import android.view.Display
import android.view.Surface
import android.view.View
import android.view.WindowManager.fixScale
import com.android.app.animation.Interpolators
@@ -35,7 +34,6 @@ import com.android.systemui.statusbar.notification.AnimatableProperty
import com.android.systemui.statusbar.notification.PropertyAnimator
import com.android.systemui.statusbar.notification.stack.AnimationProperties
import com.android.systemui.statusbar.notification.stack.StackStateAnimator
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.settings.GlobalSettings
import dagger.Lazy
import javax.inject.Inject
@@ -64,7 +62,6 @@ constructor(
    private val wakefulnessLifecycle: WakefulnessLifecycle,
    private val statusBarStateControllerImpl: StatusBarStateControllerImpl,
    private val keyguardViewMediatorLazy: Lazy<KeyguardViewMediator>,
    private val keyguardStateController: KeyguardStateController,
    private val dozeParameters: Lazy<DozeParameters>,
    private val globalSettings: GlobalSettings,
    private val notifShadeWindowControllerLazy: Lazy<NotificationShadeWindowController>,
@@ -293,13 +290,10 @@ constructor(
            handler.postDelayed(
                {
                    // Only run this callback if the device is sleeping (not interactive). This
                    // callback
                    // is removed in onStartedWakingUp, but since that event is asynchronously
                    // dispatched, a race condition could make it possible for this callback to be
                    // run
                    // as the device is waking up. That results in the AOD UI being shown while we
                    // wake
                    // up, with unpredictable consequences.
                    // callback is removed in onStartedWakingUp, but since that event is
                    // asynchronously dispatched, a race condition could make it possible for this
                    // callback to be run as the device is waking up. That results in the AOD UI
                    // being shown while we wake up, with unpredictable consequences.
                    if (
                        !powerManager.isInteractive(Display.DEFAULT_DISPLAY) &&
                            shouldAnimateInKeyguard
@@ -357,26 +351,7 @@ constructor(
            return false
        }

        // We currently draw both the light reveal scrim, and the AOD UI, in the shade. If it's
        // already expanded and showing notifications/QS, the animation looks really messy. For now,
        // disable it if the notification panel is expanded.
        if (
            (!this::centralSurfaces.isInitialized ||
                panelExpansionInteractorLazy.get().isPanelExpanded) &&
                // Status bar might be expanded because we have started
                // playing the animation already
                !isAnimationPlaying()
        ) {
            return false
        }

        // If we're not allowed to rotate the keyguard, it can only be displayed in zero-degree
        // portrait. If we're in another orientation, disable the screen off animation so we don't
        // animate in the keyguard AOD UI sideways or upside down.
        if (
            !keyguardStateController.isKeyguardScreenRotationAllowed &&
                context.display?.rotation != Surface.ROTATION_0
        ) {
        if (!this::centralSurfaces.isInitialized) {
            return false
        }