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

Commit 5054fff0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add RemoteTransition to launch desktop tasks from recents view" into main

parents 84f5f8ff 46f06f39
Loading
Loading
Loading
Loading
+36 −7
Original line number Diff line number Diff line
@@ -383,12 +383,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
    }

@@ -396,6 +397,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)
@@ -418,8 +420,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
        )
@@ -433,6 +444,7 @@ class DesktopTasksController(
        task: RunningTaskInfo,
        wct: WindowContainerTransaction = WindowContainerTransaction(),
        transitionSource: DesktopModeTransitionSource,
        remoteTransition: RemoteTransition? = null,
    ) {
        if (
            DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() &&
@@ -450,12 +462,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
        )
@@ -2657,9 +2678,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
@@ -717,7 +717,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
@@ -1217,14 +1217,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()
        )
    }

@@ -824,7 +825,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
        )

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

    @Test