• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.wm.shell.dagger;
18 
19 import static com.android.wm.shell.onehanded.OneHandedController.SUPPORT_ONE_HANDED_MODE;
20 
21 import android.app.ActivityTaskManager;
22 import android.content.Context;
23 import android.content.pm.PackageManager;
24 import android.os.Handler;
25 import android.os.SystemProperties;
26 import android.view.IWindowManager;
27 
28 import com.android.internal.logging.UiEventLogger;
29 import com.android.launcher3.icons.IconProvider;
30 import com.android.wm.shell.ProtoLogController;
31 import com.android.wm.shell.R;
32 import com.android.wm.shell.RootDisplayAreaOrganizer;
33 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
34 import com.android.wm.shell.ShellTaskOrganizer;
35 import com.android.wm.shell.TaskViewFactory;
36 import com.android.wm.shell.TaskViewFactoryController;
37 import com.android.wm.shell.TaskViewTransitions;
38 import com.android.wm.shell.WindowManagerShellWrapper;
39 import com.android.wm.shell.activityembedding.ActivityEmbeddingController;
40 import com.android.wm.shell.back.BackAnimation;
41 import com.android.wm.shell.back.BackAnimationController;
42 import com.android.wm.shell.bubbles.BubbleController;
43 import com.android.wm.shell.bubbles.Bubbles;
44 import com.android.wm.shell.common.DevicePostureController;
45 import com.android.wm.shell.common.DisplayController;
46 import com.android.wm.shell.common.DisplayImeController;
47 import com.android.wm.shell.common.DisplayInsetsController;
48 import com.android.wm.shell.common.DisplayLayout;
49 import com.android.wm.shell.common.DockStateReader;
50 import com.android.wm.shell.common.FloatingContentCoordinator;
51 import com.android.wm.shell.common.ShellExecutor;
52 import com.android.wm.shell.common.SyncTransactionQueue;
53 import com.android.wm.shell.common.SystemWindows;
54 import com.android.wm.shell.common.TabletopModeController;
55 import com.android.wm.shell.common.TaskStackListenerImpl;
56 import com.android.wm.shell.common.TransactionPool;
57 import com.android.wm.shell.common.annotations.ShellAnimationThread;
58 import com.android.wm.shell.common.annotations.ShellBackgroundThread;
59 import com.android.wm.shell.common.annotations.ShellMainThread;
60 import com.android.wm.shell.common.annotations.ShellSplashscreenThread;
61 import com.android.wm.shell.compatui.CompatUIConfiguration;
62 import com.android.wm.shell.compatui.CompatUIController;
63 import com.android.wm.shell.compatui.CompatUIShellCommandHandler;
64 import com.android.wm.shell.desktopmode.DesktopMode;
65 import com.android.wm.shell.desktopmode.DesktopModeController;
66 import com.android.wm.shell.desktopmode.DesktopModeStatus;
67 import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
68 import com.android.wm.shell.desktopmode.DesktopTasksController;
69 import com.android.wm.shell.displayareahelper.DisplayAreaHelper;
70 import com.android.wm.shell.displayareahelper.DisplayAreaHelperController;
71 import com.android.wm.shell.draganddrop.DragAndDropController;
72 import com.android.wm.shell.freeform.FreeformComponents;
73 import com.android.wm.shell.fullscreen.FullscreenTaskListener;
74 import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController;
75 import com.android.wm.shell.onehanded.OneHanded;
76 import com.android.wm.shell.onehanded.OneHandedController;
77 import com.android.wm.shell.pip.Pip;
78 import com.android.wm.shell.pip.PipMediaController;
79 import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
80 import com.android.wm.shell.pip.PipUiEventLogger;
81 import com.android.wm.shell.pip.phone.PipTouchHandler;
82 import com.android.wm.shell.recents.RecentTasks;
83 import com.android.wm.shell.recents.RecentTasksController;
84 import com.android.wm.shell.splitscreen.SplitScreen;
85 import com.android.wm.shell.splitscreen.SplitScreenController;
86 import com.android.wm.shell.startingsurface.StartingSurface;
87 import com.android.wm.shell.startingsurface.StartingWindowController;
88 import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
89 import com.android.wm.shell.startingsurface.phone.PhoneStartingWindowTypeAlgorithm;
90 import com.android.wm.shell.sysui.ShellCommandHandler;
91 import com.android.wm.shell.sysui.ShellController;
92 import com.android.wm.shell.sysui.ShellInit;
93 import com.android.wm.shell.sysui.ShellInterface;
94 import com.android.wm.shell.transition.ShellTransitions;
95 import com.android.wm.shell.transition.Transitions;
96 import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
97 import com.android.wm.shell.unfold.UnfoldAnimationController;
98 import com.android.wm.shell.unfold.UnfoldTransitionHandler;
99 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
100 
101 import java.util.Optional;
102 
103 import dagger.BindsOptionalOf;
104 import dagger.Lazy;
105 import dagger.Module;
106 import dagger.Provides;
107 
108 /**
109  * Provides basic dependencies from {@link com.android.wm.shell}, these dependencies are only
110  * accessible from components within the WM subcomponent (can be explicitly exposed to the
111  * SysUIComponent, see {@link WMComponent}).
112  *
113  * This module only defines *common* dependencies across various SystemUI implementations,
114  * dependencies that are device/form factor SystemUI implementation specific should go into their
115  * respective modules (ie. {@link WMShellModule} for handheld, {@link TvWMShellModule} for tv, etc.)
116  */
117 @Module(includes = WMShellConcurrencyModule.class)
118 public abstract class WMShellBaseModule {
119 
120     //
121     // Internal common - Components used internally by multiple shell features
122     //
123 
124     @WMSingleton
125     @Provides
provideDisplayController(Context context, IWindowManager wmService, ShellInit shellInit, @ShellMainThread ShellExecutor mainExecutor)126     static DisplayController provideDisplayController(Context context,
127             IWindowManager wmService,
128             ShellInit shellInit,
129             @ShellMainThread ShellExecutor mainExecutor) {
130         return new DisplayController(context, wmService, shellInit, mainExecutor);
131     }
132 
133     @WMSingleton
134     @Provides
provideDisplayInsetsController(IWindowManager wmService, ShellInit shellInit, DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor)135     static DisplayInsetsController provideDisplayInsetsController(IWindowManager wmService,
136             ShellInit shellInit,
137             DisplayController displayController,
138             @ShellMainThread ShellExecutor mainExecutor) {
139         return new DisplayInsetsController(wmService, shellInit, displayController,
140                 mainExecutor);
141     }
142 
143     @WMSingleton
144     @Provides
provideDisplayImeController( IWindowManager wmService, ShellInit shellInit, DisplayController displayController, DisplayInsetsController displayInsetsController, TransactionPool transactionPool, @ShellMainThread ShellExecutor mainExecutor )145     static DisplayImeController provideDisplayImeController(
146             IWindowManager wmService,
147             ShellInit shellInit,
148             DisplayController displayController,
149             DisplayInsetsController displayInsetsController,
150             TransactionPool transactionPool,
151             @ShellMainThread ShellExecutor mainExecutor
152     ) {
153         return new DisplayImeController(wmService, shellInit, displayController,
154                 displayInsetsController, transactionPool, mainExecutor);
155     }
156 
157     @WMSingleton
158     @Provides
provideDisplayLayout()159     static DisplayLayout provideDisplayLayout() {
160         return new DisplayLayout();
161     }
162 
163     @WMSingleton
164     @Provides
provideDevicePostureController( Context context, ShellInit shellInit, @ShellMainThread ShellExecutor mainExecutor )165     static DevicePostureController provideDevicePostureController(
166             Context context,
167             ShellInit shellInit,
168             @ShellMainThread ShellExecutor mainExecutor
169     ) {
170         return new DevicePostureController(context, shellInit, mainExecutor);
171     }
172 
173     @WMSingleton
174     @Provides
provideTabletopModeController( Context context, ShellInit shellInit, DevicePostureController postureController, DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor)175     static TabletopModeController provideTabletopModeController(
176             Context context,
177             ShellInit shellInit,
178             DevicePostureController postureController,
179             DisplayController displayController,
180             @ShellMainThread ShellExecutor mainExecutor) {
181         return new TabletopModeController(
182                 context, shellInit, postureController, displayController, mainExecutor);
183     }
184 
185     @WMSingleton
186     @Provides
provideDragAndDropController(Context context, ShellInit shellInit, ShellController shellController, DisplayController displayController, UiEventLogger uiEventLogger, IconProvider iconProvider, @ShellMainThread ShellExecutor mainExecutor)187     static DragAndDropController provideDragAndDropController(Context context,
188             ShellInit shellInit,
189             ShellController shellController,
190             DisplayController displayController,
191             UiEventLogger uiEventLogger,
192             IconProvider iconProvider,
193             @ShellMainThread ShellExecutor mainExecutor) {
194         return new DragAndDropController(context, shellInit, shellController, displayController,
195                 uiEventLogger, iconProvider, mainExecutor);
196     }
197 
198     @WMSingleton
199     @Provides
provideShellTaskOrganizer( Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, CompatUIController compatUI, Optional<UnfoldAnimationController> unfoldAnimationController, Optional<RecentTasksController> recentTasksOptional, @ShellMainThread ShellExecutor mainExecutor )200     static ShellTaskOrganizer provideShellTaskOrganizer(
201             Context context,
202             ShellInit shellInit,
203             ShellCommandHandler shellCommandHandler,
204             CompatUIController compatUI,
205             Optional<UnfoldAnimationController> unfoldAnimationController,
206             Optional<RecentTasksController> recentTasksOptional,
207             @ShellMainThread ShellExecutor mainExecutor
208     ) {
209         if (!context.getResources().getBoolean(R.bool.config_registerShellTaskOrganizerOnInit)) {
210             // TODO(b/238217847): Force override shell init if registration is disabled
211             shellInit = new ShellInit(mainExecutor);
212         }
213         return new ShellTaskOrganizer(shellInit, shellCommandHandler, compatUI,
214                 unfoldAnimationController, recentTasksOptional, mainExecutor);
215     }
216 
217     @WMSingleton
218     @Provides
provideCompatUIController(Context context, ShellInit shellInit, ShellController shellController, DisplayController displayController, DisplayInsetsController displayInsetsController, DisplayImeController imeController, SyncTransactionQueue syncQueue, @ShellMainThread ShellExecutor mainExecutor, Lazy<Transitions> transitionsLazy, DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration, CompatUIShellCommandHandler compatUIShellCommandHandler)219     static CompatUIController provideCompatUIController(Context context,
220             ShellInit shellInit,
221             ShellController shellController,
222             DisplayController displayController, DisplayInsetsController displayInsetsController,
223             DisplayImeController imeController, SyncTransactionQueue syncQueue,
224             @ShellMainThread ShellExecutor mainExecutor, Lazy<Transitions> transitionsLazy,
225             DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration,
226             CompatUIShellCommandHandler compatUIShellCommandHandler) {
227         return new CompatUIController(context, shellInit, shellController, displayController,
228                 displayInsetsController, imeController, syncQueue, mainExecutor, transitionsLazy,
229                 dockStateReader, compatUIConfiguration, compatUIShellCommandHandler);
230     }
231 
232     @WMSingleton
233     @Provides
provideSyncTransactionQueue(TransactionPool pool, @ShellMainThread ShellExecutor mainExecutor)234     static SyncTransactionQueue provideSyncTransactionQueue(TransactionPool pool,
235             @ShellMainThread ShellExecutor mainExecutor) {
236         return new SyncTransactionQueue(pool, mainExecutor);
237     }
238 
239     @WMSingleton
240     @Provides
provideSystemWindows(DisplayController displayController, IWindowManager wmService)241     static SystemWindows provideSystemWindows(DisplayController displayController,
242             IWindowManager wmService) {
243         return new SystemWindows(displayController, wmService);
244     }
245 
246     @WMSingleton
247     @Provides
provideIconProvider(Context context)248     static IconProvider provideIconProvider(Context context) {
249         return new IconProvider(context);
250     }
251 
252     // We currently dedupe multiple messages, so we use the shell main handler directly
253     @WMSingleton
254     @Provides
providerTaskStackListenerImpl( @hellMainThread Handler mainHandler)255     static TaskStackListenerImpl providerTaskStackListenerImpl(
256             @ShellMainThread Handler mainHandler) {
257         return new TaskStackListenerImpl(mainHandler);
258     }
259 
260     @WMSingleton
261     @Provides
provideTransactionPool()262     static TransactionPool provideTransactionPool() {
263         return new TransactionPool();
264     }
265 
266     @WMSingleton
267     @Provides
provideWindowManagerShellWrapper( @hellMainThread ShellExecutor mainExecutor)268     static WindowManagerShellWrapper provideWindowManagerShellWrapper(
269             @ShellMainThread ShellExecutor mainExecutor) {
270         return new WindowManagerShellWrapper(mainExecutor);
271     }
272 
273     //
274     // Back animation
275     //
276 
277     @WMSingleton
278     @Provides
provideBackAnimation( Optional<BackAnimationController> backAnimationController)279     static Optional<BackAnimation> provideBackAnimation(
280             Optional<BackAnimationController> backAnimationController) {
281         return backAnimationController.map(BackAnimationController::getBackAnimationImpl);
282     }
283 
284     @WMSingleton
285     @Provides
provideBackAnimationController( Context context, ShellInit shellInit, ShellController shellController, @ShellMainThread ShellExecutor shellExecutor, @ShellBackgroundThread Handler backgroundHandler )286     static Optional<BackAnimationController> provideBackAnimationController(
287             Context context,
288             ShellInit shellInit,
289             ShellController shellController,
290             @ShellMainThread ShellExecutor shellExecutor,
291             @ShellBackgroundThread Handler backgroundHandler
292     ) {
293         if (BackAnimationController.IS_ENABLED) {
294             return Optional.of(
295                     new BackAnimationController(shellInit, shellController, shellExecutor,
296                             backgroundHandler, context));
297         }
298         return Optional.empty();
299     }
300 
301     //
302     // Bubbles (optional feature)
303     //
304 
305     @WMSingleton
306     @Provides
provideBubbles(Optional<BubbleController> bubbleController)307     static Optional<Bubbles> provideBubbles(Optional<BubbleController> bubbleController) {
308         return bubbleController.map((controller) -> controller.asBubbles());
309     }
310 
311     @BindsOptionalOf
optionalBubblesController()312     abstract BubbleController optionalBubblesController();
313 
314     //
315     // Fullscreen
316     //
317 
318     // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
319     @BindsOptionalOf
320     @DynamicOverride
optionalFullscreenTaskListener()321     abstract FullscreenTaskListener optionalFullscreenTaskListener();
322 
323     @WMSingleton
324     @Provides
provideFullscreenTaskListener( @ynamicOverride Optional<FullscreenTaskListener> fullscreenTaskListener, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, Optional<RecentTasksController> recentTasksOptional, Optional<WindowDecorViewModel> windowDecorViewModelOptional)325     static FullscreenTaskListener provideFullscreenTaskListener(
326             @DynamicOverride Optional<FullscreenTaskListener> fullscreenTaskListener,
327             ShellInit shellInit,
328             ShellTaskOrganizer shellTaskOrganizer,
329             SyncTransactionQueue syncQueue,
330             Optional<RecentTasksController> recentTasksOptional,
331             Optional<WindowDecorViewModel> windowDecorViewModelOptional) {
332         if (fullscreenTaskListener.isPresent()) {
333             return fullscreenTaskListener.get();
334         } else {
335             return new FullscreenTaskListener(shellInit, shellTaskOrganizer, syncQueue,
336                     recentTasksOptional, windowDecorViewModelOptional);
337         }
338     }
339 
340     //
341     // Window Decoration
342     //
343 
344     @BindsOptionalOf
optionalWindowDecorViewModel()345     abstract WindowDecorViewModel optionalWindowDecorViewModel();
346 
347     //
348     // Unfold transition
349     //
350 
351     @BindsOptionalOf
optionalShellUnfoldProgressProvider()352     abstract ShellUnfoldProgressProvider optionalShellUnfoldProgressProvider();
353 
354     // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
355     @BindsOptionalOf
356     @DynamicOverride
optionalUnfoldController()357     abstract UnfoldAnimationController optionalUnfoldController();
358 
359     @WMSingleton
360     @Provides
provideUnfoldController( @ynamicOverride Lazy<Optional<UnfoldAnimationController>> fullscreenUnfoldController, Optional<ShellUnfoldProgressProvider> progressProvider)361     static Optional<UnfoldAnimationController> provideUnfoldController(
362             @DynamicOverride Lazy<Optional<UnfoldAnimationController>>
363                     fullscreenUnfoldController,
364             Optional<ShellUnfoldProgressProvider> progressProvider) {
365         if (progressProvider.isPresent()
366                 && progressProvider.get() != ShellUnfoldProgressProvider.NO_PROVIDER) {
367             return fullscreenUnfoldController.get();
368         }
369         return Optional.empty();
370     }
371 
372     @BindsOptionalOf
373     @DynamicOverride
optionalUnfoldTransitionHandler()374     abstract UnfoldTransitionHandler optionalUnfoldTransitionHandler();
375 
376     @WMSingleton
377     @Provides
provideUnfoldTransitionHandler( Optional<ShellUnfoldProgressProvider> progressProvider, @DynamicOverride Lazy<Optional<UnfoldTransitionHandler>> handler)378     static Optional<UnfoldTransitionHandler> provideUnfoldTransitionHandler(
379             Optional<ShellUnfoldProgressProvider> progressProvider,
380             @DynamicOverride Lazy<Optional<UnfoldTransitionHandler>> handler) {
381         if (progressProvider.isPresent()
382                 && progressProvider.get() != ShellUnfoldProgressProvider.NO_PROVIDER) {
383             return handler.get();
384         }
385         return Optional.empty();
386     }
387 
388     //
389     // Freeform (optional feature)
390     //
391 
392     // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
393     @BindsOptionalOf
394     @DynamicOverride
optionalFreeformComponents()395     abstract FreeformComponents optionalFreeformComponents();
396 
397     @WMSingleton
398     @Provides
provideFreeformComponents( @ynamicOverride Optional<FreeformComponents> freeformComponents, Context context)399     static Optional<FreeformComponents> provideFreeformComponents(
400             @DynamicOverride Optional<FreeformComponents> freeformComponents,
401             Context context) {
402         if (FreeformComponents.isFreeformEnabled(context)) {
403             return freeformComponents;
404         }
405         return Optional.empty();
406     }
407 
408     //
409     // Hide display cutout
410     //
411 
412     @WMSingleton
413     @Provides
provideHideDisplayCutoutController(Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor)414     static Optional<HideDisplayCutoutController> provideHideDisplayCutoutController(Context context,
415             ShellInit shellInit,
416             ShellCommandHandler shellCommandHandler,
417             ShellController shellController,
418             DisplayController displayController,
419             @ShellMainThread ShellExecutor mainExecutor) {
420         return Optional.ofNullable(
421                 HideDisplayCutoutController.create(context, shellInit, shellCommandHandler,
422                         shellController, displayController, mainExecutor));
423     }
424 
425     //
426     // One handed mode (optional feature)
427     //
428 
429     @WMSingleton
430     @Provides
provideOneHanded(Optional<OneHandedController> oneHandedController)431     static Optional<OneHanded> provideOneHanded(Optional<OneHandedController> oneHandedController) {
432         return oneHandedController.map((controller) -> controller.asOneHanded());
433     }
434 
435     // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
436     @BindsOptionalOf
437     @DynamicOverride
optionalOneHandedController()438     abstract OneHandedController optionalOneHandedController();
439 
440     @WMSingleton
441     @Provides
providesOneHandedController( @ynamicOverride Optional<OneHandedController> oneHandedController)442     static Optional<OneHandedController> providesOneHandedController(
443             @DynamicOverride Optional<OneHandedController> oneHandedController) {
444         if (SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false)) {
445             return oneHandedController;
446         }
447         return Optional.empty();
448     }
449 
450     //
451     // Pip (optional feature)
452     //
453 
454     @WMSingleton
455     @Provides
provideFloatingContentCoordinator()456     static FloatingContentCoordinator provideFloatingContentCoordinator() {
457         return new FloatingContentCoordinator();
458     }
459 
460     // Needs handler for registering broadcast receivers
461     @WMSingleton
462     @Provides
providePipMediaController(Context context, @ShellMainThread Handler mainHandler)463     static PipMediaController providePipMediaController(Context context,
464             @ShellMainThread Handler mainHandler) {
465         return new PipMediaController(context, mainHandler);
466     }
467 
468     @WMSingleton
469     @Provides
providePipSurfaceTransactionHelper(Context context)470     static PipSurfaceTransactionHelper providePipSurfaceTransactionHelper(Context context) {
471         return new PipSurfaceTransactionHelper(context);
472     }
473 
474     @WMSingleton
475     @Provides
providePipUiEventLogger(UiEventLogger uiEventLogger, PackageManager packageManager)476     static PipUiEventLogger providePipUiEventLogger(UiEventLogger uiEventLogger,
477             PackageManager packageManager) {
478         return new PipUiEventLogger(uiEventLogger, packageManager);
479     }
480 
481     @BindsOptionalOf
optionalPipTouchHandler()482     abstract PipTouchHandler optionalPipTouchHandler();
483 
484     //
485     // Recent tasks
486     //
487 
488     @WMSingleton
489     @Provides
provideRecentTasks( Optional<RecentTasksController> recentTasksController)490     static Optional<RecentTasks> provideRecentTasks(
491             Optional<RecentTasksController> recentTasksController) {
492         return recentTasksController.map((controller) -> controller.asRecentTasks());
493     }
494 
495     @WMSingleton
496     @Provides
provideRecentTasksController( Context context, ShellInit shellInit, ShellController shellController, ShellCommandHandler shellCommandHandler, TaskStackListenerImpl taskStackListener, ActivityTaskManager activityTaskManager, Optional<DesktopModeTaskRepository> desktopModeTaskRepository, @ShellMainThread ShellExecutor mainExecutor )497     static Optional<RecentTasksController> provideRecentTasksController(
498             Context context,
499             ShellInit shellInit,
500             ShellController shellController,
501             ShellCommandHandler shellCommandHandler,
502             TaskStackListenerImpl taskStackListener,
503             ActivityTaskManager activityTaskManager,
504             Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
505             @ShellMainThread ShellExecutor mainExecutor
506     ) {
507         return Optional.ofNullable(
508                 RecentTasksController.create(context, shellInit, shellController,
509                         shellCommandHandler, taskStackListener, activityTaskManager,
510                         desktopModeTaskRepository, mainExecutor));
511     }
512 
513     //
514     // Shell transitions
515     //
516 
517     @WMSingleton
518     @Provides
provideRemoteTransitions(Transitions transitions)519     static ShellTransitions provideRemoteTransitions(Transitions transitions) {
520         return transitions.asRemoteTransitions();
521     }
522 
523     @WMSingleton
524     @Provides
provideTransitions(Context context, ShellInit shellInit, ShellController shellController, ShellTaskOrganizer organizer, TransactionPool pool, DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellAnimationThread ShellExecutor animExecutor)525     static Transitions provideTransitions(Context context,
526             ShellInit shellInit,
527             ShellController shellController,
528             ShellTaskOrganizer organizer,
529             TransactionPool pool,
530             DisplayController displayController,
531             @ShellMainThread ShellExecutor mainExecutor,
532             @ShellMainThread Handler mainHandler,
533             @ShellAnimationThread ShellExecutor animExecutor) {
534         if (!context.getResources().getBoolean(R.bool.config_registerShellTransitionsOnInit)) {
535             // TODO(b/238217847): Force override shell init if registration is disabled
536             shellInit = new ShellInit(mainExecutor);
537         }
538         return new Transitions(context, shellInit, shellController, organizer, pool,
539                 displayController, mainExecutor, mainHandler, animExecutor);
540     }
541 
542     @WMSingleton
543     @Provides
provideTaskViewTransitions(Transitions transitions)544     static TaskViewTransitions provideTaskViewTransitions(Transitions transitions) {
545         return new TaskViewTransitions(transitions);
546     }
547 
548     //
549     // Display areas
550     //
551 
552     @WMSingleton
553     @Provides
provideRootTaskDisplayAreaOrganizer( @hellMainThread ShellExecutor mainExecutor, Context context)554     static RootTaskDisplayAreaOrganizer provideRootTaskDisplayAreaOrganizer(
555             @ShellMainThread ShellExecutor mainExecutor, Context context) {
556         return new RootTaskDisplayAreaOrganizer(mainExecutor, context);
557     }
558 
559     @WMSingleton
560     @Provides
provideRootDisplayAreaOrganizer( @hellMainThread ShellExecutor mainExecutor)561     static RootDisplayAreaOrganizer provideRootDisplayAreaOrganizer(
562             @ShellMainThread ShellExecutor mainExecutor) {
563         return new RootDisplayAreaOrganizer(mainExecutor);
564     }
565 
566     @WMSingleton
567     @Provides
provideDisplayAreaHelper( @hellMainThread ShellExecutor mainExecutor, RootDisplayAreaOrganizer rootDisplayAreaOrganizer)568     static Optional<DisplayAreaHelper> provideDisplayAreaHelper(
569             @ShellMainThread ShellExecutor mainExecutor,
570             RootDisplayAreaOrganizer rootDisplayAreaOrganizer) {
571         return Optional.of(new DisplayAreaHelperController(mainExecutor,
572                 rootDisplayAreaOrganizer));
573     }
574 
575     //
576     // Splitscreen (optional feature)
577     //
578 
579     @WMSingleton
580     @Provides
provideSplitScreen( Optional<SplitScreenController> splitScreenController)581     static Optional<SplitScreen> provideSplitScreen(
582             Optional<SplitScreenController> splitScreenController) {
583         return splitScreenController.map((controller) -> controller.asSplitScreen());
584     }
585 
586     // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
587     @BindsOptionalOf
588     @DynamicOverride
optionalSplitScreenController()589     abstract SplitScreenController optionalSplitScreenController();
590 
591     @WMSingleton
592     @Provides
providesSplitScreenController( @ynamicOverride Optional<SplitScreenController> splitscreenController, Context context)593     static Optional<SplitScreenController> providesSplitScreenController(
594             @DynamicOverride Optional<SplitScreenController> splitscreenController,
595             Context context) {
596         if (ActivityTaskManager.supportsSplitScreenMultiWindow(context)) {
597             return splitscreenController;
598         }
599         return Optional.empty();
600     }
601 
602     //
603     // Starting window
604     //
605 
606     @WMSingleton
607     @Provides
provideStartingSurface( StartingWindowController startingWindowController)608     static Optional<StartingSurface> provideStartingSurface(
609             StartingWindowController startingWindowController) {
610         return Optional.of(startingWindowController.asStartingSurface());
611     }
612 
613     @WMSingleton
614     @Provides
provideStartingWindowController( Context context, ShellInit shellInit, ShellController shellController, ShellTaskOrganizer shellTaskOrganizer, @ShellSplashscreenThread ShellExecutor splashScreenExecutor, StartingWindowTypeAlgorithm startingWindowTypeAlgorithm, IconProvider iconProvider, TransactionPool pool)615     static StartingWindowController provideStartingWindowController(
616             Context context,
617             ShellInit shellInit,
618             ShellController shellController,
619             ShellTaskOrganizer shellTaskOrganizer,
620             @ShellSplashscreenThread ShellExecutor splashScreenExecutor,
621             StartingWindowTypeAlgorithm startingWindowTypeAlgorithm, IconProvider iconProvider,
622             TransactionPool pool) {
623         return new StartingWindowController(context, shellInit, shellController, shellTaskOrganizer,
624                 splashScreenExecutor, startingWindowTypeAlgorithm, iconProvider, pool);
625     }
626 
627     // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
628     @BindsOptionalOf
629     @DynamicOverride
optionalStartingWindowTypeAlgorithm()630     abstract StartingWindowTypeAlgorithm optionalStartingWindowTypeAlgorithm();
631 
632     @WMSingleton
633     @Provides
provideStartingWindowTypeAlgorithm( @ynamicOverride Optional<StartingWindowTypeAlgorithm> startingWindowTypeAlgorithm )634     static StartingWindowTypeAlgorithm provideStartingWindowTypeAlgorithm(
635             @DynamicOverride Optional<StartingWindowTypeAlgorithm> startingWindowTypeAlgorithm
636     ) {
637         if (startingWindowTypeAlgorithm.isPresent()) {
638             return startingWindowTypeAlgorithm.get();
639         }
640         // Default to phone starting window type
641         return new PhoneStartingWindowTypeAlgorithm();
642     }
643 
644     //
645     // Task view factory
646     //
647 
648     @WMSingleton
649     @Provides
provideTaskViewFactory( TaskViewFactoryController taskViewFactoryController)650     static Optional<TaskViewFactory> provideTaskViewFactory(
651             TaskViewFactoryController taskViewFactoryController) {
652         return Optional.of(taskViewFactoryController.asTaskViewFactory());
653     }
654 
655     @WMSingleton
656     @Provides
provideTaskViewFactoryController( ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor, SyncTransactionQueue syncQueue, TaskViewTransitions taskViewTransitions)657     static TaskViewFactoryController provideTaskViewFactoryController(
658             ShellTaskOrganizer shellTaskOrganizer,
659             @ShellMainThread ShellExecutor mainExecutor,
660             SyncTransactionQueue syncQueue,
661             TaskViewTransitions taskViewTransitions) {
662         return new TaskViewFactoryController(shellTaskOrganizer, mainExecutor, syncQueue,
663                 taskViewTransitions);
664     }
665 
666 
667     //
668     // ActivityEmbedding
669     //
670 
671     @WMSingleton
672     @Provides
provideActivityEmbeddingController( Context context, ShellInit shellInit, Transitions transitions)673     static Optional<ActivityEmbeddingController> provideActivityEmbeddingController(
674             Context context,
675             ShellInit shellInit,
676             Transitions transitions) {
677         return Optional.ofNullable(
678                 ActivityEmbeddingController.create(context, shellInit, transitions));
679     }
680 
681     //
682     // SysUI -> Shell interface
683     //
684 
685     @WMSingleton
686     @Provides
provideShellSysuiCallbacks( @hellCreateTrigger Object createTrigger, ShellController shellController)687     static ShellInterface provideShellSysuiCallbacks(
688             @ShellCreateTrigger Object createTrigger,
689             ShellController shellController) {
690         return shellController.asShell();
691     }
692 
693     @WMSingleton
694     @Provides
provideShellController(ShellInit shellInit, ShellCommandHandler shellCommandHandler, @ShellMainThread ShellExecutor mainExecutor)695     static ShellController provideShellController(ShellInit shellInit,
696             ShellCommandHandler shellCommandHandler,
697             @ShellMainThread ShellExecutor mainExecutor) {
698         return new ShellController(shellInit, shellCommandHandler, mainExecutor);
699     }
700 
701     //
702     // Desktop mode (optional feature)
703     //
704 
705     @WMSingleton
706     @Provides
provideDesktopMode( Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController)707     static Optional<DesktopMode> provideDesktopMode(
708             Optional<DesktopModeController> desktopModeController,
709             Optional<DesktopTasksController> desktopTasksController) {
710         if (DesktopModeStatus.isProto2Enabled()) {
711             return desktopTasksController.map(DesktopTasksController::asDesktopMode);
712         }
713         return desktopModeController.map(DesktopModeController::asDesktopMode);
714     }
715 
716     @BindsOptionalOf
717     @DynamicOverride
optionalDesktopModeController()718     abstract DesktopModeController optionalDesktopModeController();
719 
720     @WMSingleton
721     @Provides
provideDesktopModeController( @ynamicOverride Optional<Lazy<DesktopModeController>> desktopModeController)722     static Optional<DesktopModeController> provideDesktopModeController(
723             @DynamicOverride Optional<Lazy<DesktopModeController>> desktopModeController) {
724         // Use optional-of-lazy for the dependency that this provider relies on.
725         // Lazy ensures that this provider will not be the cause the dependency is created
726         // when it will not be returned due to the condition below.
727         if (DesktopModeStatus.isProto1Enabled()) {
728             return desktopModeController.map(Lazy::get);
729         }
730         return Optional.empty();
731     }
732 
733     @BindsOptionalOf
734     @DynamicOverride
optionalDesktopTasksController()735     abstract DesktopTasksController optionalDesktopTasksController();
736 
737     @WMSingleton
738     @Provides
providesDesktopTasksController( @ynamicOverride Optional<Lazy<DesktopTasksController>> desktopTasksController)739     static Optional<DesktopTasksController> providesDesktopTasksController(
740             @DynamicOverride Optional<Lazy<DesktopTasksController>> desktopTasksController) {
741         // Use optional-of-lazy for the dependency that this provider relies on.
742         // Lazy ensures that this provider will not be the cause the dependency is created
743         // when it will not be returned due to the condition below.
744         if (DesktopModeStatus.isProto2Enabled()) {
745             return desktopTasksController.map(Lazy::get);
746         }
747         return Optional.empty();
748     }
749 
750     @BindsOptionalOf
751     @DynamicOverride
optionalDesktopModeTaskRepository()752     abstract DesktopModeTaskRepository optionalDesktopModeTaskRepository();
753 
754     @WMSingleton
755     @Provides
provideDesktopTaskRepository( @ynamicOverride Optional<Lazy<DesktopModeTaskRepository>> desktopModeTaskRepository)756     static Optional<DesktopModeTaskRepository> provideDesktopTaskRepository(
757             @DynamicOverride Optional<Lazy<DesktopModeTaskRepository>> desktopModeTaskRepository) {
758         // Use optional-of-lazy for the dependency that this provider relies on.
759         // Lazy ensures that this provider will not be the cause the dependency is created
760         // when it will not be returned due to the condition below.
761         if (DesktopModeStatus.isAnyEnabled()) {
762             return desktopModeTaskRepository.map(Lazy::get);
763         }
764         return Optional.empty();
765     }
766 
767     //
768     // Misc
769     //
770 
771     // Workaround for dynamic overriding with a default implementation, see {@link DynamicOverride}
772     @BindsOptionalOf
773     @ShellCreateTriggerOverride
provideIndependentShellComponentsToCreateOverride()774     abstract Object provideIndependentShellComponentsToCreateOverride();
775 
776     // TODO: Temporarily move dependencies to this instead of ShellInit since that is needed to add
777     // the callback. We will be moving to a different explicit startup mechanism in a follow- up CL.
778     @WMSingleton
779     @ShellCreateTrigger
780     @Provides
provideIndependentShellComponentsToCreate( DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, DragAndDropController dragAndDropController, ShellTaskOrganizer shellTaskOrganizer, 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, Optional<ActivityEmbeddingController> activityEmbeddingOptional, Transitions transitions, StartingWindowController startingWindow, ProtoLogController protoLogController, @ShellCreateTriggerOverride Optional<Object> overriddenCreateTrigger)781     static Object provideIndependentShellComponentsToCreate(
782             DisplayController displayController,
783             DisplayImeController displayImeController,
784             DisplayInsetsController displayInsetsController,
785             DragAndDropController dragAndDropController,
786             ShellTaskOrganizer shellTaskOrganizer,
787             Optional<BubbleController> bubblesOptional,
788             Optional<SplitScreenController> splitScreenOptional,
789             Optional<Pip> pipOptional,
790             Optional<PipTouchHandler> pipTouchHandlerOptional,
791             FullscreenTaskListener fullscreenTaskListener,
792             Optional<UnfoldAnimationController> unfoldAnimationController,
793             Optional<UnfoldTransitionHandler> unfoldTransitionHandler,
794             Optional<FreeformComponents> freeformComponents,
795             Optional<RecentTasksController> recentTasksOptional,
796             Optional<OneHandedController> oneHandedControllerOptional,
797             Optional<HideDisplayCutoutController> hideDisplayCutoutControllerOptional,
798             Optional<ActivityEmbeddingController> activityEmbeddingOptional,
799             Transitions transitions,
800             StartingWindowController startingWindow,
801             ProtoLogController protoLogController,
802             @ShellCreateTriggerOverride Optional<Object> overriddenCreateTrigger) {
803         return new Object();
804     }
805 
806     @WMSingleton
807     @Provides
provideShellInit(@hellMainThread ShellExecutor mainExecutor)808     static ShellInit provideShellInit(@ShellMainThread ShellExecutor mainExecutor) {
809         return new ShellInit(mainExecutor);
810     }
811 
812     @WMSingleton
813     @Provides
provideShellCommandHandler()814     static ShellCommandHandler provideShellCommandHandler() {
815         return new ShellCommandHandler();
816     }
817 
818     @WMSingleton
819     @Provides
provideProtoLogController( ShellInit shellInit, ShellCommandHandler shellCommandHandler)820     static ProtoLogController provideProtoLogController(
821             ShellInit shellInit,
822             ShellCommandHandler shellCommandHandler) {
823         return new ProtoLogController(shellInit, shellCommandHandler);
824     }
825 }
826