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

Commit 02c31289 authored by Orhan Uysal's avatar Orhan Uysal
Browse files

Minimize closing apps that are not closed by X.

New POR is to minimize closing apps that are not closed by X.

Bug: 368316371
Test: atest DesktopTasksControllerTest
Test: atest DesktopModeTaskRepositoryTest
Test: atest FreeformTaskListenerTests
Flag: com.android.window.flags.enable_desktop_windowing_back_navigation
Change-Id: I9b077b672bac274e36df93a5b1fcd655c4944c70
parent d1eccd27
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -330,8 +330,17 @@ class DesktopModeTaskRepository (

    /** Minimizes the task for [taskId] and [displayId] */
    fun minimizeTask(displayId: Int, taskId: Int) {
        if (displayId == INVALID_DISPLAY) {
            // When a task vanishes it doesn't have a displayId. Find the display of the task and
            // mark it as minimized.
            getDisplayIdForTask(taskId)?.let {
                minimizeTask(it, taskId)
            } ?: logW("Minimize task: No display id found for task: taskId=%d", taskId)
        } else {
            logD("Minimize Task: display=%d, task=%d", displayId, taskId)
            desktopTaskDataByDisplayId.getOrCreate(displayId).minimizedTasks.add(taskId)
        }

        if (Flags.enableDesktopWindowingPersistence()) {
            updatePersistentRepository(displayId)
        }
+4 −8
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@ import android.view.Display.DEFAULT_DISPLAY
import android.view.DragEvent
import android.view.SurfaceControl
import android.view.WindowManager.TRANSIT_CHANGE
import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_NONE
import android.view.WindowManager.TRANSIT_OPEN
import android.view.WindowManager.TRANSIT_TO_FRONT
@@ -1307,14 +1306,11 @@ class DesktopTasksController(
            // Remove wallpaper activity when the last active task is removed
            removeWallpaperActivity(wct)
        }

        if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) {
            taskRepository.addClosingTask(task.displayId, task.taskId)
        // If a CLOSE is triggered on a desktop task, remove the task.
        if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue() &&
            taskRepository.isVisibleTask(task.taskId) &&
            transitionType == TRANSIT_CLOSE
        ) {
            wct.removeTask(task.token)
        }

        taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(
            doesAnyTaskRequireTaskbarRounding(
                task.displayId,
+11 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.util.SparseArray;
import android.view.SurfaceControl;
import android.window.flags.DesktopModeFlags;

import com.android.internal.protolog.ProtoLog;
import com.android.wm.shell.ShellTaskOrganizer;
@@ -121,7 +122,16 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener,

        if (DesktopModeStatus.canEnterDesktopMode(mContext)) {
            mDesktopModeTaskRepository.ifPresent(repository -> {
                // TODO: b/370038902 - Handle Activity#finishAndRemoveTask.
                if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()
                        || repository.isClosingTask(taskInfo.taskId)) {
                    // A task that's vanishing should be removed:
                    // - If it's closed by the X button which means it's marked as a closing task.
                    repository.removeFreeformTask(taskInfo.displayId, taskInfo.taskId);
                } else {
                    repository.updateTaskVisibility(taskInfo.displayId, taskInfo.taskId, false);
                    repository.minimizeTask(taskInfo.displayId, taskInfo.taskId);
                }
            });
        }
        mWindowDecorationViewModel.onTaskVanished(taskInfo);
+12 −0
Original line number Diff line number Diff line
@@ -819,6 +819,18 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
    }

    @Test
    fun minimizeTask_withInvalidDisplay_minimizesCorrectTask() {
        repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 0)
        repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 0)

        repo.minimizeTask(displayId = INVALID_DISPLAY, taskId = 0)

        assertThat(repo.isMinimizedTask(taskId = 0)).isTrue()
        assertThat(repo.isMinimizedTask(taskId = 1)).isFalse()
        assertThat(repo.isMinimizedTask(taskId = 2)).isFalse()
    }

    @Test
    fun unminimizeTask_unminimizesTask() {
        repo.minimizeTask(displayId = 0, taskId = 0)
+23 −137
Original line number Diff line number Diff line
@@ -2073,11 +2073,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @DisableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION,
  )
  fun handleRequest_backTransition_singleTaskNoToken_noWallpaper_noBackNav_doesNotHandle() {
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
  fun handleRequest_backTransition_singleTaskNoToken_noWallpaper_doesNotHandle() {
    val task = setUpFreeformTask()

    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK))
