Merge "Fixed an issue where a user could't go to the locked shade from dozing" into sc-v2-dev am: 5c3d8bc297

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16631031

Change-Id: Id6d1a993dd6ff0bc7aa78cd8380f44c354f61db9
This commit is contained in:
Selim Cinek
2022-01-14 20:49:54 +00:00
committed by Automerger Merge Worker
6 changed files with 49 additions and 15 deletions

View File

@@ -138,6 +138,7 @@ public class WakefulnessLifecycle extends Lifecycle<WakefulnessLifecycle.Observe
} }
setWakefulness(WAKEFULNESS_AWAKE); setWakefulness(WAKEFULNESS_AWAKE);
dispatch(Observer::onFinishedWakingUp); dispatch(Observer::onFinishedWakingUp);
dispatch(Observer::onPostFinishedWakingUp);
} }
public void dispatchStartedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) { public void dispatchStartedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) {
@@ -236,6 +237,12 @@ public class WakefulnessLifecycle extends Lifecycle<WakefulnessLifecycle.Observe
public interface Observer { public interface Observer {
default void onStartedWakingUp() {} default void onStartedWakingUp() {}
default void onFinishedWakingUp() {} default void onFinishedWakingUp() {}
/**
* Called after the finished waking up call, ensuring it's after all the other listeners,
* reacting to {@link #onFinishedWakingUp()}
*/
default void onPostFinishedWakingUp() {}
default void onStartedGoingToSleep() {} default void onStartedGoingToSleep() {}
default void onFinishedGoingToSleep() {} default void onFinishedGoingToSleep() {}
} }

View File

@@ -7,7 +7,6 @@ import android.animation.ValueAnimator
import android.content.Context import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.os.SystemClock import android.os.SystemClock
import android.util.DisplayMetrics
import android.util.IndentingPrintWriter import android.util.IndentingPrintWriter
import android.util.MathUtils import android.util.MathUtils
import android.view.MotionEvent import android.view.MotionEvent
@@ -24,6 +23,7 @@ import com.android.systemui.classifier.Classifier
import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.MediaHierarchyManager import com.android.systemui.media.MediaHierarchyManager
import com.android.systemui.plugins.ActivityStarter.OnDismissAction import com.android.systemui.plugins.ActivityStarter.OnDismissAction
import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.FalsingManager
@@ -64,6 +64,7 @@ class LockscreenShadeTransitionController @Inject constructor(
private val scrimController: ScrimController, private val scrimController: ScrimController,
private val depthController: NotificationShadeDepthController, private val depthController: NotificationShadeDepthController,
private val context: Context, private val context: Context,
wakefulnessLifecycle: WakefulnessLifecycle,
configurationController: ConfigurationController, configurationController: ConfigurationController,
falsingManager: FalsingManager, falsingManager: FalsingManager,
dumpManager: DumpManager, dumpManager: DumpManager,
@@ -119,6 +120,12 @@ class LockscreenShadeTransitionController @Inject constructor(
*/ */
private var nextHideKeyguardNeedsNoAnimation = false private var nextHideKeyguardNeedsNoAnimation = false
/**
* Are we currently waking up to the shade locked
*/
var isWakingToShadeLocked: Boolean = false
private set
/** /**
* The distance until we're showing the notifications when pulsing * The distance until we're showing the notifications when pulsing
*/ */
@@ -160,6 +167,13 @@ class LockscreenShadeTransitionController @Inject constructor(
} }
} }
}) })
wakefulnessLifecycle.addObserver(object : WakefulnessLifecycle.Observer {
override fun onPostFinishedWakingUp() {
// when finishing waking up, the UnlockedScreenOffAnimation has another attempt
// to reset keyguard. Let's do it in post
isWakingToShadeLocked = false
}
})
} }
private fun updateResources() { private fun updateResources() {
@@ -488,6 +502,10 @@ class LockscreenShadeTransitionController @Inject constructor(
draggedDownEntry = entry draggedDownEntry = entry
} else { } else {
logger.logGoingToLockedShade(animationHandler != null) logger.logGoingToLockedShade(animationHandler != null)
if (statusBarStateController.isDozing) {
// Make sure we don't go back to keyguard immediately again after waking up
isWakingToShadeLocked = true
}
statusBarStateController.setState(StatusBarState.SHADE_LOCKED) statusBarStateController.setState(StatusBarState.SHADE_LOCKED)
// This call needs to be after updating the shade state since otherwise // This call needs to be after updating the shade state since otherwise
// the scrimstate resets too early // the scrimstate resets too early
@@ -598,6 +616,7 @@ class LockscreenShadeTransitionController @Inject constructor(
it.println("dragDownAmount: $dragDownAmount") it.println("dragDownAmount: $dragDownAmount")
it.println("isDragDownAnywhereEnabled: $isDragDownAnywhereEnabled") it.println("isDragDownAnywhereEnabled: $isDragDownAnywhereEnabled")
it.println("isFalsingCheckNeeded: $isFalsingCheckNeeded") it.println("isFalsingCheckNeeded: $isFalsingCheckNeeded")
it.println("isWakingToShadeLocked: $isWakingToShadeLocked")
it.println("hasPendingHandlerOnKeyguardDismiss: " + it.println("hasPendingHandlerOnKeyguardDismiss: " +
"${animationHandlerOnKeyguardDismiss != null}") "${animationHandlerOnKeyguardDismiss != null}")
} }

View File

@@ -107,8 +107,6 @@ constructor(
private var mDraggedFarEnough: Boolean = false private var mDraggedFarEnough: Boolean = false
private var mStartingChild: ExpandableView? = null private var mStartingChild: ExpandableView? = null
private var mPulsing: Boolean = false private var mPulsing: Boolean = false
var isWakingToShadeLocked: Boolean = false
private set
private var velocityTracker: VelocityTracker? = null private var velocityTracker: VelocityTracker? = null
@@ -235,7 +233,6 @@ constructor(
mStartingChild = null mStartingChild = null
} }
if (statusBarStateController.isDozing) { if (statusBarStateController.isDozing) {
isWakingToShadeLocked = true
wakeUpCoordinator.willWakeUp = true wakeUpCoordinator.willWakeUp = true
mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), WAKE_REASON_GESTURE, mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), WAKE_REASON_GESTURE,
"com.android.systemui:PULSEDRAG") "com.android.systemui:PULSEDRAG")
@@ -333,10 +330,6 @@ constructor(
mPulsing = pulsing mPulsing = pulsing
} }
fun onStartedWakingUp() {
isWakingToShadeLocked = false
}
override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
IndentingPrintWriter(pw, " ").let { IndentingPrintWriter(pw, " ").let {
it.println("PulseExpansionHandler:") it.println("PulseExpansionHandler:")
@@ -344,7 +337,6 @@ constructor(
it.println("isExpanding: $isExpanding") it.println("isExpanding: $isExpanding")
it.println("leavingLockscreen: $leavingLockscreen") it.println("leavingLockscreen: $leavingLockscreen")
it.println("mPulsing: $mPulsing") it.println("mPulsing: $mPulsing")
it.println("isWakingToShadeLocked: $isWakingToShadeLocked")
it.println("qsExpanded: $qsExpanded") it.println("qsExpanded: $qsExpanded")
it.println("bouncerShowing: $bouncerShowing") it.println("bouncerShowing: $bouncerShowing")
} }

View File

@@ -2965,7 +2965,7 @@ public class StatusBar extends SystemUI implements
mMessageRouter.cancelMessages(MSG_LAUNCH_TRANSITION_TIMEOUT); mMessageRouter.cancelMessages(MSG_LAUNCH_TRANSITION_TIMEOUT);
if (mUserSwitcherController != null && mUserSwitcherController.useFullscreenUserSwitcher()) { if (mUserSwitcherController != null && mUserSwitcherController.useFullscreenUserSwitcher()) {
mStatusBarStateController.setState(StatusBarState.FULLSCREEN_USER_SWITCHER); mStatusBarStateController.setState(StatusBarState.FULLSCREEN_USER_SWITCHER);
} else if (!mPulseExpansionHandler.isWakingToShadeLocked()) { } else if (!mLockscreenShadeTransitionController.isWakingToShadeLocked()) {
mStatusBarStateController.setState(StatusBarState.KEYGUARD); mStatusBarStateController.setState(StatusBarState.KEYGUARD);
} }
updatePanelExpansionForKeyguard(); updatePanelExpansionForKeyguard();
@@ -3570,7 +3570,6 @@ public class StatusBar extends SystemUI implements
// once we fully woke up. // once we fully woke up.
updateRevealEffect(true /* wakingUp */); updateRevealEffect(true /* wakingUp */);
updateNotificationPanelTouchState(); updateNotificationPanelTouchState();
mPulseExpansionHandler.onStartedWakingUp();
// If we are waking up during the screen off animation, we should undo making the // If we are waking up during the screen off animation, we should undo making the
// expanded visible (we did that so the LightRevealScrim would be visible). // expanded visible (we did that so the LightRevealScrim would be visible).

View File

@@ -80,6 +80,7 @@ public class WakefulnessLifecycleTest extends SysuiTestCase {
assertEquals(WakefulnessLifecycle.WAKEFULNESS_AWAKE, mWakefulness.getWakefulness()); assertEquals(WakefulnessLifecycle.WAKEFULNESS_AWAKE, mWakefulness.getWakefulness());
verify(mWakefulnessObserver).onFinishedWakingUp(); verify(mWakefulnessObserver).onFinishedWakingUp();
verify(mWakefulnessObserver).onPostFinishedWakingUp();
} }
@Test @Test

