From d580290a3b13be4e73128cac4f575f6fddacd374 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 5 Feb 2021 11:56:11 -0800 Subject: [PATCH] 11/ Clean up usage of exported interfaces from internal controllers - Adding documentation for dagger setup for shell - We should only reference the controllers from shell code instead of through the external interfaces. This reduces the number of exposed methods, and is also more direct (it ends up in the controller anyways). This means that the base module will provide the controllers separately and we can remove some duplication in the create methods for the controllers (except in cases where it's doing other initialization) - Remove SizeCompatUi interface since it's not actually used in SysUI - Group related dependencies in the module to make it a little eaiser to parse Bug: 161979899 Test: atest WMShellUnitTests Test: atest SystemUITests Change-Id: I07c2c002b87ffd127ebfce67b5485ff47d127e1f --- .../android/wm/shell/ShellCommandHandler.java | 12 +- .../wm/shell/ShellCommandHandlerImpl.java | 33 +- .../com/android/wm/shell/ShellInitImpl.java | 19 +- .../android/wm/shell/ShellTaskOrganizer.java | 12 +- .../wm/shell/TaskViewFactoryController.java | 10 +- .../wm/shell/WindowManagerShellWrapper.java | 1 + .../android/wm/shell/apppairs/AppPairs.java | 4 - .../wm/shell/apppairs/AppPairsController.java | 55 +-- .../wm/shell/bubbles/BubbleController.java | 10 +- .../hidedisplaycutout/HideDisplayCutout.java | 6 - .../HideDisplayCutoutController.java | 35 +- .../LegacySplitScreenController.java | 93 ++--- .../android/wm/shell/onehanded/OneHanded.java | 5 - .../shell/onehanded/OneHandedController.java | 19 +- .../wm/shell/pip/PipTaskOrganizer.java | 10 +- .../wm/shell/sizecompatui/SizeCompatUI.java | 45 --- .../sizecompatui/SizeCompatUIController.java | 25 +- .../wm/shell/ShellTaskOrganizerTests.java | 4 +- .../wm/shell/pip/PipTaskOrganizerTest.java | 3 +- .../SizeCompatUIControllerTest.java | 6 +- .../android/systemui/dagger/WMComponent.java | 13 +- .../android/systemui/wmshell/TvPipModule.java | 7 +- .../systemui/wmshell/TvWMShellModule.java | 22 +- .../com/android/systemui/wmshell/WMShell.java | 18 +- .../systemui/wmshell/WMShellBaseModule.java | 372 +++++++++++------- .../systemui/wmshell/WMShellModule.java | 35 +- .../android/systemui/wmshell/BubblesTest.java | 4 +- .../wmshell/NewNotifPipelineBubblesTest.java | 2 +- 28 files changed, 450 insertions(+), 430 deletions(-) delete mode 100644 libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUI.java diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandler.java index aa82339a436a8..73fd6931066db 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandler.java @@ -16,24 +16,16 @@ package com.android.wm.shell; -import android.util.Slog; - -import com.android.wm.shell.apppairs.AppPairs; -import com.android.wm.shell.common.ShellExecutor; -import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout; -import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; -import com.android.wm.shell.onehanded.OneHanded; -import com.android.wm.shell.pip.Pip; +import com.android.wm.shell.common.annotations.ExternalThread; import java.io.PrintWriter; -import java.util.Optional; -import java.util.concurrent.TimeUnit; /** * An entry point into the shell for dumping shell internal state and running adb commands. * * Use with {@code adb shell dumpsys activity service SystemUIService WMShell ...}. */ +@ExternalThread public interface ShellCommandHandler { /** * Dumps the shell state. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandlerImpl.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandlerImpl.java index 982cc006e331c..eaed24d6195ab 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandlerImpl.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellCommandHandlerImpl.java @@ -18,13 +18,12 @@ package com.android.wm.shell; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_POSITION_BOTTOM_OR_RIGHT; -import com.android.wm.shell.apppairs.AppPairs; +import com.android.wm.shell.apppairs.AppPairsController; import com.android.wm.shell.common.ShellExecutor; -import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout; -import com.android.wm.shell.onehanded.OneHanded; import com.android.wm.shell.pip.Pip; -import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; -import com.android.wm.shell.splitscreen.SplitScreen; +import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController; +import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; +import com.android.wm.shell.onehanded.OneHandedController; import com.android.wm.shell.splitscreen.SplitScreenController; import java.io.PrintWriter; @@ -38,24 +37,24 @@ import java.util.Optional; public final class ShellCommandHandlerImpl { private static final String TAG = ShellCommandHandlerImpl.class.getSimpleName(); - private final Optional mLegacySplitScreenOptional; + private final Optional mLegacySplitScreenOptional; private final Optional mSplitScreenOptional; private final Optional mPipOptional; - private final Optional mOneHandedOptional; - private final Optional mHideDisplayCutout; + private final Optional mOneHandedOptional; + private final Optional mHideDisplayCutout; + private final Optional mAppPairsOptional; private final ShellTaskOrganizer mShellTaskOrganizer; - private final Optional mAppPairsOptional; private final ShellExecutor mMainExecutor; private final HandlerImpl mImpl = new HandlerImpl(); public static ShellCommandHandler create( ShellTaskOrganizer shellTaskOrganizer, - Optional legacySplitScreenOptional, + Optional legacySplitScreenOptional, Optional splitScreenOptional, Optional pipOptional, - Optional oneHandedOptional, - Optional hideDisplayCutout, - Optional appPairsOptional, + Optional oneHandedOptional, + Optional hideDisplayCutout, + Optional appPairsOptional, ShellExecutor mainExecutor) { return new ShellCommandHandlerImpl(shellTaskOrganizer, legacySplitScreenOptional, splitScreenOptional, pipOptional, oneHandedOptional, hideDisplayCutout, @@ -64,12 +63,12 @@ public final class ShellCommandHandlerImpl { private ShellCommandHandlerImpl( ShellTaskOrganizer shellTaskOrganizer, - Optional legacySplitScreenOptional, + Optional legacySplitScreenOptional, Optional splitScreenOptional, Optional pipOptional, - Optional oneHandedOptional, - Optional hideDisplayCutout, - Optional appPairsOptional, + Optional oneHandedOptional, + Optional hideDisplayCutout, + Optional appPairsOptional, ShellExecutor mainExecutor) { mShellTaskOrganizer = shellTaskOrganizer; mLegacySplitScreenOptional = legacySplitScreenOptional; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInitImpl.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInitImpl.java index 925bf4bbb01c1..7376d9898ab88 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInitImpl.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellInitImpl.java @@ -18,13 +18,12 @@ package com.android.wm.shell; import static com.android.wm.shell.ShellTaskOrganizer.TASK_LISTENER_TYPE_FULLSCREEN; -import com.android.wm.shell.apppairs.AppPairs; +import com.android.wm.shell.apppairs.AppPairsController; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.annotations.ExternalThread; import com.android.wm.shell.draganddrop.DragAndDropController; -import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; -import com.android.wm.shell.splitscreen.SplitScreen; +import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.transition.Transitions; @@ -39,9 +38,9 @@ public class ShellInitImpl { private final DisplayImeController mDisplayImeController; private final DragAndDropController mDragAndDropController; private final ShellTaskOrganizer mShellTaskOrganizer; - private final Optional mLegacySplitScreenOptional; + private final Optional mLegacySplitScreenOptional; private final Optional mSplitScreenOptional; - private final Optional mAppPairsOptional; + private final Optional mAppPairsOptional; private final FullscreenTaskListener mFullscreenTaskListener; private final ShellExecutor mMainExecutor; private final Transitions mTransitions; @@ -51,9 +50,9 @@ public class ShellInitImpl { public static ShellInit create(DisplayImeController displayImeController, DragAndDropController dragAndDropController, ShellTaskOrganizer shellTaskOrganizer, - Optional legacySplitScreenOptional, + Optional legacySplitScreenOptional, Optional splitScreenOptional, - Optional appPairsOptional, + Optional appPairsOptional, FullscreenTaskListener fullscreenTaskListener, Transitions transitions, ShellExecutor mainExecutor) { @@ -71,9 +70,9 @@ public class ShellInitImpl { private ShellInitImpl(DisplayImeController displayImeController, DragAndDropController dragAndDropController, ShellTaskOrganizer shellTaskOrganizer, - Optional legacySplitScreenOptional, + Optional legacySplitScreenOptional, Optional splitScreenOptional, - Optional appPairsOptional, + Optional appPairsOptional, FullscreenTaskListener fullscreenTaskListener, Transitions transitions, ShellExecutor mainExecutor) { @@ -97,7 +96,7 @@ public class ShellInitImpl { // Register the shell organizer mShellTaskOrganizer.registerOrganizer(); - mAppPairsOptional.ifPresent(AppPairs::onOrganizerRegistered); + mAppPairsOptional.ifPresent(AppPairsController::onOrganizerRegistered); mSplitScreenOptional.ifPresent(SplitScreenController::onOrganizerRegistered); // Bind the splitscreen impl to the drag drop controller diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java index a570c0af698de..b22f358c0781d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -44,7 +44,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.ShellExecutor; -import com.android.wm.shell.sizecompatui.SizeCompatUI; +import com.android.wm.shell.sizecompatui.SizeCompatUIController; import com.android.wm.shell.startingsurface.StartingSurfaceDrawer; import java.io.PrintWriter; @@ -108,20 +108,20 @@ public class ShellTaskOrganizer extends TaskOrganizer { * compat. */ @Nullable - private final SizeCompatUI mSizeCompatUI; + private final SizeCompatUIController mSizeCompatUI; public ShellTaskOrganizer(ShellExecutor mainExecutor, Context context) { this(null /* taskOrganizerController */, mainExecutor, context, null /* sizeCompatUI */); } public ShellTaskOrganizer(ShellExecutor mainExecutor, Context context, @Nullable - SizeCompatUI sizeCompatUI) { + SizeCompatUIController sizeCompatUI) { this(null /* taskOrganizerController */, mainExecutor, context, sizeCompatUI); } @VisibleForTesting ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController, ShellExecutor mainExecutor, - Context context, @Nullable SizeCompatUI sizeCompatUI) { + Context context, @Nullable SizeCompatUIController sizeCompatUI) { super(taskOrganizerController, mainExecutor); // TODO(b/131727939) temporarily live here, the starting surface drawer should be controlled // by a controller, that class should be create while porting @@ -342,8 +342,8 @@ public class ShellTaskOrganizer extends TaskOrganizer { } /** - * Notifies {@link SizeCompatUI} about the size compat info changed on the give Task to update - * the UI accordingly. + * Notifies {@link SizeCompatUIController} about the size compat info changed on the give Task + * to update the UI accordingly. * * @param taskInfo the new Task info * @param taskListener listener to handle the Task Surface placement. {@code null} if task is diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactoryController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactoryController.java index a5dd79b373bdd..58ca1fbaba245 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactoryController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewFactoryController.java @@ -30,6 +30,7 @@ import java.util.function.Consumer; public class TaskViewFactoryController { private final ShellTaskOrganizer mTaskOrganizer; private final ShellExecutor mShellExecutor; + private final TaskViewFactory mImpl = new TaskViewFactoryImpl(); public TaskViewFactoryController(ShellTaskOrganizer taskOrganizer, ShellExecutor shellExecutor) { @@ -37,8 +38,11 @@ public class TaskViewFactoryController { mShellExecutor = shellExecutor; } + public TaskViewFactory asTaskViewFactory() { + return mImpl; + } + /** Creates an {@link TaskView} */ - @ShellMainThread public void create(@UiContext Context context, Executor executor, Consumer onCreate) { TaskView taskView = new TaskView(context, mTaskOrganizer); executor.execute(() -> { @@ -46,10 +50,6 @@ public class TaskViewFactoryController { }); } - public TaskViewFactory getTaskViewFactory() { - return new TaskViewFactoryImpl(); - } - private class TaskViewFactoryImpl implements TaskViewFactory { @ExternalThread public void create(@UiContext Context context, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/WindowManagerShellWrapper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/WindowManagerShellWrapper.java index abd92577c1d41..59271e9fb63ca 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/WindowManagerShellWrapper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/WindowManagerShellWrapper.java @@ -27,6 +27,7 @@ import com.android.wm.shell.pip.PinnedStackListenerForwarder.PinnedStackListener /** * The singleton wrapper to communicate between WindowManagerService and WMShell features * (e.g: PIP, SplitScreen, Bubble, OneHandedMode...etc) + * TODO: Remove once PinnedStackListenerForwarder can be removed */ public class WindowManagerShellWrapper { private static final String TAG = WindowManagerShellWrapper.class.getSimpleName(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairs.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairs.java index f5aa852c87aea..a9b1dbc3c23bd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairs.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairs.java @@ -35,8 +35,4 @@ public interface AppPairs { boolean pair(ActivityManager.RunningTaskInfo task1, ActivityManager.RunningTaskInfo task2); /** Unpairs any app-pair containing this task id. */ void unpair(int taskId); - /** Dumps current status of app pairs. */ - void dump(@NonNull PrintWriter pw, String prefix); - /** Called when the shell organizer has been registered. */ - void onOrganizerRegistered(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java index e380426b9ca23..0415f12496f23 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java @@ -51,18 +51,7 @@ public class AppPairsController { private final SparseArray mActiveAppPairs = new SparseArray<>(); private final DisplayController mDisplayController; - /** - * Creates {@link AppPairs}, returns {@code null} if the feature is not supported. - */ - @Nullable - public static AppPairs create(ShellTaskOrganizer organizer, - SyncTransactionQueue syncQueue, DisplayController displayController, - ShellExecutor mainExecutor) { - return new AppPairsController(organizer, syncQueue, displayController, - mainExecutor).mImpl; - } - - AppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue, + public AppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue, DisplayController displayController, ShellExecutor mainExecutor) { mTaskOrganizer = organizer; mSyncQueue = syncQueue; @@ -70,18 +59,22 @@ public class AppPairsController { mMainExecutor = mainExecutor; } - void onOrganizerRegistered() { + public AppPairs asAppPairs() { + return mImpl; + } + + public void onOrganizerRegistered() { if (mPairsPool == null) { setPairsPool(new AppPairsPool(this)); } } @VisibleForTesting - void setPairsPool(AppPairsPool pool) { + public void setPairsPool(AppPairsPool pool) { mPairsPool = pool; } - boolean pair(int taskId1, int taskId2) { + public boolean pair(int taskId1, int taskId2) { final ActivityManager.RunningTaskInfo task1 = mTaskOrganizer.getRunningTaskInfo(taskId1); final ActivityManager.RunningTaskInfo task2 = mTaskOrganizer.getRunningTaskInfo(taskId2); if (task1 == null || task2 == null) { @@ -90,13 +83,13 @@ public class AppPairsController { return pair(task1, task2); } - boolean pair(ActivityManager.RunningTaskInfo task1, + public boolean pair(ActivityManager.RunningTaskInfo task1, ActivityManager.RunningTaskInfo task2) { return pairInner(task1, task2) != null; } @VisibleForTesting - AppPair pairInner( + public AppPair pairInner( @NonNull ActivityManager.RunningTaskInfo task1, @NonNull ActivityManager.RunningTaskInfo task2) { final AppPair pair = mPairsPool.acquire(); @@ -109,11 +102,11 @@ public class AppPairsController { return pair; } - void unpair(int taskId) { + public void unpair(int taskId) { unpair(taskId, true /* releaseToPool */); } - void unpair(int taskId, boolean releaseToPool) { + public void unpair(int taskId, boolean releaseToPool) { AppPair pair = mActiveAppPairs.get(taskId); if (pair == null) { for (int i = mActiveAppPairs.size() - 1; i >= 0; --i) { @@ -137,19 +130,19 @@ public class AppPairsController { } } - ShellTaskOrganizer getTaskOrganizer() { + public ShellTaskOrganizer getTaskOrganizer() { return mTaskOrganizer; } - SyncTransactionQueue getSyncTransactionQueue() { + public SyncTransactionQueue getSyncTransactionQueue() { return mSyncQueue; } - DisplayController getDisplayController() { + public DisplayController getDisplayController() { return mDisplayController; } - private void dump(@NonNull PrintWriter pw, String prefix) { + public void dump(@NonNull PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; final String childPrefix = innerPrefix + " "; pw.println(prefix + this); @@ -202,21 +195,5 @@ public class AppPairsController { AppPairsController.this.unpair(taskId); }); } - - @Override - public void onOrganizerRegistered() { - mMainExecutor.execute(() -> { - AppPairsController.this.onOrganizerRegistered(); - }); - } - - @Override - public void dump(@NonNull PrintWriter pw, String prefix) { - try { - mMainExecutor.executeBlocking(() -> AppPairsController.this.dump(pw, prefix)); - } catch (InterruptedException e) { - Slog.e(TAG, "Failed to dump AppPairsController in 2s"); - } - } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index d73fc6dca4c66..2391a0874bcb7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -192,9 +192,9 @@ public class BubbleController { private boolean mIsStatusBarShade = true; /** - * Injected constructor. + * Creates an instance of the BubbleController. */ - public static Bubbles create(Context context, + public static BubbleController create(Context context, @Nullable BubbleStackView.SurfaceSynchronizer synchronizer, FloatingContentCoordinator floatingContentCoordinator, @Nullable IStatusBarService statusBarService, @@ -211,14 +211,14 @@ public class BubbleController { return new BubbleController(context, data, synchronizer, floatingContentCoordinator, new BubbleDataRepository(context, launcherApps, mainExecutor), statusBarService, windowManager, windowManagerShellWrapper, launcherApps, - logger, organizer, positioner, mainExecutor, mainHandler).mImpl; + logger, organizer, positioner, mainExecutor, mainHandler); } /** * Testing constructor. */ @VisibleForTesting - public BubbleController(Context context, + protected BubbleController(Context context, BubbleData data, @Nullable BubbleStackView.SurfaceSynchronizer synchronizer, FloatingContentCoordinator floatingContentCoordinator, @@ -322,7 +322,7 @@ public class BubbleController { } @VisibleForTesting - public Bubbles getImpl() { + public Bubbles asBubbles() { return mImpl; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutout.java index 3a2f0da6bf03f..60123ab97fd7f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutout.java @@ -31,12 +31,6 @@ import java.io.PrintWriter; public interface HideDisplayCutout { /** * Notifies {@link Configuration} changed. - * @param newConfig */ void onConfigurationChanged(Configuration newConfig); - - /** - * Dumps hide display cutout status. - */ - void dump(@NonNull PrintWriter pw); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java index 12b8b87f12855..23f76ca5f6ae6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java @@ -44,20 +44,12 @@ public class HideDisplayCutoutController { @VisibleForTesting boolean mEnabled; - HideDisplayCutoutController(Context context, HideDisplayCutoutOrganizer organizer, - ShellExecutor mainExecutor) { - mContext = context; - mOrganizer = organizer; - mMainExecutor = mainExecutor; - updateStatus(); - } - /** * Creates {@link HideDisplayCutoutController}, returns {@code null} if the feature is not * supported. */ @Nullable - public static HideDisplayCutout create( + public static HideDisplayCutoutController create( Context context, DisplayController displayController, ShellExecutor mainExecutor) { // The SystemProperty is set for devices that support this feature and is used to control // whether to create the HideDisplayCutout instance. @@ -68,7 +60,19 @@ public class HideDisplayCutoutController { HideDisplayCutoutOrganizer organizer = new HideDisplayCutoutOrganizer(context, displayController, mainExecutor); - return new HideDisplayCutoutController(context, organizer, mainExecutor).mImpl; + return new HideDisplayCutoutController(context, organizer, mainExecutor); + } + + HideDisplayCutoutController(Context context, HideDisplayCutoutOrganizer organizer, + ShellExecutor mainExecutor) { + mContext = context; + mOrganizer = organizer; + mMainExecutor = mainExecutor; + updateStatus(); + } + + public HideDisplayCutout asHideDisplayCutout() { + return mImpl; } @VisibleForTesting @@ -94,7 +98,7 @@ public class HideDisplayCutoutController { updateStatus(); } - private void dump(@NonNull PrintWriter pw) { + public void dump(@NonNull PrintWriter pw) { final String prefix = " "; pw.print(TAG); pw.println(" states: "); @@ -111,14 +115,5 @@ public class HideDisplayCutoutController { HideDisplayCutoutController.this.onConfigurationChanged(newConfig); }); } - - @Override - public void dump(@NonNull PrintWriter pw) { - try { - mMainExecutor.executeBlocking(() -> HideDisplayCutoutController.this.dump(pw)); - } catch (InterruptedException e) { - Slog.e(TAG, "Failed to dump HideDisplayCutoutController in 2s"); - } - } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java index bca6deb451c92..d25bef197359e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java @@ -115,21 +115,6 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays private volatile boolean mAdjustedForIme = false; private boolean mHomeStackResizable = false; - /** - * Creates {@link SplitScreen}, returns {@code null} if the feature is not supported. - */ - @Nullable - public static LegacySplitScreen create(Context context, - DisplayController displayController, SystemWindows systemWindows, - DisplayImeController imeController, TransactionPool transactionPool, - ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, - TaskStackListenerImpl taskStackListener, Transitions transitions, - ShellExecutor mainExecutor, AnimationHandler sfVsyncAnimationHandler) { - return new LegacySplitScreenController(context, displayController, systemWindows, - imeController, transactionPool, shellTaskOrganizer, syncQueue, taskStackListener, - transitions, mainExecutor, sfVsyncAnimationHandler).mImpl; - } - public LegacySplitScreenController(Context context, DisplayController displayController, SystemWindows systemWindows, DisplayImeController imeController, TransactionPool transactionPool, @@ -228,8 +213,12 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } }); } + + public LegacySplitScreen asLegacySplitScreen() { + return mImpl; + } - void onSplitScreenSupported() { + public void onSplitScreenSupported() { // Set starting tile bounds based on middle target final WindowContainerTransaction tct = new WindowContainerTransaction(); int midPos = mSplitLayout.getSnapAlgorithm().getMiddleTarget().position; @@ -237,7 +226,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays mTaskOrganizer.applyTransaction(tct); } - private void onKeyguardVisibilityChanged(boolean showing) { + public void onKeyguardVisibilityChanged(boolean showing) { if (!isSplitActive() || mView == null) { return; } @@ -293,19 +282,19 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - boolean isMinimized() { + public boolean isMinimized() { return mMinimized; } - boolean isHomeStackResizable() { + public boolean isHomeStackResizable() { return mHomeStackResizable; } - DividerView getDividerView() { + public DividerView getDividerView() { return mView; } - boolean isDividerVisible() { + public boolean isDividerVisible() { return mView != null && mView.getVisibility() == View.VISIBLE; } @@ -314,13 +303,13 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays * isDividerVisible because the divider is only visible once *everything* is in split mode * while this only cares if some things are (eg. while entering/exiting as well). */ - private boolean isSplitActive() { + public boolean isSplitActive() { return mSplits.mPrimary != null && mSplits.mSecondary != null && (mSplits.mPrimary.topActivityType != ACTIVITY_TYPE_UNDEFINED || mSplits.mSecondary.topActivityType != ACTIVITY_TYPE_UNDEFINED); } - private void addDivider(Configuration configuration) { + public void addDivider(Configuration configuration) { Context dctx = mDisplayController.getDisplayContext(mContext.getDisplayId()); mView = (DividerView) LayoutInflater.from(dctx).inflate(R.layout.docked_stack_divider, null); @@ -338,14 +327,14 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays mWindowManager.add(mView, width, height, mContext.getDisplayId()); } - private void removeDivider() { + public void removeDivider() { if (mView != null) { mView.onDividerRemoved(); } mWindowManager.remove(); } - private void update(Configuration configuration) { + public void update(Configuration configuration) { final boolean isDividerHidden = mView != null && mIsKeyguardShowing; removeDivider(); @@ -358,11 +347,11 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays mView.setHidden(isDividerHidden); } - void onTaskVanished() { + public void onTaskVanished() { removeDivider(); } - private void updateVisibility(final boolean visible) { + public void updateVisibility(final boolean visible) { if (DEBUG) Slog.d(TAG, "Updating visibility " + mVisible + "->" + visible); if (mVisible != visible) { mVisible = visible; @@ -390,7 +379,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - private void setMinimized(final boolean minimized) { + public void setMinimized(final boolean minimized) { if (DEBUG) Slog.d(TAG, "posting ext setMinimized " + minimized + " vis:" + mVisible); mMainExecutor.execute(() -> { if (DEBUG) Slog.d(TAG, "run posted ext setMinimized " + minimized + " vis:" + mVisible); @@ -401,7 +390,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays }); } - private void setHomeMinimized(final boolean minimized) { + public void setHomeMinimized(final boolean minimized) { if (DEBUG) { Slog.d(TAG, "setHomeMinimized min:" + mMinimized + "->" + minimized + " hrsz:" + mHomeStackResizable + " split:" + isDividerVisible()); @@ -441,7 +430,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - void setAdjustedForIme(boolean adjustedForIme) { + public void setAdjustedForIme(boolean adjustedForIme) { if (mAdjustedForIme == adjustedForIme) { return; } @@ -449,30 +438,30 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays updateTouchable(); } - private void updateTouchable() { + public void updateTouchable() { mWindowManager.setTouchable(!mAdjustedForIme); } - private void onUndockingTask() { + public void onUndockingTask() { if (mView != null) { mView.onUndockingTask(); } } - private void onAppTransitionFinished() { + public void onAppTransitionFinished() { if (mView == null) { return; } mForcedResizableController.onAppTransitionFinished(); } - private void dump(PrintWriter pw) { + public void dump(PrintWriter pw) { pw.print(" mVisible="); pw.println(mVisible); pw.print(" mMinimized="); pw.println(mMinimized); pw.print(" mAdjustedForIme="); pw.println(mAdjustedForIme); } - long getAnimDuration() { + public long getAnimDuration() { float transitionScale = Settings.Global.getFloat(mContext.getContentResolver(), Settings.Global.TRANSITION_ANIMATION_SCALE, mContext.getResources().getFloat( @@ -482,14 +471,14 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays return (long) (transitionDuration * transitionScale); } - void registerInSplitScreenListener(Consumer listener) { + public void registerInSplitScreenListener(Consumer listener) { listener.accept(isDividerVisible()); synchronized (mDockedStackExistsListeners) { mDockedStackExistsListeners.add(new WeakReference<>(listener)); } } - void unregisterInSplitScreenListener(Consumer listener) { + public void unregisterInSplitScreenListener(Consumer listener) { synchronized (mDockedStackExistsListeners) { for (int i = mDockedStackExistsListeners.size() - 1; i >= 0; i--) { if (mDockedStackExistsListeners.get(i) == listener) { @@ -499,13 +488,13 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - private void registerBoundsChangeListener(BiConsumer listener) { + public void registerBoundsChangeListener(BiConsumer listener) { synchronized (mBoundsChangedListeners) { mBoundsChangedListeners.add(new WeakReference<>(listener)); } } - private boolean splitPrimaryTask() { + public boolean splitPrimaryTask() { try { if (ActivityTaskManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED || isSplitActive()) { @@ -538,12 +527,12 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays topRunningTask.taskId, true /* onTop */); } - private void dismissSplitToPrimaryTask() { + public void dismissSplitToPrimaryTask() { startDismissSplit(true /* toPrimaryTask */); } /** Notifies the bounds of split screen changed. */ - void notifyBoundsChanged(Rect secondaryWindowBounds, Rect secondaryWindowInsets) { + public void notifyBoundsChanged(Rect secondaryWindowBounds, Rect secondaryWindowInsets) { synchronized (mBoundsChangedListeners) { mBoundsChangedListeners.removeIf(wf -> { BiConsumer l = wf.get(); @@ -553,19 +542,19 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - void startEnterSplit() { + public void startEnterSplit() { update(mDisplayController.getDisplayContext( mContext.getDisplayId()).getResources().getConfiguration()); // Set resizable directly here because applyEnterSplit already resizes home stack. mHomeStackResizable = mWindowManagerProxy.applyEnterSplit(mSplits, mSplitLayout); } - void prepareEnterSplitTransition(WindowContainerTransaction outWct) { + public void prepareEnterSplitTransition(WindowContainerTransaction outWct) { // Set resizable directly here because buildEnterSplit already resizes home stack. mHomeStackResizable = mWindowManagerProxy.buildEnterSplit(outWct, mSplits, mSplitLayout); } - void finishEnterSplitTransition(boolean minimized) { + public void finishEnterSplitTransition(boolean minimized) { update(mDisplayController.getDisplayContext( mContext.getDisplayId()).getResources().getConfiguration()); if (minimized) { @@ -575,11 +564,11 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - void startDismissSplit(boolean toPrimaryTask) { + public void startDismissSplit(boolean toPrimaryTask) { startDismissSplit(toPrimaryTask, false /* snapped */); } - void startDismissSplit(boolean toPrimaryTask, boolean snapped) { + public void startDismissSplit(boolean toPrimaryTask, boolean snapped) { if (Transitions.ENABLE_SHELL_TRANSITIONS) { mSplits.getSplitTransitions().dismissSplit( mSplits, mSplitLayout, !toPrimaryTask, snapped); @@ -589,7 +578,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - void onDismissSplit() { + public void onDismissSplit() { updateVisibility(false /* visible */); mMinimized = false; // Resets divider bar position to undefined, so new divider bar will apply default position @@ -599,7 +588,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays mImePositionProcessor.reset(); } - void ensureMinimizedSplit() { + public void ensureMinimizedSplit() { setHomeMinimized(true /* minimized */); if (mView != null && !isDividerVisible()) { // Wasn't in split-mode yet, so enter now. @@ -610,7 +599,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - void ensureNormalSplit() { + public void ensureNormalSplit() { setHomeMinimized(false /* minimized */); if (mView != null && !isDividerVisible()) { // Wasn't in split-mode, so enter now. @@ -621,15 +610,15 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays } } - LegacySplitDisplayLayout getSplitLayout() { + public LegacySplitDisplayLayout getSplitLayout() { return mSplitLayout; } - WindowManagerProxy getWmProxy() { + public WindowManagerProxy getWmProxy() { return mWindowManagerProxy; } - WindowContainerToken getSecondaryRoot() { + public WindowContainerToken getSecondaryRoot() { if (mSplits == null || mSplits.mSecondary == null) { return null; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java index e95864873c0c4..11c11f44a7813 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java @@ -69,9 +69,4 @@ public interface OneHanded { * 3 button navigation mode only */ void registerGestureCallback(OneHandedGestureEventCallback callback); - - /** - * Dump one handed status. - */ - void dump(@NonNull PrintWriter pw); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index eaa704f22410a..5a3c38b09ec6c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -134,10 +134,10 @@ public class OneHandedController { /** - * Creates {@link OneHanded}, returns {@code null} if the feature is not supported. + * Creates {@link OneHandedController}, returns {@code null} if the feature is not supported. */ @Nullable - public static OneHanded create( + public static OneHandedController create( Context context, DisplayController displayController, TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, ShellExecutor mainExecutor, Handler mainHandler) { @@ -166,7 +166,7 @@ public class OneHandedController { return new OneHandedController(context, displayController, oneHandedBackgroundPanelOrganizer, organizer, touchHandler, tutorialHandler, gestureHandler, timeoutHandler, oneHandedUiEventsLogger, overlayManager, - taskStackListener, mainExecutor, mainHandler).mImpl; + taskStackListener, mainExecutor, mainHandler); } @VisibleForTesting @@ -228,6 +228,10 @@ public class OneHandedController { mAccessibilityStateChangeListener); } + public OneHanded asOneHanded() { + return mImpl; + } + /** * Set one handed enabled or disabled when user update settings */ @@ -468,7 +472,7 @@ public class OneHandedController { } } - private void dump(@NonNull PrintWriter pw) { + public void dump(@NonNull PrintWriter pw) { final String innerPrefix = " "; pw.println(TAG + "states: "); pw.print(innerPrefix + "mOffSetFraction="); @@ -561,12 +565,5 @@ public class OneHandedController { OneHandedController.this.registerGestureCallback(callback); }); } - - @Override - public void dump(@NonNull PrintWriter pw) { - mMainExecutor.execute(() -> { - OneHandedController.this.dump(pw); - }); - } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index ad6f435ea9076..3064af6f51700 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -67,6 +67,7 @@ import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; +import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.phone.PipMotionHelper; import com.android.wm.shell.transition.Transitions; @@ -131,7 +132,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, private final PipUiEventLogger mPipUiEventLoggerLogger; private final int mEnterExitAnimationDuration; private final PipSurfaceTransactionHelper mSurfaceTransactionHelper; - private final Optional mSplitScreenOptional; + private final Optional mSplitScreenOptional; protected final ShellTaskOrganizer mTaskOrganizer; protected final ShellExecutor mMainExecutor; @@ -207,7 +208,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, @NonNull PipAnimationController pipAnimationController, @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper, @NonNull PipTransitionController pipTransitionController, - Optional splitScreenOptional, + Optional splitScreenOptional, @NonNull DisplayController displayController, @NonNull PipUiEventLogger pipUiEventLogger, @NonNull ShellTaskOrganizer shellTaskOrganizer, @@ -1047,7 +1048,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, } /** - * Sync with {@link LegacySplitScreen} on destination bounds if PiP is going to split screen. + * Sync with {@link LegacySplitScreenController} on destination bounds if PiP is going to split + * screen. * * @param destinationBoundsOut contain the updated destination bounds if applicable * @return {@code true} if destinationBounds is altered for split screen @@ -1057,7 +1059,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, return false; } - LegacySplitScreen legacySplitScreen = mSplitScreenOptional.get(); + LegacySplitScreenController legacySplitScreen = mSplitScreenOptional.get(); if (!legacySplitScreen.isDividerVisible()) { // fail early if system is not in split screen mode return false; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUI.java b/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUI.java deleted file mode 100644 index 11f22ed24a690..0000000000000 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUI.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.wm.shell.sizecompatui; - -import android.annotation.Nullable; -import android.graphics.Rect; -import android.os.IBinder; - -import com.android.wm.shell.ShellTaskOrganizer; -import com.android.wm.shell.common.annotations.ExternalThread; - -/** - * Interface to engage size compat mode UI. - */ -@ExternalThread -public interface SizeCompatUI { - /** - * Called when the Task info changed. Creates and updates the restart button if there is an - * activity in size compat, or removes the restart button if there is no size compat activity. - * - * @param displayId display the task and activity are in. - * @param taskId task the activity is in. - * @param taskBounds task bounds to place the restart button in. - * @param sizeCompatActivity the size compat activity in the task. Can be {@code null} if the - * top activity in this Task is not in size compat. - * @param taskListener listener to handle the Task Surface placement. - */ - void onSizeCompatInfoChanged(int displayId, int taskId, @Nullable Rect taskBounds, - @Nullable IBinder sizeCompatActivity, - @Nullable ShellTaskOrganizer.TaskListener taskListener); -} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIController.java index 286c3b6a051ea..48ee86c4954fd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIController.java @@ -48,7 +48,6 @@ public class SizeCompatUIController implements DisplayController.OnDisplaysChang private final SparseArray> mDisplayContextCache = new SparseArray<>(0); @VisibleForTesting - final SizeCompatUI mImpl = new SizeCompatUIImpl(); private final Context mContext; private final ShellExecutor mMainExecutor; private final DisplayController mDisplayController; @@ -57,17 +56,8 @@ public class SizeCompatUIController implements DisplayController.OnDisplaysChang /** Only show once automatically in the process life. */ private boolean mHasShownHint; - /** Creates the {@link SizeCompatUIController}. */ - public static SizeCompatUI create(Context context, - DisplayController displayController, - DisplayImeController imeController, - ShellExecutor mainExecutor) { - return new SizeCompatUIController(context, displayController, imeController, mainExecutor) - .mImpl; - } - @VisibleForTesting - SizeCompatUIController(Context context, + public SizeCompatUIController(Context context, DisplayController displayController, DisplayImeController imeController, ShellExecutor mainExecutor) { @@ -79,7 +69,7 @@ public class SizeCompatUIController implements DisplayController.OnDisplaysChang mImeController.addPositionProcessor(this); } - private void onSizeCompatInfoChanged(int displayId, int taskId, @Nullable Rect taskBounds, + public void onSizeCompatInfoChanged(int displayId, int taskId, @Nullable Rect taskBounds, @Nullable IBinder sizeCompatActivity, @Nullable ShellTaskOrganizer.TaskListener taskListener) { // TODO Draw button on Task surface @@ -177,15 +167,4 @@ public class SizeCompatUIController implements DisplayController.OnDisplaysChang } return context; } - - private class SizeCompatUIImpl implements SizeCompatUI { - @Override - public void onSizeCompatInfoChanged(int displayId, int taskId, @Nullable Rect taskBounds, - @Nullable IBinder sizeCompatActivity, - @Nullable ShellTaskOrganizer.TaskListener taskListener) { - mMainExecutor.execute(() -> - SizeCompatUIController.this.onSizeCompatInfoChanged(displayId, taskId, - taskBounds, sizeCompatActivity, taskListener)); - } - } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java index 80ea9b9e177ec..176b33dda020e 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java @@ -51,7 +51,7 @@ import androidx.test.filters.SmallTest; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TransactionPool; -import com.android.wm.shell.sizecompatui.SizeCompatUI; +import com.android.wm.shell.sizecompatui.SizeCompatUIController; import org.junit.Before; import org.junit.Test; @@ -76,7 +76,7 @@ public class ShellTaskOrganizerTests { @Mock private Context mContext; @Mock - private SizeCompatUI mSizeCompatUI; + private SizeCompatUIController mSizeCompatUI; ShellTaskOrganizer mOrganizer; private final SyncTransactionQueue mSyncTransactionQueue = mock(SyncTransactionQueue.class); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java index 9430af9468996..d10c03677d301 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java @@ -44,6 +44,7 @@ import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; +import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.phone.PhonePipMenuController; import org.junit.Before; @@ -70,7 +71,7 @@ public class PipTaskOrganizerTest extends ShellTestCase { @Mock private PipTransitionController mMockPipTransitionController; @Mock private PipSurfaceTransactionHelper mMockPipSurfaceTransactionHelper; @Mock private PipUiEventLogger mMockPipUiEventLogger; - @Mock private Optional mMockOptionalSplitScreen; + @Mock private Optional mMockOptionalSplitScreen; @Mock private ShellTaskOrganizer mMockShellTaskOrganizer; private TestShellExecutor mMainExecutor; private PipBoundsState mPipBoundsState; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/sizecompatui/SizeCompatUIControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/sizecompatui/SizeCompatUIControllerTest.java index 98f01ff08debc..0eb64e5963d17 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/sizecompatui/SizeCompatUIControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/sizecompatui/SizeCompatUIControllerTest.java @@ -86,7 +86,7 @@ public class SizeCompatUIControllerTest extends ShellTestCase { final Rect taskBounds = new Rect(0, 0, 1000, 2000); // Verify that the restart button is added with non-null size compat activity. - mController.mImpl.onSizeCompatInfoChanged(DISPLAY_ID, taskId, taskBounds, + mController.onSizeCompatInfoChanged(DISPLAY_ID, taskId, taskBounds, mMockActivityToken, mMockTaskListener); mShellMainExecutor.flushAll(); @@ -94,7 +94,7 @@ public class SizeCompatUIControllerTest extends ShellTestCase { verify(mMockButton).updateLastTargetActivity(eq(mMockActivityToken)); // Verify that the restart button is removed with null size compat activity. - mController.mImpl.onSizeCompatInfoChanged(DISPLAY_ID, taskId, null, null, null); + mController.onSizeCompatInfoChanged(DISPLAY_ID, taskId, null, null, null); mShellMainExecutor.flushAll(); verify(mMockButton).remove(); @@ -104,7 +104,7 @@ public class SizeCompatUIControllerTest extends ShellTestCase { public void testChangeButtonVisibilityOnImeShowHide() { final int taskId = 12; final Rect taskBounds = new Rect(0, 0, 1000, 2000); - mController.mImpl.onSizeCompatInfoChanged(DISPLAY_ID, taskId, taskBounds, + mController.onSizeCompatInfoChanged(DISPLAY_ID, taskId, taskBounds, mMockActivityToken, mMockTaskListener); mShellMainExecutor.flushAll(); diff --git a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java index 84dd25963a15f..f3726a37bb651 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java @@ -16,6 +16,11 @@ package com.android.systemui.dagger; +import android.content.Context; + +import com.android.systemui.SystemUIFactory; +import com.android.systemui.tv.TvWMComponent; +import com.android.systemui.wmshell.TvWMShellModule; import com.android.systemui.wmshell.WMShellModule; import com.android.wm.shell.ShellCommandHandler; import com.android.wm.shell.ShellInit; @@ -34,7 +39,13 @@ import java.util.Optional; import dagger.Subcomponent; /** - * Dagger Subcomponent for WindowManager. + * Dagger Subcomponent for WindowManager. This class explicitly describes the interfaces exported + * from the WM component into the SysUI component (in + * {@link SystemUIFactory#init(Context, boolean)}), and references the specific dependencies + * provided by its particular device/form-factor SystemUI implementation. + * + * ie. {@link WMComponent} includes {@link WMShellModule} + * and {@link TvWMComponent} includes {@link TvWMShellModule} */ @WMSingleton @Subcomponent(modules = {WMShellModule.class}) diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java index 0795d89eb0bc1..ff28819533427 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java @@ -19,6 +19,7 @@ package com.android.systemui.wmshell; import android.content.Context; import android.os.Handler; +import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMSingleton; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; @@ -28,6 +29,7 @@ import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; +import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipBoundsAlgorithm; @@ -49,7 +51,7 @@ import dagger.Module; import dagger.Provides; /** - * Dagger module for TV Pip. + * Provides TV specific dependencies for Pip. */ @Module(includes = {WMShellBaseModule.class}) public abstract class TvPipModule { @@ -143,7 +145,8 @@ public abstract class TvPipModule { PipAnimationController pipAnimationController, PipTransitionController pipTransitionController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, - Optional splitScreenOptional, DisplayController displayController, + Optional splitScreenOptional, + DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm, diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java index f23367b4d65b0..141b9f7d410d8 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java @@ -20,6 +20,7 @@ import android.animation.AnimationHandler; import android.content.Context; import android.view.IWindowManager; +import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMSingleton; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; @@ -39,11 +40,20 @@ import dagger.Module; import dagger.Provides; /** - * Provides dependencies from {@link com.android.wm.shell} which could be customized among different - * branches of SystemUI. + * Provides dependencies from {@link com.android.wm.shell}, these dependencies are only + * accessible from components within the WM subcomponent (can be explicitly exposed to the + * SysUIComponent, see {@link WMComponent}). + * + * This module only defines Shell dependencies for the TV SystemUI implementation. Common + * dependencies should go into {@link WMShellBaseModule}. */ @Module(includes = {TvPipModule.class}) public class TvWMShellModule { + + // + // Internal common - Components used internally by multiple shell features + // + @WMSingleton @Provides static DisplayImeController provideDisplayImeController(IWindowManager wmService, @@ -53,16 +63,20 @@ public class TvWMShellModule { transactionPool); } + // + // Split/multiwindow + // + @WMSingleton @Provides - static LegacySplitScreen provideSplitScreen(Context context, + static LegacySplitScreenController provideSplitScreen(Context context, DisplayController displayController, SystemWindows systemWindows, DisplayImeController displayImeController, TransactionPool transactionPool, ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, TaskStackListenerImpl taskStackListener, Transitions transitions, @ShellMainThread ShellExecutor mainExecutor, @ChoreographerSfVsync AnimationHandler sfVsyncAnimationHandler) { - return LegacySplitScreenController.create(context, displayController, systemWindows, + return new LegacySplitScreenController(context, displayController, systemWindows, displayImeController, transactionPool, shellTaskOrganizer, syncQueue, taskStackListener, transitions, mainExecutor, sfVsyncAnimationHandler); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 81ac21c008234..ec61db5913247 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -43,6 +43,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dependency; import com.android.systemui.SystemUI; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.model.SysUiState; @@ -73,7 +74,20 @@ import java.util.concurrent.Executor; import javax.inject.Inject; /** - * Proxy in SysUiScope to delegate events to controllers in WM Shell library. + * A SystemUI service that starts with the SystemUI application and sets up any bindings between + * Shell and SysUI components. This service starts happens after the {@link WMComponent} has + * already been initialized and may only reference Shell components that are explicitly exported to + * SystemUI (see {@link WMComponent}. + * + * eg. SysUI application starts + * -> SystemUIFactory is initialized + * -> WMComponent is created + * -> WMShellBaseModule dependencies are injected + * -> WMShellModule (form-factory specific) dependencies are injected + * -> SysUIComponent is created + * -> WMComponents are explicitly provided to SysUIComponent for injection into SysUI code + * -> SysUI services are started + * -> WMShell starts and binds SysUI with Shell components via exported Shell interfaces */ @SysUISingleton public final class WMShell extends SystemUI @@ -142,6 +156,8 @@ public final class WMShell extends SystemUI @Override public void start() { + // TODO: Consider piping config change and other common calls to a shell component to + // delegate internally mProtoTracer.add(this); mCommandQueue.addCallback(this); mPipOptional.ifPresent(this::initPip); diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java index b42dde63d1c2b..449db61a0fbba 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java @@ -32,6 +32,7 @@ import android.view.WindowManager; import com.android.internal.graphics.SfVsyncFrameCallbackProvider; import com.android.internal.logging.UiEventLogger; import com.android.internal.statusbar.IStatusBarService; +import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMSingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.wm.shell.FullscreenTaskListener; @@ -45,6 +46,7 @@ import com.android.wm.shell.TaskViewFactory; import com.android.wm.shell.TaskViewFactoryController; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.apppairs.AppPairs; +import com.android.wm.shell.apppairs.AppPairsController; import com.android.wm.shell.bubbles.BubbleController; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.common.DisplayController; @@ -63,6 +65,7 @@ import com.android.wm.shell.draganddrop.DragAndDropController; import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout; import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; +import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.onehanded.OneHanded; import com.android.wm.shell.onehanded.OneHandedController; import com.android.wm.shell.pip.Pip; @@ -70,8 +73,8 @@ import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipUiEventLogger; import com.android.wm.shell.pip.phone.PipAppOpsListener; +import com.android.wm.shell.pip.phone.PipController; import com.android.wm.shell.pip.phone.PipTouchHandler; -import com.android.wm.shell.sizecompatui.SizeCompatUI; import com.android.wm.shell.sizecompatui.SizeCompatUIController; import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.splitscreen.SplitScreenController; @@ -85,8 +88,13 @@ import dagger.Module; import dagger.Provides; /** - * Provides basic dependencies from {@link com.android.wm.shell}, the dependencies declared here - * should be shared among different branches of SystemUI. + * Provides basic dependencies from {@link com.android.wm.shell}, these dependencies are only + * accessible from components within the WM subcomponent (can be explicitly exposed to the + * SysUIComponent, see {@link WMComponent}). + * + * This module only defines *common* dependencies across various SystemUI implementations, + * dependencies that are device/form factor SystemUI implementation specific should go into their + * respective modules (ie. {@link WMShellModule} for handheld, {@link TvWMShellModule} for tv, etc.) */ @Module public abstract class WMShellBaseModule { @@ -174,53 +182,9 @@ public abstract class WMShellBaseModule { } } - @WMSingleton - @Provides - static ShellInit provideShellInit(DisplayImeController displayImeController, - DragAndDropController dragAndDropController, - ShellTaskOrganizer shellTaskOrganizer, - Optional legacySplitScreenOptional, - Optional splitScreenOptional, - Optional appPairsOptional, - FullscreenTaskListener fullscreenTaskListener, - Transitions transitions, - @ShellMainThread ShellExecutor mainExecutor) { - return ShellInitImpl.create(displayImeController, - dragAndDropController, - shellTaskOrganizer, - legacySplitScreenOptional, - splitScreenOptional, - appPairsOptional, - fullscreenTaskListener, - transitions, - mainExecutor); - } - - /** - * Note, this is only optional because we currently pass this to the SysUI component scope and - * for non-primary users, we may inject a null-optional for that dependency. - */ - @WMSingleton - @Provides - static Optional provideShellCommandHandler( - ShellTaskOrganizer shellTaskOrganizer, - Optional legacySplitScreenOptional, - Optional splitScreenOptional, - Optional pipOptional, - Optional oneHandedOptional, - Optional hideDisplayCutout, - Optional appPairsOptional, - @ShellMainThread ShellExecutor mainExecutor) { - return Optional.of(ShellCommandHandlerImpl.create(shellTaskOrganizer, - legacySplitScreenOptional, splitScreenOptional, pipOptional, oneHandedOptional, - hideDisplayCutout, appPairsOptional, mainExecutor)); - } - - @WMSingleton - @Provides - static TransactionPool provideTransactionPool() { - return new TransactionPool(); - } + // + // Internal common - Components used internally by multiple shell features + // @WMSingleton @Provides @@ -238,8 +202,45 @@ public abstract class WMShellBaseModule { @WMSingleton @Provides - static FloatingContentCoordinator provideFloatingContentCoordinator() { - return new FloatingContentCoordinator(); + static ShellTaskOrganizer provideShellTaskOrganizer(@ShellMainThread ShellExecutor mainExecutor, + Context context, SizeCompatUIController sizeCompatUI) { + return new ShellTaskOrganizer(mainExecutor, context, sizeCompatUI); + } + + @WMSingleton + @Provides + static SizeCompatUIController provideSizeCompatUIController(Context context, + DisplayController displayController, DisplayImeController imeController, + @ShellMainThread ShellExecutor mainExecutor) { + return new SizeCompatUIController(context, displayController, imeController, mainExecutor); + } + + @WMSingleton + @Provides + static SyncTransactionQueue provideSyncTransactionQueue(TransactionPool pool, + @ShellMainThread ShellExecutor mainExecutor) { + return new SyncTransactionQueue(pool, mainExecutor); + } + + @WMSingleton + @Provides + static SystemWindows provideSystemWindows(DisplayController displayController, + IWindowManager wmService) { + return new SystemWindows(displayController, wmService); + } + + // We currently dedupe multiple messages, so we use the shell main handler directly + @WMSingleton + @Provides + static TaskStackListenerImpl providerTaskStackListenerImpl( + @ShellMainThread Handler mainHandler) { + return new TaskStackListenerImpl(mainHandler); + } + + @WMSingleton + @Provides + static TransactionPool provideTransactionPool() { + return new TransactionPool(); } @WMSingleton @@ -249,10 +250,99 @@ public abstract class WMShellBaseModule { return new WindowManagerShellWrapper(mainExecutor); } + // + // Bubbles + // + + @WMSingleton + @Provides + static Optional provideBubbles(Optional bubbleController) { + return bubbleController.map((controller) -> controller.asBubbles()); + } + + // Note: Handler needed for LauncherApps.register + @WMSingleton + @Provides + static Optional provideBubbleController(Context context, + FloatingContentCoordinator floatingContentCoordinator, + IStatusBarService statusBarService, + WindowManager windowManager, + WindowManagerShellWrapper windowManagerShellWrapper, + LauncherApps launcherApps, + UiEventLogger uiEventLogger, + ShellTaskOrganizer organizer, + @ShellMainThread ShellExecutor mainExecutor, + @ShellMainThread Handler mainHandler) { + return Optional.of(BubbleController.create(context, null /* synchronizer */, + floatingContentCoordinator, statusBarService, windowManager, + windowManagerShellWrapper, launcherApps, uiEventLogger, organizer, + mainExecutor, mainHandler)); + } + + // + // Fullscreen + // + + @WMSingleton + @Provides + static FullscreenTaskListener provideFullscreenTaskListener(SyncTransactionQueue syncQueue) { + return new FullscreenTaskListener(syncQueue); + } + + // + // Hide display cutout + // + + @WMSingleton + @Provides + static Optional provideHideDisplayCutout( + Optional hideDisplayCutoutController) { + return hideDisplayCutoutController.map((controller) -> controller.asHideDisplayCutout()); + } + + @WMSingleton + @Provides + static Optional provideHideDisplayCutoutController(Context context, + DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor) { + return Optional.ofNullable( + HideDisplayCutoutController.create(context, displayController, mainExecutor)); + } + + // + // One handed mode (optional feature) + // + + @WMSingleton + @Provides + static Optional provideOneHanded(Optional oneHandedController) { + return oneHandedController.map((controller) -> controller.asOneHanded()); + } + + // Needs the shell main handler for ContentObserver callbacks + @WMSingleton + @Provides + static Optional provideOneHandedController(Context context, + DisplayController displayController, TaskStackListenerImpl taskStackListener, + UiEventLogger uiEventLogger, + @ShellMainThread ShellExecutor mainExecutor, + @ShellMainThread Handler mainHandler) { + return Optional.ofNullable(OneHandedController.create(context, displayController, + taskStackListener, uiEventLogger, mainExecutor, mainHandler)); + } + + // + // Pip (optional feature) + // + + @WMSingleton + @Provides + static FloatingContentCoordinator provideFloatingContentCoordinator() { + return new FloatingContentCoordinator(); + } + @WMSingleton @Provides static PipAppOpsListener providePipAppOpsListener(Context context, - IActivityManager activityManager, PipTouchHandler pipTouchHandler, @ShellMainThread ShellExecutor mainExecutor) { return new PipAppOpsListener(context, pipTouchHandler.getMotionHelper(), mainExecutor); @@ -266,13 +356,6 @@ public abstract class WMShellBaseModule { return new PipMediaController(context, mainHandler); } - @WMSingleton - @Provides - static PipUiEventLogger providePipUiEventLogger(UiEventLogger uiEventLogger, - PackageManager packageManager) { - return new PipUiEventLogger(uiEventLogger, packageManager); - } - @WMSingleton @Provides static PipSurfaceTransactionHelper providePipSurfaceTransactionHelper(Context context) { @@ -281,24 +364,32 @@ public abstract class WMShellBaseModule { @WMSingleton @Provides - static SystemWindows provideSystemWindows(DisplayController displayController, - IWindowManager wmService) { - return new SystemWindows(displayController, wmService); + static PipUiEventLogger providePipUiEventLogger(UiEventLogger uiEventLogger, + PackageManager packageManager) { + return new PipUiEventLogger(uiEventLogger, packageManager); + } + + // + // Shell transitions + // + + @WMSingleton + @Provides + static RemoteTransitions provideRemoteTransitions(Transitions transitions) { + return Transitions.asRemoteTransitions(transitions); } @WMSingleton @Provides - static SyncTransactionQueue provideSyncTransactionQueue(TransactionPool pool, - @ShellMainThread ShellExecutor mainExecutor) { - return new SyncTransactionQueue(pool, mainExecutor); + static Transitions provideTransitions(ShellTaskOrganizer organizer, TransactionPool pool, + @ShellMainThread ShellExecutor mainExecutor, + @ShellAnimationThread ShellExecutor animExecutor) { + return new Transitions(organizer, pool, mainExecutor, animExecutor); } - @WMSingleton - @Provides - static ShellTaskOrganizer provideShellTaskOrganizer(@ShellMainThread ShellExecutor mainExecutor, - Context context, SizeCompatUI sizeCompatUI) { - return new ShellTaskOrganizer(mainExecutor, context, sizeCompatUI); - } + // + // Split/multiwindow + // @WMSingleton @Provides @@ -307,17 +398,6 @@ public abstract class WMShellBaseModule { return new RootTaskDisplayAreaOrganizer(mainExecutor, context); } - // We currently dedupe multiple messages, so we use the shell main handler directly - @WMSingleton - @Provides - static TaskStackListenerImpl providerTaskStackListenerImpl( - @ShellMainThread Handler mainHandler) { - return new TaskStackListenerImpl(mainHandler); - } - - @BindsOptionalOf - abstract LegacySplitScreen optionalLegacySplitScreen(); - @WMSingleton @Provides static Optional provideSplitScreen( @@ -340,81 +420,91 @@ public abstract class WMShellBaseModule { } } + // Legacy split (optional feature) + + @WMSingleton + @Provides + static Optional provideLegacySplitScreen( + Optional splitScreenController) { + return splitScreenController.map((controller) -> controller.asLegacySplitScreen()); + } + @BindsOptionalOf - abstract AppPairs optionalAppPairs(); + abstract LegacySplitScreenController optionalLegacySplitScreenController(); + + // App Pairs (optional feature) - // Note: Handler needed for LauncherApps.register @WMSingleton @Provides - static Optional provideBubbles(Context context, - FloatingContentCoordinator floatingContentCoordinator, - IStatusBarService statusBarService, - WindowManager windowManager, - WindowManagerShellWrapper windowManagerShellWrapper, - LauncherApps launcherApps, - UiEventLogger uiEventLogger, - ShellTaskOrganizer organizer, - @ShellMainThread ShellExecutor mainExecutor, - @ShellMainThread Handler mainHandler) { - return Optional.of(BubbleController.create(context, null /* synchronizer */, - floatingContentCoordinator, statusBarService, windowManager, - windowManagerShellWrapper, launcherApps, uiEventLogger, organizer, - mainExecutor, mainHandler)); + static Optional provideAppPairs(Optional appPairsController) { + return appPairsController.map((controller) -> controller.asAppPairs()); } - // Needs the shell main handler for ContentObserver callbacks + @BindsOptionalOf + abstract AppPairsController optionalAppPairs(); + + // + // Task view factory + // + @WMSingleton @Provides - static Optional provideOneHandedController(Context context, - DisplayController displayController, TaskStackListenerImpl taskStackListener, - UiEventLogger uiEventLogger, - @ShellMainThread ShellExecutor mainExecutor, - @ShellMainThread Handler mainHandler) { - return Optional.ofNullable(OneHandedController.create(context, displayController, - taskStackListener, uiEventLogger, mainExecutor, mainHandler)); + static Optional provideTaskViewFactory( + TaskViewFactoryController taskViewFactoryController) { + return Optional.of(taskViewFactoryController.asTaskViewFactory()); } @WMSingleton @Provides - static Optional provideHideDisplayCutoutController(Context context, - DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor) { - return Optional.ofNullable( - HideDisplayCutoutController.create(context, displayController, mainExecutor)); - } - - @WMSingleton - @Provides - static Optional provideTaskViewFactory(ShellTaskOrganizer shellTaskOrganizer, + static TaskViewFactoryController provideTaskViewFactoryController( + ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { - return Optional.of(new TaskViewFactoryController(shellTaskOrganizer, mainExecutor) - .getTaskViewFactory()); + return new TaskViewFactoryController(shellTaskOrganizer, mainExecutor); } + // + // Misc + // + @WMSingleton @Provides - static FullscreenTaskListener provideFullscreenTaskListener(SyncTransactionQueue syncQueue) { - return new FullscreenTaskListener(syncQueue); - } - - @WMSingleton - @Provides - static RemoteTransitions provideRemoteTransitions(Transitions transitions) { - return Transitions.asRemoteTransitions(transitions); - } - - @WMSingleton - @Provides - static Transitions provideTransitions(ShellTaskOrganizer organizer, TransactionPool pool, - @ShellMainThread ShellExecutor mainExecutor, - @ShellAnimationThread ShellExecutor animExecutor) { - return new Transitions(organizer, pool, mainExecutor, animExecutor); - } - - @WMSingleton - @Provides - static SizeCompatUI provideSizeCompatUI(Context context, DisplayController displayController, - DisplayImeController imeController, @ShellMainThread ShellExecutor mainExecutor) { - return SizeCompatUIController.create(context, displayController, imeController, + static ShellInit provideShellInit(DisplayImeController displayImeController, + DragAndDropController dragAndDropController, + ShellTaskOrganizer shellTaskOrganizer, + Optional legacySplitScreenOptional, + Optional splitScreenOptional, + Optional appPairsOptional, + FullscreenTaskListener fullscreenTaskListener, + Transitions transitions, + @ShellMainThread ShellExecutor mainExecutor) { + return ShellInitImpl.create(displayImeController, + dragAndDropController, + shellTaskOrganizer, + legacySplitScreenOptional, + splitScreenOptional, + appPairsOptional, + fullscreenTaskListener, + transitions, mainExecutor); } + + /** + * Note, this is only optional because we currently pass this to the SysUI component scope and + * for non-primary users, we may inject a null-optional for that dependency. + */ + @WMSingleton + @Provides + static Optional provideShellCommandHandler( + ShellTaskOrganizer shellTaskOrganizer, + Optional legacySplitScreenOptional, + Optional splitScreenOptional, + Optional pipOptional, + Optional oneHandedOptional, + Optional hideDisplayCutout, + Optional appPairsOptional, + @ShellMainThread ShellExecutor mainExecutor) { + return Optional.of(ShellCommandHandlerImpl.create(shellTaskOrganizer, + legacySplitScreenOptional, splitScreenOptional, pipOptional, oneHandedOptional, + hideDisplayCutout, appPairsOptional, mainExecutor)); + } } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java index 2aaa0951d9d98..997b488a627f0 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java @@ -21,10 +21,10 @@ import android.content.Context; import android.os.Handler; import android.view.IWindowManager; +import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMSingleton; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; -import com.android.wm.shell.apppairs.AppPairs; import com.android.wm.shell.apppairs.AppPairsController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayImeController; @@ -36,7 +36,6 @@ import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.annotations.ChoreographerSfVsync; import com.android.wm.shell.common.annotations.ShellMainThread; -import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; @@ -60,11 +59,20 @@ import dagger.Module; import dagger.Provides; /** - * Provides dependencies from {@link com.android.wm.shell} which could be customized among different - * branches of SystemUI. + * Provides dependencies from {@link com.android.wm.shell}, these dependencies are only + * accessible from components within the WM subcomponent (can be explicitly exposed to the + * SysUIComponent, see {@link WMComponent}). + * + * This module only defines Shell dependencies for handheld SystemUI implementation. Common + * dependencies should go into {@link WMShellBaseModule}. */ @Module(includes = WMShellBaseModule.class) public class WMShellModule { + + // + // Internal common - Components used internally by multiple shell features + // + @WMSingleton @Provides static DisplayImeController provideDisplayImeController(IWindowManager wmService, @@ -74,29 +82,37 @@ public class WMShellModule { transactionPool); } + // + // Split/multiwindow + // + @WMSingleton @Provides - static LegacySplitScreen provideLegacySplitScreen(Context context, + static LegacySplitScreenController provideLegacySplitScreen(Context context, DisplayController displayController, SystemWindows systemWindows, DisplayImeController displayImeController, TransactionPool transactionPool, ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, TaskStackListenerImpl taskStackListener, Transitions transitions, @ShellMainThread ShellExecutor mainExecutor, @ChoreographerSfVsync AnimationHandler sfVsyncAnimationHandler) { - return LegacySplitScreenController.create(context, displayController, systemWindows, + return new LegacySplitScreenController(context, displayController, systemWindows, displayImeController, transactionPool, shellTaskOrganizer, syncQueue, taskStackListener, transitions, mainExecutor, sfVsyncAnimationHandler); } @WMSingleton @Provides - static AppPairs provideAppPairs(ShellTaskOrganizer shellTaskOrganizer, + static AppPairsController provideAppPairs(ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor) { - return AppPairsController.create(shellTaskOrganizer, syncQueue, displayController, + return new AppPairsController(shellTaskOrganizer, syncQueue, displayController, mainExecutor); } + // + // Pip + // + @WMSingleton @Provides static Optional providePip(Context context, DisplayController displayController, @@ -161,7 +177,8 @@ public class WMShellModule { PipAnimationController pipAnimationController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, PipTransitionController pipTransitionController, - Optional splitScreenOptional, DisplayController displayController, + Optional splitScreenOptional, + DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 76269dda82456..f1fc0b7723fce 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -89,8 +89,6 @@ import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.ZenModeController; -import com.android.systemui.util.concurrency.FakeExecutor; -import com.android.systemui.util.time.FakeSystemClock; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.bubbles.Bubble; @@ -297,7 +295,7 @@ public class BubblesTest extends SysuiTestCase { mBubblesManager = new BubblesManager( mContext, - mBubbleController.getImpl(), + mBubbleController.asBubbles(), mNotificationShadeWindowController, mStatusBarStateController, mShadeController, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java index 5340ff7e967c3..9e10b21ce3b72 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java @@ -261,7 +261,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase { mBubblesManager = new BubblesManager( mContext, - mBubbleController.getImpl(), + mBubbleController.asBubbles(), mNotificationShadeWindowController, mStatusBarStateController, mShadeController,