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

Commit fcb47c92 authored by wilsonshih's avatar wilsonshih
Browse files

Do not prepare PB animation if previous activity has no process.

There will be no window nor snapshot if the activity's process is dead,
also the final hierarchy can be unpredictable after the process
restarted.

Flag: EXEMPT bugfix
Bug: 395218543
Test: atest BackNavigationControllerTests
Change-Id: I564299e33ddad134d540b4efaa2d1f00275587b0
parent 0e0e1d3e
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -281,6 +281,10 @@ class BackNavigationController {
            } else if (hasTranslucentActivity(currentActivity, prevActivities)) {
                // skip if one of participant activity is translucent
                backType = BackNavigationInfo.TYPE_CALLBACK;
            } else if (!allActivitiesHaveProcesses(prevActivities)) {
                // Skip if one of previous activity has no process. Restart process can be slow, and
                // the final hierarchy could be different.
                backType = BackNavigationInfo.TYPE_CALLBACK;
            } else if (prevActivities.size() > 0
                    && requestOverride == SystemOverrideOnBackInvokedCallback.OVERRIDE_UNDEFINED) {
                if ((!isOccluded || isAllActivitiesCanShowWhenLocked(prevActivities))
@@ -603,6 +607,17 @@ class BackNavigationController {
        return false;
    }

    private static boolean allActivitiesHaveProcesses(
            @NonNull ArrayList<ActivityRecord> prevActivities) {
        for (int i = prevActivities.size() - 1; i >= 0; --i) {
            final ActivityRecord test = prevActivities.get(i);
            if (!test.hasProcess()) {
                return false;
            }
        }
        return true;
    }

    private static boolean isAllActivitiesCanShowWhenLocked(
            @NonNull ArrayList<ActivityRecord> prevActivities) {
        for (int i = prevActivities.size() - 1; i >= 0; --i) {
+8 −0
Original line number Diff line number Diff line
@@ -294,6 +294,14 @@ public class BackNavigationControllerTests extends WindowTestsBase {
        backNavigationInfo = startBackNavigation();
        assertThat(typeToString(backNavigationInfo.getType()))
                .isEqualTo(typeToString(BackNavigationInfo.TYPE_CROSS_ACTIVITY));

        // reset drawing status, test previous activity has no process.
        backNavigationInfo.onBackNavigationFinished(false);
        mBackNavigationController.clearBackAnimations(true);
        doReturn(false).when(testCase.recordBack).hasProcess();
        backNavigationInfo = startBackNavigation();
        assertThat(typeToString(backNavigationInfo.getType()))
                .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK));
    }

    @Test