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

Commit 38caa7a7 authored by Winson Chung's avatar Winson Chung
Browse files

5/ Fix inverted dependency for ShellCommandHandler

- Instead of ShellCommandHandler referencing the controllers that it
  needs to dump/call on, invert it so that controllers register a
  dump/command callback when they are initialized

Test: atest WMShellUnitTests
Test: atest SystemUITests
Test: adb shell dumpsys activity service SystemUIservice WMShell
Test: adb shell dumpsys activity service SystemUIservice WMShell splitscreen <cmd>
Test: adb shell dumpsys activity service SystemUIservice WMShell help
Bug: 238217847
Change-Id: I673e5f7dd11ed7af326d52da8e793356169f1d8f
parent 8df4942e
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.compatui.CompatUIController;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.startingsurface.StartingWindowController;
import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.unfold.UnfoldAnimationController;

@@ -72,6 +73,7 @@ import java.util.function.Consumer;
 */
public class ShellTaskOrganizer extends TaskOrganizer implements
        CompatUIController.CompatUICallback {
    private static final String TAG = "ShellTaskOrganizer";

    // Intentionally using negative numbers here so the positive numbers can be used
    // for task id specific listeners that will be added later.
@@ -90,8 +92,6 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
    })
    public @interface TaskListenerType {}

    private static final String TAG = "ShellTaskOrganizer";

    /**
     * Callbacks for when the tasks change in the system.
     */
@@ -177,6 +177,9 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
    @Nullable
    private final CompatUIController mCompatUI;

    @NonNull
    private final ShellCommandHandler mShellCommandHandler;

    @Nullable
    private final Optional<RecentTasksController> mRecentTasks;

