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.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

View File

@@ -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 var alwaysOnEnabled: Boolean = false
private var isScrimOpaque: Boolean = false
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 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
})
}

View File

@@ -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);