diff options
| author | 2018-12-13 18:20:11 -0800 | |
|---|---|---|
| committer | 2018-12-14 02:27:12 +0000 | |
| commit | 6ba767a8943856b9f6c1809789fe94e8598e18bc (patch) | |
| tree | 5a69c10222709a951d9ea9e14433ceaa0a95d197 | |
| parent | 7d472585f51e5f2ec9ae542fbe4ed64acd2a2cad (diff) | |
Fix issue with animation handler deadlock
- Stop synchronously fetching the choreographer on the animation thread as
the animation thread may be processing an update with the WM lock already
held
- Revert to using AnimationThread
Bug: 120844232
Test: Manual
Change-Id: Ia9cc3d2e0e2bf8740f2725fe59d12a31a67b1b89
| -rw-r--r-- | services/core/java/com/android/server/wm/BoundsAnimationController.java | 7 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 5 |
2 files changed, 7 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java index 731ebb8a6e86..f9980bebca9e 100644 --- a/services/core/java/com/android/server/wm/BoundsAnimationController.java +++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java @@ -128,9 +128,10 @@ public class BoundsAnimationController { mAnimationHandler = animationHandler; if (animationHandler != null) { // If an animation handler is provided, then ensure that it runs on the sf vsync tick - handler.runWithScissors(() -> mChoreographer = Choreographer.getSfInstance(), - 0 /* timeout */); - animationHandler.setProvider(new SfVsyncFrameCallbackProvider(mChoreographer)); + handler.post(() -> { + mChoreographer = Choreographer.getSfInstance(); + animationHandler.setProvider(new SfVsyncFrameCallbackProvider(mChoreographer)); + }); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 2f4c5cab2559..307ac0de8f8d 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -61,9 +61,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; - import static android.view.WindowManager.TRANSIT_TASK_OPEN; import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; + import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; @@ -169,6 +169,7 @@ import android.view.WindowManagerPolicyConstants.PointerEventListener; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ToBooleanFunction; import com.android.internal.util.function.TriConsumer; +import com.android.server.AnimationThread; import com.android.server.policy.WindowManagerPolicy; import com.android.server.wm.utils.DisplayRotationUtil; import com.android.server.wm.utils.RotationCache; @@ -861,7 +862,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo AnimationHandler animationHandler = new AnimationHandler(); mBoundsAnimationController = new BoundsAnimationController(service.mContext, - mAppTransition, SurfaceAnimationThread.getHandler(), animationHandler); + mAppTransition, AnimationThread.getHandler(), animationHandler); if (mWmService.mInputManager != null) { final InputChannel inputChannel = mWmService.mInputManager.monitorInput("Display " |