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

Commit 405c7474 authored by Ivan Tkachenko's avatar Ivan Tkachenko
Browse files

Remove wallpaper activity when moving to fullscreen/splitscreen

- Add remove wallpaper activity hierarchy ops when moving to
  fullscreen/splitscreen the last visible non-minimized task from desktop windowing.
- Removing wallpaper activity fixes the problem with navigating back to
  empty desktop (wallpaper activity without desktop windows).

Bug: 352481893
Test: atest WMShellUnitTests:DesktopTasksControllerTest
Flag: com.android.window.flags.enable_desktop_windowing_wallpaper_activity
Change-Id: I80cb8e05ba40673293ea093e6e0e95368670a17f
parent 732fe397
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1101,6 +1101,10 @@ class DesktopTasksController(
        if (useDesktopOverrideDensity()) {
            wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi())
        }
        if (desktopModeTaskRepository.isOnlyVisibleNonClosingTask(taskInfo.taskId)) {
            // Remove wallpaper activity when leaving desktop mode
            removeWallpaperActivity(wct)
        }
    }

    /**
@@ -1116,6 +1120,10 @@ class DesktopTasksController(
        // The task's density may have been overridden in freeform; revert it here as we don't
        // want it overridden in multi-window.
        wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi())
        if (desktopModeTaskRepository.isOnlyVisibleNonClosingTask(taskInfo.taskId)) {
            // Remove wallpaper activity when leaving desktop mode
            removeWallpaperActivity(wct)
        }
    }

    /** Returns the ID of the Task that will be minimized, or null if no task will be minimized. */
