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

Commit 814a7684 authored by wilsonshih's avatar wilsonshih Committed by Wei Sheng Shih
Browse files

Fixes system server crash from window detached from hierarchy...

during predictive back animation.

Bug: 330430707
Test: simulale app crash and remove task immediately while back
navigating, verify there will just cancel animation.

Change-Id: I36493a74a137d951c43ace2110599a605cf2520a
parent 00481176
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -748,6 +748,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
@@ -1122,6 +1126,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{"
@@ -1659,6 +1678,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.