[DO NOT MERGE] Remove MODE_WAKE_AND_UNLOCK_PULSING from stopDozing
A race condition exists when unlocking with UDFPS, or when unlocking from a pulse state, that leaves SystemUI believing it is still in a doze state even after unlocking. Because of this, the blur never transitions and instead stuck in the doze state, which then causes SystemUI to retain focus and grab all touches over the launcher. This code path should no longer be relevant. Updated unlock animations now handle all the keyguard elements without the need for this dedicated path. Furthermore, cleanup unused paths in NotifcationShadeDepthController. The animateTo() calls accepted an optional view which was never used. Test: manual - Use UDFPS to unlock while dozing with AOD, without AOD, and when pulsing from a notification Test: atest NotificationShadeDepthControllerTest CentralSurfacesImplTest DozeServiceHostTest Fixes: 242415456 Change-Id: Ide66ab84eda91d8938a48014a91cbe3f12f2bf26
This commit is contained in:
@@ -81,7 +81,6 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
lateinit var root: View
|
lateinit var root: View
|
||||||
private var blurRoot: View? = null
|
|
||||||
private var keyguardAnimator: Animator? = null
|
private var keyguardAnimator: Animator? = null
|
||||||
private var notificationAnimator: Animator? = null
|
private var notificationAnimator: Animator? = null
|
||||||
private var updateScheduled: Boolean = false
|
private var updateScheduled: Boolean = false
|
||||||
@@ -235,7 +234,7 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
|
|
||||||
val opaque = scrimsVisible && !blursDisabledForAppLaunch
|
val opaque = scrimsVisible && !blursDisabledForAppLaunch
|
||||||
Trace.traceCounter(Trace.TRACE_TAG_APP, "shade_blur_radius", blur)
|
Trace.traceCounter(Trace.TRACE_TAG_APP, "shade_blur_radius", blur)
|
||||||
blurUtils.applyBlur(blurRoot?.viewRootImpl ?: root.viewRootImpl, blur, opaque)
|
blurUtils.applyBlur(root.viewRootImpl, blur, opaque)
|
||||||
lastAppliedBlur = blur
|
lastAppliedBlur = blur
|
||||||
wallpaperController.setNotificationShadeZoom(zoomOut)
|
wallpaperController.setNotificationShadeZoom(zoomOut)
|
||||||
listeners.forEach {
|
listeners.forEach {
|
||||||
@@ -271,7 +270,6 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
override fun onAnimationEnd(animation: Animator?) {
|
override fun onAnimationEnd(animation: Animator?) {
|
||||||
keyguardAnimator = null
|
keyguardAnimator = null
|
||||||
wakeAndUnlockBlurRadius = 0f
|
wakeAndUnlockBlurRadius = 0f
|
||||||
scheduleUpdate()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
start()
|
start()
|
||||||
@@ -302,7 +300,6 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
|
|
||||||
override fun onDozeAmountChanged(linear: Float, eased: Float) {
|
override fun onDozeAmountChanged(linear: Float, eased: Float) {
|
||||||
wakeAndUnlockBlurRadius = blurUtils.blurRadiusOfRatio(eased)
|
wakeAndUnlockBlurRadius = blurUtils.blurRadiusOfRatio(eased)
|
||||||
scheduleUpdate()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,12 +436,11 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
shadeAnimation.animateTo(blurUtils.blurRadiusOfRatio(targetBlurNormalized).toInt())
|
shadeAnimation.animateTo(blurUtils.blurRadiusOfRatio(targetBlurNormalized).toInt())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun scheduleUpdate(viewToBlur: View? = null) {
|
private fun scheduleUpdate() {
|
||||||
if (updateScheduled) {
|
if (updateScheduled) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
updateScheduled = true
|
updateScheduled = true
|
||||||
blurRoot = viewToBlur
|
|
||||||
choreographer.postFrameCallback(updateBlurCallback)
|
choreographer.postFrameCallback(updateBlurCallback)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -495,16 +491,11 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
*/
|
*/
|
||||||
private var pendingRadius = -1
|
private var pendingRadius = -1
|
||||||
|
|
||||||
/**
|
|
||||||
* View on {@link Surface} that wants depth.
|
|
||||||
*/
|
|
||||||
private var view: View? = null
|
|
||||||
|
|
||||||
private var springAnimation = SpringAnimation(this, object :
|
private var springAnimation = SpringAnimation(this, object :
|
||||||
FloatPropertyCompat<DepthAnimation>("blurRadius") {
|
FloatPropertyCompat<DepthAnimation>("blurRadius") {
|
||||||
override fun setValue(rect: DepthAnimation?, value: Float) {
|
override fun setValue(rect: DepthAnimation?, value: Float) {
|
||||||
radius = value
|
radius = value
|
||||||
scheduleUpdate(view)
|
scheduleUpdate()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getValue(rect: DepthAnimation?): Float {
|
override fun getValue(rect: DepthAnimation?): Float {
|
||||||
@@ -519,11 +510,10 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
springAnimation.addEndListener { _, _, _, _ -> pendingRadius = -1 }
|
springAnimation.addEndListener { _, _, _, _ -> pendingRadius = -1 }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun animateTo(newRadius: Int, viewToBlur: View? = null) {
|
fun animateTo(newRadius: Int) {
|
||||||
if (pendingRadius == newRadius && view == viewToBlur) {
|
if (pendingRadius == newRadius) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
view = viewToBlur
|
|
||||||
pendingRadius = newRadius
|
pendingRadius = newRadius
|
||||||
springAnimation.animateToFinalPosition(newRadius.toFloat())
|
springAnimation.animateToFinalPosition(newRadius.toFloat())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -390,8 +390,6 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn
|
|||||||
void fadeKeyguardAfterLaunchTransition(Runnable beforeFading,
|
void fadeKeyguardAfterLaunchTransition(Runnable beforeFading,
|
||||||
Runnable endRunnable, Runnable cancelRunnable);
|
Runnable endRunnable, Runnable cancelRunnable);
|
||||||
|
|
||||||
void fadeKeyguardWhilePulsing();
|
|
||||||
|
|
||||||
void animateKeyguardUnoccluding();
|
void animateKeyguardUnoccluding();
|
||||||
|
|
||||||
void startLaunchTransitionTimeout();
|
void startLaunchTransitionTimeout();
|
||||||
|
|||||||
@@ -3018,19 +3018,6 @@ public class CentralSurfacesImpl extends CoreStartable implements
|
|||||||
mLaunchTransitionCancelRunnable = null;
|
mLaunchTransitionCancelRunnable = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Fades the content of the Keyguard while we are dozing and makes it invisible when finished
|
|
||||||
* fading.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void fadeKeyguardWhilePulsing() {
|
|
||||||
mNotificationPanelViewController.fadeOut(0, FADE_KEYGUARD_DURATION_PULSING,
|
|
||||||
()-> {
|
|
||||||
hideKeyguard();
|
|
||||||
mStatusBarKeyguardViewManager.onKeyguardFadedAway();
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plays the animation when an activity that was occluding Keyguard goes away.
|
* Plays the animation when an activity that was occluding Keyguard goes away.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -209,12 +209,8 @@ public final class DozeServiceHost implements DozeHost {
|
|||||||
void updateDozing() {
|
void updateDozing() {
|
||||||
Assert.isMainThread();
|
Assert.isMainThread();
|
||||||
|
|
||||||
// When in wake-and-unlock while pulsing, keep dozing state until fully unlocked.
|
boolean dozing =
|
||||||
boolean
|
mDozingRequested && mStatusBarStateController.getState() == StatusBarState.KEYGUARD;
|
||||||
dozing =
|
|
||||||
mDozingRequested && mStatusBarStateController.getState() == StatusBarState.KEYGUARD
|
|
||||||
|| mBiometricUnlockControllerLazy.get().getMode()
|
|
||||||
== BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
|
|
||||||
// When in wake-and-unlock we may not have received a change to StatusBarState
|
// When in wake-and-unlock we may not have received a change to StatusBarState
|
||||||
// but we still should not be dozing, manually set to false.
|
// but we still should not be dozing, manually set to false.
|
||||||
if (mBiometricUnlockControllerLazy.get().getMode()
|
if (mBiometricUnlockControllerLazy.get().getMode()
|
||||||
|
|||||||
@@ -837,30 +837,24 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
executeAfterKeyguardGoneAction();
|
executeAfterKeyguardGoneAction();
|
||||||
boolean wakeUnlockPulsing =
|
|
||||||
mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING;
|
|
||||||
mCentralSurfaces.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
|
mCentralSurfaces.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
|
||||||
mBiometricUnlockController.startKeyguardFadingAway();
|
mBiometricUnlockController.startKeyguardFadingAway();
|
||||||
hideBouncer(true /* destroyView */);
|
hideBouncer(true /* destroyView */);
|
||||||
if (wakeUnlockPulsing) {
|
|
||||||
mCentralSurfaces.fadeKeyguardWhilePulsing();
|
boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide();
|
||||||
|
if (!staying) {
|
||||||
|
mNotificationShadeWindowController.setKeyguardFadingAway(true);
|
||||||
|
mCentralSurfaces.hideKeyguard();
|
||||||
|
// hide() will happen asynchronously and might arrive after the scrims
|
||||||
|
// were already hidden, this means that the transition callback won't
|
||||||
|
// be triggered anymore and StatusBarWindowController will be forever in
|
||||||
|
// the fadingAway state.
|
||||||
|
mCentralSurfaces.updateScrimController();
|
||||||
wakeAndUnlockDejank();
|
wakeAndUnlockDejank();
|
||||||
} else {
|
} else {
|
||||||
boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide();
|
mCentralSurfaces.hideKeyguard();
|
||||||
if (!staying) {
|
mCentralSurfaces.finishKeyguardFadingAway();
|
||||||
mNotificationShadeWindowController.setKeyguardFadingAway(true);
|
mBiometricUnlockController.finishKeyguardFadingAway();
|
||||||
mCentralSurfaces.hideKeyguard();
|
|
||||||
// hide() will happen asynchronously and might arrive after the scrims
|
|
||||||
// were already hidden, this means that the transition callback won't
|
|
||||||
// be triggered anymore and StatusBarWindowController will be forever in
|
|
||||||
// the fadingAway state.
|
|
||||||
mCentralSurfaces.updateScrimController();
|
|
||||||
wakeAndUnlockDejank();
|
|
||||||
} else {
|
|
||||||
mCentralSurfaces.hideKeyguard();
|
|
||||||
mCentralSurfaces.finishKeyguardFadingAway();
|
|
||||||
mBiometricUnlockController.finishKeyguardFadingAway();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateStates();
|
updateStates();
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ import org.mockito.ArgumentMatchers.floatThat
|
|||||||
import org.mockito.Captor
|
import org.mockito.Captor
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
import org.mockito.Mockito
|
import org.mockito.Mockito
|
||||||
import org.mockito.Mockito.`when`
|
|
||||||
import org.mockito.Mockito.any
|
import org.mockito.Mockito.any
|
||||||
import org.mockito.Mockito.anyFloat
|
import org.mockito.Mockito.anyFloat
|
||||||
import org.mockito.Mockito.anyString
|
import org.mockito.Mockito.anyString
|
||||||
@@ -56,6 +55,7 @@ import org.mockito.Mockito.clearInvocations
|
|||||||
import org.mockito.Mockito.never
|
import org.mockito.Mockito.never
|
||||||
import org.mockito.Mockito.reset
|
import org.mockito.Mockito.reset
|
||||||
import org.mockito.Mockito.verify
|
import org.mockito.Mockito.verify
|
||||||
|
import org.mockito.Mockito.`when`
|
||||||
import org.mockito.junit.MockitoJUnit
|
import org.mockito.junit.MockitoJUnit
|
||||||
|
|
||||||
@RunWith(AndroidTestingRunner::class)
|
@RunWith(AndroidTestingRunner::class)
|
||||||
@@ -139,7 +139,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
notificationShadeDepthController.onPanelExpansionChanged(
|
notificationShadeDepthController.onPanelExpansionChanged(
|
||||||
PanelExpansionChangeEvent(
|
PanelExpansionChangeEvent(
|
||||||
fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
|
fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
|
||||||
verify(shadeAnimation).animateTo(eq(maxBlur), any())
|
verify(shadeAnimation).animateTo(eq(maxBlur))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -147,7 +147,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
notificationShadeDepthController.onPanelExpansionChanged(
|
notificationShadeDepthController.onPanelExpansionChanged(
|
||||||
PanelExpansionChangeEvent(
|
PanelExpansionChangeEvent(
|
||||||
fraction = 0.01f, expanded = false, tracking = false, dragDownPxAmount = 0f))
|
fraction = 0.01f, expanded = false, tracking = false, dragDownPxAmount = 0f))
|
||||||
verify(shadeAnimation).animateTo(eq(maxBlur), any())
|
verify(shadeAnimation).animateTo(eq(maxBlur))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -157,7 +157,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
notificationShadeDepthController.onPanelExpansionChanged(
|
notificationShadeDepthController.onPanelExpansionChanged(
|
||||||
PanelExpansionChangeEvent(
|
PanelExpansionChangeEvent(
|
||||||
fraction = 0f, expanded = false, tracking = false, dragDownPxAmount = 0f))
|
fraction = 0f, expanded = false, tracking = false, dragDownPxAmount = 0f))
|
||||||
verify(shadeAnimation).animateTo(eq(0), any())
|
verify(shadeAnimation).animateTo(eq(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -168,15 +168,15 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
onPanelExpansionChanged_apliesBlur_ifShade()
|
onPanelExpansionChanged_apliesBlur_ifShade()
|
||||||
clearInvocations(shadeAnimation)
|
clearInvocations(shadeAnimation)
|
||||||
notificationShadeDepthController.onPanelExpansionChanged(event)
|
notificationShadeDepthController.onPanelExpansionChanged(event)
|
||||||
verify(shadeAnimation, never()).animateTo(anyInt(), any())
|
verify(shadeAnimation, never()).animateTo(anyInt())
|
||||||
|
|
||||||
notificationShadeDepthController.onPanelExpansionChanged(
|
notificationShadeDepthController.onPanelExpansionChanged(
|
||||||
event.copy(fraction = 0.9f, tracking = true))
|
event.copy(fraction = 0.9f, tracking = true))
|
||||||
verify(shadeAnimation, never()).animateTo(anyInt(), any())
|
verify(shadeAnimation, never()).animateTo(anyInt())
|
||||||
|
|
||||||
notificationShadeDepthController.onPanelExpansionChanged(
|
notificationShadeDepthController.onPanelExpansionChanged(
|
||||||
event.copy(fraction = 0.8f, tracking = false))
|
event.copy(fraction = 0.8f, tracking = false))
|
||||||
verify(shadeAnimation).animateTo(eq(0), any())
|
verify(shadeAnimation).animateTo(eq(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -186,7 +186,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
notificationShadeDepthController.onPanelExpansionChanged(
|
notificationShadeDepthController.onPanelExpansionChanged(
|
||||||
PanelExpansionChangeEvent(
|
PanelExpansionChangeEvent(
|
||||||
fraction = 0.6f, expanded = true, tracking = true, dragDownPxAmount = 0f))
|
fraction = 0.6f, expanded = true, tracking = true, dragDownPxAmount = 0f))
|
||||||
verify(shadeAnimation).animateTo(eq(maxBlur), any())
|
verify(shadeAnimation).animateTo(eq(maxBlur))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -212,7 +212,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
|
|
||||||
statusBarState = StatusBarState.KEYGUARD
|
statusBarState = StatusBarState.KEYGUARD
|
||||||
statusBarStateListener.onStateChanged(statusBarState)
|
statusBarStateListener.onStateChanged(statusBarState)
|
||||||
verify(shadeAnimation).animateTo(eq(0), any())
|
verify(shadeAnimation).animateTo(eq(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -395,13 +395,13 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
@Test
|
@Test
|
||||||
fun brightnessMirrorVisible_whenVisible() {
|
fun brightnessMirrorVisible_whenVisible() {
|
||||||
notificationShadeDepthController.brightnessMirrorVisible = true
|
notificationShadeDepthController.brightnessMirrorVisible = true
|
||||||
verify(brightnessSpring).animateTo(eq(maxBlur), any())
|
verify(brightnessSpring).animateTo(eq(maxBlur))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun brightnessMirrorVisible_whenHidden() {
|
fun brightnessMirrorVisible_whenHidden() {
|
||||||
notificationShadeDepthController.brightnessMirrorVisible = false
|
notificationShadeDepthController.brightnessMirrorVisible = false
|
||||||
verify(brightnessSpring).animateTo(eq(0), any())
|
verify(brightnessSpring).animateTo(eq(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -424,7 +424,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
fun ignoreShadeBlurUntilHidden_whennNull_ignoresIfShadeHasNoBlur() {
|
fun ignoreShadeBlurUntilHidden_whennNull_ignoresIfShadeHasNoBlur() {
|
||||||
`when`(shadeAnimation.radius).thenReturn(0f)
|
`when`(shadeAnimation.radius).thenReturn(0f)
|
||||||
notificationShadeDepthController.blursDisabledForAppLaunch = true
|
notificationShadeDepthController.blursDisabledForAppLaunch = true
|
||||||
verify(shadeAnimation, never()).animateTo(anyInt(), any())
|
verify(shadeAnimation, never()).animateTo(anyInt())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun enableSplitShade() {
|
private fun enableSplitShade() {
|
||||||
|
|||||||
Reference in New Issue
Block a user