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

This commit is contained in:
Nick Chameyev
2022-02-21 17:47:21 +00:00
committed by Android (Google) Code Review
3 changed files with 60 additions and 4 deletions

View File

@@ -28,6 +28,8 @@ import android.util.Log;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.assist.AssistManager; 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.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController; 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.ArrayList;
import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
@@ -73,6 +78,8 @@ public final class DozeServiceHost implements DozeHost {
private final WakefulnessLifecycle mWakefulnessLifecycle; private final WakefulnessLifecycle mWakefulnessLifecycle;
private final SysuiStatusBarStateController mStatusBarStateController; private final SysuiStatusBarStateController mStatusBarStateController;
private final DeviceProvisionedController mDeviceProvisionedController; private final DeviceProvisionedController mDeviceProvisionedController;
@Nullable
private final FoldAodAnimationController mFoldAodAnimationController;
private final HeadsUpManagerPhone mHeadsUpManagerPhone; private final HeadsUpManagerPhone mHeadsUpManagerPhone;
private final BatteryController mBatteryController; private final BatteryController mBatteryController;
private final ScrimController mScrimController; private final ScrimController mScrimController;
@@ -105,6 +112,7 @@ public final class DozeServiceHost implements DozeHost {
Lazy<AssistManager> assistManagerLazy, Lazy<AssistManager> assistManagerLazy,
DozeScrimController dozeScrimController, KeyguardUpdateMonitor keyguardUpdateMonitor, DozeScrimController dozeScrimController, KeyguardUpdateMonitor keyguardUpdateMonitor,
PulseExpansionHandler pulseExpansionHandler, PulseExpansionHandler pulseExpansionHandler,
Optional<SysUIUnfoldComponent> sysUIUnfoldComponent,
NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController,
NotificationWakeUpCoordinator notificationWakeUpCoordinator, NotificationWakeUpCoordinator notificationWakeUpCoordinator,
AuthController authController, AuthController authController,
@@ -128,6 +136,8 @@ public final class DozeServiceHost implements DozeHost {
mNotificationWakeUpCoordinator = notificationWakeUpCoordinator; mNotificationWakeUpCoordinator = notificationWakeUpCoordinator;
mAuthController = authController; mAuthController = authController;
mNotificationIconAreaController = notificationIconAreaController; 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. // 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); mStatusBarStateController.setIsDozing(dozing);
mNotificationShadeWindowViewController.setDozing(dozing); mNotificationShadeWindowViewController.setDozing(dozing);
if (mFoldAodAnimationController != null) {
mFoldAodAnimationController.setIsDozing(dozing);
}
} }
@Override @Override

View File

@@ -16,9 +16,12 @@
package com.android.systemui.unfold package com.android.systemui.unfold
import android.content.Context
import android.hardware.devicestate.DeviceStateManager
import android.os.Handler import android.os.Handler
import android.os.PowerManager import android.os.PowerManager
import android.provider.Settings import android.provider.Settings
import androidx.core.view.OneShotPreDrawListener
import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.statusbar.LightRevealScrim 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.statusbar.policy.CallbackController
import com.android.systemui.unfold.FoldAodAnimationController.FoldAodAnimationStatus import com.android.systemui.unfold.FoldAodAnimationController.FoldAodAnimationStatus
import com.android.systemui.util.settings.GlobalSettings import com.android.systemui.util.settings.GlobalSettings
import java.util.concurrent.Executor
import java.util.function.Consumer
import javax.inject.Inject import javax.inject.Inject
/** /**
@@ -38,13 +43,21 @@ class FoldAodAnimationController
@Inject @Inject
constructor( constructor(
@Main private val handler: Handler, @Main private val handler: Handler,
@Main private val executor: Executor,
private val context: Context,
private val deviceStateManager: DeviceStateManager,
private val wakefulnessLifecycle: WakefulnessLifecycle, private val wakefulnessLifecycle: WakefulnessLifecycle,
private val globalSettings: GlobalSettings private val globalSettings: GlobalSettings
) : CallbackController<FoldAodAnimationStatus>, ScreenOffAnimation, WakefulnessLifecycle.Observer { ) : CallbackController<FoldAodAnimationStatus>, ScreenOffAnimation, WakefulnessLifecycle.Observer {
private var alwaysOnEnabled: Boolean = false
private var isScrimOpaque: Boolean = false
private lateinit var statusBar: StatusBar 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 var pendingScrimReadyCallback: Runnable? = null private var pendingScrimReadyCallback: Runnable? = null
private var shouldPlayAnimation = false private var shouldPlayAnimation = false
@@ -62,6 +75,7 @@ constructor(
override fun initialize(statusBar: StatusBar, lightRevealScrim: LightRevealScrim) { override fun initialize(statusBar: StatusBar, lightRevealScrim: LightRevealScrim) {
this.statusBar = statusBar this.statusBar = statusBar
deviceStateManager.registerCallback(executor, FoldListener())
wakefulnessLifecycle.addObserver(this) wakefulnessLifecycle.addObserver(this)
} }
@@ -84,7 +98,7 @@ constructor(
override fun onStartedWakingUp() { override fun onStartedWakingUp() {
if (isAnimationPlaying) { if (isAnimationPlaying) {
handler.removeCallbacks(startAnimationRunnable) handler.removeCallbacks(startAnimationRunnable)
statusBar.notificationPanelViewController.cancelFoldToAodAnimation(); statusBar.notificationPanelViewController.cancelFoldToAodAnimation()
} }
setAnimationState(playing = false) setAnimationState(playing = false)
@@ -105,11 +119,24 @@ constructor(
*/ */
fun onScreenTurningOn(onReady: Runnable) { fun onScreenTurningOn(onReady: Runnable) {
if (shouldPlayAnimation) { if (shouldPlayAnimation) {
// The device was not dozing and going to sleep after folding, play the animation
if (isScrimOpaque) { if (isScrimOpaque) {
onReady.run() onReady.run()
} else { } else {
pendingScrimReadyCallback = onReady 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 { } else {
// No animation, call ready callback immediately // No animation, call ready callback immediately
onReady.run() onReady.run()
@@ -136,6 +163,10 @@ constructor(
} }
} }
fun setIsDozing(dozing: Boolean) {
isDozing = dozing
}
override fun isAnimationPlaying(): Boolean = isAnimationPlaying override fun isAnimationPlaying(): Boolean = isAnimationPlaying
override fun isKeyguardHideDelayed(): Boolean = isAnimationPlaying() override fun isKeyguardHideDelayed(): Boolean = isAnimationPlaying()
@@ -166,4 +197,15 @@ constructor(
interface FoldAodAnimationStatus { interface FoldAodAnimationStatus {
fun onFoldToAodAnimationChanged() 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
})
} }

View File

@@ -59,6 +59,7 @@ import org.mockito.MockitoAnnotations;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Optional;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
@@ -97,7 +98,7 @@ public class DozeServiceHostTest extends SysuiTestCase {
mStatusBarStateController, mDeviceProvisionedController, mHeadsUpManager, mStatusBarStateController, mDeviceProvisionedController, mHeadsUpManager,
mBatteryController, mScrimController, () -> mBiometricUnlockController, mBatteryController, mScrimController, () -> mBiometricUnlockController,
mKeyguardViewMediator, () -> mAssistManager, mDozeScrimController, mKeyguardViewMediator, () -> mAssistManager, mDozeScrimController,
mKeyguardUpdateMonitor, mPulseExpansionHandler, mKeyguardUpdateMonitor, mPulseExpansionHandler, Optional.empty(),
mNotificationShadeWindowController, mNotificationWakeUpCoordinator, mNotificationShadeWindowController, mNotificationWakeUpCoordinator,
mAuthController, mNotificationIconAreaController); mAuthController, mNotificationIconAreaController);