From 4d1835db5d98f75bbd2dd1e8bed3a06d7f1ccc46 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Thu, 31 Aug 2017 17:28:27 +0200 Subject: [PATCH] Fix stuck activity Assume the following sequence of events: - prepareAppTransition - setVisibility(app) - okToAnimate -> false - setVisibility(app) In this case, the first setVisibility call sets a dummy animation but the second setVisibility call removes the app from mOpeningApps but does not clear out the animation. In that case, the app is stuck with the dummy animation set that will get never cleared. To fix this, we always reset the animation if a dummy animation is set when changing the visibility, no matter we use a transit or not. Test: Unlock with fingerprint from AOD to homescreen Change-Id: I0dbe2d9836238aba7f16d3e45649fd4b82ff52f6 Fixes: 65067824 --- .../java/com/android/server/wm/AppWindowAnimator.java | 2 +- .../core/java/com/android/server/wm/AppWindowToken.java | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index c2edc04db2e11..c76b90593ab31 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -450,7 +450,7 @@ public class AppWindowAnimator { return isAnimating; } - void dump(PrintWriter pw, String prefix, boolean dumpAll) { + void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken); pw.print(prefix); pw.print("mAnimator="); pw.println(mAnimator); pw.print(prefix); pw.print("freezingScreen="); pw.print(freezingScreen); diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index f4ac961af3733..0a7d1c1d34609 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -368,10 +368,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean runningAppAnimation = false; + if (mAppAnimator.animation == AppWindowAnimator.sDummyAnimation) { + mAppAnimator.setNullAnimation(); + } if (transit != AppTransition.TRANSIT_UNSET) { - if (mAppAnimator.animation == AppWindowAnimator.sDummyAnimation) { - mAppAnimator.setNullAnimation(); - } if (mService.applyAnimationLocked(this, lp, transit, visible, isVoiceInteraction)) { delayed = runningAppAnimation = true; } @@ -1759,6 +1759,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (mRemovingFromDisplay) { pw.println(prefix + "mRemovingFromDisplay=" + mRemovingFromDisplay); } + if (mAppAnimator.isAnimating()) { + mAppAnimator.dump(pw, prefix + " "); + } } @Override