diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/BackNavigationController.java | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 1e96849e556a..7144445f86d8 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -767,6 +767,10 @@ class BackNavigationController { if (!isMonitoringTransition() || targets.isEmpty()) { return; } + if (mAnimationHandler.hasTargetDetached()) { + mNavigationMonitor.cancelBackNavigating("targetDetached"); + return; + } for (int i = targets.size() - 1; i >= 0; --i) { final WindowContainer wc = targets.get(i).mContainer; if (wc.asActivityRecord() == null && wc.asTask() == null @@ -1141,6 +1145,21 @@ class BackNavigationController { || containTarget(openApps, false /* open */)); } + /** + * Check if any animation target is detached, possibly due to app crash. + */ + boolean hasTargetDetached() { + if (!mComposed) { + return false; + } + for (int i = mOpenAnimAdaptor.mAdaptors.length - 1; i >= 0; --i) { + if (!mOpenAnimAdaptor.mAdaptors[i].mTarget.isAttached()) { + return true; + } + } + return !mCloseAdaptor.mTarget.isAttached(); + } + @Override public String toString() { return "AnimationTargets{" @@ -1678,6 +1697,10 @@ class BackNavigationController { } private static void restoreLaunchBehind(@NonNull ActivityRecord activity) { + if (!activity.isAttached()) { + // The activity was detached from hierarchy. + return; + } activity.mDisplayContent.continueUpdateOrientationForDiffOrienLaunchingApp(); // Restore the launch-behind state. |