diff options
4 files changed, 160 insertions, 27 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 4e9e8f97620c..0860fe4ea88c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -57,6 +57,7 @@ import com.android.wm.shell.dagger.back.ShellBackAnimationModule; import com.android.wm.shell.dagger.pip.PipModule; import com.android.wm.shell.desktopmode.DesktopModeEventLogger; import com.android.wm.shell.desktopmode.DesktopModeLoggerTransitionObserver; +import com.android.wm.shell.desktopmode.DesktopModeShellCommandHandler; import com.android.wm.shell.desktopmode.DesktopModeTaskRepository; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.desktopmode.DesktopTasksLimiter; @@ -533,8 +534,7 @@ public abstract class WMShellModule { exitDesktopTransitionHandler, toggleResizeDesktopTaskTransitionHandler, dragToDesktopTransitionHandler, desktopModeTaskRepository, desktopModeLoggerTransitionObserver, launchAdjacentController, - recentsTransitionHandler, multiInstanceHelper, - mainExecutor, desktopTasksLimiter); + recentsTransitionHandler, multiInstanceHelper, mainExecutor, desktopTasksLimiter); } @WMSingleton @@ -633,6 +633,20 @@ public abstract class WMShellModule { return new ResizeHandleSizeRepository(); } + @WMSingleton + @Provides + static Optional<DesktopModeShellCommandHandler> provideDesktopModeShellCommandHandler( + ShellInit shellInit, ShellCommandHandler shellCommandHandler, + Optional<DesktopTasksController> tasksController, + ResizeHandleSizeRepository resizeHandleSizeRepository) { + if (!DesktopModeStatus.isEnabled()) { + return Optional.empty(); + } + return Optional.of( + new DesktopModeShellCommandHandler(shellInit, shellCommandHandler, tasksController, + resizeHandleSizeRepository)); + } + // // Drag and drop // @@ -673,7 +687,8 @@ public abstract class WMShellModule { @Provides static Object provideIndependentShellComponentsToCreate( DragAndDropController dragAndDropController, - Optional<DesktopTasksTransitionObserver> desktopTasksTransitionObserverOptional) { + Optional<DesktopTasksTransitionObserver> desktopTasksTransitionObserverOptional, + Optional<DesktopModeShellCommandHandler> desktopModeShellCommandHandler) { return new Object(); } } 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 f1a475a42452..f26db8a7d3cf 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,15 +16,45 @@ package com.android.wm.shell.desktopmode +import android.content.res.Resources +import android.util.TypedValue +import android.util.TypedValue.COMPLEX_UNIT_DIP import android.window.WindowContainerTransaction +import com.android.wm.shell.protolog.ShellProtoLogGroup +import com.android.wm.shell.shared.DesktopModeStatus import com.android.wm.shell.sysui.ShellCommandHandler +import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.util.KtProtoLog +import com.android.wm.shell.windowdecor.ResizeHandleSizeRepository import java.io.PrintWriter +import java.util.Optional /** - * Handles the shell commands for the DesktopTasksController. + * Handles the shell commands for desktop windowing mode. + * + * <p>Use with {@code adb shell dumpsys activity service SystemUIService WMShell desktopmode ...}. */ -class DesktopModeShellCommandHandler(private val controller: DesktopTasksController) : - ShellCommandHandler.ShellCommandActionHandler { +class DesktopModeShellCommandHandler( + shellInit: ShellInit, + private val shellCommandHandler: ShellCommandHandler, + private val controller: Optional<DesktopTasksController>, + private val resizeHandleSizeRepository: ResizeHandleSizeRepository +) : ShellCommandHandler.ShellCommandActionHandler { + + private var resources: Resources? = null + + init { + if (DesktopModeStatus.isEnabled()) { + shellInit.addInitCallback(::onInit, this) + } + } + + private fun onInit() { + KtProtoLog.d(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, + "Initialize DesktopModeShellCommandHandler") + shellCommandHandler.addCommandCallback("desktopmode", this, this) + resources = if (controller.isPresent) controller.get().context.resources else null + } override fun onShellCommand(args: Array<String>, pw: PrintWriter): Boolean { return when (args[0]) { @@ -44,6 +74,9 @@ class DesktopModeShellCommandHandler(private val controller: DesktopTasksControl true } } + "edgeResizeHandle" -> { + return updateEdgeResizeHandle(args, pw) + } else -> { pw.println("Invalid command: ${args[0]}") false @@ -58,14 +91,19 @@ class DesktopModeShellCommandHandler(private val controller: DesktopTasksControl return false } - val taskId = try { - args[1].toInt() - } catch (e: NumberFormatException) { - pw.println("Error: task id should be an integer") - return false - } + val taskId = + try { + args[1].toInt() + } catch (e: NumberFormatException) { + pw.println("Error: task id should be an integer") + return false + } - return controller.moveToDesktop(taskId, WindowContainerTransaction()) + return if (controller.isPresent) { + controller.get().moveToDesktop(taskId, WindowContainerTransaction()) + } else { + false + } } private fun runMoveToNextDisplay(args: Array<String>, pw: PrintWriter): Boolean { @@ -75,14 +113,92 @@ class DesktopModeShellCommandHandler(private val controller: DesktopTasksControl return false } - val taskId = try { - args[1].toInt() - } catch (e: NumberFormatException) { - pw.println("Error: task id should be an integer") + val taskId = + try { + args[1].toInt() + } catch (e: NumberFormatException) { + pw.println("Error: task id should be an integer") + return false + } + + if (controller.isPresent) { + controller.get().moveToNextDisplay(taskId) + return true + } else { return false } + } - controller.moveToNextDisplay(taskId) + private fun updateEdgeResizeHandle(args: Array<String>, pw: PrintWriter): Boolean { + if (args.size < 2) { + // First argument is the action name. + pw.println("Error: edge resize action should be provided as arguments [set|reset|get]") + return false + } + when (val action = args[1]) { + "set" -> { + if (resources == null) { + pw.println("Error: unable to convert given dp to pixel units") + return false + } + if (args.size < 3) { + pw.println( + "Error: edge resize size should be provided as argument " + + "<positive integer>" + ) + return false + } + val newEdgeSizeDp = + try { + args[2].toFloat() + } catch (e: NumberFormatException) { + pw.println("Error: edge resize width should be an integer") + return false + } + if (newEdgeSizeDp <= 0) { + pw.println("Error: edge resize width should be a positive integer") + return false + } + val newEdgeSizePixels = + TypedValue.convertDimensionToPixels( + COMPLEX_UNIT_DIP, + newEdgeSizeDp, + resources!!.displayMetrics + ) + .toInt() + resizeHandleSizeRepository.setResizeEdgeHandlePixels(newEdgeSizePixels) + pw.println( + "Handling set request for edge handle size of $newEdgeSizeDp dp " + + "(or $newEdgeSizePixels px)" + ) + } + "reset" -> { + resizeHandleSizeRepository.resetResizeEdgeHandlePixels() + pw.println("Handling reset request for edge handle size") + } + "get" -> { + if (resources == null) { + pw.println("Error: unable to retrieve edge handle size") + return false + } + val edgeSizePixels = resizeHandleSizeRepository + .getResizeEdgeHandlePixels(resources!!) + .toFloat() + val edgeSizeDp = + TypedValue.deriveDimension( + COMPLEX_UNIT_DIP, + edgeSizePixels, + resources!!.displayMetrics + ) + pw.println("Current edge handle size is $edgeSizeDp dp (or $edgeSizePixels px)") + } + else -> { + pw.println( + "Error: must provide a valid argument (set, reset, or get); received " + action + ) + return false + } + } return true } @@ -91,5 +207,14 @@ class DesktopModeShellCommandHandler(private val controller: DesktopTasksControl 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.") + pw.println("$prefix edgeResizeHandle set <positive integer>") + pw.println("$prefix Sets the width of the handle, in dp, to use for edge resizing.") + pw.println("$prefix edgeResizeHandle reset") + pw.println("$prefix Restore the original width of the handle to use for edge resizing.") + pw.println("$prefix edgeResizeHandle get") + pw.println( + "$prefix Retrieves the current width, in dp, of the handle to use for edge " + + "resizing." + ) } -}
\ No newline at end of file +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index e5bf53a4afdb..693654441722 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -124,8 +124,6 @@ class DesktopTasksController( private val desktopMode: DesktopModeImpl private var visualIndicator: DesktopModeVisualIndicator? = null - private val desktopModeShellCommandHandler: DesktopModeShellCommandHandler = - DesktopModeShellCommandHandler(this) private val mOnAnimationFinishedCallback = Consumer<SurfaceControl.Transaction> { t: SurfaceControl.Transaction -> visualIndicator?.releaseVisualIndicator(t) @@ -178,11 +176,6 @@ class DesktopTasksController( private fun onInit() { KtProtoLog.d(WM_SHELL_DESKTOP_MODE, "Initialize DesktopTasksController") shellCommandHandler.addDumpCallback(this::dump, this) - shellCommandHandler.addCommandCallback( - "desktopmode", - desktopModeShellCommandHandler, - this - ) shellController.addExternalInterface( ShellSharedConstants.KEY_EXTRA_SHELL_DESKTOP_MODE, { createExternalInterface() }, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index d8d534bec6ea..004b044f567a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -93,6 +93,7 @@ import com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_DESKTOP_MODE import com.android.wm.shell.transition.Transitions.TransitionHandler import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertWithMessage +import java.util.Optional import org.junit.After import org.junit.Assume.assumeTrue import org.junit.Before @@ -115,7 +116,6 @@ import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.atLeastOnce import org.mockito.kotlin.capture import org.mockito.quality.Strictness -import java.util.Optional import junit.framework.Assert.assertFalse import junit.framework.Assert.assertTrue import org.mockito.Mockito.`when` as whenever |