Enable WM remote occlude flag; fix occlude state issues.

The flag in KeyguardService was updated, but this one was
not, leading to some duplicate setOccluded calls.

Also, we should not be setting the keyguard occluded if
the occlusion launch animator is cancelled. Cancellations
should be ignored, if we're cancelling due to unoccluding
then we'll set occluded = false in the unocclude method.

Fixes: 228800628
Fixes: 229749961
Fixes: 230135606
Fixes: 229890065
Test: launch Camera a lot
Change-Id: I978cc051c35f84c4a967528801d3bf0f6944430b
This commit is contained in:
Josh Tsuji
2022-04-15 14:24:48 -04:00
parent e133038ef5
commit 05f45a0916
3 changed files with 60 additions and 5 deletions

View File

@@ -849,7 +849,8 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
@Override
public void onLaunchAnimationCancelled() {
setOccluded(true /* occluded */, false /* animate */);
Log.d(TAG, "Occlude launch animation cancelled. "
+ "Occluded state is now: " + mOccluded);
}
@NonNull
@@ -894,7 +895,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
};
private IRemoteAnimationRunner mOccludeAnimationRunner =
new ActivityLaunchRemoteAnimationRunner(mOccludeAnimationController);
new OccludeActivityLaunchRemoteAnimationRunner(mOccludeAnimationController);
/**
* Animation controller for activities that unocclude the keyguard. This does not use the
@@ -919,13 +920,17 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
RemoteAnimationTarget[] wallpapers,
RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
final RemoteAnimationTarget primary = apps[0];
if (apps == null || apps.length == 0 || apps[0] == null) {
Log.d(TAG, "No apps provided to unocclude runner; "
+ "skipping animation and unoccluding.");
if (primary == null) {
finishedCallback.onAnimationFinished();
setOccluded(false /* isOccluded */, true /* animate */);
return;
}
final RemoteAnimationTarget primary = apps[0];
final SyncRtSurfaceTransactionApplier applier =
new SyncRtSurfaceTransactionApplier(
mKeyguardViewControllerLazy.get().getViewRootImpl().getView());
@@ -965,6 +970,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
@Override
public void onAnimationEnd(Animator animation) {
try {
setOccluded(false /* isOccluded */, true /* animate */);
finishedCallback.onAnimationFinished();
mUnoccludeAnimator = null;
} catch (RemoteException e) {
@@ -3125,4 +3131,36 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
mRunner.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback);
}
}
/**
* Subclass of {@link ActivityLaunchRemoteAnimationRunner} that calls {@link #setOccluded} when
* onAnimationStart is called.
*/
private class OccludeActivityLaunchRemoteAnimationRunner
extends ActivityLaunchRemoteAnimationRunner {
OccludeActivityLaunchRemoteAnimationRunner(
ActivityLaunchAnimator.Controller controller) {
super(controller);
}
@Override
public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
super.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback);
// This is the first signal we have from WM that we're going to be occluded. Set our
// internal state to reflect that immediately, vs. waiting for the launch animator to
// begin. Otherwise, calls to setShowingLocked, etc. will not know that we're about to
// be occluded and might re-show the keyguard.
setOccluded(true /* isOccluded */, false /* animate */);
}
@Override
public void onAnimationCancelled() throws RemoteException {
super.onAnimationCancelled();
Log.d(TAG, "Occlude launch animation cancelled. Occluded state is now: " + mOccluded);
}
}
}

View File

@@ -1743,6 +1743,23 @@ public class CentralSurfaces extends CoreStartable implements
}
}
@Override
public void onLaunchAnimationStart(boolean isExpandingFullyAbove) {
super.onLaunchAnimationStart(isExpandingFullyAbove);
// Double check that the keyguard is still showing and not going away, but if so
// set the keyguard occluded. Typically, WM will let KeyguardViewMediator know
// directly, but we're overriding that to play the custom launch animation, so
// we need to take care of that here. The unocclude animation is not overridden,
// so WM will call KeyguardViewMediator's unocclude animation runner when the
// activity is exited.
if (mKeyguardStateController.isShowing()
&& !mKeyguardStateController.isKeyguardGoingAway()) {
mKeyguardViewMediator.setOccluded(true /* isOccluded */,
true /* animate */);
}
}
@Override
public void onLaunchAnimationEnd(boolean isExpandingFullyAbove) {
// Set mIsLaunchingActivityOverLockscreen to false before actually finishing the

View File

@@ -423,7 +423,7 @@ public class WindowManagerService extends IWindowManager.Stub
"persist.wm.enable_remote_keyguard_animation";
private static final int sEnableRemoteKeyguardAnimation =
SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 2);
/**
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY