[1/N] Desks: Add support for adb commands

Adds support to create/remove desks and manage tasks within them
using adb commands.
This change defines the commands and adds the basic skeleton to handle
them, but doesn't actually implement any functionality.

Flag: com.android.window.flags.enable_multiple_desktops_backend
Test: adb shell dumpsys activity service SystemUIService WMShell
desktopmode <command> <args>
Bug: 389787966

Change-Id: I7f78e77c3ffcec7b47c964a757daa411a0776e52
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
index cdfa14b..9b99884 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
@@ -16,6 +16,7 @@
 
 package com.android.wm.shell.desktopmode
 
+import com.android.window.flags.Flags
 import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource.UNKNOWN
 import com.android.wm.shell.sysui.ShellCommandHandler
 import java.io.PrintWriter
@@ -26,35 +27,28 @@
 
     override fun onShellCommand(args: Array<String>, pw: PrintWriter): Boolean =
         when (args[0]) {
-            "moveToDesktop" -> {
-                if (!runMoveToDesktop(args, pw)) {
-                    pw.println("Task not found. Please enter a valid taskId.")
-                    false
-                } else {
-                    true
-                }
-            }
-            "moveToNextDisplay" -> {
-                if (!runMoveToNextDisplay(args, pw)) {
-                    pw.println("Task not found. Please enter a valid taskId.")
-                    false
-                } else {
-                    true
-                }
-            }
+            "moveTaskToDesk" -> runMoveTaskToDesk(args, pw)
+            "moveToNextDisplay" -> runMoveToNextDisplay(args, pw)
+            "createDesk" -> runCreateDesk(args, pw)
+            "activateDesk" -> runActivateDesk(args, pw)
+            "removeDesk" -> runRemoveDesk(args, pw)
+            "removeAllDesks" -> runRemoveAllDesks(args, pw)
+            "moveTaskToFront" -> runMoveTaskToFront(args, pw)
+            "moveTaskOutOfDesk" -> runMoveTaskOutOfDesk(args, pw)
+            "canCreateDesk" -> runCanCreateDesk(args, pw)
+            "getActiveDeskId" -> runGetActiveDeskId(args, pw)
             else -> {
                 pw.println("Invalid command: ${args[0]}")
                 false
             }
         }
 
-    private fun runMoveToDesktop(args: Array<String>, pw: PrintWriter): Boolean {
+    private fun runMoveTaskToDesk(args: Array<String>, pw: PrintWriter): Boolean {
         if (args.size < 2) {
             // First argument is the action name.
             pw.println("Error: task id should be provided as arguments")
             return false
         }
-
         val taskId =
             try {
                 args[1].toInt()
@@ -62,7 +56,22 @@
                 pw.println("Error: task id should be an integer")
                 return false
             }
-        return controller.moveTaskToDesktop(taskId, transitionSource = UNKNOWN)
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            return controller.moveTaskToDesktop(taskId, transitionSource = UNKNOWN)
+        }
+        if (args.size < 3) {
+            pw.println("Error: desk id should be provided as arguments")
+            return false
+        }
+        val deskId =
+            try {
+                args[2].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: desk id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
     }
 
     private fun runMoveToNextDisplay(args: Array<String>, pw: PrintWriter): Boolean {
@@ -84,10 +93,184 @@
         return true
     }
 
+    private fun runCreateDesk(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        if (args.size < 2) {
+            // First argument is the action name.
+            pw.println("Error: desk id should be provided as arguments")
+            return false
+        }
+        val displayId =
+            try {
+                args[1].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: display id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
+    }
+
+    private fun runActivateDesk(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        if (args.size < 2) {
+            // First argument is the action name.
+            pw.println("Error: desk id should be provided as arguments")
+            return false
+        }
+        val deskId =
+            try {
+                args[1].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: desk id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
+    }
+
+    private fun runRemoveDesk(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        if (args.size < 2) {
+            // First argument is the action name.
+            pw.println("Error: desk id should be provided as arguments")
+            return false
+        }
+        val deskId =
+            try {
+                args[1].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: desk id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
+    }
+
+    private fun runRemoveAllDesks(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        pw.println("Not implemented.")
+        return false
+    }
+
+    private fun runMoveTaskToFront(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        if (args.size < 2) {
+            // First argument is the action name.
+            pw.println("Error: task id should be provided as arguments")
+            return false
+        }
+        val taskId =
+            try {
+                args[1].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: task id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
+    }
+
+    private fun runMoveTaskOutOfDesk(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        if (args.size < 2) {
+            // First argument is the action name.
+            pw.println("Error: task id should be provided as arguments")
+            return false
+        }
+        val taskId =
+            try {
+                args[1].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: task id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
+    }
+
+    private fun runCanCreateDesk(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        val displayId =
+            try {
+                args[1].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: display id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
+    }
+
+    private fun runGetActiveDeskId(args: Array<String>, pw: PrintWriter): Boolean {
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("Not supported.")
+            return false
+        }
+        if (args.size < 2) {
+            // First argument is the action name.
+            pw.println("Error: task id should be provided as arguments")
+            return false
+        }
+        val displayId =
+            try {
+                args[1].toInt()
+            } catch (e: NumberFormatException) {
+                pw.println("Error: display id should be an integer")
+                return false
+            }
+        pw.println("Not implemented.")
+        return false
+    }
+
     override fun printShellCommandHelp(pw: PrintWriter, prefix: String) {
-        pw.println("$prefix moveToDesktop <taskId> ")
-        pw.println("$prefix  Move a task with given id to desktop mode.")
-        pw.println("$prefix moveToNextDisplay <taskId> ")
+        if (!Flags.enableMultipleDesktopsBackend()) {
+            pw.println("$prefix moveTaskToDesk <taskId> ")
+            pw.println("$prefix  Move a task with given id to desktop mode.")
+            pw.println("$prefix moveToNextDisplay <taskId> ")
+            pw.println("$prefix  Move a task with given id to next display.")
+            return
+        }
+        pw.println("$prefix moveTaskToDesk <taskId> <deskId>")
+        pw.println("$prefix  Move a task with given id to the given desk and activate it.")
+        pw.println("$prefix moveToNextDisplay <taskId>")
         pw.println("$prefix  Move a task with given id to next display.")
+        pw.println("$prefix createDesk <displayId>")
+        pw.println("$prefix  Creates a desk on the given display.")
+        pw.println("$prefix activateDesk <deskId>")
+        pw.println("$prefix  Activates the given desk.")
+        pw.println("$prefix removeDesk <deskId> ")
+        pw.println("$prefix  Removes the given desk and all of its windows.")
+        pw.println("$prefix removeAllDesks")
+        pw.println("$prefix  Removes all the desks and their windows across all displays")
+        pw.println("$prefix moveTaskToFront <taskId>")
+        pw.println("$prefix  Moves a task in front of its siblings.")
+        pw.println("$prefix moveTaskOutOfDesk <taskId>")
+        pw.println("$prefix  Moves the given desktop task out of the desk into fullscreen mode.")
+        pw.println("$prefix canCreateDesk <displayId>")
+        pw.println("$prefix  Whether creating a new desk in the given display is allowed.")
+        pw.println("$prefix getActivateDeskId <displayId>")
+        pw.println("$prefix  Print the id of the active desk in the given display.")
     }
 }