View File

@@ -4,13 +4,12 @@ import android.test.suitebuilder.annotation.SmallTest
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import android.testing.TestableLooper import android.testing.TestableLooper
import android.testing.TestableLooper.RunWithLooper import android.testing.TestableLooper.RunWithLooper
import android.util.DisplayMetrics
import com.android.systemui.ExpandHelper import com.android.systemui.ExpandHelper
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.log.LogBuffer import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.MediaHierarchyManager import com.android.systemui.media.MediaHierarchyManager
import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.qs.QS import com.android.systemui.plugins.qs.QS
@@ -64,12 +63,11 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
@Mock lateinit var lockScreenUserManager: NotificationLockscreenUserManager @Mock lateinit var lockScreenUserManager: NotificationLockscreenUserManager
@Mock lateinit var falsingCollector: FalsingCollector @Mock lateinit var falsingCollector: FalsingCollector
@Mock lateinit var ambientState: AmbientState @Mock lateinit var ambientState: AmbientState
@Mock lateinit var displayMetrics: DisplayMetrics @Mock lateinit var wakefulnessLifecycle: WakefulnessLifecycle
@Mock lateinit var mediaHierarchyManager: MediaHierarchyManager @Mock lateinit var mediaHierarchyManager: MediaHierarchyManager
@Mock lateinit var scrimController: ScrimController @Mock lateinit var scrimController: ScrimController
@Mock lateinit var configurationController: ConfigurationController @Mock lateinit var configurationController: ConfigurationController
@Mock lateinit var falsingManager: FalsingManager @Mock lateinit var falsingManager: FalsingManager
@Mock lateinit var buffer: LogBuffer
@Mock lateinit var notificationPanelController: NotificationPanelViewController @Mock lateinit var notificationPanelController: NotificationPanelViewController
@Mock lateinit var nsslController: NotificationStackScrollLayoutController @Mock lateinit var nsslController: NotificationStackScrollLayoutController
@Mock lateinit var depthController: NotificationShadeDepthController @Mock lateinit var depthController: NotificationShadeDepthController
@@ -98,6 +96,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
mediaHierarchyManager = mediaHierarchyManager, mediaHierarchyManager = mediaHierarchyManager,
scrimController = scrimController, scrimController = scrimController,
depthController = depthController, depthController = depthController,
wakefulnessLifecycle = wakefulnessLifecycle,
context = context, context = context,
configurationController = configurationController, configurationController = configurationController,
falsingManager = falsingManager, falsingManager = falsingManager,
@@ -147,6 +146,23 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
verify(statusbarStateController).setState(StatusBarState.SHADE_LOCKED) verify(statusbarStateController).setState(StatusBarState.SHADE_LOCKED)
} }
@Test
fun testWakingToShadeLockedWhenDozing() {
whenever(statusbarStateController.isDozing).thenReturn(true)
transitionController.goToLockedShade(null)
verify(statusbarStateController).setState(StatusBarState.SHADE_LOCKED)
assertTrue("Not waking to shade locked", transitionController.isWakingToShadeLocked)
}
@Test
fun testNotWakingToShadeLockedWhenNotDozing() {
whenever(statusbarStateController.isDozing).thenReturn(false)
transitionController.goToLockedShade(null)
verify(statusbarStateController).setState(StatusBarState.SHADE_LOCKED)
assertFalse("Waking to shade locked when not dozing",
transitionController.isWakingToShadeLocked)
}
@Test @Test
fun testGoToLockedShadeOnlyOnKeyguard() { fun testGoToLockedShadeOnlyOnKeyguard() {
whenever(statusbarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED) whenever(statusbarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED)