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

Commit 9e735b40 authored by Jorge Gil's avatar Jorge Gil
Browse files

Check for minimize & exit immersive logic on #openInstance

When a task is re-opened through the instance manager, check whether the
system needs to minimize or move a task out of immersive mode in the
same transition.

Flag: EXEMPT bugfix
Fix: 373628617
Fix: 369025348
Test: open a new window through the Manage Windows menu, check the
oldest task is minimized if at the limit or the immersive task exists if
needed.

Change-Id: Idd76dcfd2aca149757f94efe36d71c8cee2ee52e
parent 691e8f28
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -1184,7 +1184,13 @@ class DesktopTasksController(
        val options = createNewWindowOptions(callingTask)
        if (options.launchWindowingMode == WINDOWING_MODE_FREEFORM) {
            wct.startTask(requestedTaskId, options.toBundle())
            transitions.startTransition(TRANSIT_OPEN, wct, null)
            val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(
                callingTask.displayId, wct, requestedTaskId)
            val runOnTransit = immersiveTransitionHandler
                .exitImmersiveIfApplicable(wct, callingTask.displayId)
            val transition = transitions.startTransition(TRANSIT_OPEN, wct, null)
            addPendingMinimizeTransition(transition, taskToMinimize)
            runOnTransit?.invoke(transition)
        } else {
            val splitPosition = splitScreenController.determineNewInstancePosition(callingTask)
            splitScreenController.startTask(requestedTaskId, splitPosition,
+52 −0
Original line number Diff line number Diff line
@@ -2984,6 +2984,58 @@ class DesktopTasksControllerTest : ShellTestCase() {
      .launchWindowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
  fun openInstance_fromFreeform_minimizesIfNeeded() {
    setUpLandscapeDisplay()
    val homeTask = setUpHomeTask()
    val freeformTasks = (1..MAX_TASK_LIMIT + 1).map { _ -> setUpFreeformTask() }
    val oldestTask = freeformTasks.first()
    val newestTask = freeformTasks.last()

    runOpenInstance(newestTask, freeformTasks[1].taskId)

    val wct = getLatestWct(type = TRANSIT_OPEN)
    // Home is moved to front of everything.
    assertThat(
      wct.hierarchyOps.any { hop ->
        hop.container == homeTask.token.asBinder() && hop.toTop
      }
    ).isTrue()
    // And the oldest task isn't moved in front of home, effectively minimizing it.
    assertThat(
      wct.hierarchyOps.none { hop ->
        hop.container == oldestTask.token.asBinder() && hop.toTop
      }
    ).isTrue()
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MULTI_INSTANCE_FEATURES)
  fun openInstance_fromFreeform_exitsImmersiveIfNeeded() {
    setUpLandscapeDisplay()
    val homeTask = setUpHomeTask()
    val freeformTask = setUpFreeformTask()
    val immersiveTask = setUpFreeformTask()
    taskRepository.setTaskInFullImmersiveState(
      displayId = immersiveTask.displayId,
      taskId = immersiveTask.taskId,
      immersive = true
    )
    val runOnStartTransit = RunOnStartTransitionCallback()
    val transition = Binder()
    whenever(transitions.startTransition(eq(TRANSIT_OPEN), any(), anyOrNull()))
      .thenReturn(transition)
    whenever(mockDesktopFullImmersiveTransitionHandler
      .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId))).thenReturn(runOnStartTransit)

    runOpenInstance(immersiveTask, freeformTask.taskId)

    verify(mockDesktopFullImmersiveTransitionHandler)
      .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId))
    runOnStartTransit.assertOnlyInvocation(transition)
  }

  private fun runOpenInstance(
    callingTask: RunningTaskInfo,
    requestedTaskId: Int