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
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user