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

Commit 7a299db3 authored by Wei Sheng Shih's avatar Wei Sheng Shih Committed by Android (Google) Code Review
Browse files

Merge "Skip predictive back animation if previous activity does not have window" into main

parents bcd59289 8a663f22
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -345,6 +345,10 @@ class BackNavigationController {
                // 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 (!allActivitiesHaveWindow(prevActivities)) {
                // Skip if one of previous activity doesn't has window. Predictive back animation
                // cannot resume previous activity, so nothing will be shown.
                backType = BackNavigationInfo.TYPE_CALLBACK;
            } else if (prevActivities.size() > 0
                    && requestOverride == SystemOverrideOnBackInvokedCallback.OVERRIDE_UNDEFINED) {
                if ((!isOccluded || isAllActivitiesCanShowWhenLocked(prevActivities))
@@ -416,7 +420,8 @@ class BackNavigationController {
                    final Task currParent = currentTask.getParent().asTask();
                    if ((prevTask.inMultiWindowMode() && prevParent != currParent)
                            // Do not animate to translucent task, it could be trampoline.
                            || hasTranslucentActivity(currentActivity, prevActivities)) {
                            || hasTranslucentActivity(currentActivity, prevActivities)
                            || !allActivitiesHaveWindow(prevActivities)) {
                        backType = BackNavigationInfo.TYPE_CALLBACK;
                    } else {
                        removedWindowContainer = prevTask;
@@ -650,6 +655,17 @@ class BackNavigationController {
        return true;
    }

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

    private static boolean isAllActivitiesCanShowWhenLocked(
            @NonNull ArrayList<ActivityRecord> prevActivities) {
        for (int i = prevActivities.size() - 1; i >= 0; --i) {
+18 −0
Original line number Diff line number Diff line
@@ -156,6 +156,8 @@ public class BackNavigationControllerTests extends WindowTestsBase {
    public void backTypeCrossTaskWhenBackToPreviousTask() {
        Task taskA = createTask(mDefaultDisplay);
        ActivityRecord recordA = createActivityRecord(taskA);
        newWindowBuilder("windowA", TYPE_BASE_APPLICATION).setWindowToken(
                recordA).build();
        Mockito.doNothing().when(recordA).reparentSurfaceControl(any(), any());

        final Task topTask = createTopTaskWithActivity();
@@ -206,6 +208,14 @@ public class BackNavigationControllerTests extends WindowTestsBase {
        backNavigationInfo = startBackNavigation();
        assertThat(typeToString(backNavigationInfo.getType()))
                .isEqualTo(typeToString(BackNavigationInfo.TYPE_CROSS_TASK));

        // Reset drawing status to test no window activity.
        backNavigationInfo.onBackNavigationFinished(false);
        mBackNavigationController.clearBackAnimations(true);
        doReturn(null).when(recordA).findMainWindow();
        backNavigationInfo = startBackNavigation();
        assertThat(typeToString(backNavigationInfo.getType()))
                .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK));
    }

    @Test
@@ -304,6 +314,14 @@ public class BackNavigationControllerTests extends WindowTestsBase {
        backNavigationInfo = startBackNavigation();
        assertThat(typeToString(backNavigationInfo.getType()))
                .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK));

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

    @Test