Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46f06f39 authored by Jordan Silva's avatar Jordan Silva
Browse files

Add RemoteTransition to launch desktop tasks from recents view

Bug: 333524374
Fix: 379620787
Flag: com.android.window.flags.enable_desktop_windowing_mode
Test: DesktopTasksControllerTest
Test: DesktopModeWindowDecorViewModelTests
Change-Id: Ibac0c55b0661653f7771846bf64804e2275b0d33
parent 6e34e3a2
Loading
Loading
Loading
Loading
+36 −7
Original line number Diff line number Diff line
@@ -376,12 +376,13 @@ class DesktopTasksController(
        taskId: Int,
        wct: WindowContainerTransaction = WindowContainerTransaction(),
        transitionSource: DesktopModeTransitionSource,
        remoteTransition: RemoteTransition? = null,
    ): Boolean {
        val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId)
        if (runningTask == null) {
            return moveBackgroundTaskToDesktop(taskId, wct, transitionSource)
            return moveBackgroundTaskToDesktop(taskId, wct, transitionSource, remoteTransition)
        }
        moveRunningTaskToDesktop(runningTask, wct, transitionSource)
        moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition)
        return true
    }

@@ -389,6 +390,7 @@ class DesktopTasksController(
        taskId: Int,
        wct: WindowContainerTransaction,
        transitionSource: DesktopModeTransitionSource,
        remoteTransition: RemoteTransition? = null,
    ): Boolean {
        if (recentTasksController?.findTaskInBackground(taskId) == null) {
            logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId)
@@ -411,8 +413,17 @@ class DesktopTasksController(
                .apply { launchWindowingMode = WINDOWING_MODE_FREEFORM }
                .toBundle(),
        )

        val transition: IBinder
        if (remoteTransition != null) {
            val transitionType = transitionType(remoteTransition)
            val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition)
            transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler)
            remoteTransitionHandler.setTransition(transition)
        } else {
            // TODO(343149901): Add DPI changes for task launch
        val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
            transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
        }
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
            FREEFORM_ANIMATION_DURATION
        )
@@ -426,6 +437,7 @@ class DesktopTasksController(
        task: RunningTaskInfo,
        wct: WindowContainerTransaction = WindowContainerTransaction(),
        transitionSource: DesktopModeTransitionSource,
        remoteTransition: RemoteTransition? = null,
    ) {
        if (
            DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() &&
@@ -443,12 +455,21 @@ class DesktopTasksController(
                excludeTaskId = task.taskId,
                reason = DesktopImmersiveController.ExitReason.TASK_LAUNCH,
            )

        // Bring other apps to front first
        val taskIdToMinimize =
            bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId)
        addMoveToDesktopChanges(wct, task)

        val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
        val transition: IBinder
        if (remoteTransition != null) {
            val transitionType = transitionType(remoteTransition)
            val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition)
            transition = transitions.startTransition(transitionType, wct, remoteTransitionHandler)
            remoteTransitionHandler.setTransition(transition)
        } else {
            transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
        }
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
            FREEFORM_ANIMATION_DURATION
        )
@@ -2606,9 +2627,17 @@ class DesktopTasksController(
            }
        }

        override fun moveToDesktop(taskId: Int, transitionSource: DesktopModeTransitionSource) {
        override fun moveToDesktop(
            taskId: Int,
            transitionSource: DesktopModeTransitionSource,
            remoteTransition: RemoteTransition?,
        ) {
            executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c ->
                c.moveTaskToDesktop(taskId, transitionSource = transitionSource)
                c.moveTaskToDesktop(
                    taskId,
                    transitionSource = transitionSource,
                    remoteTransition = remoteTransition,
                )
            }
        }

+2 −1
Original line number Diff line number Diff line
@@ -53,7 +53,8 @@ interface IDesktopMode {
    oneway void setTaskListener(IDesktopTaskListener listener);

    /** Move a task with given `taskId` to desktop */
    void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource);
    void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource,
                        in @nullable RemoteTransition remoteTransition);

    /** Remove desktop on the given display */
    oneway void removeDesktop(int displayId);
+2 −1
Original line number Diff line number Diff line
@@ -701,7 +701,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel,
        // App sometimes draws before the insets from WindowDecoration#relayout have
        // been added, so they must be added here
        decoration.addCaptionInset(wct);
        mDesktopTasksController.moveTaskToDesktop(taskId, wct, source);
        mDesktopTasksController.moveTaskToDesktop(taskId, wct, source,
                /* remoteTransition= */ null);
        decoration.closeHandleMenu();

        if (source == DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) {
+31 −5
Original line number Diff line number Diff line
@@ -1216,14 +1216,40 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  fun moveRunningTaskToDesktop_deviceSupported_taskIsMovedToDesktop() {
    val task = setUpFullscreenTask()
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  fun moveBackgroundTaskToDesktop_remoteTransition_usesOneShotHandler() {
    val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java)
    whenever(
      transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())
    ).thenReturn(Binder())

    controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
    val task = createTaskInfo(1)
    whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null)
    whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task)
    controller.moveTaskToDesktop(
      taskId = task.taskId,
      transitionSource = UNKNOWN,
      remoteTransition = RemoteTransition(spy(TestRemoteTransition())))

    val wct = getLatestEnterDesktopWct()
    assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
    verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION)
    assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value)
  }


  @Test
  fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() {
    val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java)
    whenever(
      transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())
    ).thenReturn(Binder())

    controller.moveRunningTaskToDesktop(
      task = setUpFullscreenTask(),
      transitionSource = UNKNOWN,
      remoteTransition = RemoteTransition(spy(TestRemoteTransition())))

    verify(desktopModeEnterExitTransitionListener).onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION)
    assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value)
  }

  @Test
+3 −2
Original line number Diff line number Diff line
@@ -591,7 +591,8 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
        verify(mockDesktopTasksController).moveTaskToDesktop(
            eq(decor.mTaskInfo.taskId),
            any(),
            eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON)
            eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON),
            anyOrNull()
        )
    }

@@ -822,7 +823,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
        )

        verify(mockDesktopTasksController, times(1))
            .moveTaskToDesktop(any(), any(), any())
            .moveTaskToDesktop(any(), any(), any(), anyOrNull())
    }

    @Test