Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8dab57e9 authored by Robin Lee's avatar Robin Lee Committed by Android Build Coastguard Worker
Browse files

Cancel current animation instead of candidate

Otherwise everything along the way confidently ignores this
and Keyguard doesn't even see the timeout and force-abort
coming when it hits. This leaves an animation timer running
for 950ms which sets occlude status on finish callback and
causes unpleasant race conditions.

Test: atest android.server.wm.KeyguardTests
Test: specific case to be added in b/274003805
Bug: 275650364
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:8ffedf11e398f9a6aa8b30cff5f06b102fd54536)
Merged-In: I7b3dcd06e7483fde745a1d56dfee7c4efc262ed7
Change-Id: I7b3dcd06e7483fde745a1d56dfee7c4efc262ed7
parent 6ab4b8a9
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -260,22 +260,20 @@ public class KeyguardService extends Service {
                );
            }

            public void mergeAnimation(IBinder transition, TransitionInfo info,
                    SurfaceControl.Transaction t, IBinder mergeTarget,
                    IRemoteTransitionFinishedCallback finishCallback) {
            public void mergeAnimation(IBinder candidateTransition, TransitionInfo candidateInfo,
                    SurfaceControl.Transaction candidateT, IBinder currentTransition,
                    IRemoteTransitionFinishedCallback candidateFinishCallback) {
                try {
                    final IRemoteTransitionFinishedCallback origFinishCB;
                    final IRemoteTransitionFinishedCallback currentFinishCB;
                    synchronized (mFinishCallbacks) {
                        origFinishCB = mFinishCallbacks.remove(transition);
                        currentFinishCB = mFinishCallbacks.remove(currentTransition);
                    }
                    info.releaseAllSurfaces();
                    t.close();
                    if (origFinishCB == null) {
                        // already finished (or not started yet), so do nothing.
                    if (currentFinishCB == null) {
                        Slog.e(TAG, "Called mergeAnimation, but finish callback is missing");
                        return;
                    }
                    runner.onAnimationCancelled(false /* isKeyguardOccluded */);
                    origFinishCB.onTransitionFinished(null /* wct */, null /* t */);
                    currentFinishCB.onTransitionFinished(null /* wct */, null /* t */);
                } catch (RemoteException e) {
                    // nothing, we'll just let it finish on its own I guess.
                }
+9 −4
Original line number Diff line number Diff line
@@ -951,10 +951,15 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,

                @Override
                public void onAnimationCancelled(boolean isKeyguardOccluded) {
                    mContext.getMainExecutor().execute(() -> {
                        if (mOccludeByDreamAnimator != null) {
                            mOccludeByDreamAnimator.cancel();
                        }
                    setOccluded(isKeyguardOccluded /* isOccluded */, false /* animate */);
                    });
                    // The value of isKeyguardOccluded here may come from mergeAnimation, which
                    // isn't reliable. In all cases, after running or cancelling this animation,
                    // keyguard should be occluded.
                    setOccluded(true /* isOccluded */, false /* animate */);
                    if (DEBUG) {
                        Log.d(TAG, "Occlude by Dream animation cancelled. Occluded state is now: "
                                + mOccluded);