Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ public abstract class WMShellModule { ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController) { Loading @@ -212,6 +213,7 @@ public abstract class WMShellModule { taskOrganizer, displayController, syncQueue, transitions, desktopModeController, desktopTasksController, splitScreenController); Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +7 −1 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private final InputMonitorFactory mInputMonitorFactory; private TaskOperations mTaskOperations; private final Supplier<SurfaceControl.Transaction> mTransactionFactory; private final Transitions mTransitions; private Optional<SplitScreenController> mSplitScreenController; Loading @@ -118,6 +119,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController) { Loading @@ -128,6 +130,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { taskOrganizer, displayController, syncQueue, transitions, desktopModeController, desktopTasksController, splitScreenController, Loading @@ -144,6 +147,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController, Loading @@ -158,6 +162,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mDisplayController = displayController; mSplitScreenController = splitScreenController; mSyncQueue = syncQueue; mTransitions = transitions; mDesktopModeController = desktopModeController; mDesktopTasksController = desktopTasksController; Loading Loading @@ -818,7 +823,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } else { windowDecoration.createResizeVeil(); return new VeiledResizeTaskPositioner(mTaskOrganizer, windowDecoration, mDisplayController, disallowedAreaForEndBounds, mDragStartListener); mDisplayController, disallowedAreaForEndBounds, mDragStartListener, mTransitions); } } Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.java +1 −2 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ import java.util.function.Supplier; * Creates and updates a veil that covers task contents on resize. */ public class ResizeVeil { private static final int RESIZE_ALPHA_DURATION = 200; private static final int RESIZE_ALPHA_DURATION = 100; private final Context mContext; private final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier; private final Supplier<SurfaceControl.Transaction> mSurfaceControlTransactionSupplier; Loading Loading @@ -155,7 +155,6 @@ public class ResizeVeil { * Animate veil's alpha to 0, fading it out. */ public void hideVeil() { final View resizeVeilView = mViewHost.getView(); final ValueAnimator animator = new ValueAnimator(); animator.setFloatValues(1, 0); animator.setDuration(RESIZE_ALPHA_DURATION); Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java +52 −16 Original line number Diff line number Diff line Loading @@ -16,13 +16,22 @@ package com.android.wm.shell.windowdecor; import static android.view.WindowManager.TRANSIT_CHANGE; import android.graphics.PointF; import android.graphics.Rect; import android.os.IBinder; import android.view.SurfaceControl; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.transition.Transitions; import java.util.function.Supplier; Loading @@ -32,12 +41,14 @@ import java.util.function.Supplier; * If the drag is resizing the task, we resize the veil instead. * If the drag is repositioning, we update in the typical manner. */ public class VeiledResizeTaskPositioner implements DragPositioningCallback { public class VeiledResizeTaskPositioner implements DragPositioningCallback, Transitions.TransitionHandler { private DesktopModeWindowDecoration mDesktopWindowDecoration; private ShellTaskOrganizer mTaskOrganizer; private DisplayController mDisplayController; private DragPositioningCallbackUtility.DragStartListener mDragStartListener; private final Transitions mTransitions; private final Rect mStableBounds = new Rect(); private final Rect mTaskBoundsAtDragStart = new Rect(); private final PointF mRepositionStartPoint = new PointF(); Loading @@ -46,28 +57,29 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { // finalize the bounds there using WCT#setBounds private final Rect mDisallowedAreaForEndBounds = new Rect(); private final Supplier<SurfaceControl.Transaction> mTransactionSupplier; private boolean mHasDragResized; private int mCtrlType; public VeiledResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, DesktopModeWindowDecoration windowDecoration, DisplayController displayController, Rect disallowedAreaForEndBounds, DragPositioningCallbackUtility.DragStartListener dragStartListener) { DragPositioningCallbackUtility.DragStartListener dragStartListener, Transitions transitions) { this(taskOrganizer, windowDecoration, displayController, disallowedAreaForEndBounds, dragStartListener, SurfaceControl.Transaction::new); dragStartListener, SurfaceControl.Transaction::new, transitions); } public VeiledResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, DesktopModeWindowDecoration windowDecoration, DisplayController displayController, Rect disallowedAreaForEndBounds, DragPositioningCallbackUtility.DragStartListener dragStartListener, Supplier<SurfaceControl.Transaction> supplier) { Supplier<SurfaceControl.Transaction> supplier, Transitions transitions) { mTaskOrganizer = taskOrganizer; mDesktopWindowDecoration = windowDecoration; mDisplayController = displayController; mDragStartListener = dragStartListener; mDisallowedAreaForEndBounds.set(disallowedAreaForEndBounds); mTransactionSupplier = supplier; mTransitions = transitions; } @Override Loading @@ -84,7 +96,6 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { mTaskOrganizer.applyTransaction(wct); } } mHasDragResized = false; mDragStartListener.onDragStart(mDesktopWindowDecoration.mTaskInfo.taskId); mRepositionTaskBounds.set(mTaskBoundsAtDragStart); } Loading @@ -96,7 +107,6 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { mRepositionTaskBounds, mTaskBoundsAtDragStart, mStableBounds, delta, mDisplayController, mDesktopWindowDecoration)) { mDesktopWindowDecoration.updateResizeVeil(mRepositionTaskBounds); mHasDragResized = true; } else if (mCtrlType == CTRL_TYPE_UNDEFINED) { final SurfaceControl.Transaction t = mTransactionSupplier.get(); DragPositioningCallbackUtility.setPositionOnDrag(mDesktopWindowDecoration, Loading @@ -111,18 +121,23 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { PointF delta = DragPositioningCallbackUtility.calculateDelta(x, y, mRepositionStartPoint); if (isResizing()) { if (mHasDragResized) { if (!mTaskBoundsAtDragStart.equals(mRepositionTaskBounds)) { DragPositioningCallbackUtility.changeBounds( mCtrlType, mRepositionTaskBounds, mTaskBoundsAtDragStart, mStableBounds, delta, mDisplayController, mDesktopWindowDecoration); DragPositioningCallbackUtility.applyTaskBoundsChange( new WindowContainerTransaction(), mDesktopWindowDecoration, mRepositionTaskBounds, mTaskOrganizer); } // TODO: (b/279062291) Synchronize the start of hide to the end of the draw triggered // above. mDesktopWindowDecoration.updateResizeVeil(mRepositionTaskBounds); final WindowContainerTransaction wct = new WindowContainerTransaction(); wct.setBounds(mDesktopWindowDecoration.mTaskInfo.token, mRepositionTaskBounds); if (Transitions.ENABLE_SHELL_TRANSITIONS) { mTransitions.startTransition(TRANSIT_CHANGE, wct, this); } else { mTaskOrganizer.applyTransaction(wct); } } else { // If bounds haven't changed, perform necessary veil reset here as startAnimation // won't be called. mDesktopWindowDecoration.hideResizeVeil(); } } else if (!mDisallowedAreaForEndBounds.contains((int) x, (int) y)) { DragPositioningCallbackUtility.updateTaskBounds(mRepositionTaskBounds, mTaskBoundsAtDragStart, mRepositionStartPoint, x, y); Loading @@ -133,7 +148,6 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { mCtrlType = CTRL_TYPE_UNDEFINED; mTaskBoundsAtDragStart.setEmpty(); mRepositionStartPoint.set(0, 0); mHasDragResized = false; } private boolean isResizing() { Loading @@ -141,4 +155,26 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { || (mCtrlType & CTRL_TYPE_LEFT) != 0 || (mCtrlType & CTRL_TYPE_RIGHT) != 0; } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { startTransaction.apply(); mDesktopWindowDecoration.hideResizeVeil(); mCtrlType = CTRL_TYPE_UNDEFINED; finishCallback.onTransitionFinished(null, null); return true; } /** * We should never reach this as this handler's transitions are only started from shell * explicitly. */ @Nullable @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { return null; } } libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java +3 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.DesktopModeController; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.transition.Transitions; import org.junit.Before; import org.junit.Test; Loading Loading @@ -87,6 +88,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { @Mock private DesktopTasksController mDesktopTasksController; @Mock private InputMonitor mInputMonitor; @Mock private InputManager mInputManager; @Mock private Transitions mTransitions; @Mock private DesktopModeWindowDecorViewModel.InputMonitorFactory mMockInputMonitorFactory; @Mock private Supplier<SurfaceControl.Transaction> mTransactionFactory; @Mock private SurfaceControl.Transaction mTransaction; Loading @@ -106,6 +108,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { mTaskOrganizer, mDisplayController, mSyncQueue, mTransitions, Optional.of(mDesktopModeController), Optional.of(mDesktopTasksController), Optional.of(mSplitScreenController), Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,7 @@ public abstract class WMShellModule { ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController) { Loading @@ -212,6 +213,7 @@ public abstract class WMShellModule { taskOrganizer, displayController, syncQueue, transitions, desktopModeController, desktopTasksController, splitScreenController); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +7 −1 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private final InputMonitorFactory mInputMonitorFactory; private TaskOperations mTaskOperations; private final Supplier<SurfaceControl.Transaction> mTransactionFactory; private final Transitions mTransitions; private Optional<SplitScreenController> mSplitScreenController; Loading @@ -118,6 +119,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController) { Loading @@ -128,6 +130,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { taskOrganizer, displayController, syncQueue, transitions, desktopModeController, desktopTasksController, splitScreenController, Loading @@ -144,6 +147,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController, Loading @@ -158,6 +162,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mDisplayController = displayController; mSplitScreenController = splitScreenController; mSyncQueue = syncQueue; mTransitions = transitions; mDesktopModeController = desktopModeController; mDesktopTasksController = desktopTasksController; Loading Loading @@ -818,7 +823,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } else { windowDecoration.createResizeVeil(); return new VeiledResizeTaskPositioner(mTaskOrganizer, windowDecoration, mDisplayController, disallowedAreaForEndBounds, mDragStartListener); mDisplayController, disallowedAreaForEndBounds, mDragStartListener, mTransitions); } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.java +1 −2 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ import java.util.function.Supplier; * Creates and updates a veil that covers task contents on resize. */ public class ResizeVeil { private static final int RESIZE_ALPHA_DURATION = 200; private static final int RESIZE_ALPHA_DURATION = 100; private final Context mContext; private final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier; private final Supplier<SurfaceControl.Transaction> mSurfaceControlTransactionSupplier; Loading Loading @@ -155,7 +155,6 @@ public class ResizeVeil { * Animate veil's alpha to 0, fading it out. */ public void hideVeil() { final View resizeVeilView = mViewHost.getView(); final ValueAnimator animator = new ValueAnimator(); animator.setFloatValues(1, 0); animator.setDuration(RESIZE_ALPHA_DURATION); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java +52 −16 Original line number Diff line number Diff line Loading @@ -16,13 +16,22 @@ package com.android.wm.shell.windowdecor; import static android.view.WindowManager.TRANSIT_CHANGE; import android.graphics.PointF; import android.graphics.Rect; import android.os.IBinder; import android.view.SurfaceControl; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.transition.Transitions; import java.util.function.Supplier; Loading @@ -32,12 +41,14 @@ import java.util.function.Supplier; * If the drag is resizing the task, we resize the veil instead. * If the drag is repositioning, we update in the typical manner. */ public class VeiledResizeTaskPositioner implements DragPositioningCallback { public class VeiledResizeTaskPositioner implements DragPositioningCallback, Transitions.TransitionHandler { private DesktopModeWindowDecoration mDesktopWindowDecoration; private ShellTaskOrganizer mTaskOrganizer; private DisplayController mDisplayController; private DragPositioningCallbackUtility.DragStartListener mDragStartListener; private final Transitions mTransitions; private final Rect mStableBounds = new Rect(); private final Rect mTaskBoundsAtDragStart = new Rect(); private final PointF mRepositionStartPoint = new PointF(); Loading @@ -46,28 +57,29 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { // finalize the bounds there using WCT#setBounds private final Rect mDisallowedAreaForEndBounds = new Rect(); private final Supplier<SurfaceControl.Transaction> mTransactionSupplier; private boolean mHasDragResized; private int mCtrlType; public VeiledResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, DesktopModeWindowDecoration windowDecoration, DisplayController displayController, Rect disallowedAreaForEndBounds, DragPositioningCallbackUtility.DragStartListener dragStartListener) { DragPositioningCallbackUtility.DragStartListener dragStartListener, Transitions transitions) { this(taskOrganizer, windowDecoration, displayController, disallowedAreaForEndBounds, dragStartListener, SurfaceControl.Transaction::new); dragStartListener, SurfaceControl.Transaction::new, transitions); } public VeiledResizeTaskPositioner(ShellTaskOrganizer taskOrganizer, DesktopModeWindowDecoration windowDecoration, DisplayController displayController, Rect disallowedAreaForEndBounds, DragPositioningCallbackUtility.DragStartListener dragStartListener, Supplier<SurfaceControl.Transaction> supplier) { Supplier<SurfaceControl.Transaction> supplier, Transitions transitions) { mTaskOrganizer = taskOrganizer; mDesktopWindowDecoration = windowDecoration; mDisplayController = displayController; mDragStartListener = dragStartListener; mDisallowedAreaForEndBounds.set(disallowedAreaForEndBounds); mTransactionSupplier = supplier; mTransitions = transitions; } @Override Loading @@ -84,7 +96,6 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { mTaskOrganizer.applyTransaction(wct); } } mHasDragResized = false; mDragStartListener.onDragStart(mDesktopWindowDecoration.mTaskInfo.taskId); mRepositionTaskBounds.set(mTaskBoundsAtDragStart); } Loading @@ -96,7 +107,6 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { mRepositionTaskBounds, mTaskBoundsAtDragStart, mStableBounds, delta, mDisplayController, mDesktopWindowDecoration)) { mDesktopWindowDecoration.updateResizeVeil(mRepositionTaskBounds); mHasDragResized = true; } else if (mCtrlType == CTRL_TYPE_UNDEFINED) { final SurfaceControl.Transaction t = mTransactionSupplier.get(); DragPositioningCallbackUtility.setPositionOnDrag(mDesktopWindowDecoration, Loading @@ -111,18 +121,23 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { PointF delta = DragPositioningCallbackUtility.calculateDelta(x, y, mRepositionStartPoint); if (isResizing()) { if (mHasDragResized) { if (!mTaskBoundsAtDragStart.equals(mRepositionTaskBounds)) { DragPositioningCallbackUtility.changeBounds( mCtrlType, mRepositionTaskBounds, mTaskBoundsAtDragStart, mStableBounds, delta, mDisplayController, mDesktopWindowDecoration); DragPositioningCallbackUtility.applyTaskBoundsChange( new WindowContainerTransaction(), mDesktopWindowDecoration, mRepositionTaskBounds, mTaskOrganizer); } // TODO: (b/279062291) Synchronize the start of hide to the end of the draw triggered // above. mDesktopWindowDecoration.updateResizeVeil(mRepositionTaskBounds); final WindowContainerTransaction wct = new WindowContainerTransaction(); wct.setBounds(mDesktopWindowDecoration.mTaskInfo.token, mRepositionTaskBounds); if (Transitions.ENABLE_SHELL_TRANSITIONS) { mTransitions.startTransition(TRANSIT_CHANGE, wct, this); } else { mTaskOrganizer.applyTransaction(wct); } } else { // If bounds haven't changed, perform necessary veil reset here as startAnimation // won't be called. mDesktopWindowDecoration.hideResizeVeil(); } } else if (!mDisallowedAreaForEndBounds.contains((int) x, (int) y)) { DragPositioningCallbackUtility.updateTaskBounds(mRepositionTaskBounds, mTaskBoundsAtDragStart, mRepositionStartPoint, x, y); Loading @@ -133,7 +148,6 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { mCtrlType = CTRL_TYPE_UNDEFINED; mTaskBoundsAtDragStart.setEmpty(); mRepositionStartPoint.set(0, 0); mHasDragResized = false; } private boolean isResizing() { Loading @@ -141,4 +155,26 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback { || (mCtrlType & CTRL_TYPE_LEFT) != 0 || (mCtrlType & CTRL_TYPE_RIGHT) != 0; } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { startTransaction.apply(); mDesktopWindowDecoration.hideResizeVeil(); mCtrlType = CTRL_TYPE_UNDEFINED; finishCallback.onTransitionFinished(null, null); return true; } /** * We should never reach this as this handler's transitions are only started from shell * explicitly. */ @Nullable @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { return null; } }
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.java +3 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.DesktopModeController; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.transition.Transitions; import org.junit.Before; import org.junit.Test; Loading Loading @@ -87,6 +88,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { @Mock private DesktopTasksController mDesktopTasksController; @Mock private InputMonitor mInputMonitor; @Mock private InputManager mInputManager; @Mock private Transitions mTransitions; @Mock private DesktopModeWindowDecorViewModel.InputMonitorFactory mMockInputMonitorFactory; @Mock private Supplier<SurfaceControl.Transaction> mTransactionFactory; @Mock private SurfaceControl.Transaction mTransaction; Loading @@ -106,6 +108,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase { mTaskOrganizer, mDisplayController, mSyncQueue, mTransitions, Optional.of(mDesktopModeController), Optional.of(mDesktopTasksController), Optional.of(mSplitScreenController), Loading