summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/BackNavigationController.java23
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.