summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wei Sheng Shih <wilsonshih@google.com> 2024-06-05 02:31:23 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-06-05 02:31:23 +0000
commit18bc6e82f0e117f59e4f477b0d578e1b48014e49 (patch)
treed1f195625d5fc78885cfb26650bdc6568d9f97fd
parenta1531cf789b8f8c4a099910239fcab2c4e28ec55 (diff)
parent262fe527a159eb428a57647eb955758bc918e13a (diff)
Merge "Polish a weird transition that open animation can apply on non-top task." into main
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java6
-rw-r--r--services/core/java/com/android/server/wm/Transition.java18
2 files changed, 22 insertions, 2 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 65fda9729f00..b056c18cc9f3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -655,8 +655,10 @@ public class Transitions implements RemoteCallable<Transitions>,
}
if (change.hasFlags(FLAG_NO_ANIMATION)) {
hasNoAnimation = true;
- } else {
- // at-least one relevant participant *is* animated, so we need to animate.
+ } else if (!TransitionUtil.isOrderOnly(change) && !change.hasFlags(FLAG_IS_OCCLUDED)) {
+ // Ignore the order only or occluded changes since they shouldn't be visible during
+ // animation. For anything else, we need to animate if at-least one relevant
+ // participant *is* animated,
return false;
}
}
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 4c7582f4a6d2..86c6f8db8899 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -52,6 +52,7 @@ import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY;
import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW;
import static android.window.TransitionInfo.FLAG_IS_DISPLAY;
import static android.window.TransitionInfo.FLAG_IS_INPUT_METHOD;
+import static android.window.TransitionInfo.FLAG_IS_OCCLUDED;
import static android.window.TransitionInfo.FLAG_IS_VOICE_INTERACTION;
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
@@ -2735,6 +2736,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
out.setAnimationOptions(animOptionsForActivityTransition);
}
+ final ArraySet<WindowContainer> occludedAtEndContainers = new ArraySet<>();
// Convert all the resolved ChangeInfos into TransactionInfo.Change objects in order.
final int count = sortedTargets.size();
for (int i = 0; i < count; ++i) {
@@ -2758,6 +2760,22 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
info.mReadyFlags = change.getFlags();
change.setDisplayId(info.mDisplayId, getDisplayId(target));
+ // Add FLAGS_IS_OCCLUDED to preventing from visible-translucent change which belows
+ // the non-translucent change playing unexpected open animation.
+ if (change.getMode() == TRANSIT_TO_FRONT || change.getMode() == TRANSIT_OPEN) {
+ for (int occIndex = occludedAtEndContainers.size() - 1; occIndex >= 0; --occIndex) {
+ if (target.isDescendantOf(occludedAtEndContainers.valueAt(occIndex))) {
+ change.setFlags(change.getFlags() | FLAG_IS_OCCLUDED);
+ break;
+ }
+ }
+ }
+ if (!change.hasFlags(FLAG_TRANSLUCENT) && (change.getMode() == TRANSIT_OPEN
+ || change.getMode() == TRANSIT_TO_FRONT
+ || change.getMode() == TRANSIT_CHANGE)) {
+ occludedAtEndContainers.add(target.getParent());
+ }
+
final Task task = target.asTask();
final TaskFragment taskFragment = target.asTaskFragment();
final boolean isEmbeddedTaskFragment = taskFragment != null