diff options
7 files changed, 54 insertions, 1 deletions
diff --git a/core/java/android/window/TaskFragmentOrganizer.java b/core/java/android/window/TaskFragmentOrganizer.java index 5c113f865d45..461eab61e393 100644 --- a/core/java/android/window/TaskFragmentOrganizer.java +++ b/core/java/android/window/TaskFragmentOrganizer.java @@ -18,6 +18,7 @@ package android.window; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; +import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM; import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_OPEN; @@ -93,6 +94,19 @@ public class TaskFragmentOrganizer extends WindowOrganizer { @TaskFragmentTransitionType public static final int TASK_FRAGMENT_TRANSIT_CHANGE = TRANSIT_CHANGE; + + /** + * The task fragment drag resize transition used by activity embedding. + * + * This value is also used in Transitions.TRANSIT_TASK_FRAGMENT_DRAG_RESIZE and must not + * conflict with other predefined transition types. + * + * @hide + */ + @WindowManager.TransitionType + @TaskFragmentTransitionType + public static final int TASK_FRAGMENT_TRANSIT_DRAG_RESIZE = TRANSIT_FIRST_CUSTOM + 17; + /** * Introduced a sub set of {@link WindowManager.TransitionType} for the types that are used for * TaskFragment transition. @@ -106,6 +120,7 @@ public class TaskFragmentOrganizer extends WindowOrganizer { TASK_FRAGMENT_TRANSIT_OPEN, TASK_FRAGMENT_TRANSIT_CLOSE, TASK_FRAGMENT_TRANSIT_CHANGE, + TASK_FRAGMENT_TRANSIT_DRAG_RESIZE, }) @Retention(RetentionPolicy.SOURCE) public @interface TaskFragmentTransitionType {} diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index 89d3058cc14d..f072f5b25f1c 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -28,6 +28,7 @@ import static android.window.TaskFragmentOrganizer.KEY_ERROR_CALLBACK_OP_TYPE; import static android.window.TaskFragmentOrganizer.KEY_ERROR_CALLBACK_TASK_FRAGMENT_INFO; import static android.window.TaskFragmentOrganizer.KEY_ERROR_CALLBACK_THROWABLE; import static android.window.TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_CLOSE; +import static android.window.TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_DRAG_RESIZE; import static android.window.TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_OPEN; import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENTED_TO_TASK; import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_APPEARED; @@ -3240,6 +3241,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen synchronized (mLock) { final TransactionRecord transactionRecord = mTransactionManager.startNewTransaction(); + transactionRecord.setOriginType(TASK_FRAGMENT_TRANSIT_DRAG_RESIZE); final WindowContainerTransaction wct = transactionRecord.getTransaction(); final TaskContainer taskContainer = mTaskContainers.get(taskId); if (taskContainer != null) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java index d44033c72302..a426b206b0cd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java @@ -26,6 +26,7 @@ import static com.android.wm.shell.activityembedding.ActivityEmbeddingAnimationS import static com.android.wm.shell.transition.TransitionAnimationHelper.addBackgroundToTransition; import static com.android.wm.shell.transition.TransitionAnimationHelper.edgeExtendWindow; import static com.android.wm.shell.transition.TransitionAnimationHelper.getTransitionBackgroundColorIfSet; +import static com.android.wm.shell.transition.Transitions.TRANSIT_TASK_FRAGMENT_DRAG_RESIZE; import android.animation.Animator; import android.animation.ValueAnimator; @@ -190,6 +191,10 @@ class ActivityEmbeddingAnimationRunner { @NonNull private List<ActivityEmbeddingAnimationAdapter> createAnimationAdapters( @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction) { + if (info.getType() == TRANSIT_TASK_FRAGMENT_DRAG_RESIZE) { + // Jump cut for AE drag resizing because the content is veiled. + return new ArrayList<>(); + } boolean isChangeTransition = false; for (TransitionInfo.Change change : info.getChanges()) { if (change.hasFlags(FLAG_IS_BEHIND_STARTING_WINDOW)) { 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 1f9358e2aa91..d6b9d34c5ab3 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 @@ -22,6 +22,7 @@ import static android.window.TransitionInfo.FLAG_FILLS_TASK; import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static com.android.wm.shell.transition.DefaultTransitionHandler.isSupportedOverrideAnimation; +import static com.android.wm.shell.transition.Transitions.TRANSIT_TASK_FRAGMENT_DRAG_RESIZE; import static java.util.Objects.requireNonNull; @@ -90,6 +91,12 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle /** Whether ActivityEmbeddingController should animate this transition. */ public boolean shouldAnimate(@NonNull TransitionInfo info) { + if (info.getType() == TRANSIT_TASK_FRAGMENT_DRAG_RESIZE) { + // The TRANSIT_TASK_FRAGMENT_DRAG_RESIZE type happens when the user drags the + // interactive divider to resize the split containers. The content is veiled, so we will + // handle the transition with a jump cut. + return true; + } boolean containsEmbeddingChange = false; for (TransitionInfo.Change change : info.getChanges()) { if (!change.hasFlags(FLAG_FILLS_TASK) && change.hasFlags( 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 9b2922dff2f5..4d3c76322fa8 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 @@ -61,6 +61,7 @@ import android.view.SurfaceControl; import android.view.WindowManager; import android.window.ITransitionPlayer; import android.window.RemoteTransition; +import android.window.TaskFragmentOrganizer; import android.window.TransitionFilter; import android.window.TransitionInfo; import android.window.TransitionMetrics; @@ -183,6 +184,13 @@ public class Transitions implements RemoteCallable<Transitions>, /** Transition to resize PiP task. */ public static final int TRANSIT_RESIZE_PIP = TRANSIT_FIRST_CUSTOM + 16; + /** + * The task fragment drag resize transition used by activity embedding. + */ + public static final int TRANSIT_TASK_FRAGMENT_DRAG_RESIZE = + // TRANSIT_FIRST_CUSTOM + 17 + TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_DRAG_RESIZE; + private final ShellTaskOrganizer mOrganizer; private final Context mContext; private final ShellExecutor mMainExecutor; 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 2ac72affbb0c..ea522cdf2509 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 @@ -20,6 +20,8 @@ import static android.view.WindowManager.TRANSIT_OPEN; import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW; +import static com.android.wm.shell.transition.Transitions.TRANSIT_TASK_FRAGMENT_DRAG_RESIZE; + import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -100,6 +102,20 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim } @Test + public void testTransitionTypeDragResize() { + final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_TASK_FRAGMENT_DRAG_RESIZE, 0) + .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY)) + .build(); + final Animator animator = mAnimRunner.createAnimator( + info, mStartTransaction, mFinishTransaction, + () -> mFinishCallback.onTransitionFinished(null /* wct */), + new ArrayList()); + + // The animation should be empty when it is a jump cut for drag resize. + assertEquals(0, animator.getDuration()); + } + + @Test public void testInvalidCustomAnimation() { final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0) .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY)) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 9b98380dd5e8..86382549830d 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -6916,7 +6916,7 @@ class Task extends TaskFragment { mIsBoosted = isBoosted; // The client transaction will be applied together with the next assignLayer. if (clientTransaction != null) { - mDecorSurfaceContainer.mPendingClientTransactions.add(clientTransaction); + mPendingClientTransactions.add(clientTransaction); } } |