Loading services/core/java/com/android/server/wm/BackNavigationController.java +17 −1 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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; Loading Loading @@ -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) { Loading services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +18 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading
services/core/java/com/android/server/wm/BackNavigationController.java +17 −1 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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; Loading Loading @@ -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) { Loading
services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +18 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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 Loading Loading @@ -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 Loading