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