@@ -187,29 +190,33 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
    private RunningTaskInfo mLastFocusedTaskInfo;

    public ShellTaskOrganizer(ShellExecutor mainExecutor) {
        this(null /* shellInit */, null /* taskOrganizerController */, null /* compatUI */,
        this(null /* shellInit */, null /* shellCommandHandler */,
                null /* taskOrganizerController */, null /* compatUI */,
                Optional.empty() /* unfoldAnimationController */,
                Optional.empty() /* recentTasksController */,
                mainExecutor);
    }

    public ShellTaskOrganizer(ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            @Nullable CompatUIController compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<RecentTasksController> recentTasks,
            ShellExecutor mainExecutor) {
        this(shellInit, null /* taskOrganizerController */, compatUI,
        this(shellInit, shellCommandHandler, null /* taskOrganizerController */, compatUI,
                unfoldAnimationController, recentTasks, mainExecutor);
    }

    @VisibleForTesting
    protected ShellTaskOrganizer(ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            ITaskOrganizerController taskOrganizerController,
            @Nullable CompatUIController compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<RecentTasksController> recentTasks,
            ShellExecutor mainExecutor) {
        super(taskOrganizerController, mainExecutor);
        mShellCommandHandler = shellCommandHandler;
        mCompatUI = compatUI;
        mRecentTasks = recentTasks;
        mUnfoldAnimationController = unfoldAnimationController.orElse(null);
@@ -219,6 +226,7 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
    }

    private void onInit() {
        mShellCommandHandler.addDumpCallback(this::dump, this);
        if (mCompatUI != null) {
            mCompatUI.setCompatUICallback(this);
        }
+20 −23
Original line number Diff line number Diff line
@@ -174,13 +174,14 @@ public abstract class WMShellBaseModule {
    @Provides
    static ShellTaskOrganizer provideShellTaskOrganizer(
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            CompatUIController compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<RecentTasksController> recentTasksOptional,
            @ShellMainThread ShellExecutor mainExecutor
    ) {
        return new ShellTaskOrganizer(shellInit, compatUI, unfoldAnimationController,
                recentTasksOptional, mainExecutor);
        return new ShellTaskOrganizer(shellInit, shellCommandHandler, compatUI,
                unfoldAnimationController, recentTasksOptional, mainExecutor);
    }

    @WMSingleton
@@ -188,6 +189,7 @@ public abstract class WMShellBaseModule {
    static KidsModeTaskOrganizer provideKidsModeTaskOrganizer(
            Context context,
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            SyncTransactionQueue syncTransactionQueue,
            DisplayController displayController,
            DisplayInsetsController displayInsetsController,
@@ -196,9 +198,9 @@ public abstract class WMShellBaseModule {
            @ShellMainThread ShellExecutor mainExecutor,
            @ShellMainThread Handler mainHandler
    ) {
        return new KidsModeTaskOrganizer(context, shellInit, syncTransactionQueue,
                displayController, displayInsetsController, unfoldAnimationController,
                recentTasksOptional, mainExecutor, mainHandler);
        return new KidsModeTaskOrganizer(context, shellInit, shellCommandHandler,
                syncTransactionQueue, displayController, displayInsetsController,
                unfoldAnimationController, recentTasksOptional, mainExecutor, mainHandler);
    }

    @WMSingleton
@@ -388,12 +390,13 @@ public abstract class WMShellBaseModule {
    @Provides
    static Optional<HideDisplayCutoutController> provideHideDisplayCutoutController(Context context,
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            ShellController shellController,
            DisplayController displayController,
            @ShellMainThread ShellExecutor mainExecutor) {
        return Optional.ofNullable(
                HideDisplayCutoutController.create(context, shellInit, shellController,
                        displayController, mainExecutor));
                HideDisplayCutoutController.create(context, shellInit, shellCommandHandler,
                        shellController, displayController, mainExecutor));
    }

    //
@@ -471,12 +474,13 @@ public abstract class WMShellBaseModule {
    static Optional<RecentTasksController> provideRecentTasksController(
            Context context,
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            TaskStackListenerImpl taskStackListener,
            @ShellMainThread ShellExecutor mainExecutor
    ) {
        return Optional.ofNullable(
                RecentTasksController.create(context, shellInit, taskStackListener,
                        mainExecutor));
                RecentTasksController.create(context, shellInit, shellCommandHandler,
                        taskStackListener, mainExecutor));
    }

    //
@@ -654,8 +658,9 @@ public abstract class WMShellBaseModule {
    @WMSingleton
    @Provides
    static ShellController provideShellController(ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            @ShellMainThread ShellExecutor mainExecutor) {
        return new ShellController(shellInit, mainExecutor);
        return new ShellController(shellInit, shellCommandHandler, mainExecutor);
    }

    //
@@ -681,12 +686,15 @@ public abstract class WMShellBaseModule {
            KidsModeTaskOrganizer kidsModeTaskOrganizer,
            Optional<BubbleController> bubblesOptional,
            Optional<SplitScreenController> splitScreenOptional,
            Optional<Pip> pipOptional,
            Optional<PipTouchHandler> pipTouchHandlerOptional,
            FullscreenTaskListener fullscreenTaskListener,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<UnfoldTransitionHandler> unfoldTransitionHandler,
            Optional<FreeformComponents> freeformComponents,
            Optional<RecentTasksController> recentTasksOptional,
            Optional<OneHandedController> oneHandedControllerOptional,
            Optional<HideDisplayCutoutController> hideDisplayCutoutControllerOptional,
            ActivityEmbeddingController activityEmbeddingOptional,
            Transitions transitions,
            StartingWindowController startingWindow,
@@ -702,18 +710,7 @@ public abstract class WMShellBaseModule {

    @WMSingleton
    @Provides
    static ShellCommandHandler provideShellCommandHandlerImpl(
            ShellController shellController,
            ShellTaskOrganizer shellTaskOrganizer,
            KidsModeTaskOrganizer kidsModeTaskOrganizer,
            Optional<SplitScreenController> splitScreenOptional,
            Optional<Pip> pipOptional,
            Optional<OneHandedController> oneHandedOptional,
            Optional<HideDisplayCutoutController> hideDisplayCutout,
            Optional<RecentTasksController> recentTasksOptional,
            @ShellMainThread ShellExecutor mainExecutor) {
        return new ShellCommandHandler(shellController, shellTaskOrganizer,
                kidsModeTaskOrganizer, splitScreenOptional, pipOptional, oneHandedOptional,
                hideDisplayCutout, recentTasksOptional, mainExecutor);
    static ShellCommandHandler provideShellCommandHandler() {
        return new ShellCommandHandler();
    }
}
+27 −15
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipTouchHandler;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.SplitscreenPipMixedHandler;
@@ -249,6 +250,7 @@ public abstract class WMShellModule {
    @DynamicOverride
    static OneHandedController provideOneHandedController(Context context,
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            ShellController shellController,
            WindowManager windowManager,
            DisplayController displayController,
@@ -258,9 +260,9 @@ public abstract class WMShellModule {
            InteractionJankMonitor jankMonitor,
            @ShellMainThread ShellExecutor mainExecutor,
            @ShellMainThread Handler mainHandler) {
        return OneHandedController.create(context, shellInit, shellController, windowManager,
                displayController, displayLayout, taskStackListener, jankMonitor, uiEventLogger,
                mainExecutor, mainHandler);
        return OneHandedController.create(context, shellInit, shellCommandHandler, shellController,
                windowManager, displayController, displayLayout, taskStackListener, jankMonitor,
                uiEventLogger, mainExecutor, mainHandler);
    }

    //
@@ -273,6 +275,7 @@ public abstract class WMShellModule {
    static SplitScreenController provideSplitScreenController(
            Context context,
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            ShellController shellController,
            ShellTaskOrganizer shellTaskOrganizer,
            SyncTransactionQueue syncQueue,
@@ -286,10 +289,10 @@ public abstract class WMShellModule {
            IconProvider iconProvider,
            Optional<RecentTasksController> recentTasks,
            @ShellMainThread ShellExecutor mainExecutor) {
        return new SplitScreenController(context, shellInit, shellController, shellTaskOrganizer,
                syncQueue, rootTaskDisplayAreaOrganizer, displayController, displayImeController,
                displayInsetsController, dragAndDropController, transitions, transactionPool,
                iconProvider, recentTasks, mainExecutor);
        return new SplitScreenController(context, shellInit, shellCommandHandler, shellController,
                shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, displayController,
                displayImeController, displayInsetsController, dragAndDropController, transitions,
                transactionPool, iconProvider, recentTasks, mainExecutor);
    }

    //
@@ -298,20 +301,29 @@ public abstract class WMShellModule {

    @WMSingleton
    @Provides
    static Optional<Pip> providePip(Context context, ShellInit shellInit,
            ShellController shellController, DisplayController displayController,
            PipAppOpsListener pipAppOpsListener, PipBoundsAlgorithm pipBoundsAlgorithm,
            PipKeepClearAlgorithm pipKeepClearAlgorithm, PipBoundsState pipBoundsState,
            PipMotionHelper pipMotionHelper, PipMediaController pipMediaController,
            PhonePipMenuController phonePipMenuController, PipTaskOrganizer pipTaskOrganizer,
    static Optional<Pip> providePip(Context context,
            ShellInit shellInit,
            ShellCommandHandler shellCommandHandler,
            ShellController shellController,
            DisplayController displayController,
            PipAppOpsListener pipAppOpsListener,
            PipBoundsAlgorithm pipBoundsAlgorithm,
            PipKeepClearAlgorithm pipKeepClearAlgorithm,
            PipBoundsState pipBoundsState,
            PipMotionHelper pipMotionHelper,
            PipMediaController pipMediaController,
            PhonePipMenuController phonePipMenuController,
            PipTaskOrganizer pipTaskOrganizer,
            PipTransitionState pipTransitionState,
            PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController,
            PipTouchHandler pipTouchHandler,
            PipTransitionController pipTransitionController,
            WindowManagerShellWrapper windowManagerShellWrapper,
            TaskStackListenerImpl taskStackListener,
            PipParamsChangedForwarder pipParamsChangedForwarder,
            Optional<OneHandedController> oneHandedController,
            @ShellMainThread ShellExecutor mainExecutor) {
        return Optional.ofNullable(PipController.create(context, shellInit, shellController,
        return Optional.ofNullable(PipController.create(
                context, shellInit, shellCommandHandler, shellController,
                displayController, pipAppOpsListener, pipBoundsAlgorithm, pipKeepClearAlgorithm,
                pipBoundsState, pipMotionHelper, pipMediaController, phonePipMenuController,
                pipTaskOrganizer, pipTransitionState, pipTouchHandler, pipTransitionController,
+3 −3
Original line number Diff line number Diff line
@@ -59,9 +59,9 @@ WMShell SysUI service:
adb shell dumpsys activity service SystemUIService WMShell
```

If information should be added to the dump, make updates to:
- `WMShell` if you are dumping SysUI state
- `ShellCommandHandler` if you are dumping Shell state
If information should be added to the dump, either:
- Update `WMShell` if you are dumping SysUI state
- Inject `ShellCommandHandler` into your Shell class, and add a dump callback

## Debugging in Android Studio

+24 −6
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ interfaces provided by the Shell and the rest of SystemUI.

More detail can be found in [go/wm-sysui-dagger](http://go/wm-sysui-dagger).

## Interfaces to Shell components
## Interfaces from SysUI to Shell components

Within the same process, the WM Shell components can be running on a different thread than the main
SysUI thread (disabled on certain products).  This introduces challenges where we have to be
@@ -54,12 +54,30 @@ For example, you might have:
Adding an interface to a Shell component may seem like a lot of boiler plate, but is currently
necessary to maintain proper threading and logic isolation.

## Configuration changes & other SysUI events
## Listening for Configuration changes & other SysUI events

Aside from direct calls into Shell controllers for exposed features, the Shell also receives
common event callbacks from SysUI via the `ShellController`.  This includes things like:

- Configuration changes
- TODO: Shell init
- TODO: Shell command
- TODO: Keyguard events
 No newline at end of file
- Keyguard events
- Shell init
- Shell dumps & commands

For other events which are specific to the Shell feature, then you can add callback methods on
the Shell feature interface.  Any such calls should <u>**never**</u> be synchronous calls as
they will need to post to the Shell main thread to run.

## Shell commands & Dumps

Since the Shell library is a part of the SysUI process, it relies on SysUI to trigger commands
on individual Shell components, or to dump individual shell components.

```shell
# Dump everything
adb shell dumpsys activity service SystemUIService WMShell

# Run a specific command
adb shell dumpsys activity service SystemUIService WMShell help
adb shell dumpsys activity service SystemUIService WMShell <cmd> <args> ...
```
 No newline at end of file
Loading