diff options
8 files changed, 144 insertions, 82 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index e8728498ad64..42c8d7417611 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -70,8 +70,8 @@ import com.android.wm.shell.sysui.ShellSharedConstants import com.android.wm.shell.transition.OneShotRemoteHandler import com.android.wm.shell.transition.Transitions import com.android.wm.shell.util.KtProtoLog -import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration import com.android.wm.shell.windowdecor.MoveToDesktopAnimator +import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener import java.io.PrintWriter import java.util.concurrent.Executor import java.util.function.Consumer @@ -175,6 +175,12 @@ class DesktopTasksController( ) } + fun setOnTaskResizeAnimationListener(listener: OnTaskResizeAnimationListener) { + toggleResizeDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener) + enterDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener) + dragToDesktopTransitionHandler.setOnTaskResizeAnimatorListener(listener) + } + /** Setter needed to avoid cyclic dependency. */ fun setSplitScreenController(controller: SplitScreenController) { splitScreenController = controller @@ -236,12 +242,11 @@ class DesktopTasksController( /** Move a task with given `taskId` to desktop */ fun moveToDesktop( - decor: DesktopModeWindowDecoration, taskId: Int, wct: WindowContainerTransaction = WindowContainerTransaction() ) { shellTaskOrganizer.getRunningTaskInfo(taskId)?.let { - task -> moveToDesktop(decor, task, wct) + task -> moveToDesktop(task, wct) } } @@ -283,7 +288,6 @@ class DesktopTasksController( * Move a task to desktop */ fun moveToDesktop( - decor: DesktopModeWindowDecoration, task: RunningTaskInfo, wct: WindowContainerTransaction = WindowContainerTransaction() ) { @@ -298,7 +302,7 @@ class DesktopTasksController( addMoveToDesktopChanges(wct, task) if (Transitions.ENABLE_SHELL_TRANSITIONS) { - enterDesktopTaskTransitionHandler.moveToDesktop(wct, decor) + enterDesktopTaskTransitionHandler.moveToDesktop(wct) } else { shellTaskOrganizer.applyTransaction(wct) } @@ -311,7 +315,6 @@ class DesktopTasksController( fun startDragToDesktop( taskInfo: RunningTaskInfo, dragToDesktopValueAnimator: MoveToDesktopAnimator, - windowDecor: DesktopModeWindowDecoration ) { KtProtoLog.v( WM_SHELL_DESKTOP_MODE, @@ -320,8 +323,7 @@ class DesktopTasksController( ) dragToDesktopTransitionHandler.startDragToDesktopTransition( taskInfo.taskId, - dragToDesktopValueAnimator, - windowDecor + dragToDesktopValueAnimator ) } @@ -522,7 +524,7 @@ class DesktopTasksController( } /** Quick-resizes a desktop task, toggling between the stable bounds and the default bounds. */ - fun toggleDesktopTaskSize(taskInfo: RunningTaskInfo, windowDecor: DesktopModeWindowDecoration) { + fun toggleDesktopTaskSize(taskInfo: RunningTaskInfo) { val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return val stableBounds = Rect() @@ -543,11 +545,7 @@ class DesktopTasksController( val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds) if (Transitions.ENABLE_SHELL_TRANSITIONS) { - toggleResizeDesktopTaskTransitionHandler.startTransition( - wct, - taskInfo.taskId, - windowDecor - ) + toggleResizeDesktopTaskTransitionHandler.startTransition(wct) } else { shellTaskOrganizer.applyTransaction(wct) } @@ -558,11 +556,7 @@ class DesktopTasksController( * * @param position the portion of the screen (RIGHT or LEFT) we want to snap the task to. */ - fun snapToHalfScreen( - taskInfo: RunningTaskInfo, - windowDecor: DesktopModeWindowDecoration, - position: SnapPosition - ) { + fun snapToHalfScreen(taskInfo: RunningTaskInfo, position: SnapPosition) { val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return val stableBounds = Rect() @@ -592,11 +586,7 @@ class DesktopTasksController( val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds) if (Transitions.ENABLE_SHELL_TRANSITIONS) { - toggleResizeDesktopTaskTransitionHandler.startTransition( - wct, - taskInfo.taskId, - windowDecor - ) + toggleResizeDesktopTaskTransitionHandler.startTransition(wct) } else { shellTaskOrganizer.applyTransaction(wct) } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt index 39610e3c5c80..af26e2980afe 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt @@ -34,9 +34,9 @@ import com.android.wm.shell.transition.Transitions.TRANSIT_DESKTOP_MODE_END_DRAG import com.android.wm.shell.transition.Transitions.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP import com.android.wm.shell.transition.Transitions.TransitionHandler import com.android.wm.shell.util.KtProtoLog -import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration import com.android.wm.shell.windowdecor.MoveToDesktopAnimator import com.android.wm.shell.windowdecor.MoveToDesktopAnimator.Companion.DRAG_FREEFORM_SCALE +import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener import java.util.function.Supplier /** @@ -69,6 +69,7 @@ class DragToDesktopTransitionHandler( private var dragToDesktopStateListener: DragToDesktopStateListener? = null private var splitScreenController: SplitScreenController? = null private var transitionState: TransitionState? = null + private lateinit var onTaskResizeAnimationListener: OnTaskResizeAnimationListener /** Whether a drag-to-desktop transition is in progress. */ val inProgress: Boolean @@ -84,6 +85,10 @@ class DragToDesktopTransitionHandler( splitScreenController = controller } + fun setOnTaskResizeAnimatorListener(listener: OnTaskResizeAnimationListener) { + onTaskResizeAnimationListener = listener + } + /** * Starts a transition that performs a transient launch of Home so that Home is brought to the * front while still keeping the currently focused task that is being dragged resumed. This @@ -96,7 +101,6 @@ class DragToDesktopTransitionHandler( fun startDragToDesktopTransition( taskId: Int, dragToDesktopAnimator: MoveToDesktopAnimator, - windowDecoration: DesktopModeWindowDecoration ) { if (inProgress) { KtProtoLog.v( @@ -128,14 +132,12 @@ class DragToDesktopTransitionHandler( TransitionState.FromSplit( draggedTaskId = taskId, dragAnimator = dragToDesktopAnimator, - windowDecoration = windowDecoration, startTransitionToken = startTransitionToken ) } else { TransitionState.FromFullscreen( draggedTaskId = taskId, dragAnimator = dragToDesktopAnimator, - windowDecoration = windowDecoration, startTransitionToken = startTransitionToken ) } @@ -405,7 +407,7 @@ class DragToDesktopTransitionHandler( // Accept the merge by applying the merging transaction (applied by #showResizeVeil) // and finish callback. Show the veil and position the task at the first frame before // starting the final animation. - state.windowDecoration.showResizeVeil(t, animStartBounds) + onTaskResizeAnimationListener.onAnimationStart(state.draggedTaskId, t, animStartBounds) finishCallback.onTransitionFinished(null /* wct */) // Because the task surface was scaled down during the drag, we must use the animated @@ -429,11 +431,15 @@ class DragToDesktopTransitionHandler( animBounds.height() ) } - state.windowDecoration.updateResizeVeil(tx, animBounds) + onTaskResizeAnimationListener.onBoundsChange( + state.draggedTaskId, + tx, + animBounds + ) } addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { - state.windowDecoration.hideResizeVeil() + onTaskResizeAnimationListener.onAnimationEnd(state.draggedTaskId) startTransitionFinishCb.onTransitionFinished(null /* null */) clearState() } @@ -576,7 +582,6 @@ class DragToDesktopTransitionHandler( sealed class TransitionState { abstract val draggedTaskId: Int abstract val dragAnimator: MoveToDesktopAnimator - abstract val windowDecoration: DesktopModeWindowDecoration abstract val startTransitionToken: IBinder abstract var startTransitionFinishCb: Transitions.TransitionFinishCallback? abstract var startTransitionFinishTransaction: SurfaceControl.Transaction? @@ -589,7 +594,6 @@ class DragToDesktopTransitionHandler( data class FromFullscreen( override val draggedTaskId: Int, override val dragAnimator: MoveToDesktopAnimator, - override val windowDecoration: DesktopModeWindowDecoration, override val startTransitionToken: IBinder, override var startTransitionFinishCb: Transitions.TransitionFinishCallback? = null, override var startTransitionFinishTransaction: SurfaceControl.Transaction? = null, @@ -603,7 +607,6 @@ class DragToDesktopTransitionHandler( data class FromSplit( override val draggedTaskId: Int, override val dragAnimator: MoveToDesktopAnimator, - override val windowDecoration: DesktopModeWindowDecoration, override val startTransitionToken: IBinder, override var startTransitionFinishCb: Transitions.TransitionFinishCallback? = null, override var startTransitionFinishTransaction: SurfaceControl.Transaction? = null, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java index ba08b096e82b..07cf202ddfac 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java @@ -38,7 +38,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.transition.Transitions; -import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration; +import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener; import java.util.ArrayList; import java.util.List; @@ -59,8 +59,8 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition public static final int FREEFORM_ANIMATION_DURATION = 336; private final List<IBinder> mPendingTransitionTokens = new ArrayList<>(); - private DesktopModeWindowDecoration mDesktopModeWindowDecoration; + private OnTaskResizeAnimationListener mOnTaskResizeAnimationListener; public EnterDesktopTaskTransitionHandler( Transitions transitions) { this(transitions, SurfaceControl.Transaction::new); @@ -73,14 +73,15 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition mTransactionSupplier = supplier; } + void setOnTaskResizeAnimationListener(OnTaskResizeAnimationListener listener) { + mOnTaskResizeAnimationListener = listener; + } + /** * Starts Transition of type TRANSIT_MOVE_TO_DESKTOP * @param wct WindowContainerTransaction for transition - * @param decor {@link DesktopModeWindowDecoration} of task being animated */ - public void moveToDesktop(@NonNull WindowContainerTransaction wct, - DesktopModeWindowDecoration decor) { - mDesktopModeWindowDecoration = decor; + public void moveToDesktop(@NonNull WindowContainerTransaction wct) { final IBinder token = mTransitions.startTransition(TRANSIT_MOVE_TO_DESKTOP, wct, this); mPendingTransitionTokens.add(token); } @@ -136,18 +137,18 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition @NonNull TransitionInfo.Change change, @NonNull SurfaceControl.Transaction startT, @NonNull Transitions.TransitionFinishCallback finishCallback) { - if (mDesktopModeWindowDecoration == null) { - Slog.e(TAG, "Window Decoration is not available for this transition"); + final SurfaceControl leash = change.getLeash(); + final Rect startBounds = change.getStartAbsBounds(); + final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); + if (mOnTaskResizeAnimationListener == null) { + Slog.e(TAG, "onTaskResizeAnimationListener is not available for this transition"); return false; } - final SurfaceControl leash = change.getLeash(); - final Rect startBounds = change.getStartAbsBounds(); startT.setPosition(leash, startBounds.left, startBounds.top) .setWindowCrop(leash, startBounds.width(), startBounds.height()) .show(leash); - mDesktopModeWindowDecoration.showResizeVeil(startT, startBounds); - + mOnTaskResizeAnimationListener.onAnimationStart(taskInfo.taskId, startT, startBounds); final ValueAnimator animator = ValueAnimator.ofObject(new RectEvaluator(), change.getStartAbsBounds(), change.getEndAbsBounds()); animator.setDuration(FREEFORM_ANIMATION_DURATION); @@ -157,12 +158,12 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition t.setPosition(leash, animationValue.left, animationValue.top) .setWindowCrop(leash, animationValue.width(), animationValue.height()) .show(leash); - mDesktopModeWindowDecoration.updateResizeVeil(t, animationValue); + mOnTaskResizeAnimationListener.onBoundsChange(taskInfo.taskId, t, animationValue); }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - mDesktopModeWindowDecoration.hideResizeVeil(); + mOnTaskResizeAnimationListener.onAnimationEnd(taskInfo.taskId); mTransitions.getMainExecutor().execute( () -> finishCallback.onTransitionFinished(null)); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt index 0218493589b0..c469e652b117 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt @@ -21,7 +21,6 @@ import android.animation.RectEvaluator import android.animation.ValueAnimator import android.graphics.Rect import android.os.IBinder -import android.util.SparseArray import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_CHANGE import android.window.TransitionInfo @@ -30,7 +29,7 @@ import android.window.WindowContainerTransaction import androidx.core.animation.addListener import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TRANSIT_DESKTOP_MODE_TOGGLE_RESIZE -import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration +import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener import java.util.function.Supplier /** Handles the animation of quick resizing of desktop tasks. */ @@ -40,7 +39,7 @@ class ToggleResizeDesktopTaskTransitionHandler( ) : Transitions.TransitionHandler { private val rectEvaluator = RectEvaluator(Rect()) - private val taskToDecorationMap = SparseArray<DesktopModeWindowDecoration>() + private lateinit var onTaskResizeAnimationListener: OnTaskResizeAnimationListener private var boundsAnimator: Animator? = null @@ -49,13 +48,12 @@ class ToggleResizeDesktopTaskTransitionHandler( ) : this(transitions, Supplier { SurfaceControl.Transaction() }) /** Starts a quick resize transition. */ - fun startTransition( - wct: WindowContainerTransaction, - taskId: Int, - windowDecoration: DesktopModeWindowDecoration - ) { + fun startTransition(wct: WindowContainerTransaction) { transitions.startTransition(TRANSIT_DESKTOP_MODE_TOGGLE_RESIZE, wct, this) - taskToDecorationMap.put(taskId, windowDecoration) + } + + fun setOnTaskResizeAnimationListener(listener: OnTaskResizeAnimationListener) { + onTaskResizeAnimationListener = listener } override fun startAnimation( @@ -70,9 +68,6 @@ class ToggleResizeDesktopTaskTransitionHandler( val taskId = checkNotNull(change.taskInfo).taskId val startBounds = change.startAbsBounds val endBounds = change.endAbsBounds - val windowDecor = - taskToDecorationMap.removeReturnOld(taskId) - ?: throw IllegalStateException("Window decoration not found for task $taskId") val tx = transactionSupplier.get() boundsAnimator?.cancel() @@ -90,7 +85,11 @@ class ToggleResizeDesktopTaskTransitionHandler( ) .setWindowCrop(leash, startBounds.width(), startBounds.height()) .show(leash) - windowDecor.showResizeVeil(startTransaction, startBounds) + onTaskResizeAnimationListener.onAnimationStart( + taskId, + startTransaction, + startBounds + ) }, onEnd = { finishTransaction @@ -101,7 +100,7 @@ class ToggleResizeDesktopTaskTransitionHandler( ) .setWindowCrop(leash, endBounds.width(), endBounds.height()) .show(leash) - windowDecor.hideResizeVeil() + onTaskResizeAnimationListener.onAnimationEnd(taskId) finishCallback.onTransitionFinished(null) boundsAnimator = null } @@ -111,7 +110,7 @@ class ToggleResizeDesktopTaskTransitionHandler( tx.setPosition(leash, rect.left.toFloat(), rect.top.toFloat()) .setWindowCrop(leash, rect.width(), rect.height()) .show(leash) - windowDecor.updateResizeVeil(tx, rect) + onTaskResizeAnimationListener.onBoundsChange(taskId, tx, rect) } start() } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 891eea072c0d..7db3d382ed8e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -211,6 +211,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mShellCommandHandler.addDumpCallback(this::dump, this); mDisplayInsetsController.addInsetsChangedListener(mContext.getDisplayId(), new DesktopModeOnInsetsChangedListener()); + mDesktopTasksController.ifPresent(c -> c.setOnTaskResizeAnimationListener( + new DeskopModeOnTaskResizeAnimationListener())); } @Override @@ -356,7 +358,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { // App sometimes draws before the insets from WindowDecoration#relayout have // been added, so they must be added here mWindowDecorByTaskId.get(mTaskId).addCaptionInset(wct); - mDesktopTasksController.get().moveToDesktop(decoration, mTaskId, wct); + mDesktopTasksController.get().moveToDesktop(mTaskId, wct); closeOtherSplitTask(mTaskId); } decoration.closeHandleMenu(); @@ -387,25 +389,23 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { return; } final RunningTaskInfo taskInfo = decoration.mTaskInfo; - mDesktopTasksController.ifPresent(c -> c.toggleDesktopTaskSize( - taskInfo, decoration)); + mDesktopTasksController.ifPresent(c -> c.toggleDesktopTaskSize(taskInfo)); decoration.closeHandleMenu(); } else if (id == R.id.maximize_menu_maximize_button) { final RunningTaskInfo taskInfo = decoration.mTaskInfo; - mDesktopTasksController.ifPresent(c -> c.toggleDesktopTaskSize( - taskInfo, mWindowDecorByTaskId.get(taskInfo.taskId))); + mDesktopTasksController.ifPresent(c -> c.toggleDesktopTaskSize(taskInfo)); decoration.closeHandleMenu(); decoration.closeMaximizeMenu(); } else if (id == R.id.maximize_menu_snap_left_button) { final RunningTaskInfo taskInfo = decoration.mTaskInfo; mDesktopTasksController.ifPresent(c -> c.snapToHalfScreen( - taskInfo, mWindowDecorByTaskId.get(taskInfo.taskId), SnapPosition.LEFT)); + taskInfo, SnapPosition.LEFT)); decoration.closeHandleMenu(); decoration.closeMaximizeMenu(); } else if (id == R.id.maximize_menu_snap_right_button) { final RunningTaskInfo taskInfo = decoration.mTaskInfo; mDesktopTasksController.ifPresent(c -> c.snapToHalfScreen( - taskInfo, mWindowDecorByTaskId.get(taskInfo.taskId), SnapPosition.RIGHT)); + taskInfo, SnapPosition.RIGHT)); decoration.closeHandleMenu(); decoration.closeMaximizeMenu(); } @@ -558,7 +558,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } mDesktopTasksController.ifPresent(c -> { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(mTaskId); - c.toggleDesktopTaskSize(decoration.mTaskInfo, decoration); + c.toggleDesktopTaskSize(decoration.mTaskInfo); }); return true; } @@ -761,7 +761,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { relevantDecor.mTaskInfo, relevantDecor.mTaskSurface); mDesktopTasksController.ifPresent( c -> c.startDragToDesktop(relevantDecor.mTaskInfo, - mMoveToDesktopAnimator, relevantDecor)); + mMoveToDesktopAnimator)); } } if (mMoveToDesktopAnimator != null) { @@ -1020,6 +1020,34 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { pw.println(innerPrefix + "mWindowDecorByTaskId=" + mWindowDecorByTaskId); } + private class DeskopModeOnTaskResizeAnimationListener + implements OnTaskResizeAnimationListener { + @Override + public void onAnimationStart(int taskId, Transaction t, Rect bounds) { + final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); + if (decoration == null) { + t.apply(); + return; + } + decoration.showResizeVeil(t, bounds); + } + + @Override + public void onBoundsChange(int taskId, Transaction t, Rect bounds) { + final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); + if (decoration == null) return; + decoration.updateResizeVeil(t, bounds); + } + + @Override + public void onAnimationEnd(int taskId) { + final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); + if (decoration == null) return; + decoration.hideResizeVeil(); + } + } + + private class DragStartListenerImpl implements DragPositioningCallbackUtility.DragStartListener { @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/OnTaskResizeAnimationListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/OnTaskResizeAnimationListener.kt new file mode 100644 index 000000000000..09c62bfc9da2 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/OnTaskResizeAnimationListener.kt @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.wm.shell.windowdecor + +import android.graphics.Rect +import android.view.SurfaceControl + +import com.android.wm.shell.transition.Transitions.TransitionHandler +/** + * Listener that allows implementations of [TransitionHandler] to notify when an + * animation that is resizing a task is starting, updating, and finishing the animation. + */ +interface OnTaskResizeAnimationListener { + /** + * Notifies that a transition animation is about to be started with the given bounds. + */ + fun onAnimationStart(taskId: Int, t: SurfaceControl.Transaction, bounds: Rect) + + /** + * Notifies that a transition animation is expanding or shrinking the task to the given bounds. + */ + fun onBoundsChange(taskId: Int, t: SurfaceControl.Transaction, bounds: Rect) + + /** + * Notifies that a transition animation is about to be finished. + */ + fun onAnimationEnd(taskId: Int) +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 9249b0a0dfda..79634e6040c4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -303,7 +303,7 @@ class DesktopTasksControllerTest : ShellTestCase() { fun moveToDesktop_displayFullscreen_windowingModeSetToFreeform() { val task = setUpFullscreenTask() task.configuration.windowConfiguration.displayWindowingMode = WINDOWING_MODE_FULLSCREEN - controller.moveToDesktop(desktopModeWindowDecoration, task) + controller.moveToDesktop(task) val wct = getLatestMoveToDesktopWct() assertThat(wct.changes[task.token.asBinder()]?.windowingMode) .isEqualTo(WINDOWING_MODE_FREEFORM) @@ -313,7 +313,7 @@ class DesktopTasksControllerTest : ShellTestCase() { fun moveToDesktop_displayFreeform_windowingModeSetToUndefined() { val task = setUpFullscreenTask() task.configuration.windowConfiguration.displayWindowingMode = WINDOWING_MODE_FREEFORM - controller.moveToDesktop(desktopModeWindowDecoration, task) + controller.moveToDesktop(task) val wct = getLatestMoveToDesktopWct() assertThat(wct.changes[task.token.asBinder()]?.windowingMode) .isEqualTo(WINDOWING_MODE_UNDEFINED) @@ -321,7 +321,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun moveToDesktop_nonExistentTask_doesNothing() { - controller.moveToDesktop(desktopModeWindowDecoration, 999) + controller.moveToDesktop(999) verifyWCTNotExecuted() } @@ -332,7 +332,7 @@ class DesktopTasksControllerTest : ShellTestCase() { val fullscreenTask = setUpFullscreenTask() markTaskHidden(freeformTask) - controller.moveToDesktop(desktopModeWindowDecoration, fullscreenTask) + controller.moveToDesktop(fullscreenTask) with(getLatestMoveToDesktopWct()) { // Operations should include home task, freeform task @@ -354,7 +354,7 @@ class DesktopTasksControllerTest : ShellTestCase() { val freeformTaskSecond = setUpFreeformTask(displayId = SECOND_DISPLAY) markTaskHidden(freeformTaskSecond) - controller.moveToDesktop(desktopModeWindowDecoration, fullscreenTaskDefault) + controller.moveToDesktop(fullscreenTaskDefault) with(getLatestMoveToDesktopWct()) { // Check that hierarchy operations do not include tasks from second display @@ -368,7 +368,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun moveToDesktop_splitTaskExitsSplit() { val task = setUpSplitScreenTask() - controller.moveToDesktop(desktopModeWindowDecoration, task) + controller.moveToDesktop(task) val wct = getLatestMoveToDesktopWct() assertThat(wct.changes[task.token.asBinder()]?.windowingMode) .isEqualTo(WINDOWING_MODE_FREEFORM) @@ -380,7 +380,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun moveToDesktop_fullscreenTaskDoesNotExitSplit() { val task = setUpFullscreenTask() - controller.moveToDesktop(desktopModeWindowDecoration, task) + controller.moveToDesktop(task) val wct = getLatestMoveToDesktopWct() assertThat(wct.changes[task.token.asBinder()]?.windowingMode) .isEqualTo(WINDOWING_MODE_FREEFORM) @@ -802,7 +802,7 @@ class DesktopTasksControllerTest : ShellTestCase() { private fun getLatestMoveToDesktopWct(): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) if (ENABLE_SHELL_TRANSITIONS) { - verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture(), any()) + verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture()) } else { verify(shellTaskOrganizer).applyTransaction(arg.capture()) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt index be639e867e0b..98e90d60b3b6 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt @@ -24,7 +24,6 @@ import com.android.wm.shell.transition.Transitions.TRANSIT_DESKTOP_MODE_CANCEL_D import com.android.wm.shell.transition.Transitions.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP import com.android.wm.shell.transition.Transitions.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP import com.android.wm.shell.windowdecor.MoveToDesktopAnimator -import java.util.function.Supplier import junit.framework.Assert.assertFalse import org.junit.Before import org.junit.Test @@ -38,6 +37,7 @@ import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.verifyZeroInteractions import org.mockito.kotlin.whenever +import java.util.function.Supplier /** Tests of [DragToDesktopTransitionHandler]. */ @SmallTest @@ -246,7 +246,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { ) ) .thenReturn(token) - handler.startDragToDesktopTransition(task.taskId, dragAnimator, mock()) + handler.startDragToDesktopTransition(task.taskId, dragAnimator) return token } |