diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/BackNavigationController.java | 32 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java | 23 |
2 files changed, 51 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index c5902c965b43..c3f1e41d4c5e 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -258,11 +258,11 @@ class BackNavigationController { // activity, we won't close the activity. backType = BackNavigationInfo.TYPE_DIALOG_CLOSE; removedWindowContainer = window; - } else if (!currentActivity.occludesParent() || currentActivity.showWallpaper()) { - // skip if current activity is translucent + } else if (hasTranslucentActivity(currentActivity, prevActivities)) { + // skip if one of participant activity is translucent backType = BackNavigationInfo.TYPE_CALLBACK; } else if (prevActivities.size() > 0) { - if (!isOccluded || prevActivities.get(0).canShowWhenLocked()) { + if (!isOccluded || isAllActivitiesCanShowWhenLocked(prevActivities)) { // We have another Activity in the same currentTask to go to final WindowContainer parent = currentActivity.getParent(); final boolean canCustomize = parent != null @@ -307,7 +307,7 @@ class BackNavigationController { findAdjacentActivityIfExist(tmpPre, prevActivities); } if (prevTask == null || prevActivities.isEmpty() - || (isOccluded && !prevActivities.get(0).canShowWhenLocked())) { + || (isOccluded && !isAllActivitiesCanShowWhenLocked(prevActivities))) { backType = BackNavigationInfo.TYPE_CALLBACK; } else if (prevTask.isActivityTypeHome()) { removedWindowContainer = currentTask; @@ -508,6 +508,30 @@ class BackNavigationController { outList.add(topActivity); } + private static boolean hasTranslucentActivity(@NonNull ActivityRecord currentActivity, + @NonNull ArrayList<ActivityRecord> prevActivities) { + if (!currentActivity.occludesParent() || currentActivity.showWallpaper()) { + return true; + } + for (int i = prevActivities.size() - 1; i >= 0; --i) { + final ActivityRecord test = prevActivities.get(i); + if (!test.occludesParent() || test.showWallpaper()) { + return true; + } + } + return false; + } + + private static boolean isAllActivitiesCanShowWhenLocked( + @NonNull ArrayList<ActivityRecord> prevActivities) { + for (int i = prevActivities.size() - 1; i >= 0; --i) { + if (!prevActivities.get(i).canShowWhenLocked()) { + return false; + } + } + return !prevActivities.isEmpty(); + } + boolean isMonitoringTransition() { return mAnimationHandler.mComposed || mNavigationMonitor.isMonitorForRemote(); } 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 4d4d397585b7..ac18f802d1c6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java @@ -233,6 +233,29 @@ public class BackNavigationControllerTests extends WindowTestsBase { assertThat(typeToString(backNavigationInfo.getType())) .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK)); + // reset drawing status, test if top activity is translucent + backNavigationInfo.onBackNavigationFinished(false); + mBackNavigationController.clearBackAnimations(); + makeWindowVisibleAndDrawn(testCase.recordFront.findMainWindow()); + // simulate translucent + testCase.recordFront.setOccludesParent(false); + backNavigationInfo = startBackNavigation(); + assertThat(typeToString(backNavigationInfo.getType())) + .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK)); + testCase.recordFront.setOccludesParent(true); + + // reset drawing status, test if bottom activity is translucent + backNavigationInfo.onBackNavigationFinished(false); + mBackNavigationController.clearBackAnimations(); + makeWindowVisibleAndDrawn(testCase.recordBack.findMainWindow()); + // simulate translucent + testCase.recordBack.setOccludesParent(false); + backNavigationInfo = startBackNavigation(); + assertThat(typeToString(backNavigationInfo.getType())) + .isEqualTo(typeToString(BackNavigationInfo.TYPE_CALLBACK)); + testCase.recordBack.setOccludesParent(true); + + // reset drawing status, test canShowWhenLocked backNavigationInfo.onBackNavigationFinished(false); mBackNavigationController.clearBackAnimations(); doReturn(true).when(testCase.recordBack).canShowWhenLocked(); |