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

Commit f8c77eee authored by Wale Ogunwale's avatar Wale Ogunwale Committed by android-build-merger
Browse files

Merge "Fixed deadlock between AM and WM when animating pinned stack." into nyc-dev

am: 3a94ec56

* commit '3a94ec56':
  Fixed deadlock between AM and WM when animating pinned stack.

Change-Id: Ie5f929b7a27f8fd3fc7f25b55066d8e45f97a444
parents 948c3638 3a94ec56
Loading
Loading
Loading
Loading
+34 −18
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.graphics.Rect;
import android.os.Handler;
import android.os.IBinder;
import android.os.Debug;
import android.util.ArrayMap;
@@ -40,6 +41,8 @@ import android.view.WindowManagerInternal;
 * the bounds of the resized object.
 *
 * The object that is resized needs to implement {@link AnimateBoundsUser} interface.
 *
 * NOTE: All calls to methods in this class should be done on the UI thread
 */
public class BoundsAnimationController {
    private static final boolean DEBUG_LOCAL = false;
@@ -51,8 +54,9 @@ public class BoundsAnimationController {
    // Only accessed on UI thread.
    private ArrayMap<AnimateBoundsUser, BoundsAnimator> mRunningAnimations = new ArrayMap<>();

    private final WindowManagerInternal.AppTransitionListener mAppTransitionNotifier
        = new WindowManagerInternal.AppTransitionListener() {
    private final class AppTransitionNotifier
            extends WindowManagerInternal.AppTransitionListener implements Runnable {

        public void onAppTransitionCancelledLocked() {
            animationFinished();
        }
@@ -61,18 +65,30 @@ public class BoundsAnimationController {
        }
        private void animationFinished() {
            if (mFinishAnimationAfterTransition) {
                mHandler.removeCallbacks(this);
                // This might end up calling into activity manager which will be bad since we have the
                // window manager lock held at this point. Post a message to take care of the processing
                // so we don't deadlock.
                mHandler.post(this);
            }
        }

        @Override
        public void run() {
            for (int i = 0; i < mRunningAnimations.size(); i++) {
                            BoundsAnimator b = mRunningAnimations.valueAt(i);
                final BoundsAnimator b = mRunningAnimations.valueAt(i);
                b.onAnimationEnd(null);
            }
        }
    }
            };

    private final Handler mHandler;
    private final AppTransition mAppTransition;
    private final AppTransitionNotifier mAppTransitionNotifier = new AppTransitionNotifier();
    private boolean mFinishAnimationAfterTransition = false;

    BoundsAnimationController(AppTransition transition) {
    BoundsAnimationController(AppTransition transition, Handler handler) {
        mHandler = handler;
        mAppTransition = transition;
        mAppTransition.registerListenerLocked(mAppTransitionNotifier);
    }
+2 −1
Original line number Diff line number Diff line
@@ -979,7 +979,8 @@ public class WindowManagerService extends IWindowManager.Stub
        mAppTransition = new AppTransition(context, this);
        mAppTransition.registerListenerLocked(mActivityManagerAppTransitionNotifier);

        mBoundsAnimationController = new BoundsAnimationController(mAppTransition);
        mBoundsAnimationController =
                new BoundsAnimationController(mAppTransition, UiThread.getHandler());

        mActivityManager = ActivityManagerNative.getDefault();
        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);