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

Commit fede529e authored by Naomi Musgrave's avatar Naomi Musgrave
Browse files

Add shell command for edge resize handle size

Bug: 335850704
Test: atest WMShellUnitTests:ResizeHandleSizeProviderTests
Test: atest WMShellUnitTests:ResizeHandleSizeProviderParameterizedTests
Flag: com.android.window.flags.enable_windowing_edge_drag_resize
Change-Id: I4dc4b7f0db8fca79414c4010d0bc81b090d5bdc5
parent 18a95181
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -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();
    }
}
+141 −16
Original line number Diff line number Diff line
@@ -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 {
        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 {
        val taskId =
            try {
                args[1].toInt()
            } catch (e: NumberFormatException) {
                pw.println("Error: task id should be an integer")
                return false
            }

        controller.moveToNextDisplay(taskId)
        if (controller.isPresent) {
            controller.get().moveToNextDisplay(taskId)
            return true
        } else {
            return false
        }
    }

    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."
        )
    }
}
+0 −7
Original line number Diff line number Diff line
@@ -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() },
+1 −1
Original line number Diff line number Diff line
@@ -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