Pass keyguard occlude state to onLaunchAnimationCancelled.

We need to apply this canonical occlusion state whenever an
animation that occludes the lockscreen is cancelled. We
usually do this via KeyguardViewMediator's occlusion launch
animator, but the controls/wallet launch cases do not use
this code path, so the WM occlusion value was being ignored.

This is normally fine, but in an edge case where the animation
is cancelled before it begins, this resulted in a temporary
mismatch of the occlusion state, leaving an empty wallpaper
with no lockscreen rendered.

Fixes: 240347798
Test: atest SystemUITests
Test: launch controls activity over lockscreen with a patch to force WM to instantly cancel all remote launch animations
Change-Id: I8a11db3a3b277364c1d8415aa152b352aa8a1c36
This commit is contained in:
Josh Tsuji
2022-08-09 15:41:51 -04:00
parent 50d3d7301c
commit 55b1bc3200
7 changed files with 29 additions and 10 deletions

View File

@@ -352,8 +352,11 @@ class ActivityLaunchAnimator(
* The animation was cancelled. Note that [onLaunchAnimationEnd] will still be called after
* this if the animation was already started, i.e. if [onLaunchAnimationStart] was called
* before the cancellation.
*
* If this launch animation affected the occlusion state of the keyguard, WM will provide
* us with [newKeyguardOccludedState] so that we can set the occluded state appropriately.
*/
fun onLaunchAnimationCancelled() {}
fun onLaunchAnimationCancelled(newKeyguardOccludedState: Boolean? = null) {}
}
@VisibleForTesting
@@ -667,7 +670,7 @@ class ActivityLaunchAnimator(
removeTimeout()
context.mainExecutor.execute {
animation?.cancel()
controller.onLaunchAnimationCancelled()
controller.onLaunchAnimationCancelled(newKeyguardOccludedState = isKeyguardOccluded)
}
}

View File

@@ -238,7 +238,7 @@ constructor(
}
}
override fun onLaunchAnimationCancelled() {
override fun onLaunchAnimationCancelled(newKeyguardOccludedState: Boolean?) {
controller.onLaunchAnimationCancelled()
enableDialogDismiss()
dialog.dismiss()

View File

@@ -831,7 +831,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
public void onLaunchAnimationStart(boolean isExpandingFullyAbove) {}
@Override
public void onLaunchAnimationCancelled() {
public void onLaunchAnimationCancelled(@Nullable Boolean newKeyguardOccludedState) {
Log.d(TAG, "Occlude launch animation cancelled. Occluded state is now: "
+ mOccluded);
}

View File

@@ -136,7 +136,7 @@ class NotificationLaunchAnimatorController(
headsUpManager.removeNotification(notificationKey, true /* releaseImmediately */, animate)
}
override fun onLaunchAnimationCancelled() {
override fun onLaunchAnimationCancelled(newKeyguardOccludedState: Boolean?) {
// TODO(b/184121838): Should we call InteractionJankMonitor.cancel if the animation started
// here?
notificationShadeWindowViewController.setExpandAnimationRunning(false)

View File

@@ -1721,13 +1721,18 @@ public class CentralSurfacesImpl extends CoreStartable implements
}
@Override
public void onLaunchAnimationCancelled() {
public void onLaunchAnimationCancelled(@Nullable Boolean newKeyguardOccludedState) {
if (newKeyguardOccludedState != null) {
mKeyguardViewMediator.setOccluded(
newKeyguardOccludedState, false /* animate */);
}
// Set mIsLaunchingActivityOverLockscreen to false before actually finishing the
// animation so that we can assume that mIsLaunchingActivityOverLockscreen
// being true means that we will collapse the shade (or at least run the
// post collapse runnables) later on.
CentralSurfacesImpl.this.mIsLaunchingActivityOverLockscreen = false;
getDelegate().onLaunchAnimationCancelled();
getDelegate().onLaunchAnimationCancelled(newKeyguardOccludedState);
}
};
} else if (dismissShade) {

View File

@@ -51,7 +51,7 @@ class StatusBarLaunchAnimatorController(
centralSurfaces.notificationPanelViewController.applyLaunchAnimationProgress(linearProgress)
}
override fun onLaunchAnimationCancelled() {
override fun onLaunchAnimationCancelled(newKeyguardOccludedState: Boolean?) {
delegate.onLaunchAnimationCancelled()
centralSurfaces.notificationPanelViewController.setIsLaunchAnimationRunning(false)
centralSurfaces.onLaunchAnimationCancelled(isLaunchForActivity)

View File

@@ -161,7 +161,18 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() {
runner.onAnimationStart(0, emptyArray(), emptyArray(), emptyArray(), iCallback)
waitForIdleSync()
verify(controller).onLaunchAnimationCancelled()
verify(controller).onLaunchAnimationCancelled(false /* newKeyguardOccludedState */)
verify(controller, never()).onLaunchAnimationStart(anyBoolean())
}
@Test
fun passesOccludedStateToLaunchAnimationCancelled_ifTrue() {
val runner = activityLaunchAnimator.createRunner(controller)
runner.onAnimationCancelled(true /* isKeyguardOccluded */)
runner.onAnimationStart(0, emptyArray(), emptyArray(), emptyArray(), iCallback)
waitForIdleSync()
verify(controller).onLaunchAnimationCancelled(true /* newKeyguardOccludedState */)
verify(controller, never()).onLaunchAnimationStart(anyBoolean())
}
@@ -253,7 +264,7 @@ private class TestLaunchAnimatorController(override var launchContainer: ViewGro
assertOnMainThread()
}
override fun onLaunchAnimationCancelled() {
override fun onLaunchAnimationCancelled(newKeyguardOccludedState: Boolean?) {
assertOnMainThread()
}
}