From fcb47c92d6786e640b56ac11cd7b02ea4e953fc3 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 14 Feb 2025 07:05:53 +0000 Subject: 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 --- .../com/android/server/wm/BackNavigationController.java | 15 +++++++++++++++ .../android/server/wm/BackNavigationControllerTests.java | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 094ad187686c..d652ea1e26a4 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -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 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 prevActivities) { for (int i = prevActivities.size() - 1; i >= 0; --i) { diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java index fbb123e25b29..e08197155f03 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java @@ -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 -- cgit v1.2.3-59-g8ed1b