diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java index 8ca763e817573..9c0025a1f91ec 100644 --- a/core/java/android/window/TransitionInfo.java +++ b/core/java/android/window/TransitionInfo.java @@ -110,8 +110,8 @@ public final class TransitionInfo implements Parcelable { /** The container is an input-method window. */ public static final int FLAG_IS_INPUT_METHOD = 1 << 8; - /** The container is ActivityEmbedding embedded. */ - public static final int FLAG_IS_EMBEDDED = 1 << 9; + /** The container is in a Task with embedded activity. */ + public static final int FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY = 1 << 9; /** The first unused bit. This can be used by remotes to attach custom flags to this change. */ public static final int FLAG_FIRST_CUSTOM = 1 << 10; @@ -137,7 +137,7 @@ public final class TransitionInfo implements Parcelable { FLAG_OCCLUDES_KEYGUARD, FLAG_DISPLAY_HAS_ALERT_WINDOWS, FLAG_IS_INPUT_METHOD, - FLAG_IS_EMBEDDED, + FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY, FLAG_FIRST_CUSTOM, FLAG_WILL_IME_SHOWN }) @@ -322,28 +322,28 @@ public final class TransitionInfo implements Parcelable { sb.append("IS_INPUT_METHOD"); } if ((flags & FLAG_TRANSLUCENT) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "TRANSLUCENT"); + sb.append(sb.length() == 0 ? "" : "|").append("TRANSLUCENT"); } if ((flags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "STARTING_WINDOW_TRANSFER"); + sb.append(sb.length() == 0 ? "" : "|").append("STARTING_WINDOW_TRANSFER"); } if ((flags & FLAG_IS_VOICE_INTERACTION) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "IS_VOICE_INTERACTION"); + sb.append(sb.length() == 0 ? "" : "|").append("IS_VOICE_INTERACTION"); } if ((flags & FLAG_IS_DISPLAY) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "IS_DISPLAY"); + sb.append(sb.length() == 0 ? "" : "|").append("IS_DISPLAY"); } if ((flags & FLAG_OCCLUDES_KEYGUARD) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "OCCLUDES_KEYGUARD"); + sb.append(sb.length() == 0 ? "" : "|").append("OCCLUDES_KEYGUARD"); } if ((flags & FLAG_DISPLAY_HAS_ALERT_WINDOWS) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "DISPLAY_HAS_ALERT_WINDOWS"); + sb.append(sb.length() == 0 ? "" : "|").append("DISPLAY_HAS_ALERT_WINDOWS"); } - if ((flags & FLAG_IS_EMBEDDED) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "IS_EMBEDDED"); + if ((flags & FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY) != 0) { + sb.append(sb.length() == 0 ? "" : "|").append("IN_TASK_WITH_EMBEDDED_ACTIVITY"); } if ((flags & FLAG_FIRST_CUSTOM) != 0) { - sb.append((sb.length() == 0 ? "" : "|") + "FIRST_CUSTOM"); + sb.append(sb.length() == 0 ? "" : "|").append("FIRST_CUSTOM"); } return sb.toString(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java index e0004fcaa0605..1c403f0993d4a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java @@ -16,7 +16,7 @@ package com.android.wm.shell.activityembedding; -import static android.window.TransitionInfo.FLAG_IS_EMBEDDED; +import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static java.util.Objects.requireNonNull; @@ -85,9 +85,9 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { // TODO(b/207070762) Handle AE animation as a part of other transitions. - // Only handle the transition if all containers are embedded. for (TransitionInfo.Change change : info.getChanges()) { - if (!isEmbedded(change)) { + if (!change.hasFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY)) { + // Only animate the transition if all changes are in a Task with ActivityEmbedding. return false; } } @@ -119,8 +119,4 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle } callback.onTransitionFinished(null /* wct */, null /* wctCB */); } - - private static boolean isEmbedded(@NonNull TransitionInfo.Change change) { - return (change.getFlags() & FLAG_IS_EMBEDDED) != 0; - } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java index b2e45a6b3a5cd..a7234c1d3cb8b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java @@ -17,7 +17,7 @@ package com.android.wm.shell.activityembedding; import static android.view.WindowManager.TRANSIT_OPEN; -import static android.window.TransitionInfo.FLAG_IS_EMBEDDED; +import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -57,7 +57,7 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim public void testStartAnimation() { final TransitionInfo info = new TransitionInfo(TRANSIT_OPEN, 0); final TransitionInfo.Change embeddingChange = createChange(); - embeddingChange.setFlags(FLAG_IS_EMBEDDED); + embeddingChange.setFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY); info.addChange(embeddingChange); doReturn(mAnimator).when(mAnimRunner).createAnimator(any(), any(), any(), any()); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java index cf43b0030d2a6..2849b24f86df9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java @@ -17,7 +17,7 @@ package com.android.wm.shell.activityembedding; import static android.view.WindowManager.TRANSIT_OPEN; -import static android.window.TransitionInfo.FLAG_IS_EMBEDDED; +import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; @@ -78,7 +78,7 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation public void testStartAnimation_containsNonActivityEmbeddingChange() { final TransitionInfo info = new TransitionInfo(TRANSIT_OPEN, 0); final TransitionInfo.Change embeddingChange = createChange(); - embeddingChange.setFlags(FLAG_IS_EMBEDDED); + embeddingChange.setFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY); final TransitionInfo.Change nonEmbeddingChange = createChange(); info.addChange(embeddingChange); info.addChange(nonEmbeddingChange); @@ -96,7 +96,7 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation public void testStartAnimation_onlyActivityEmbeddingChange() { final TransitionInfo info = new TransitionInfo(TRANSIT_OPEN, 0); final TransitionInfo.Change embeddingChange = createChange(); - embeddingChange.setFlags(FLAG_IS_EMBEDDED); + embeddingChange.setFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY); info.addChange(embeddingChange); // No-op @@ -116,7 +116,7 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation final TransitionInfo info = new TransitionInfo(TRANSIT_OPEN, 0); final TransitionInfo.Change embeddingChange = createChange(); - embeddingChange.setFlags(FLAG_IS_EMBEDDED); + embeddingChange.setFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY); info.addChange(embeddingChange); mController.startAnimation(mTransition, info, mStartTransaction, mFinishTransaction, mFinishCallback); diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 6650f43c15ae1..f3c8062842ee1 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -46,8 +46,8 @@ import static android.view.WindowManager.TransitionFlags; import static android.view.WindowManager.TransitionType; import static android.view.WindowManager.transitTypeToString; import static android.window.TransitionInfo.FLAG_DISPLAY_HAS_ALERT_WINDOWS; +import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static android.window.TransitionInfo.FLAG_IS_DISPLAY; -import static android.window.TransitionInfo.FLAG_IS_EMBEDDED; import static android.window.TransitionInfo.FLAG_IS_INPUT_METHOD; import static android.window.TransitionInfo.FLAG_IS_VOICE_INTERACTION; import static android.window.TransitionInfo.FLAG_IS_WALLPAPER; @@ -1873,8 +1873,10 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe flags |= FLAG_WILL_IME_SHOWN; } } + Task parentTask = null; final ActivityRecord record = wc.asActivityRecord(); if (record != null) { + parentTask = record.getTask(); if (record.mUseTransferredAnimation) { flags |= FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT; } @@ -1882,6 +1884,15 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe flags |= FLAG_IS_VOICE_INTERACTION; } } + final TaskFragment taskFragment = wc.asTaskFragment(); + if (taskFragment != null && task == null) { + parentTask = taskFragment.getTask(); + } + if (parentTask != null + && parentTask.forAllLeafTaskFragments(TaskFragment::isEmbedded)) { + // Whether this is in a Task with embedded activity. + flags |= FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; + } final DisplayContent dc = wc.asDisplayContent(); if (dc != null) { flags |= FLAG_IS_DISPLAY; @@ -1898,9 +1909,6 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe if (occludesKeyguard(wc)) { flags |= FLAG_OCCLUDES_KEYGUARD; } - if (wc.isEmbedded()) { - flags |= FLAG_IS_EMBEDDED; - } return flags; } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 8f186e40e2014..5ba44114b0bd6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -31,7 +31,7 @@ import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; -import static android.window.TransitionInfo.FLAG_IS_EMBEDDED; +import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static android.window.TransitionInfo.FLAG_IS_WALLPAPER; import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER; import static android.window.TransitionInfo.FLAG_TRANSLUCENT; @@ -1062,12 +1062,14 @@ public class TransitionTests extends WindowTestsBase { } @Test - public void testIsEmbeddedChange() { + public void testFlagInTaskWithEmbeddedActivity() { final Transition transition = createTestTransition(TRANSIT_OPEN); final ArrayMap changes = transition.mChanges; final ArraySet participants = transition.mParticipants; final Task task = createTask(mDisplayContent); + final ActivityRecord nonEmbeddedActivity = createActivityRecord(task); + assertFalse(nonEmbeddedActivity.isEmbedded()); final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run); mAtm.mTaskFragmentOrganizerController.registerOrganizer( ITaskFragmentOrganizer.Stub.asInterface(organizer.getOrganizerToken().asBinder())); @@ -1082,20 +1084,27 @@ public class TransitionTests extends WindowTestsBase { changes.put(embeddedTf, new Transition.ChangeInfo(true /* vis */, false /* exChg */)); changes.put(closingActivity, new Transition.ChangeInfo(true /* vis */, false /* exChg */)); changes.put(openingActivity, new Transition.ChangeInfo(false /* vis */, true /* exChg */)); + changes.put(nonEmbeddedActivity, new Transition.ChangeInfo(true /* vis */, + false /* exChg */)); // End states. closingActivity.mVisibleRequested = false; openingActivity.mVisibleRequested = true; + nonEmbeddedActivity.mVisibleRequested = false; participants.add(closingActivity); participants.add(openingActivity); + participants.add(nonEmbeddedActivity); final ArrayList targets = Transition.calculateTargets( participants, changes); final TransitionInfo info = Transition.calculateTransitionInfo( transition.mType, 0 /* flags */, targets, changes, mMockT); - assertEquals(2, info.getChanges().size()); - assertTrue((info.getChanges().get(0).getFlags() & FLAG_IS_EMBEDDED) != 0); - assertTrue((info.getChanges().get(1).getFlags() & FLAG_IS_EMBEDDED) != 0); + // All windows in the Task should have FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY because the Task + // contains embedded activity. + assertEquals(3, info.getChanges().size()); + assertTrue(info.getChanges().get(0).hasFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY)); + assertTrue(info.getChanges().get(1).hasFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY)); + assertTrue(info.getChanges().get(2).hasFlags(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY)); } @Test