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

Commit 9385a910 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Create a new Transaction to apply the edge extensions

mFrameTransaction is not thread safe and should only be used in the animation thread, but here we were accessing this transaction in a binder thread through the TransactionCommittedListenerCallback.

Bug: 228000332

Test: atest CtsWindowManagerDeviceTestCases:ActivityTransitionTests
Change-Id: Ia5c5022ebd1a12f45fecbb80905606dbda85caf9
parent cbc44916
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -176,13 +176,24 @@ class SurfaceAnimationRunner {
                t.addTransactionCommittedListener(Runnable::run, () -> {
                    final WindowAnimationSpec animationSpec = a.asWindowAnimationSpec();

                    final Transaction edgeExtensionCreationTransaction = new Transaction();
                    edgeExtendWindow(animationLeash,
                            animationSpec.getRootTaskBounds(), animationSpec.getAnimation(),
                            mFrameTransaction);
                            edgeExtensionCreationTransaction);

                    synchronized (mLock) {
                        // only run if animation is not yet canceled by this point
                        if (mPreProcessingAnimations.get(animationLeash) == runningAnim) {
                            // In the case the animation is cancelled, edge extensions are removed
                            // onAnimationLeashLost which is called before onAnimationCancelled.
                            // So we need to check if the edge extensions have already been removed
                            // or not, and if so we don't want to apply the transaction.
                            synchronized (mEdgeExtensionLock) {
                                if (!mEdgeExtensions.isEmpty()) {
                                    edgeExtensionCreationTransaction.apply();
                                }
                            }

                            mPreProcessingAnimations.remove(animationLeash);
                            mPendingAnimations.put(animationLeash, runningAnim);
                            if (!mAnimationStartDeferred) {