• 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 android.content.Context;
20 import android.content.pm.LauncherApps;
21 import android.os.Handler;
22 import android.os.UserManager;
23 import android.view.Choreographer;
24 import android.view.WindowManager;
25 
26 import com.android.internal.jank.InteractionJankMonitor;
27 import com.android.internal.logging.UiEventLogger;
28 import com.android.internal.statusbar.IStatusBarService;
29 import com.android.launcher3.icons.IconProvider;
30 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
31 import com.android.wm.shell.ShellTaskOrganizer;
32 import com.android.wm.shell.TaskViewTransitions;
33 import com.android.wm.shell.WindowManagerShellWrapper;
34 import com.android.wm.shell.bubbles.BubbleController;
35 import com.android.wm.shell.bubbles.BubbleData;
36 import com.android.wm.shell.bubbles.BubbleDataRepository;
37 import com.android.wm.shell.bubbles.BubbleLogger;
38 import com.android.wm.shell.bubbles.BubblePositioner;
39 import com.android.wm.shell.common.DisplayController;
40 import com.android.wm.shell.common.DisplayImeController;
41 import com.android.wm.shell.common.DisplayInsetsController;
42 import com.android.wm.shell.common.DisplayLayout;
43 import com.android.wm.shell.common.FloatingContentCoordinator;
44 import com.android.wm.shell.common.ShellExecutor;
45 import com.android.wm.shell.common.SyncTransactionQueue;
46 import com.android.wm.shell.common.SystemWindows;
47 import com.android.wm.shell.common.TabletopModeController;
48 import com.android.wm.shell.common.TaskStackListenerImpl;
49 import com.android.wm.shell.common.TransactionPool;
50 import com.android.wm.shell.common.annotations.ShellBackgroundThread;
51 import com.android.wm.shell.common.annotations.ShellMainThread;
52 import com.android.wm.shell.desktopmode.DesktopModeController;
53 import com.android.wm.shell.desktopmode.DesktopModeStatus;
54 import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
55 import com.android.wm.shell.desktopmode.DesktopTasksController;
56 import com.android.wm.shell.draganddrop.DragAndDropController;
57 import com.android.wm.shell.freeform.FreeformComponents;
58 import com.android.wm.shell.freeform.FreeformTaskListener;
59 import com.android.wm.shell.freeform.FreeformTaskTransitionHandler;
60 import com.android.wm.shell.freeform.FreeformTaskTransitionObserver;
61 import com.android.wm.shell.kidsmode.KidsModeTaskOrganizer;
62 import com.android.wm.shell.onehanded.OneHandedController;
63 import com.android.wm.shell.pip.Pip;
64 import com.android.wm.shell.pip.PipAnimationController;
65 import com.android.wm.shell.pip.PipAppOpsListener;
66 import com.android.wm.shell.pip.PipBoundsAlgorithm;
67 import com.android.wm.shell.pip.PipBoundsState;
68 import com.android.wm.shell.pip.PipMediaController;
69 import com.android.wm.shell.pip.PipParamsChangedForwarder;
70 import com.android.wm.shell.pip.PipSnapAlgorithm;
71 import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
72 import com.android.wm.shell.pip.PipTaskOrganizer;
73 import com.android.wm.shell.pip.PipTransition;
74 import com.android.wm.shell.pip.PipTransitionController;
75 import com.android.wm.shell.pip.PipTransitionState;
76 import com.android.wm.shell.pip.PipUiEventLogger;
77 import com.android.wm.shell.pip.phone.PhonePipKeepClearAlgorithm;
78 import com.android.wm.shell.pip.phone.PhonePipMenuController;
79 import com.android.wm.shell.pip.phone.PipController;
80 import com.android.wm.shell.pip.phone.PipMotionHelper;
81 import com.android.wm.shell.pip.phone.PipSizeSpecHandler;
82 import com.android.wm.shell.pip.phone.PipTouchHandler;
83 import com.android.wm.shell.recents.RecentTasksController;
84 import com.android.wm.shell.splitscreen.SplitScreenController;
85 import com.android.wm.shell.sysui.ShellCommandHandler;
86 import com.android.wm.shell.sysui.ShellController;
87 import com.android.wm.shell.sysui.ShellInit;
88 import com.android.wm.shell.transition.DefaultMixedHandler;
89 import com.android.wm.shell.transition.Transitions;
90 import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
91 import com.android.wm.shell.unfold.UnfoldAnimationController;
92 import com.android.wm.shell.unfold.UnfoldBackgroundController;
93 import com.android.wm.shell.unfold.UnfoldTransitionHandler;
94 import com.android.wm.shell.unfold.animation.FullscreenUnfoldTaskAnimator;
95 import com.android.wm.shell.unfold.animation.SplitTaskUnfoldAnimator;
96 import com.android.wm.shell.unfold.animation.UnfoldTaskAnimator;
97 import com.android.wm.shell.unfold.qualifier.UnfoldShellTransition;
98 import com.android.wm.shell.unfold.qualifier.UnfoldTransition;
99 import com.android.wm.shell.windowdecor.CaptionWindowDecorViewModel;
100 import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel;
101 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
102 
103 import java.util.ArrayList;
104 import java.util.List;
105 import java.util.Optional;
106 
107 import dagger.Binds;
108 import dagger.Lazy;
109 import dagger.Module;
110 import dagger.Provides;
111 
112 /**
113  * Provides dependencies from {@link com.android.wm.shell}, these dependencies are only
114  * accessible from components within the WM subcomponent (can be explicitly exposed to the
115  * SysUIComponent, see {@link WMComponent}).
116  *
117  * This module only defines Shell dependencies for handheld SystemUI implementation.  Common
118  * dependencies should go into {@link WMShellBaseModule}.
119  */
120 @Module(includes = WMShellBaseModule.class)
121 public abstract class WMShellModule {
122 
123     //
124     // Bubbles
125     //
126 
127     @WMSingleton
128     @Provides
provideBubbleLogger(UiEventLogger uiEventLogger)129     static BubbleLogger provideBubbleLogger(UiEventLogger uiEventLogger) {
130         return new BubbleLogger(uiEventLogger);
131     }
132 
133     @WMSingleton
134     @Provides
provideBubblePositioner(Context context, WindowManager windowManager)135     static BubblePositioner provideBubblePositioner(Context context,
136             WindowManager windowManager) {
137         return new BubblePositioner(context, windowManager);
138     }
139 
140     @WMSingleton
141     @Provides
provideBubbleData(Context context, BubbleLogger logger, BubblePositioner positioner, @ShellMainThread ShellExecutor mainExecutor)142     static BubbleData provideBubbleData(Context context,
143             BubbleLogger logger,
144             BubblePositioner positioner,
145             @ShellMainThread ShellExecutor mainExecutor) {
146         return new BubbleData(context, logger, positioner, mainExecutor);
147     }
148 
149     // Note: Handler needed for LauncherApps.register
150     @WMSingleton
151     @Provides
provideBubbleController(Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, BubbleData data, FloatingContentCoordinator floatingContentCoordinator, IStatusBarService statusBarService, WindowManager windowManager, WindowManagerShellWrapper windowManagerShellWrapper, UserManager userManager, LauncherApps launcherApps, TaskStackListenerImpl taskStackListener, BubbleLogger logger, ShellTaskOrganizer organizer, BubblePositioner positioner, DisplayController displayController, @DynamicOverride Optional<OneHandedController> oneHandedOptional, DragAndDropController dragAndDropController, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellBackgroundThread ShellExecutor bgExecutor, TaskViewTransitions taskViewTransitions, SyncTransactionQueue syncQueue)152     static BubbleController provideBubbleController(Context context,
153             ShellInit shellInit,
154             ShellCommandHandler shellCommandHandler,
155             ShellController shellController,
156             BubbleData data,
157             FloatingContentCoordinator floatingContentCoordinator,
158             IStatusBarService statusBarService,
159             WindowManager windowManager,
160             WindowManagerShellWrapper windowManagerShellWrapper,
161             UserManager userManager,
162             LauncherApps launcherApps,
163             TaskStackListenerImpl taskStackListener,
164             BubbleLogger logger,
165             ShellTaskOrganizer organizer,
166             BubblePositioner positioner,
167             DisplayController displayController,
168             @DynamicOverride Optional<OneHandedController> oneHandedOptional,
169             DragAndDropController dragAndDropController,
170             @ShellMainThread ShellExecutor mainExecutor,
171             @ShellMainThread Handler mainHandler,
172             @ShellBackgroundThread ShellExecutor bgExecutor,
173             TaskViewTransitions taskViewTransitions,
174             SyncTransactionQueue syncQueue) {
175         return new BubbleController(context, shellInit, shellCommandHandler, shellController, data,
176                 null /* synchronizer */, floatingContentCoordinator,
177                 new BubbleDataRepository(context, launcherApps, mainExecutor),
178                 statusBarService, windowManager, windowManagerShellWrapper, userManager,
179                 launcherApps, logger, taskStackListener, organizer, positioner, displayController,
180                 oneHandedOptional, dragAndDropController, mainExecutor, mainHandler, bgExecutor,
181                 taskViewTransitions, syncQueue);
182     }
183 
184     //
185     // Window decoration
186     //
187 
188     @WMSingleton
189     @Provides
provideWindowDecorViewModel( Context context, @ShellMainThread Handler mainHandler, @ShellMainThread Choreographer mainChoreographer, ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Optional<DesktopModeController> desktopModeController, Optional<DesktopTasksController> desktopTasksController, Optional<SplitScreenController> splitScreenController)190     static WindowDecorViewModel provideWindowDecorViewModel(
191             Context context,
192             @ShellMainThread Handler mainHandler,
193             @ShellMainThread Choreographer mainChoreographer,
194             ShellTaskOrganizer taskOrganizer,
195             DisplayController displayController,
196             SyncTransactionQueue syncQueue,
197             Optional<DesktopModeController> desktopModeController,
198             Optional<DesktopTasksController> desktopTasksController,
199             Optional<SplitScreenController> splitScreenController) {
200         if (DesktopModeStatus.isAnyEnabled()) {
201             return new DesktopModeWindowDecorViewModel(
202                     context,
203                     mainHandler,
204                     mainChoreographer,
205                     taskOrganizer,
206                     displayController,
207                     syncQueue,
208                     desktopModeController,
209                     desktopTasksController,
210                     splitScreenController);
211         }
212         return new CaptionWindowDecorViewModel(
213                     context,
214                     mainHandler,
215                     mainChoreographer,
216                     taskOrganizer,
217                     displayController,
218                     syncQueue);
219     }
220 
221     //
222     // Freeform
223     //
224 
225     @WMSingleton
226     @Provides
227     @DynamicOverride
provideFreeformComponents( FreeformTaskListener taskListener, FreeformTaskTransitionHandler transitionHandler, FreeformTaskTransitionObserver transitionObserver)228     static FreeformComponents provideFreeformComponents(
229             FreeformTaskListener taskListener,
230             FreeformTaskTransitionHandler transitionHandler,
231             FreeformTaskTransitionObserver transitionObserver) {
232         return new FreeformComponents(
233                 taskListener, Optional.of(transitionHandler), Optional.of(transitionObserver));
234     }
235 
236     @WMSingleton
237     @Provides
provideFreeformTaskListener( Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Optional<DesktopModeTaskRepository> desktopModeTaskRepository, WindowDecorViewModel windowDecorViewModel)238     static FreeformTaskListener provideFreeformTaskListener(
239             Context context,
240             ShellInit shellInit,
241             ShellTaskOrganizer shellTaskOrganizer,
242             Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
243             WindowDecorViewModel windowDecorViewModel) {
244         // TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
245         //                    override for this controller from the base module
246         ShellInit init = FreeformComponents.isFreeformEnabled(context)
247                 ? shellInit
248                 : null;
249         return new FreeformTaskListener(init, shellTaskOrganizer, desktopModeTaskRepository,
250                 windowDecorViewModel);
251     }
252 
253     @WMSingleton
254     @Provides
provideFreeformTaskTransitionHandler( ShellInit shellInit, Transitions transitions, WindowDecorViewModel windowDecorViewModel)255     static FreeformTaskTransitionHandler provideFreeformTaskTransitionHandler(
256             ShellInit shellInit,
257             Transitions transitions,
258             WindowDecorViewModel windowDecorViewModel) {
259         return new FreeformTaskTransitionHandler(shellInit, transitions, windowDecorViewModel);
260     }
261 
262     @WMSingleton
263     @Provides
provideFreeformTaskTransitionObserver( Context context, ShellInit shellInit, Transitions transitions, WindowDecorViewModel windowDecorViewModel)264     static FreeformTaskTransitionObserver provideFreeformTaskTransitionObserver(
265             Context context,
266             ShellInit shellInit,
267             Transitions transitions,
268             WindowDecorViewModel windowDecorViewModel) {
269         return new FreeformTaskTransitionObserver(
270                 context, shellInit, transitions, windowDecorViewModel);
271     }
272 
273     //
274     // One handed mode
275     //
276 
277 
278     // Needs the shell main handler for ContentObserver callbacks
279     @WMSingleton
280     @Provides
281     @DynamicOverride
provideOneHandedController(Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, WindowManager windowManager, DisplayController displayController, DisplayLayout displayLayout, TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, InteractionJankMonitor jankMonitor, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler)282     static OneHandedController provideOneHandedController(Context context,
283             ShellInit shellInit,
284             ShellCommandHandler shellCommandHandler,
285             ShellController shellController,
286             WindowManager windowManager,
287             DisplayController displayController,
288             DisplayLayout displayLayout,
289             TaskStackListenerImpl taskStackListener,
290             UiEventLogger uiEventLogger,
291             InteractionJankMonitor jankMonitor,
292             @ShellMainThread ShellExecutor mainExecutor,
293             @ShellMainThread Handler mainHandler) {
294         return OneHandedController.create(context, shellInit, shellCommandHandler, shellController,
295                 windowManager, displayController, displayLayout, taskStackListener, jankMonitor,
296                 uiEventLogger, mainExecutor, mainHandler);
297     }
298 
299     //
300     // Splitscreen
301     //
302 
303     @WMSingleton
304     @Provides
305     @DynamicOverride
provideSplitScreenController( Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, DragAndDropController dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, Optional<RecentTasksController> recentTasks, @ShellMainThread ShellExecutor mainExecutor)306     static SplitScreenController provideSplitScreenController(
307             Context context,
308             ShellInit shellInit,
309             ShellCommandHandler shellCommandHandler,
310             ShellController shellController,
311             ShellTaskOrganizer shellTaskOrganizer,
312             SyncTransactionQueue syncQueue,
313             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
314             DisplayController displayController,
315             DisplayImeController displayImeController,
316             DisplayInsetsController displayInsetsController,
317             DragAndDropController dragAndDropController,
318             Transitions transitions,
319             TransactionPool transactionPool,
320             IconProvider iconProvider,
321             Optional<RecentTasksController> recentTasks,
322             @ShellMainThread ShellExecutor mainExecutor) {
323         return new SplitScreenController(context, shellInit, shellCommandHandler, shellController,
324                 shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, displayController,
325                 displayImeController, displayInsetsController, dragAndDropController, transitions,
326                 transactionPool, iconProvider, recentTasks, mainExecutor);
327     }
328 
329     //
330     // Pip
331     //
332 
333     @WMSingleton
334     @Provides
providePip(Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, DisplayController displayController, PipAnimationController pipAnimationController, PipAppOpsListener pipAppOpsListener, PipBoundsAlgorithm pipBoundsAlgorithm, PhonePipKeepClearAlgorithm pipKeepClearAlgorithm, PipBoundsState pipBoundsState, PipSizeSpecHandler pipSizeSpecHandler, PipMotionHelper pipMotionHelper, PipMediaController pipMediaController, PhonePipMenuController phonePipMenuController, PipTaskOrganizer pipTaskOrganizer, PipTransitionState pipTransitionState, PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController, WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, PipParamsChangedForwarder pipParamsChangedForwarder, DisplayInsetsController displayInsetsController, TabletopModeController pipTabletopController, Optional<OneHandedController> oneHandedController, @ShellMainThread ShellExecutor mainExecutor)335     static Optional<Pip> providePip(Context context,
336             ShellInit shellInit,
337             ShellCommandHandler shellCommandHandler,
338             ShellController shellController,
339             DisplayController displayController,
340             PipAnimationController pipAnimationController,
341             PipAppOpsListener pipAppOpsListener,
342             PipBoundsAlgorithm pipBoundsAlgorithm,
343             PhonePipKeepClearAlgorithm pipKeepClearAlgorithm,
344             PipBoundsState pipBoundsState,
345             PipSizeSpecHandler pipSizeSpecHandler,
346             PipMotionHelper pipMotionHelper,
347             PipMediaController pipMediaController,
348             PhonePipMenuController phonePipMenuController,
349             PipTaskOrganizer pipTaskOrganizer,
350             PipTransitionState pipTransitionState,
351             PipTouchHandler pipTouchHandler,
352             PipTransitionController pipTransitionController,
353             WindowManagerShellWrapper windowManagerShellWrapper,
354             TaskStackListenerImpl taskStackListener,
355             PipParamsChangedForwarder pipParamsChangedForwarder,
356             DisplayInsetsController displayInsetsController,
357             TabletopModeController pipTabletopController,
358             Optional<OneHandedController> oneHandedController,
359             @ShellMainThread ShellExecutor mainExecutor) {
360         return Optional.ofNullable(PipController.create(
361                 context, shellInit, shellCommandHandler, shellController,
362                 displayController, pipAnimationController, pipAppOpsListener, pipBoundsAlgorithm,
363                 pipKeepClearAlgorithm, pipBoundsState, pipSizeSpecHandler, pipMotionHelper,
364                 pipMediaController, phonePipMenuController, pipTaskOrganizer, pipTransitionState,
365                 pipTouchHandler, pipTransitionController, windowManagerShellWrapper,
366                 taskStackListener, pipParamsChangedForwarder, displayInsetsController,
367                 pipTabletopController, oneHandedController, mainExecutor));
368     }
369 
370     @WMSingleton
371     @Provides
providePipBoundsState(Context context, PipSizeSpecHandler pipSizeSpecHandler)372     static PipBoundsState providePipBoundsState(Context context,
373             PipSizeSpecHandler pipSizeSpecHandler) {
374         return new PipBoundsState(context, pipSizeSpecHandler);
375     }
376 
377     @WMSingleton
378     @Provides
providePipSnapAlgorithm()379     static PipSnapAlgorithm providePipSnapAlgorithm() {
380         return new PipSnapAlgorithm();
381     }
382 
383     @WMSingleton
384     @Provides
providePhonePipKeepClearAlgorithm(Context context)385     static PhonePipKeepClearAlgorithm providePhonePipKeepClearAlgorithm(Context context) {
386         return new PhonePipKeepClearAlgorithm(context);
387     }
388 
389     @WMSingleton
390     @Provides
providePipSizeSpecHelper(Context context)391     static PipSizeSpecHandler providePipSizeSpecHelper(Context context) {
392         return new PipSizeSpecHandler(context);
393     }
394 
395     @WMSingleton
396     @Provides
providesPipBoundsAlgorithm(Context context, PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm, PhonePipKeepClearAlgorithm pipKeepClearAlgorithm, PipSizeSpecHandler pipSizeSpecHandler)397     static PipBoundsAlgorithm providesPipBoundsAlgorithm(Context context,
398             PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm,
399             PhonePipKeepClearAlgorithm pipKeepClearAlgorithm,
400             PipSizeSpecHandler pipSizeSpecHandler) {
401         return new PipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm,
402                 pipKeepClearAlgorithm, pipSizeSpecHandler);
403     }
404 
405     // Handler is used by Icon.loadDrawableAsync
406     @WMSingleton
407     @Provides
providesPipPhoneMenuController(Context context, PipBoundsState pipBoundsState, PipMediaController pipMediaController, SystemWindows systemWindows, Optional<SplitScreenController> splitScreenOptional, PipUiEventLogger pipUiEventLogger, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler)408     static PhonePipMenuController providesPipPhoneMenuController(Context context,
409             PipBoundsState pipBoundsState, PipMediaController pipMediaController,
410             SystemWindows systemWindows,
411             Optional<SplitScreenController> splitScreenOptional,
412             PipUiEventLogger pipUiEventLogger,
413             @ShellMainThread ShellExecutor mainExecutor,
414             @ShellMainThread Handler mainHandler) {
415         return new PhonePipMenuController(context, pipBoundsState, pipMediaController,
416                 systemWindows, splitScreenOptional, pipUiEventLogger, mainExecutor, mainHandler);
417     }
418 
419     @WMSingleton
420     @Provides
providePipTouchHandler(Context context, ShellInit shellInit, PhonePipMenuController menuPhoneController, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, PipSizeSpecHandler pipSizeSpecHandler, PipTaskOrganizer pipTaskOrganizer, PipMotionHelper pipMotionHelper, FloatingContentCoordinator floatingContentCoordinator, PipUiEventLogger pipUiEventLogger, @ShellMainThread ShellExecutor mainExecutor)421     static PipTouchHandler providePipTouchHandler(Context context,
422             ShellInit shellInit,
423             PhonePipMenuController menuPhoneController,
424             PipBoundsAlgorithm pipBoundsAlgorithm,
425             PipBoundsState pipBoundsState,
426             PipSizeSpecHandler pipSizeSpecHandler,
427             PipTaskOrganizer pipTaskOrganizer,
428             PipMotionHelper pipMotionHelper,
429             FloatingContentCoordinator floatingContentCoordinator,
430             PipUiEventLogger pipUiEventLogger,
431             @ShellMainThread ShellExecutor mainExecutor) {
432         return new PipTouchHandler(context, shellInit, menuPhoneController, pipBoundsAlgorithm,
433                 pipBoundsState, pipSizeSpecHandler, pipTaskOrganizer, pipMotionHelper,
434                 floatingContentCoordinator, pipUiEventLogger, mainExecutor);
435     }
436 
437     @WMSingleton
438     @Provides
providePipTransitionState()439     static PipTransitionState providePipTransitionState() {
440         return new PipTransitionState();
441     }
442 
443     @WMSingleton
444     @Provides
providePipTaskOrganizer(Context context, SyncTransactionQueue syncTransactionQueue, PipTransitionState pipTransitionState, PipBoundsState pipBoundsState, PipSizeSpecHandler pipSizeSpecHandler, PipBoundsAlgorithm pipBoundsAlgorithm, PhonePipMenuController menuPhoneController, PipAnimationController pipAnimationController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, PipTransitionController pipTransitionController, PipParamsChangedForwarder pipParamsChangedForwarder, Optional<SplitScreenController> splitScreenControllerOptional, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor)445     static PipTaskOrganizer providePipTaskOrganizer(Context context,
446             SyncTransactionQueue syncTransactionQueue,
447             PipTransitionState pipTransitionState,
448             PipBoundsState pipBoundsState,
449             PipSizeSpecHandler pipSizeSpecHandler,
450             PipBoundsAlgorithm pipBoundsAlgorithm,
451             PhonePipMenuController menuPhoneController,
452             PipAnimationController pipAnimationController,
453             PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
454             PipTransitionController pipTransitionController,
455             PipParamsChangedForwarder pipParamsChangedForwarder,
456             Optional<SplitScreenController> splitScreenControllerOptional,
457             DisplayController displayController,
458             PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
459             @ShellMainThread ShellExecutor mainExecutor) {
460         return new PipTaskOrganizer(context,
461                 syncTransactionQueue, pipTransitionState, pipBoundsState, pipSizeSpecHandler,
462                 pipBoundsAlgorithm, menuPhoneController, pipAnimationController,
463                 pipSurfaceTransactionHelper, pipTransitionController, pipParamsChangedForwarder,
464                 splitScreenControllerOptional, displayController, pipUiEventLogger,
465                 shellTaskOrganizer, mainExecutor);
466     }
467 
468     @WMSingleton
469     @Provides
providePipAnimationController(PipSurfaceTransactionHelper pipSurfaceTransactionHelper)470     static PipAnimationController providePipAnimationController(PipSurfaceTransactionHelper
471             pipSurfaceTransactionHelper) {
472         return new PipAnimationController(pipSurfaceTransactionHelper);
473     }
474 
475     @WMSingleton
476     @Provides
providePipTransitionController(Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, PipSizeSpecHandler pipSizeSpecHandler, PipTransitionState pipTransitionState, PhonePipMenuController pipMenuController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional<SplitScreenController> splitScreenOptional)477     static PipTransitionController providePipTransitionController(Context context,
478             ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions,
479             PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm,
480             PipBoundsState pipBoundsState, PipSizeSpecHandler pipSizeSpecHandler,
481             PipTransitionState pipTransitionState, PhonePipMenuController pipMenuController,
482             PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
483             Optional<SplitScreenController> splitScreenOptional) {
484         return new PipTransition(context, shellInit, shellTaskOrganizer, transitions,
485                 pipBoundsState, pipSizeSpecHandler, pipTransitionState, pipMenuController,
486                 pipBoundsAlgorithm, pipAnimationController, pipSurfaceTransactionHelper,
487                 splitScreenOptional);
488     }
489 
490     @WMSingleton
491     @Provides
providePipAppOpsListener(Context context, PipTouchHandler pipTouchHandler, @ShellMainThread ShellExecutor mainExecutor)492     static PipAppOpsListener providePipAppOpsListener(Context context,
493             PipTouchHandler pipTouchHandler,
494             @ShellMainThread ShellExecutor mainExecutor) {
495         return new PipAppOpsListener(context, pipTouchHandler.getMotionHelper(), mainExecutor);
496     }
497 
498     @WMSingleton
499     @Provides
providePipMotionHelper(Context context, PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, PhonePipMenuController menuController, PipSnapAlgorithm pipSnapAlgorithm, PipTransitionController pipTransitionController, FloatingContentCoordinator floatingContentCoordinator)500     static PipMotionHelper providePipMotionHelper(Context context,
501             PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer,
502             PhonePipMenuController menuController, PipSnapAlgorithm pipSnapAlgorithm,
503             PipTransitionController pipTransitionController,
504             FloatingContentCoordinator floatingContentCoordinator) {
505         return new PipMotionHelper(context, pipBoundsState, pipTaskOrganizer,
506                 menuController, pipSnapAlgorithm, pipTransitionController,
507                 floatingContentCoordinator);
508     }
509 
510     @WMSingleton
511     @Provides
providePipParamsChangedForwarder()512     static PipParamsChangedForwarder providePipParamsChangedForwarder() {
513         return new PipParamsChangedForwarder();
514     }
515 
516     //
517     // Transitions
518     //
519 
520     @WMSingleton
521     @Provides
provideDefaultMixedHandler( ShellInit shellInit, Optional<SplitScreenController> splitScreenOptional, Optional<PipTouchHandler> pipTouchHandlerOptional, Transitions transitions)522     static DefaultMixedHandler provideDefaultMixedHandler(
523             ShellInit shellInit,
524             Optional<SplitScreenController> splitScreenOptional,
525             Optional<PipTouchHandler> pipTouchHandlerOptional,
526             Transitions transitions) {
527         return new DefaultMixedHandler(shellInit, transitions, splitScreenOptional,
528                 pipTouchHandlerOptional);
529     }
530 
531     //
532     // Unfold transition
533     //
534 
535     @WMSingleton
536     @Provides
537     @DynamicOverride
provideUnfoldAnimationController( Optional<ShellUnfoldProgressProvider> progressProvider, TransactionPool transactionPool, @UnfoldTransition SplitTaskUnfoldAnimator splitAnimator, FullscreenUnfoldTaskAnimator fullscreenAnimator, Lazy<Optional<UnfoldTransitionHandler>> unfoldTransitionHandler, ShellInit shellInit, @ShellMainThread ShellExecutor mainExecutor )538     static UnfoldAnimationController provideUnfoldAnimationController(
539             Optional<ShellUnfoldProgressProvider> progressProvider,
540             TransactionPool transactionPool,
541             @UnfoldTransition SplitTaskUnfoldAnimator splitAnimator,
542             FullscreenUnfoldTaskAnimator fullscreenAnimator,
543             Lazy<Optional<UnfoldTransitionHandler>> unfoldTransitionHandler,
544             ShellInit shellInit,
545             @ShellMainThread ShellExecutor mainExecutor
546     ) {
547         final List<UnfoldTaskAnimator> animators = new ArrayList<>();
548         animators.add(splitAnimator);
549         animators.add(fullscreenAnimator);
550 
551         return new UnfoldAnimationController(
552                         shellInit,
553                         transactionPool,
554                         progressProvider.get(),
555                         animators,
556                         unfoldTransitionHandler,
557                         mainExecutor
558                 );
559     }
560 
561     @Provides
provideFullscreenUnfoldTaskAnimator( Context context, UnfoldBackgroundController unfoldBackgroundController, ShellController shellController, DisplayInsetsController displayInsetsController )562     static FullscreenUnfoldTaskAnimator provideFullscreenUnfoldTaskAnimator(
563             Context context,
564             UnfoldBackgroundController unfoldBackgroundController,
565             ShellController shellController,
566             DisplayInsetsController displayInsetsController
567     ) {
568         return new FullscreenUnfoldTaskAnimator(context, unfoldBackgroundController,
569                 shellController, displayInsetsController);
570     }
571 
572     @Provides
provideSplitTaskUnfoldAnimatorBase( Context context, UnfoldBackgroundController backgroundController, ShellController shellController, @ShellMainThread ShellExecutor executor, Lazy<Optional<SplitScreenController>> splitScreenOptional, DisplayInsetsController displayInsetsController )573     static SplitTaskUnfoldAnimator provideSplitTaskUnfoldAnimatorBase(
574             Context context,
575             UnfoldBackgroundController backgroundController,
576             ShellController shellController,
577             @ShellMainThread ShellExecutor executor,
578             Lazy<Optional<SplitScreenController>> splitScreenOptional,
579             DisplayInsetsController displayInsetsController
580     ) {
581         // TODO(b/238217847): The lazy reference here causes some dependency issues since it
582         // immediately registers a listener on that controller on init.  We should reference the
583         // controller directly once we refactor ShellTaskOrganizer to not depend on the unfold
584         // animation controller directly.
585         return new SplitTaskUnfoldAnimator(context, executor, splitScreenOptional,
586                 shellController, backgroundController, displayInsetsController);
587     }
588 
589     @WMSingleton
590     @UnfoldShellTransition
591     @Binds
provideShellSplitTaskUnfoldAnimator( SplitTaskUnfoldAnimator splitTaskUnfoldAnimator)592     abstract SplitTaskUnfoldAnimator provideShellSplitTaskUnfoldAnimator(
593             SplitTaskUnfoldAnimator splitTaskUnfoldAnimator);
594 
595     @WMSingleton
596     @UnfoldTransition
597     @Binds
provideSplitTaskUnfoldAnimator( SplitTaskUnfoldAnimator splitTaskUnfoldAnimator)598     abstract SplitTaskUnfoldAnimator provideSplitTaskUnfoldAnimator(
599             SplitTaskUnfoldAnimator splitTaskUnfoldAnimator);
600 
601     @WMSingleton
602     @Provides
603     @DynamicOverride
provideUnfoldTransitionHandler( Optional<ShellUnfoldProgressProvider> progressProvider, FullscreenUnfoldTaskAnimator animator, @UnfoldShellTransition SplitTaskUnfoldAnimator unfoldAnimator, TransactionPool transactionPool, Transitions transitions, @ShellMainThread ShellExecutor executor, ShellInit shellInit)604     static UnfoldTransitionHandler provideUnfoldTransitionHandler(
605             Optional<ShellUnfoldProgressProvider> progressProvider,
606             FullscreenUnfoldTaskAnimator animator,
607             @UnfoldShellTransition SplitTaskUnfoldAnimator unfoldAnimator,
608             TransactionPool transactionPool,
609             Transitions transitions,
610             @ShellMainThread ShellExecutor executor,
611             ShellInit shellInit) {
612         return new UnfoldTransitionHandler(shellInit, progressProvider.get(), animator,
613                 unfoldAnimator, transactionPool, executor, transitions);
614     }
615 
616     @WMSingleton
617     @Provides
provideUnfoldBackgroundController( RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, Context context )618     static UnfoldBackgroundController provideUnfoldBackgroundController(
619             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
620             Context context
621     ) {
622         return new UnfoldBackgroundController(
623                 context,
624                 rootTaskDisplayAreaOrganizer
625         );
626     }
627 
628     //
629     // Desktop mode (optional feature)
630     //
631 
632     @WMSingleton
633     @Provides
634     @DynamicOverride
provideDesktopModeController(Context context, ShellInit shellInit, ShellController shellController, ShellTaskOrganizer shellTaskOrganizer, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, Transitions transitions, @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository, @ShellMainThread Handler mainHandler, @ShellMainThread ShellExecutor mainExecutor )635     static DesktopModeController provideDesktopModeController(Context context,
636             ShellInit shellInit,
637             ShellController shellController,
638             ShellTaskOrganizer shellTaskOrganizer,
639             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
640             Transitions transitions,
641             @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
642             @ShellMainThread Handler mainHandler,
643             @ShellMainThread ShellExecutor mainExecutor
644     ) {
645         return new DesktopModeController(context, shellInit, shellController, shellTaskOrganizer,
646                 rootTaskDisplayAreaOrganizer, transitions, desktopModeTaskRepository, mainHandler,
647                 mainExecutor);
648     }
649 
650     @WMSingleton
651     @Provides
652     @DynamicOverride
provideDesktopTasksController( Context context, ShellInit shellInit, ShellController shellController, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository, @ShellMainThread ShellExecutor mainExecutor )653     static DesktopTasksController provideDesktopTasksController(
654             Context context,
655             ShellInit shellInit,
656             ShellController shellController,
657             ShellTaskOrganizer shellTaskOrganizer,
658             Transitions transitions,
659             @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository,
660             @ShellMainThread ShellExecutor mainExecutor
661     ) {
662         return new DesktopTasksController(context, shellInit, shellController, shellTaskOrganizer,
663                 transitions, desktopModeTaskRepository, mainExecutor);
664     }
665 
666     @WMSingleton
667     @Provides
668     @DynamicOverride
provideDesktopModeTaskRepository()669     static DesktopModeTaskRepository provideDesktopModeTaskRepository() {
670         return new DesktopModeTaskRepository();
671     }
672 
673     //
674     // Kids mode
675     //
676     @WMSingleton
677     @Provides
provideKidsModeTaskOrganizer( Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, SyncTransactionQueue syncTransactionQueue, DisplayController displayController, DisplayInsetsController displayInsetsController, Optional<UnfoldAnimationController> unfoldAnimationController, Optional<RecentTasksController> recentTasksOptional, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler )678     static KidsModeTaskOrganizer provideKidsModeTaskOrganizer(
679             Context context,
680             ShellInit shellInit,
681             ShellCommandHandler shellCommandHandler,
682             SyncTransactionQueue syncTransactionQueue,
683             DisplayController displayController,
684             DisplayInsetsController displayInsetsController,
685             Optional<UnfoldAnimationController> unfoldAnimationController,
686             Optional<RecentTasksController> recentTasksOptional,
687             @ShellMainThread ShellExecutor mainExecutor,
688             @ShellMainThread Handler mainHandler
689     ) {
690         return new KidsModeTaskOrganizer(context, shellInit, shellCommandHandler,
691                 syncTransactionQueue, displayController, displayInsetsController,
692                 unfoldAnimationController, recentTasksOptional, mainExecutor, mainHandler);
693     }
694 
695     //
696     // Misc
697     //
698 
699     // TODO: Temporarily move dependencies to this instead of ShellInit since that is needed to add
700     // the callback. We will be moving to a different explicit startup mechanism in a follow- up CL.
701     @WMSingleton
702     @ShellCreateTriggerOverride
703     @Provides
provideIndependentShellComponentsToCreate( DefaultMixedHandler defaultMixedHandler, KidsModeTaskOrganizer kidsModeTaskOrganizer, Optional<DesktopModeController> desktopModeController)704     static Object provideIndependentShellComponentsToCreate(
705             DefaultMixedHandler defaultMixedHandler,
706             KidsModeTaskOrganizer kidsModeTaskOrganizer,
707             Optional<DesktopModeController> desktopModeController) {
708         return new Object();
709     }
710 }
711