@@ -2110,8 +2107,7 @@ class DesktopTasksControllerTest : ShellTestCase() {

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
  fun handleRequest_backTransition_singleTaskNoToken_noBackNav_doesNotHandle() {
  fun handleRequest_backTransition_singleTaskNoToken_doesNotHandle() {
    val task = setUpFreeformTask()

    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK))
@@ -2120,11 +2116,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @DisableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_backTransition_singleTaskWithToken_noWallpaper_noBackNav_doesNotHandle() {
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
  fun handleRequest_backTransition_singleTaskWithToken_noWallpaper_doesNotHandle() {
    val task = setUpFreeformTask()

    taskRepository.wallpaperActivityToken = MockToken().token()
@@ -2147,11 +2140,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @DisableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_backTransition_multipleTasks_noWallpaper_noBackNav_doesNotHandle() {
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
  fun handleRequest_backTransition_multipleTasks_noWallpaper_doesNotHandle() {
    val task1 = setUpFreeformTask()
    setUpFreeformTask()

@@ -2163,7 +2153,7 @@ class DesktopTasksControllerTest : ShellTestCase() {

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  fun handleRequest_backTransition_multipleTasks_noBackNav_doesNotHandle() {
  fun handleRequest_backTransition_multipleTasks_doesNotHandle() {
    val task1 = setUpFreeformTask()
    setUpFreeformTask()

@@ -2209,11 +2199,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @EnableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_backTransition_nonMinimizadTask_withWallpaper_withBackNav_removesWallpaper() {
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
  fun handleRequest_backTransition_nonMinimizadTask_withWallpaper_removesWallpaper() {
    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val wallpaperToken = MockToken().token()
@@ -2229,11 +2216,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @DisableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_singleTaskNoToken_noWallpaper_noBackNav_doesNotHandle() {
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
  fun handleRequest_closeTransition_singleTaskNoToken_noWallpaper_doesNotHandle() {
    val task = setUpFreeformTask()

    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))
@@ -2241,23 +2225,9 @@ class DesktopTasksControllerTest : ShellTestCase() {
    assertNull(result, "Should not handle request")
  }

  @Test
  @EnableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_singleTaskNoToken_withWallpaper_withBackNav_removesTask() {
    val task = setUpFreeformTask()

    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))

    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, task.token)
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
  fun handleRequest_closeTransition_singleTaskNoToken_noBackNav_doesNotHandle() {
  fun handleRequest_closeTransition_singleTaskNoToken_doesNotHandle() {
    val task = setUpFreeformTask()

    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))
@@ -2266,11 +2236,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @DisableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_singleTaskWithToken_noWallpaper_noBackNav_doesNotHandle() {
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  fun handleRequest_closeTransition_singleTaskWithToken_noWallpaper_doesNotHandle() {
    val task = setUpFreeformTask()

    taskRepository.wallpaperActivityToken = MockToken().token()
@@ -2279,27 +2246,9 @@ class DesktopTasksControllerTest : ShellTestCase() {
    assertNull(result, "Should not handle request")
  }

  @Test
  @EnableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_singleTaskWithToken_removesWallpaperAndTask() {
    val task = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

    taskRepository.wallpaperActivityToken = wallpaperToken
    val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE))

    // Should create remove wallpaper transaction
    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
    result.assertRemoveAt(index = 1, task.token)
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
  fun handleRequest_closeTransition_singleTaskWithToken_withWallpaper_noBackNav_removesWallpaper() {
  fun handleRequest_closeTransition_singleTaskWithToken_withWallpaper_removesWallpaper() {
    val task = setUpFreeformTask()
    val wallpaperToken = MockToken().token()

@@ -2311,11 +2260,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @DisableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_multipleTasks_noWallpaper_noBackNav_doesNotHandle() {
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  fun handleRequest_closeTransition_multipleTasks_noWallpaper_doesNotHandle() {
    val task1 = setUpFreeformTask()
    setUpFreeformTask()

@@ -2325,26 +2271,9 @@ class DesktopTasksControllerTest : ShellTestCase() {
    assertNull(result, "Should not handle request")
  }

  @Test
  @EnableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_multipleTasks_withWallpaper_withBackNav_removesTask() {
    val task1 = setUpFreeformTask()
    setUpFreeformTask()

    taskRepository.wallpaperActivityToken = MockToken().token()
    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_CLOSE))

    assertNotNull(result, "Should handle request")
    result.assertRemoveAt(index = 0, task1.token)
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
  fun handleRequest_closeTransition_multipleTasksFlagEnabled_noBackNav_doesNotHandle() {
  fun handleRequest_closeTransition_multipleTasksFlagEnabled_doesNotHandle() {
    val task1 = setUpFreeformTask()
    setUpFreeformTask()

@@ -2354,29 +2283,9 @@ class DesktopTasksControllerTest : ShellTestCase() {
    assertNull(result, "Should not handle request")
  }

  @Test
  @EnableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_multipleTasksSingleNonClosing_removesWallpaperAndTask() {
    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val wallpaperToken = MockToken().token()

    taskRepository.wallpaperActivityToken = wallpaperToken
    taskRepository.addClosingTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId)
    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_CLOSE))

    // Should create remove wallpaper transaction
    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
    result.assertRemoveAt(index = 1, task1.token)
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
  fun handleRequest_closeTransition_multipleTasksSingleNonClosing_noBackNav_removesWallpaper() {
  fun handleRequest_closeTransition_multipleTasksSingleNonClosing_removesWallpaper() {
    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val wallpaperToken = MockToken().token()
@@ -2389,29 +2298,9 @@ class DesktopTasksControllerTest : ShellTestCase() {
    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
  }

  @Test
  @EnableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_multipleTasksOneNonMinimized_removesWallpaperAndTask() {
    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val wallpaperToken = MockToken().token()

    taskRepository.wallpaperActivityToken = wallpaperToken
    taskRepository.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = task2.taskId)
    val result = controller.handleRequest(Binder(), createTransition(task1, type = TRANSIT_CLOSE))

    // Should create remove wallpaper transaction
    assertNotNull(result, "Should handle request").assertRemoveAt(index = 0, wallpaperToken)
    result.assertRemoveAt(index = 1, task1.token)
  }

  @Test
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
  @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION)
  fun handleRequest_closeTransition_multipleTasksSingleNonMinimized_noBackNav_removesWallpaper() {
  fun handleRequest_closeTransition_multipleTasksSingleNonMinimized_removesWallpaper() {
    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val wallpaperToken = MockToken().token()
@@ -2425,11 +2314,8 @@ class DesktopTasksControllerTest : ShellTestCase() {
  }

  @Test
  @EnableFlags(
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
    Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
  )
  fun handleRequest_closeTransition_minimizadTask_withWallpaper_withBackNav_removesWallpaper() {
  @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,)
  fun handleRequest_closeTransition_minimizadTask_withWallpaper_removesWallpaper() {
    val task1 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val task2 = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
    val wallpaperToken = MockToken().token()
Loading