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

Commit 239675d7 authored by Nick Chameyev's avatar Nick Chameyev Committed by Android (Google) Code Review
Browse files

Merge "[Fold to AOD] Play fold to AOD even if we already in AOD on the inner screen" into tm-dev

parents 75ac29b6 241a7898
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.assist.AssistManager;
@@ -46,8 +48,11 @@ import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.unfold.FoldAodAnimationController;
import com.android.systemui.unfold.SysUIUnfoldComponent;

import java.util.ArrayList;
import java.util.Optional;

import javax.inject.Inject;

@@ -73,6 +78,8 @@ public final class DozeServiceHost implements DozeHost {
    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private final SysuiStatusBarStateController mStatusBarStateController;
    private final DeviceProvisionedController mDeviceProvisionedController;
    @Nullable
    private final FoldAodAnimationController mFoldAodAnimationController;
    private final HeadsUpManagerPhone mHeadsUpManagerPhone;
    private final BatteryController mBatteryController;
    private final ScrimController mScrimController;
@@ -105,6 +112,7 @@ public final class DozeServiceHost implements DozeHost {
            Lazy<AssistManager> assistManagerLazy,
            DozeScrimController dozeScrimController, KeyguardUpdateMonitor keyguardUpdateMonitor,
            PulseExpansionHandler pulseExpansionHandler,
            Optional<SysUIUnfoldComponent> sysUIUnfoldComponent,
            NotificationShadeWindowController notificationShadeWindowController,
            NotificationWakeUpCoordinator notificationWakeUpCoordinator,
            AuthController authController,
@@ -128,6 +136,8 @@ public final class DozeServiceHost implements DozeHost {
        mNotificationWakeUpCoordinator = notificationWakeUpCoordinator;
        mAuthController = authController;
        mNotificationIconAreaController = notificationIconAreaController;
        mFoldAodAnimationController = sysUIUnfoldComponent
                .map(SysUIUnfoldComponent::getFoldAodAnimationController).orElse(null);
    }

    // TODO: we should try to not pass status bar in here if we can avoid it.
@@ -215,6 +225,9 @@ public final class DozeServiceHost implements DozeHost {

        mStatusBarStateController.setIsDozing(dozing);
        mNotificationShadeWindowViewController.setDozing(dozing);
        if (mFoldAodAnimationController != null) {
            mFoldAodAnimationController.setIsDozing(dozing);
        }
    }

    @Override
+44 −2
Original line number Diff line number Diff line
@@ -16,9 +16,12 @@

package com.android.systemui.unfold

import android.content.Context
import android.hardware.devicestate.DeviceStateManager
import android.os.Handler
import android.os.PowerManager
import android.provider.Settings
import androidx.core.view.OneShotPreDrawListener
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.statusbar.LightRevealScrim
@@ -27,6 +30,8 @@ import com.android.systemui.statusbar.phone.StatusBar
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.unfold.FoldAodAnimationController.FoldAodAnimationStatus
import com.android.systemui.util.settings.GlobalSettings
import java.util.concurrent.Executor
import java.util.function.Consumer
import javax.inject.Inject

/**
@@ -38,13 +43,21 @@ class FoldAodAnimationController
@Inject
constructor(
    @Main private val handler: Handler,
    @Main private val executor: Executor,
    private val context: Context,
    private val deviceStateManager: DeviceStateManager,
    private val wakefulnessLifecycle: WakefulnessLifecycle,
    private val globalSettings: GlobalSettings
) : CallbackController<FoldAodAnimationStatus>, ScreenOffAnimation, WakefulnessLifecycle.Observer {

    private lateinit var statusBar: StatusBar

    private var isFolded = false
    private var isFoldHandled = true

    private var alwaysOnEnabled: Boolean = false
    private var isDozing: Boolean = false
    private var isScrimOpaque: Boolean = false
    private lateinit var statusBar: StatusBar
    private var pendingScrimReadyCallback: Runnable? = null

    private var shouldPlayAnimation = false
@@ -62,6 +75,7 @@ constructor(
    override fun initialize(statusBar: StatusBar, lightRevealScrim: LightRevealScrim) {
        this.statusBar = statusBar

        deviceStateManager.registerCallback(executor, FoldListener())
        wakefulnessLifecycle.addObserver(this)
    }

@@ -84,7 +98,7 @@ constructor(
    override fun onStartedWakingUp() {
        if (isAnimationPlaying) {
            handler.removeCallbacks(startAnimationRunnable)
            statusBar.notificationPanelViewController.cancelFoldToAodAnimation();
            statusBar.notificationPanelViewController.cancelFoldToAodAnimation()
        }

        setAnimationState(playing = false)
@@ -105,11 +119,24 @@ constructor(
     */
    fun onScreenTurningOn(onReady: Runnable) {
        if (shouldPlayAnimation) {
            // The device was not dozing and going to sleep after folding, play the animation

            if (isScrimOpaque) {
                onReady.run()
            } else {
                pendingScrimReadyCallback = onReady
            }
        } else if (isFolded && !isFoldHandled && alwaysOnEnabled && isDozing) {
            // Screen turning on for the first time after folding and we are already dozing
            // We should play the folding to AOD animation

            setAnimationState(playing = true)
            statusBar.notificationPanelViewController.prepareFoldToAodAnimation()

            // We don't need to wait for the scrim as it is already displayed
            // but we should wait for the initial animation preparations to be drawn
            // (setting initial alpha/translation)
            OneShotPreDrawListener.add(statusBar.notificationPanelViewController.view, onReady)
        } else {
            // No animation, call ready callback immediately
            onReady.run()
@@ -136,6 +163,10 @@ constructor(
        }
    }

    fun setIsDozing(dozing: Boolean) {
        isDozing = dozing
    }

    override fun isAnimationPlaying(): Boolean = isAnimationPlaying

    override fun isKeyguardHideDelayed(): Boolean = isAnimationPlaying()
@@ -166,4 +197,15 @@ constructor(
    interface FoldAodAnimationStatus {
        fun onFoldToAodAnimationChanged()
    }

    private inner class FoldListener :
        DeviceStateManager.FoldStateListener(
            context,
            Consumer { isFolded ->
                if (!isFolded) {
                    // We are unfolded now, reset the fold handle status
                    isFoldHandled = false
                }
                this.isFolded = isFolded
            })
}
+2 −1
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;

@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -97,7 +98,7 @@ public class DozeServiceHostTest extends SysuiTestCase {
                mStatusBarStateController, mDeviceProvisionedController, mHeadsUpManager,
                mBatteryController, mScrimController, () -> mBiometricUnlockController,
                mKeyguardViewMediator, () -> mAssistManager, mDozeScrimController,
                mKeyguardUpdateMonitor, mPulseExpansionHandler,
                mKeyguardUpdateMonitor, mPulseExpansionHandler, Optional.empty(),
                mNotificationShadeWindowController, mNotificationWakeUpCoordinator,
                mAuthController, mNotificationIconAreaController);