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

Commit 040ca8f9 authored by Jorge Gil's avatar Jorge Gil
Browse files

Dump DesktopImmersiveController state

Flag: com.android.window.flags.enable_fully_immersive_in_desktop
Bug: 359523924
Test: adb shell dumpsys activity service SystemUIService WMShell | grep
-e DesktopImmersiveController -A 20

Change-Id: I5b8edf7bccbaf1e79ff3b02007bd71ae75dd5aa3
parent b2de438c
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -836,14 +836,21 @@ public abstract class WMShellModule {
    @Provides
    static Optional<DesktopImmersiveController> provideDesktopImmersiveController(
            Context context,
            ShellInit shellInit,
            Transitions transitions,
            @DynamicOverride DesktopRepository desktopRepository,
            DisplayController displayController,
            ShellTaskOrganizer shellTaskOrganizer) {
            ShellTaskOrganizer shellTaskOrganizer,
            ShellCommandHandler shellCommandHandler) {
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
            return Optional.of(
                    new DesktopImmersiveController(
                            transitions, desktopRepository, displayController, shellTaskOrganizer));
                            shellInit,
                            transitions,
                            desktopRepository,
                            displayController,
                            shellTaskOrganizer,
                            shellCommandHandler));
        }
        return Optional.empty();
    }
+24 −0
Original line number Diff line number Diff line
@@ -34,10 +34,13 @@ import com.android.window.flags.Flags
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.sysui.ShellCommandHandler
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.transition.Transitions.TransitionHandler
import com.android.wm.shell.transition.Transitions.TransitionObserver
import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener
import java.io.PrintWriter

/**
 * A controller to move tasks in/out of desktop's full immersive state where the task
@@ -45,23 +48,29 @@ import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener
 * be transient below the status bar like in fullscreen immersive mode.
 */
class DesktopImmersiveController(
    shellInit: ShellInit,
    private val transitions: Transitions,
    private val desktopRepository: DesktopRepository,
    private val displayController: DisplayController,
    private val shellTaskOrganizer: ShellTaskOrganizer,
    private val shellCommandHandler: ShellCommandHandler,
    private val transactionSupplier: () -> SurfaceControl.Transaction,
) : TransitionHandler, TransitionObserver {

    constructor(
        shellInit: ShellInit,
        transitions: Transitions,
        desktopRepository: DesktopRepository,
        displayController: DisplayController,
        shellTaskOrganizer: ShellTaskOrganizer,
        shellCommandHandler: ShellCommandHandler,
    ) : this(
        shellInit,
        transitions,
        desktopRepository,
        displayController,
        shellTaskOrganizer,
        shellCommandHandler,
        { SurfaceControl.Transaction() }
    )

@@ -79,6 +88,14 @@ class DesktopImmersiveController(
    /** A listener to invoke on animation changes during entry/exit. */
    var onTaskResizeAnimationListener: OnTaskResizeAnimationListener? = null

    init {
        shellInit.addInitCallback({ onInit() }, this)
    }

    fun onInit() {
        shellCommandHandler.addDumpCallback(this::dump, this)
    }

    /** Starts a transition to enter full immersive state inside the desktop. */
    fun moveTaskToImmersive(taskInfo: RunningTaskInfo) {
        if (inProgress) {
@@ -449,6 +466,13 @@ class DesktopImmersiveController(
    private fun TransitionInfo.hasTaskChange(taskId: Int): Boolean =
        changes.any { c -> c.taskInfo?.taskId == taskId }

    private fun dump(pw: PrintWriter, prefix: String) {
        val innerPrefix = "$prefix  "
        pw.println("${prefix}DesktopImmersiveController")
        pw.println(innerPrefix + "state=" + state)
        pw.println(innerPrefix + "pendingExternalExitTransitions=" + pendingExternalExitTransitions)
    }

    /** The state of the currently running transition. */
    private data class TransitionState(
        val transition: IBinder,
+2 −0
Original line number Diff line number Diff line
@@ -89,10 +89,12 @@ class DesktopImmersiveControllerTest : ShellTestCase() {
            (invocation.getArgument(0) as Rect).set(STABLE_BOUNDS)
        }
        controller = DesktopImmersiveController(
            shellInit = mock(),
            transitions = mockTransitions,
            desktopRepository = desktopRepository,
            displayController = mockDisplayController,
            shellTaskOrganizer = mockShellTaskOrganizer,
            shellCommandHandler = mock(),
            transactionSupplier = transactionSupplier,
        )
    }