summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wei Sheng Shih <wilsonshih@google.com> 2023-12-07 02:09:35 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-12-07 02:09:35 +0000
commite5127ca459c535fed7593f03dac2728cb15f2257 (patch)
tree221af249761d2cb9b484c70e38c8894a87cdbecb
parent21bc8cced5fdbabfb83ef73accab8217136eb129 (diff)
parenta39fce76745ae0b43b4db5328d48624d7b538666 (diff)
Merge "Skip predict back animation to translucent activity." into main
-rw-r--r--services/core/java/com/android/server/wm/BackNavigationController.java32
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java23
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();