+157 −4
Original line number Diff line number Diff line
@@ -920,6 +920,24 @@ class DesktopTasksControllerTest : ShellTestCase() {
        .isEqualTo(WINDOWING_MODE_UNDEFINED)
  }

  @Test
  fun moveToFullscreen_tdaFullscreen_windowingModeUndefined_removesWallpaperActivity() {
    val task = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken
    assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY))
      .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN

    controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN)

    val wct = getLatestExitDesktopWct()
    val taskChange = assertNotNull(wct.changes[task.token.asBinder()])
    assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED)
    // Removes wallpaper activity when leaving desktop
    wct.assertRemoveAt(index = 0, wallpaperToken)
  }

  @Test
  fun moveToFullscreen_tdaFreeform_windowingModeSetToFullscreen() {
    val task = setUpFreeformTask()
@@ -931,6 +949,44 @@ class DesktopTasksControllerTest : ShellTestCase() {
        .isEqualTo(WINDOWING_MODE_FULLSCREEN)
  }

  @Test
  fun moveToFullscreen_tdaFreeform_windowingModeFullscreen_removesWallpaperActivity() {
    val task = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken
    assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY))
      .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM

    controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN)

    val wct = getLatestExitDesktopWct()
    val taskChange = assertNotNull(wct.changes[task.token.asBinder()])
    assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_FULLSCREEN)
    // Removes wallpaper activity when leaving desktop
    wct.assertRemoveAt(index = 0, wallpaperToken)
  }

  @Test
  fun moveToFullscreen_multipleVisibleNonMinimizedTasks_doesNotRemoveWallpaperActivity() {
    val task1 = setUpFreeformTask()
    // Setup task2
    setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken
    assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY))
      .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN

    controller.moveToFullscreen(task1.taskId, transitionSource = UNKNOWN)

    val wct = getLatestExitDesktopWct()
    val task1Change = assertNotNull(wct.changes[task1.token.asBinder()])
    assertThat(task1Change.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED)
    // Does not remove wallpaper activity, as desktop still has a visible desktop task
    assertThat(wct.hierarchyOps).isEmpty()
  }

  @Test
  fun moveToFullscreen_nonExistentTask_doesNothing() {
    controller.moveToFullscreen(999, transitionSource = UNKNOWN)
@@ -1754,6 +1810,49 @@ class DesktopTasksControllerTest : ShellTestCase() {
        .isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN
  }

  @Test
  fun moveFocusedTaskToFullscreen_onlyVisibleNonMinimizedTask_removesWallpaperActivity() {
    val task1 = setUpFreeformTask()
    val task2 = setUpFreeformTask()
    val task3 = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    task1.isFocused = false
    task2.isFocused = true
    task3.isFocused = false
    desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken
    desktopModeTaskRepository.minimizeTask(DEFAULT_DISPLAY, task1.taskId)
    desktopModeTaskRepository.updateVisibleFreeformTasks(DEFAULT_DISPLAY, task3.taskId,
      visible = false)

    controller.enterFullscreen(DEFAULT_DISPLAY, transitionSource = UNKNOWN)

    val wct = getLatestExitDesktopWct()
    val taskChange = assertNotNull(wct.changes[task2.token.asBinder()])
    assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN
    wct.assertRemoveAt(index = 0, wallpaperToken)
  }

  @Test
  fun moveFocusedTaskToFullscreen_multipleVisibleTasks_doesNotRemoveWallpaperActivity() {
    val task1 = setUpFreeformTask()
    val task2 = setUpFreeformTask()
    val task3 = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    task1.isFocused = false
    task2.isFocused = true
    task3.isFocused = false
    desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken
    controller.enterFullscreen(DEFAULT_DISPLAY, transitionSource = UNKNOWN)

    val wct = getLatestExitDesktopWct()
    val taskChange = assertNotNull(wct.changes[task2.token.asBinder()])
    assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN
    // Does not remove wallpaper activity, as desktop still has visible desktop tasks
    assertThat(wct.hierarchyOps).isEmpty()
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS)
  fun dragToDesktop_landscapeDevice_resizable_undefinedOrientation_defaultLandscapeBounds() {
@@ -1963,6 +2062,7 @@ class DesktopTasksControllerTest : ShellTestCase() {
            eq(null))
  }

  @Test
  fun enterSplit_freeformTaskIsMovedToSplit() {
    val task1 = setUpFreeformTask()
    val task2 = setUpFreeformTask()
@@ -1972,14 +2072,67 @@ class DesktopTasksControllerTest : ShellTestCase() {
    task2.isFocused = true
    task3.isFocused = false

    controller.enterSplit(DEFAULT_DISPLAY, false)
    controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false)

    verify(splitScreenController)
        .requestEnterSplitSelect(
            task2,
            eq(task2),
            any(),
            SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT,
            task2.configuration.windowConfiguration.bounds)
            eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT),
            eq(task2.configuration.windowConfiguration.bounds))
  }

  @Test
  fun enterSplit_onlyVisibleNonMinimizedTask_removesWallpaperActivity() {
    val task1 = setUpFreeformTask()
    val task2 = setUpFreeformTask()
    val task3 = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    task1.isFocused = false
    task2.isFocused = true
    task3.isFocused = false
    desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken
    desktopModeTaskRepository.minimizeTask(DEFAULT_DISPLAY, task1.taskId)
    desktopModeTaskRepository.updateVisibleFreeformTasks(DEFAULT_DISPLAY, task3.taskId,
      visible = false)

    controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false)

    val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
    verify(splitScreenController)
      .requestEnterSplitSelect(
        eq(task2),
        wctArgument.capture(),
        eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT),
        eq(task2.configuration.windowConfiguration.bounds))
    // Removes wallpaper activity when leaving desktop
    wctArgument.value.assertRemoveAt(index = 0, wallpaperToken)
  }

  @Test
  fun enterSplit_multipleVisibleNonMinimizedTasks_removesWallpaperActivity() {
    val task1 = setUpFreeformTask()
    val task2 = setUpFreeformTask()
    val task3 = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    task1.isFocused = false
    task2.isFocused = true
    task3.isFocused = false
    desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken

    controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false)

    val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
    verify(splitScreenController)
      .requestEnterSplitSelect(
        eq(task2),
        wctArgument.capture(),
        eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT),
        eq(task2.configuration.windowConfiguration.bounds))
    // Does not remove wallpaper activity, as desktop still has visible desktop tasks
    assertThat(wctArgument.value.hierarchyOps).isEmpty()
  }

  @Test