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