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:
committed by
Android (Google) Code Review
commit
239675d72b
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user