• 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 android.window.DesktopModeFlags.ENABLE_DESKTOP_SYSTEM_DIALOGS_TRANSITIONS;
20 import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX;
21 import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY;
22 import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT;
23 import static android.window.DesktopModeFlags.ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS;
24 
25 import static com.android.hardware.input.Flags.manageKeyGestures;
26 import static com.android.hardware.input.Flags.useKeyGestureEventHandler;
27 
28 import android.annotation.NonNull;
29 import android.annotation.Nullable;
30 import android.app.KeyguardManager;
31 import android.content.Context;
32 import android.content.pm.LauncherApps;
33 import android.content.pm.PackageManager;
34 import android.hardware.input.InputManager;
35 import android.os.Handler;
36 import android.os.UserManager;
37 import android.view.Choreographer;
38 import android.view.IWindowManager;
39 import android.view.SurfaceControl;
40 import android.view.WindowManager;
41 import android.window.DesktopModeFlags;
42 
43 import androidx.annotation.OptIn;
44 
45 import com.android.internal.jank.InteractionJankMonitor;
46 import com.android.internal.logging.UiEventLogger;
47 import com.android.internal.statusbar.IStatusBarService;
48 import com.android.internal.util.LatencyTracker;
49 import com.android.launcher3.icons.IconProvider;
50 import com.android.window.flags.Flags;
51 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
52 import com.android.wm.shell.ShellTaskOrganizer;
53 import com.android.wm.shell.activityembedding.ActivityEmbeddingController;
54 import com.android.wm.shell.apptoweb.AppToWebGenericLinksParser;
55 import com.android.wm.shell.apptoweb.AssistContentRequester;
56 import com.android.wm.shell.appzoomout.AppZoomOutController;
57 import com.android.wm.shell.back.BackAnimationController;
58 import com.android.wm.shell.bubbles.BubbleController;
59 import com.android.wm.shell.bubbles.BubbleData;
60 import com.android.wm.shell.bubbles.BubbleDataRepository;
61 import com.android.wm.shell.bubbles.BubbleEducationController;
62 import com.android.wm.shell.bubbles.BubbleLogger;
63 import com.android.wm.shell.bubbles.BubblePositioner;
64 import com.android.wm.shell.bubbles.BubbleResizabilityChecker;
65 import com.android.wm.shell.bubbles.BubbleTaskUnfoldTransitionMerger;
66 import com.android.wm.shell.bubbles.bar.BubbleBarDragListener;
67 import com.android.wm.shell.bubbles.storage.BubblePersistentRepository;
68 import com.android.wm.shell.common.DisplayController;
69 import com.android.wm.shell.common.DisplayImeController;
70 import com.android.wm.shell.common.DisplayInsetsController;
71 import com.android.wm.shell.common.DisplayLayout;
72 import com.android.wm.shell.common.FloatingContentCoordinator;
73 import com.android.wm.shell.common.HomeIntentProvider;
74 import com.android.wm.shell.common.LaunchAdjacentController;
75 import com.android.wm.shell.common.MultiDisplayDragMoveIndicatorController;
76 import com.android.wm.shell.common.MultiDisplayDragMoveIndicatorSurface;
77 import com.android.wm.shell.common.MultiInstanceHelper;
78 import com.android.wm.shell.common.ShellExecutor;
79 import com.android.wm.shell.common.SyncTransactionQueue;
80 import com.android.wm.shell.common.TaskStackListenerImpl;
81 import com.android.wm.shell.common.UserProfileContexts;
82 import com.android.wm.shell.common.split.SplitState;
83 import com.android.wm.shell.compatui.api.CompatUIHandler;
84 import com.android.wm.shell.compatui.letterbox.LetterboxCommandHandler;
85 import com.android.wm.shell.compatui.letterbox.LetterboxTransitionObserver;
86 import com.android.wm.shell.crashhandling.ShellCrashHandler;
87 import com.android.wm.shell.dagger.back.ShellBackAnimationModule;
88 import com.android.wm.shell.dagger.pip.PipModule;
89 import com.android.wm.shell.desktopmode.CloseDesktopTaskTransitionHandler;
90 import com.android.wm.shell.desktopmode.DefaultDragToDesktopTransitionHandler;
91 import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler;
92 import com.android.wm.shell.desktopmode.DesktopDisplayEventHandler;
93 import com.android.wm.shell.desktopmode.DesktopDisplayModeController;
94 import com.android.wm.shell.desktopmode.DesktopImeHandler;
95 import com.android.wm.shell.desktopmode.DesktopImmersiveController;
96 import com.android.wm.shell.desktopmode.DesktopMinimizationTransitionHandler;
97 import com.android.wm.shell.desktopmode.DesktopMixedTransitionHandler;
98 import com.android.wm.shell.desktopmode.DesktopModeDragAndDropTransitionHandler;
99 import com.android.wm.shell.desktopmode.DesktopModeEventLogger;
100 import com.android.wm.shell.desktopmode.DesktopModeKeyGestureHandler;
101 import com.android.wm.shell.desktopmode.DesktopModeLoggerTransitionObserver;
102 import com.android.wm.shell.desktopmode.DesktopModeMoveToDisplayTransitionHandler;
103 import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger;
104 import com.android.wm.shell.desktopmode.DesktopTaskChangeListener;
105 import com.android.wm.shell.desktopmode.DesktopTasksController;
106 import com.android.wm.shell.desktopmode.DesktopTasksLimiter;
107 import com.android.wm.shell.desktopmode.DesktopTasksTransitionObserver;
108 import com.android.wm.shell.desktopmode.DesktopUserRepositories;
109 import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler;
110 import com.android.wm.shell.desktopmode.DragToDisplayTransitionHandler;
111 import com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler;
112 import com.android.wm.shell.desktopmode.ExitDesktopTaskTransitionHandler;
113 import com.android.wm.shell.desktopmode.OverviewToDesktopTransitionObserver;
114 import com.android.wm.shell.desktopmode.ReturnToDragStartAnimator;
115 import com.android.wm.shell.desktopmode.SpringDragToDesktopTransitionHandler;
116 import com.android.wm.shell.desktopmode.ToggleResizeDesktopTaskTransitionHandler;
117 import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository;
118 import com.android.wm.shell.desktopmode.compatui.SystemModalsTransitionHandler;
119 import com.android.wm.shell.desktopmode.desktopwallpaperactivity.DesktopWallpaperActivityTokenProvider;
120 import com.android.wm.shell.desktopmode.education.AppHandleEducationController;
121 import com.android.wm.shell.desktopmode.education.AppHandleEducationFilter;
122 import com.android.wm.shell.desktopmode.education.AppToWebEducationController;
123 import com.android.wm.shell.desktopmode.education.AppToWebEducationFilter;
124 import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository;
125 import com.android.wm.shell.desktopmode.education.data.AppToWebEducationDatastoreRepository;
126 import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer;
127 import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver;
128 import com.android.wm.shell.desktopmode.multidesks.RootTaskDesksOrganizer;
129 import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository;
130 import com.android.wm.shell.desktopmode.persistence.DesktopRepositoryInitializer;
131 import com.android.wm.shell.desktopmode.persistence.DesktopRepositoryInitializerImpl;
132 import com.android.wm.shell.draganddrop.DragAndDropController;
133 import com.android.wm.shell.draganddrop.GlobalDragListener;
134 import com.android.wm.shell.freeform.FreeformComponents;
135 import com.android.wm.shell.freeform.FreeformTaskListener;
136 import com.android.wm.shell.freeform.FreeformTaskTransitionHandler;
137 import com.android.wm.shell.freeform.FreeformTaskTransitionObserver;
138 import com.android.wm.shell.freeform.FreeformTaskTransitionStarter;
139 import com.android.wm.shell.freeform.FreeformTaskTransitionStarterInitializer;
140 import com.android.wm.shell.freeform.TaskChangeListener;
141 import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
142 import com.android.wm.shell.onehanded.OneHandedController;
143 import com.android.wm.shell.pip.PipTransitionController;
144 import com.android.wm.shell.recents.RecentTasksController;
145 import com.android.wm.shell.recents.RecentsTransitionHandler;
146 import com.android.wm.shell.shared.TransactionPool;
147 import com.android.wm.shell.shared.annotations.ShellAnimationThread;
148 import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
149 import com.android.wm.shell.shared.annotations.ShellDesktopThread;
150 import com.android.wm.shell.shared.annotations.ShellMainThread;
151 import com.android.wm.shell.shared.desktopmode.DesktopModeCompatPolicy;
152 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
153 import com.android.wm.shell.splitscreen.SplitScreenController;
154 import com.android.wm.shell.sysui.ShellCommandHandler;
155 import com.android.wm.shell.sysui.ShellController;
156 import com.android.wm.shell.sysui.ShellInit;
157 import com.android.wm.shell.taskview.TaskViewRepository;
158 import com.android.wm.shell.taskview.TaskViewTransitions;
159 import com.android.wm.shell.transition.DefaultMixedHandler;
160 import com.android.wm.shell.transition.FocusTransitionObserver;
161 import com.android.wm.shell.transition.HomeTransitionObserver;
162 import com.android.wm.shell.transition.MixedTransitionHandler;
163 import com.android.wm.shell.transition.Transitions;
164 import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
165 import com.android.wm.shell.unfold.UnfoldAnimationController;
166 import com.android.wm.shell.unfold.UnfoldBackgroundController;
167 import com.android.wm.shell.unfold.UnfoldTransitionHandler;
168 import com.android.wm.shell.unfold.animation.FullscreenUnfoldTaskAnimator;
169 import com.android.wm.shell.unfold.animation.SplitTaskUnfoldAnimator;
170 import com.android.wm.shell.unfold.animation.UnfoldTaskAnimator;
171 import com.android.wm.shell.unfold.qualifier.UnfoldShellTransition;
172 import com.android.wm.shell.unfold.qualifier.UnfoldTransition;
173 import com.android.wm.shell.windowdecor.CaptionWindowDecorViewModel;
174 import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel;
175 import com.android.wm.shell.windowdecor.WindowDecorViewModel;
176 import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer;
177 import com.android.wm.shell.windowdecor.common.AppHandleAndHeaderVisibilityHelper;
178 import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader;
179 import com.android.wm.shell.windowdecor.common.viewhost.DefaultWindowDecorViewHostSupplier;
180 import com.android.wm.shell.windowdecor.common.viewhost.PooledWindowDecorViewHostSupplier;
181 import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost;
182 import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier;
183 import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationPromoController;
184 import com.android.wm.shell.windowdecor.education.DesktopWindowingEducationTooltipController;
185 import com.android.wm.shell.windowdecor.tiling.DesktopTilingDecorViewModel;
186 
187 import dagger.Binds;
188 import dagger.Lazy;
189 import dagger.Module;
190 import dagger.Provides;
191 
192 import kotlinx.coroutines.CoroutineScope;
193 import kotlinx.coroutines.ExperimentalCoroutinesApi;
194 import kotlinx.coroutines.MainCoroutineDispatcher;
195 
196 import java.util.ArrayList;
197 import java.util.List;
198 import java.util.Optional;
199 
200 /**
201  * Provides dependencies from {@link com.android.wm.shell}, these dependencies are only accessible
202  * from components within the WM subcomponent (can be explicitly exposed to the SysUIComponent, see
203  * {@link WMComponent}).
204  *
205  * <p>This module only defines Shell dependencies for handheld SystemUI implementation. Common
206  * dependencies should go into {@link WMShellBaseModule}.
207  */
208 @Module(includes = {WMShellBaseModule.class, PipModule.class, ShellBackAnimationModule.class,
209         LetterboxModule.class})
210 public abstract class WMShellModule {
211 
212     //
213     // Bubbles
214     //
215 
216     @WMSingleton
217     @Provides
provideBubbleLogger(UiEventLogger uiEventLogger)218     static BubbleLogger provideBubbleLogger(UiEventLogger uiEventLogger) {
219         return new BubbleLogger(uiEventLogger);
220     }
221 
222     @WMSingleton
223     @Provides
provideBubblePositioner(Context context, WindowManager windowManager)224     static BubblePositioner provideBubblePositioner(Context context, WindowManager windowManager) {
225         return new BubblePositioner(context, windowManager);
226     }
227 
228     @WMSingleton
229     @Provides
provideBubbleEducationProvider(Context context)230     static BubbleEducationController provideBubbleEducationProvider(Context context) {
231         return new BubbleEducationController(context);
232     }
233 
234     @WMSingleton
235     @Provides
provideBubbleData( Context context, BubbleLogger logger, BubblePositioner positioner, BubbleEducationController educationController, @ShellMainThread ShellExecutor mainExecutor, @ShellBackgroundThread ShellExecutor bgExecutor)236     static BubbleData provideBubbleData(
237             Context context,
238             BubbleLogger logger,
239             BubblePositioner positioner,
240             BubbleEducationController educationController,
241             @ShellMainThread ShellExecutor mainExecutor,
242             @ShellBackgroundThread ShellExecutor bgExecutor) {
243         return new BubbleData(
244                 context, logger, positioner, educationController, mainExecutor, bgExecutor);
245     }
246 
247     @WMSingleton
248     @Provides
provideBubbleTaskUnfoldTransitionMerger( Optional<BubbleController> bubbleController)249     static Optional<BubbleTaskUnfoldTransitionMerger> provideBubbleTaskUnfoldTransitionMerger(
250             Optional<BubbleController> bubbleController) {
251         return bubbleController.map(controller -> controller);
252     }
253 
254     // Note: Handler needed for LauncherApps.register
255     @WMSingleton
256     @Provides
provideBubbleController( Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, BubbleData data, FloatingContentCoordinator floatingContentCoordinator, IStatusBarService statusBarService, WindowManager windowManager, DisplayInsetsController displayInsetsController, DisplayImeController displayImeController, 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, TaskViewRepository taskViewRepository, TaskViewTransitions taskViewTransitions, Transitions transitions, SyncTransactionQueue syncQueue, IWindowManager wmService)257     static BubbleController provideBubbleController(
258             Context context,
259             ShellInit shellInit,
260             ShellCommandHandler shellCommandHandler,
261             ShellController shellController,
262             BubbleData data,
263             FloatingContentCoordinator floatingContentCoordinator,
264             IStatusBarService statusBarService,
265             WindowManager windowManager,
266             DisplayInsetsController displayInsetsController,
267             DisplayImeController displayImeController,
268             UserManager userManager,
269             LauncherApps launcherApps,
270             TaskStackListenerImpl taskStackListener,
271             BubbleLogger logger,
272             ShellTaskOrganizer organizer,
273             BubblePositioner positioner,
274             DisplayController displayController,
275             @DynamicOverride Optional<OneHandedController> oneHandedOptional,
276             DragAndDropController dragAndDropController,
277             @ShellMainThread ShellExecutor mainExecutor,
278             @ShellMainThread Handler mainHandler,
279             @ShellBackgroundThread ShellExecutor bgExecutor,
280             TaskViewRepository taskViewRepository,
281             TaskViewTransitions taskViewTransitions,
282             Transitions transitions,
283             SyncTransactionQueue syncQueue,
284             IWindowManager wmService) {
285         return new BubbleController(
286                 context,
287                 shellInit,
288                 shellCommandHandler,
289                 shellController,
290                 data,
291                 null /* synchronizer */,
292                 floatingContentCoordinator,
293                 new BubbleDataRepository(
294                         launcherApps,
295                         mainExecutor,
296                         bgExecutor,
297                         new BubblePersistentRepository(context)),
298                 statusBarService,
299                 windowManager,
300                 displayInsetsController,
301                 displayImeController,
302                 userManager,
303                 launcherApps,
304                 logger,
305                 taskStackListener,
306                 organizer,
307                 positioner,
308                 displayController,
309                 oneHandedOptional,
310                 dragAndDropController,
311                 mainExecutor,
312                 mainHandler,
313                 bgExecutor,
314                 taskViewRepository,
315                 taskViewTransitions,
316                 transitions,
317                 syncQueue,
318                 wmService,
319                 new BubbleResizabilityChecker());
320     }
321 
322     //
323     // Window decoration
324     //
325 
326     @WMSingleton
327     @Provides
provideWindowDecorViewModel( Context context, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellMainThread Choreographer mainChoreographer, @ShellBackgroundThread ShellExecutor bgExecutor, ShellInit shellInit, IWindowManager windowManager, ShellTaskOrganizer taskOrganizer, DisplayController displayController, SyncTransactionQueue syncQueue, Transitions transitions, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, FocusTransitionObserver focusTransitionObserver, WindowDecorViewHostSupplier<WindowDecorViewHost> windowDecorViewHostSupplier, Optional<DesktopModeWindowDecorViewModel> desktopModeWindowDecorViewModel)328     static WindowDecorViewModel provideWindowDecorViewModel(
329             Context context,
330             @ShellMainThread ShellExecutor mainExecutor,
331             @ShellMainThread Handler mainHandler,
332             @ShellMainThread Choreographer mainChoreographer,
333             @ShellBackgroundThread ShellExecutor bgExecutor,
334             ShellInit shellInit,
335             IWindowManager windowManager,
336             ShellTaskOrganizer taskOrganizer,
337             DisplayController displayController,
338             SyncTransactionQueue syncQueue,
339             Transitions transitions,
340             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
341             FocusTransitionObserver focusTransitionObserver,
342             WindowDecorViewHostSupplier<WindowDecorViewHost> windowDecorViewHostSupplier,
343             Optional<DesktopModeWindowDecorViewModel> desktopModeWindowDecorViewModel) {
344         if (desktopModeWindowDecorViewModel.isPresent()) {
345             return desktopModeWindowDecorViewModel.get();
346         }
347         return new CaptionWindowDecorViewModel(
348                 context,
349                 mainHandler,
350                 mainExecutor,
351                 bgExecutor,
352                 mainChoreographer,
353                 windowManager,
354                 shellInit,
355                 taskOrganizer,
356                 displayController,
357                 rootTaskDisplayAreaOrganizer,
358                 syncQueue,
359                 transitions,
360                 focusTransitionObserver,
361                 windowDecorViewHostSupplier);
362     }
363 
364     @WMSingleton
365     @Provides
provideGenericLinksParser( Context context, @ShellMainThread ShellExecutor mainExecutor)366     static AppToWebGenericLinksParser provideGenericLinksParser(
367             Context context, @ShellMainThread ShellExecutor mainExecutor) {
368         return new AppToWebGenericLinksParser(context, mainExecutor);
369     }
370 
371     @Provides
provideAssistContentRequester( Context context, @ShellMainThread ShellExecutor shellExecutor, @ShellBackgroundThread ShellExecutor bgExecutor)372     static AssistContentRequester provideAssistContentRequester(
373             Context context,
374             @ShellMainThread ShellExecutor shellExecutor,
375             @ShellBackgroundThread ShellExecutor bgExecutor) {
376         return new AssistContentRequester(context, shellExecutor, bgExecutor);
377     }
378 
379     @Provides
provideAdditionalSystemViewContainerFactory()380     static AdditionalSystemViewContainer.Factory provideAdditionalSystemViewContainerFactory() {
381         return new AdditionalSystemViewContainer.Factory();
382     }
383 
384     @WMSingleton
385     @Provides
provideWindowDecorViewHostSupplier( @onNull Context context, @ShellMainThread @NonNull CoroutineScope mainScope, @NonNull ShellInit shellInit)386     static WindowDecorViewHostSupplier<WindowDecorViewHost> provideWindowDecorViewHostSupplier(
387             @NonNull Context context,
388             @ShellMainThread @NonNull CoroutineScope mainScope,
389             @NonNull ShellInit shellInit) {
390         final int poolSize = DesktopModeStatus.getWindowDecorScvhPoolSize(context);
391         final int preWarmSize = DesktopModeStatus.getWindowDecorPreWarmSize();
392         if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context) && poolSize > 0) {
393             return new PooledWindowDecorViewHostSupplier(
394                     context, mainScope, shellInit, poolSize, preWarmSize);
395         }
396         return new DefaultWindowDecorViewHostSupplier(mainScope);
397     }
398 
399     //
400     // Freeform
401     //
402 
403     @WMSingleton
404     @Provides
405     @DynamicOverride
provideFreeformComponents( FreeformTaskListener taskListener, FreeformTaskTransitionHandler transitionHandler, FreeformTaskTransitionObserver transitionObserver, FreeformTaskTransitionStarterInitializer transitionStarterInitializer)406     static FreeformComponents provideFreeformComponents(
407             FreeformTaskListener taskListener,
408             FreeformTaskTransitionHandler transitionHandler,
409             FreeformTaskTransitionObserver transitionObserver,
410             FreeformTaskTransitionStarterInitializer transitionStarterInitializer) {
411         return new FreeformComponents(
412                 taskListener,
413                 Optional.of(transitionHandler),
414                 Optional.of(transitionObserver),
415                 Optional.of(transitionStarterInitializer));
416     }
417 
418     @WMSingleton
419     @Provides
provideFreeformTaskListener( Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Optional<DesktopUserRepositories> desktopUserRepositories, Optional<DesktopTasksController> desktopTasksController, DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver, LaunchAdjacentController launchAdjacentController, WindowDecorViewModel windowDecorViewModel, Optional<TaskChangeListener> taskChangeListener)420     static FreeformTaskListener provideFreeformTaskListener(
421             Context context,
422             ShellInit shellInit,
423             ShellTaskOrganizer shellTaskOrganizer,
424             Optional<DesktopUserRepositories> desktopUserRepositories,
425             Optional<DesktopTasksController> desktopTasksController,
426             DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver,
427             LaunchAdjacentController launchAdjacentController,
428             WindowDecorViewModel windowDecorViewModel,
429             Optional<TaskChangeListener> taskChangeListener) {
430         // TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
431         //                    override for this controller from the base module
432         ShellInit init = FreeformComponents.requiresFreeformComponents(context) ? shellInit : null;
433         return new FreeformTaskListener(
434                 context,
435                 init,
436                 shellTaskOrganizer,
437                 desktopUserRepositories,
438                 desktopTasksController,
439                 desktopModeLoggerTransitionObserver,
440                 launchAdjacentController,
441                 windowDecorViewModel,
442                 taskChangeListener);
443     }
444 
445     @WMSingleton
446     @Provides
provideFreeformTaskTransitionHandler( Transitions transitions, DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor, @ShellAnimationThread ShellExecutor animExecutor, @ShellAnimationThread Handler animHandler)447     static FreeformTaskTransitionHandler provideFreeformTaskTransitionHandler(
448             Transitions transitions,
449             DisplayController displayController,
450             @ShellMainThread ShellExecutor mainExecutor,
451             @ShellAnimationThread ShellExecutor animExecutor,
452             @ShellAnimationThread Handler animHandler) {
453         return new FreeformTaskTransitionHandler(
454                 transitions, displayController, mainExecutor, animExecutor, animHandler);
455     }
456 
457     @WMSingleton
458     @Provides
provideFreeformTaskTransitionObserver( Context context, ShellInit shellInit, Transitions transitions, Optional<DesktopImmersiveController> desktopImmersiveController, WindowDecorViewModel windowDecorViewModel, Optional<TaskChangeListener> taskChangeListener, FocusTransitionObserver focusTransitionObserver, Optional<DesksTransitionObserver> desksTransitionObserver)459     static FreeformTaskTransitionObserver provideFreeformTaskTransitionObserver(
460             Context context,
461             ShellInit shellInit,
462             Transitions transitions,
463             Optional<DesktopImmersiveController> desktopImmersiveController,
464             WindowDecorViewModel windowDecorViewModel,
465             Optional<TaskChangeListener> taskChangeListener,
466             FocusTransitionObserver focusTransitionObserver,
467             Optional<DesksTransitionObserver> desksTransitionObserver) {
468         return new FreeformTaskTransitionObserver(
469                 context,
470                 shellInit,
471                 transitions,
472                 desktopImmersiveController,
473                 windowDecorViewModel,
474                 taskChangeListener,
475                 focusTransitionObserver,
476                 desksTransitionObserver);
477     }
478 
479     @WMSingleton
480     @Provides
provideFreeformTaskTransitionStarterInitializer( ShellInit shellInit, WindowDecorViewModel windowDecorViewModel, FreeformTaskTransitionHandler freeformTaskTransitionHandler, Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler)481     static FreeformTaskTransitionStarterInitializer provideFreeformTaskTransitionStarterInitializer(
482             ShellInit shellInit,
483             WindowDecorViewModel windowDecorViewModel,
484             FreeformTaskTransitionHandler freeformTaskTransitionHandler,
485             Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler) {
486         FreeformTaskTransitionStarter transitionStarter;
487         if (desktopMixedTransitionHandler.isPresent()) {
488             transitionStarter = desktopMixedTransitionHandler.get();
489         } else {
490             transitionStarter = freeformTaskTransitionHandler;
491         }
492         return new FreeformTaskTransitionStarterInitializer(
493                 shellInit, windowDecorViewModel, transitionStarter);
494     }
495 
496     //
497     // One handed mode
498     //
499 
500     // Needs the shell main handler for ContentObserver callbacks
501     @WMSingleton
502     @Provides
503     @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)504     static OneHandedController provideOneHandedController(
505             Context context,
506             ShellInit shellInit,
507             ShellCommandHandler shellCommandHandler,
508             ShellController shellController,
509             WindowManager windowManager,
510             DisplayController displayController,
511             DisplayLayout displayLayout,
512             TaskStackListenerImpl taskStackListener,
513             UiEventLogger uiEventLogger,
514             InteractionJankMonitor jankMonitor,
515             @ShellMainThread ShellExecutor mainExecutor,
516             @ShellMainThread Handler mainHandler) {
517         return OneHandedController.create(
518                 context,
519                 shellInit,
520                 shellCommandHandler,
521                 shellController,
522                 windowManager,
523                 displayController,
524                 displayLayout,
525                 taskStackListener,
526                 jankMonitor,
527                 uiEventLogger,
528                 mainExecutor,
529                 mainHandler);
530     }
531 
532     //
533     // Splitscreen
534     //
535 
536     @WMSingleton
537     @Provides
538     @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, LaunchAdjacentController launchAdjacentController, Optional<WindowDecorViewModel> windowDecorViewModel, Optional<DesktopTasksController> desktopTasksController, MultiInstanceHelper multiInstanceHelper, SplitState splitState, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler)539     static SplitScreenController provideSplitScreenController(
540             Context context,
541             ShellInit shellInit,
542             ShellCommandHandler shellCommandHandler,
543             ShellController shellController,
544             ShellTaskOrganizer shellTaskOrganizer,
545             SyncTransactionQueue syncQueue,
546             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
547             DisplayController displayController,
548             DisplayImeController displayImeController,
549             DisplayInsetsController displayInsetsController,
550             DragAndDropController dragAndDropController,
551             Transitions transitions,
552             TransactionPool transactionPool,
553             IconProvider iconProvider,
554             Optional<RecentTasksController> recentTasks,
555             LaunchAdjacentController launchAdjacentController,
556             Optional<WindowDecorViewModel> windowDecorViewModel,
557             Optional<DesktopTasksController> desktopTasksController,
558             MultiInstanceHelper multiInstanceHelper,
559             SplitState splitState,
560             @ShellMainThread ShellExecutor mainExecutor,
561             @ShellMainThread Handler mainHandler) {
562         return new SplitScreenController(
563                 context,
564                 shellInit,
565                 shellCommandHandler,
566                 shellController,
567                 shellTaskOrganizer,
568                 syncQueue,
569                 rootTaskDisplayAreaOrganizer,
570                 displayController,
571                 displayImeController,
572                 displayInsetsController,
573                 dragAndDropController,
574                 transitions,
575                 transactionPool,
576                 iconProvider,
577                 recentTasks,
578                 launchAdjacentController,
579                 windowDecorViewModel,
580                 desktopTasksController,
581                 null /* stageCoordinator */,
582                 multiInstanceHelper,
583                 splitState,
584                 mainExecutor,
585                 mainHandler);
586     }
587 
588     //
589     // Transitions
590     //
591 
592     @WMSingleton
593     @DynamicOverride
594     @Provides
provideMixedTransitionHandler( ShellInit shellInit, Optional<SplitScreenController> splitScreenOptional, @Nullable PipTransitionController pipTransitionController, Optional<RecentsTransitionHandler> recentsTransitionHandler, KeyguardTransitionHandler keyguardTransitionHandler, Optional<DesktopTasksController> desktopTasksController, Optional<UnfoldTransitionHandler> unfoldHandler, Optional<ActivityEmbeddingController> activityEmbeddingController, Transitions transitions)595     static MixedTransitionHandler provideMixedTransitionHandler(
596             ShellInit shellInit,
597             Optional<SplitScreenController> splitScreenOptional,
598             @Nullable PipTransitionController pipTransitionController,
599             Optional<RecentsTransitionHandler> recentsTransitionHandler,
600             KeyguardTransitionHandler keyguardTransitionHandler,
601             Optional<DesktopTasksController> desktopTasksController,
602             Optional<UnfoldTransitionHandler> unfoldHandler,
603             Optional<ActivityEmbeddingController> activityEmbeddingController,
604             Transitions transitions) {
605         return new DefaultMixedHandler(
606                 shellInit,
607                 transitions,
608                 splitScreenOptional,
609                 pipTransitionController,
610                 recentsTransitionHandler,
611                 keyguardTransitionHandler,
612                 desktopTasksController,
613                 unfoldHandler,
614                 activityEmbeddingController);
615     }
616 
617     @WMSingleton
618     @Provides
provideRecentsTransitionHandler( ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, Optional<RecentTasksController> recentTasksController, HomeTransitionObserver homeTransitionObserver)619     static RecentsTransitionHandler provideRecentsTransitionHandler(
620             ShellInit shellInit,
621             ShellTaskOrganizer shellTaskOrganizer,
622             Transitions transitions,
623             Optional<RecentTasksController> recentTasksController,
624             HomeTransitionObserver homeTransitionObserver) {
625         return new RecentsTransitionHandler(
626                 shellInit,
627                 shellTaskOrganizer,
628                 transitions,
629                 recentTasksController.orElse(null),
630                 homeTransitionObserver);
631     }
632 
633     //
634     // Unfold transition
635     //
636 
637     @WMSingleton
638     @Provides
639     @DynamicOverride
provideUnfoldAnimationController( Optional<ShellUnfoldProgressProvider> progressProvider, TransactionPool transactionPool, @UnfoldTransition SplitTaskUnfoldAnimator splitAnimator, FullscreenUnfoldTaskAnimator fullscreenAnimator, Lazy<Optional<UnfoldTransitionHandler>> unfoldTransitionHandler, ShellInit shellInit, @ShellMainThread ShellExecutor mainExecutor)640     static UnfoldAnimationController provideUnfoldAnimationController(
641             Optional<ShellUnfoldProgressProvider> progressProvider,
642             TransactionPool transactionPool,
643             @UnfoldTransition SplitTaskUnfoldAnimator splitAnimator,
644             FullscreenUnfoldTaskAnimator fullscreenAnimator,
645             Lazy<Optional<UnfoldTransitionHandler>> unfoldTransitionHandler,
646             ShellInit shellInit,
647             @ShellMainThread ShellExecutor mainExecutor) {
648         final List<UnfoldTaskAnimator> animators = new ArrayList<>();
649         animators.add(splitAnimator);
650         animators.add(fullscreenAnimator);
651 
652         return new UnfoldAnimationController(
653                 shellInit,
654                 transactionPool,
655                 progressProvider.get(),
656                 animators,
657                 unfoldTransitionHandler,
658                 mainExecutor);
659     }
660 
661     @Provides
provideFullscreenUnfoldTaskAnimator( Context context, UnfoldBackgroundController unfoldBackgroundController, ShellController shellController, DisplayInsetsController displayInsetsController)662     static FullscreenUnfoldTaskAnimator provideFullscreenUnfoldTaskAnimator(
663             Context context,
664             UnfoldBackgroundController unfoldBackgroundController,
665             ShellController shellController,
666             DisplayInsetsController displayInsetsController) {
667         return new FullscreenUnfoldTaskAnimator(
668                 context, unfoldBackgroundController, shellController, displayInsetsController);
669     }
670 
671     @Provides
provideSplitTaskUnfoldAnimatorBase( Context context, UnfoldBackgroundController backgroundController, ShellController shellController, @ShellMainThread ShellExecutor executor, Lazy<Optional<SplitScreenController>> splitScreenOptional, DisplayInsetsController displayInsetsController)672     static SplitTaskUnfoldAnimator provideSplitTaskUnfoldAnimatorBase(
673             Context context,
674             UnfoldBackgroundController backgroundController,
675             ShellController shellController,
676             @ShellMainThread ShellExecutor executor,
677             Lazy<Optional<SplitScreenController>> splitScreenOptional,
678             DisplayInsetsController displayInsetsController) {
679         // TODO(b/238217847): The lazy reference here causes some dependency issues since it
680         // immediately registers a listener on that controller on init.  We should reference the
681         // controller directly once we refactor ShellTaskOrganizer to not depend on the unfold
682         // animation controller directly.
683         return new SplitTaskUnfoldAnimator(
684                 context,
685                 executor,
686                 splitScreenOptional,
687                 shellController,
688                 backgroundController,
689                 displayInsetsController);
690     }
691 
692     @WMSingleton
693     @UnfoldShellTransition
694     @Binds
provideShellSplitTaskUnfoldAnimator( SplitTaskUnfoldAnimator splitTaskUnfoldAnimator)695     abstract SplitTaskUnfoldAnimator provideShellSplitTaskUnfoldAnimator(
696             SplitTaskUnfoldAnimator splitTaskUnfoldAnimator);
697 
698     @WMSingleton
699     @UnfoldTransition
700     @Binds
provideSplitTaskUnfoldAnimator( SplitTaskUnfoldAnimator splitTaskUnfoldAnimator)701     abstract SplitTaskUnfoldAnimator provideSplitTaskUnfoldAnimator(
702             SplitTaskUnfoldAnimator splitTaskUnfoldAnimator);
703 
704     @WMSingleton
705     @Provides
706     @DynamicOverride
provideUnfoldTransitionHandler( Optional<ShellUnfoldProgressProvider> progressProvider, FullscreenUnfoldTaskAnimator animator, @UnfoldShellTransition SplitTaskUnfoldAnimator unfoldAnimator, TransactionPool transactionPool, Transitions transitions, @ShellMainThread ShellExecutor executor, @ShellMainThread Handler handler, ShellInit shellInit, Optional<BubbleTaskUnfoldTransitionMerger> bubbleTaskUnfoldTransitionMerger)707     static UnfoldTransitionHandler provideUnfoldTransitionHandler(
708             Optional<ShellUnfoldProgressProvider> progressProvider,
709             FullscreenUnfoldTaskAnimator animator,
710             @UnfoldShellTransition SplitTaskUnfoldAnimator unfoldAnimator,
711             TransactionPool transactionPool,
712             Transitions transitions,
713             @ShellMainThread ShellExecutor executor,
714             @ShellMainThread Handler handler,
715             ShellInit shellInit,
716             Optional<BubbleTaskUnfoldTransitionMerger> bubbleTaskUnfoldTransitionMerger) {
717         return new UnfoldTransitionHandler(
718                 shellInit,
719                 progressProvider.get(),
720                 animator,
721                 unfoldAnimator,
722                 transactionPool,
723                 executor,
724                 handler,
725                 transitions,
726                 bubbleTaskUnfoldTransitionMerger);
727     }
728 
729     @WMSingleton
730     @Provides
provideUnfoldBackgroundController(Context context)731     static UnfoldBackgroundController provideUnfoldBackgroundController(Context context) {
732         return new UnfoldBackgroundController(context);
733     }
734 
735     //
736     // Desktop mode (optional feature)
737     //
738 
739     @WMSingleton
740     @Provides
provideDesksOrganizer( @onNull ShellInit shellInit, @NonNull ShellCommandHandler shellCommandHandler, @NonNull ShellTaskOrganizer shellTaskOrganizer, @NonNull LaunchAdjacentController launchAdjacentController )741     static DesksOrganizer provideDesksOrganizer(
742             @NonNull ShellInit shellInit,
743             @NonNull ShellCommandHandler shellCommandHandler,
744             @NonNull ShellTaskOrganizer shellTaskOrganizer,
745             @NonNull LaunchAdjacentController launchAdjacentController
746     ) {
747         return new RootTaskDesksOrganizer(shellInit, shellCommandHandler, shellTaskOrganizer,
748                 launchAdjacentController);
749     }
750 
751     @WMSingleton
752     @Provides
753     @DynamicOverride
provideDesktopTasksController( Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, DisplayController displayController, ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, DragAndDropController dragAndDropController, Transitions transitions, KeyguardManager keyguardManager, ReturnToDragStartAnimator returnToDragStartAnimator, Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler, EnterDesktopTaskTransitionHandler enterDesktopTransitionHandler, ExitDesktopTaskTransitionHandler exitDesktopTransitionHandler, DesktopModeDragAndDropTransitionHandler desktopModeDragAndDropTransitionHandler, ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler, DragToDesktopTransitionHandler dragToDesktopTransitionHandler, @DynamicOverride DesktopUserRepositories desktopUserRepositories, DesktopRepositoryInitializer desktopRepositoryInitializer, Optional<DesktopImmersiveController> desktopImmersiveController, DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver, LaunchAdjacentController launchAdjacentController, RecentsTransitionHandler recentsTransitionHandler, MultiInstanceHelper multiInstanceHelper, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellDesktopThread ShellExecutor desktopExecutor, Optional<DesktopTasksLimiter> desktopTasksLimiter, Optional<RecentTasksController> recentTasksController, InteractionJankMonitor interactionJankMonitor, InputManager inputManager, FocusTransitionObserver focusTransitionObserver, DesktopModeEventLogger desktopModeEventLogger, DesktopModeUiEventLogger desktopModeUiEventLogger, DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider, Optional<BubbleController> bubbleController, OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver, DesksOrganizer desksOrganizer, Optional<DesksTransitionObserver> desksTransitionObserver, UserProfileContexts userProfileContexts, DesktopModeCompatPolicy desktopModeCompatPolicy, DragToDisplayTransitionHandler dragToDisplayTransitionHandler, DesktopModeMoveToDisplayTransitionHandler moveToDisplayTransitionHandler, HomeIntentProvider homeIntentProvider)754     static DesktopTasksController provideDesktopTasksController(
755             Context context,
756             ShellInit shellInit,
757             ShellCommandHandler shellCommandHandler,
758             ShellController shellController,
759             DisplayController displayController,
760             ShellTaskOrganizer shellTaskOrganizer,
761             SyncTransactionQueue syncQueue,
762             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
763             DragAndDropController dragAndDropController,
764             Transitions transitions,
765             KeyguardManager keyguardManager,
766             ReturnToDragStartAnimator returnToDragStartAnimator,
767             Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler,
768             EnterDesktopTaskTransitionHandler enterDesktopTransitionHandler,
769             ExitDesktopTaskTransitionHandler exitDesktopTransitionHandler,
770             DesktopModeDragAndDropTransitionHandler desktopModeDragAndDropTransitionHandler,
771             ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler,
772             DragToDesktopTransitionHandler dragToDesktopTransitionHandler,
773             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
774             DesktopRepositoryInitializer desktopRepositoryInitializer,
775             Optional<DesktopImmersiveController> desktopImmersiveController,
776             DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver,
777             LaunchAdjacentController launchAdjacentController,
778             RecentsTransitionHandler recentsTransitionHandler,
779             MultiInstanceHelper multiInstanceHelper,
780             @ShellMainThread ShellExecutor mainExecutor,
781             @ShellMainThread Handler mainHandler,
782             @ShellDesktopThread ShellExecutor desktopExecutor,
783             Optional<DesktopTasksLimiter> desktopTasksLimiter,
784             Optional<RecentTasksController> recentTasksController,
785             InteractionJankMonitor interactionJankMonitor,
786             InputManager inputManager,
787             FocusTransitionObserver focusTransitionObserver,
788             DesktopModeEventLogger desktopModeEventLogger,
789             DesktopModeUiEventLogger desktopModeUiEventLogger,
790             DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
791             Optional<BubbleController> bubbleController,
792             OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver,
793             DesksOrganizer desksOrganizer,
794             Optional<DesksTransitionObserver> desksTransitionObserver,
795             UserProfileContexts userProfileContexts,
796             DesktopModeCompatPolicy desktopModeCompatPolicy,
797             DragToDisplayTransitionHandler dragToDisplayTransitionHandler,
798             DesktopModeMoveToDisplayTransitionHandler moveToDisplayTransitionHandler,
799             HomeIntentProvider homeIntentProvider) {
800         return new DesktopTasksController(
801                 context,
802                 shellInit,
803                 shellCommandHandler,
804                 shellController,
805                 displayController,
806                 shellTaskOrganizer,
807                 syncQueue,
808                 rootTaskDisplayAreaOrganizer,
809                 dragAndDropController,
810                 transitions,
811                 keyguardManager,
812                 returnToDragStartAnimator,
813                 desktopMixedTransitionHandler.get(),
814                 enterDesktopTransitionHandler,
815                 exitDesktopTransitionHandler,
816                 desktopModeDragAndDropTransitionHandler,
817                 toggleResizeDesktopTaskTransitionHandler,
818                 dragToDesktopTransitionHandler,
819                 desktopImmersiveController.get(),
820                 desktopUserRepositories,
821                 desktopRepositoryInitializer,
822                 recentsTransitionHandler,
823                 multiInstanceHelper,
824                 mainExecutor,
825                 desktopExecutor,
826                 desktopTasksLimiter,
827                 recentTasksController.orElse(null),
828                 interactionJankMonitor,
829                 mainHandler,
830                 focusTransitionObserver,
831                 desktopModeEventLogger,
832                 desktopModeUiEventLogger,
833                 desktopWallpaperActivityTokenProvider,
834                 bubbleController,
835                 overviewToDesktopTransitionObserver,
836                 desksOrganizer,
837                 desksTransitionObserver.get(),
838                 userProfileContexts,
839                 desktopModeCompatPolicy,
840                 dragToDisplayTransitionHandler,
841                 moveToDisplayTransitionHandler,
842                 homeIntentProvider);
843     }
844 
845     @WMSingleton
846     @Provides
provideDesktopTilingViewModel(Context context, @ShellMainThread MainCoroutineDispatcher mainDispatcher, @ShellBackgroundThread CoroutineScope bgScope, DisplayController displayController, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, SyncTransactionQueue syncQueue, Transitions transitions, ShellTaskOrganizer shellTaskOrganizer, ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler, ReturnToDragStartAnimator returnToDragStartAnimator, @DynamicOverride DesktopUserRepositories desktopUserRepositories, DesktopModeEventLogger desktopModeEventLogger, WindowDecorTaskResourceLoader windowDecorTaskResourceLoader, FocusTransitionObserver focusTransitionObserver, @ShellMainThread ShellExecutor mainExecutor)847     static DesktopTilingDecorViewModel provideDesktopTilingViewModel(Context context,
848             @ShellMainThread MainCoroutineDispatcher mainDispatcher,
849             @ShellBackgroundThread CoroutineScope bgScope,
850             DisplayController displayController,
851             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
852             SyncTransactionQueue syncQueue,
853             Transitions transitions,
854             ShellTaskOrganizer shellTaskOrganizer,
855             ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler,
856             ReturnToDragStartAnimator returnToDragStartAnimator,
857             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
858             DesktopModeEventLogger desktopModeEventLogger,
859             WindowDecorTaskResourceLoader windowDecorTaskResourceLoader,
860             FocusTransitionObserver focusTransitionObserver,
861             @ShellMainThread ShellExecutor mainExecutor) {
862         return new DesktopTilingDecorViewModel(
863                 context,
864                 mainDispatcher,
865                 bgScope,
866                 displayController,
867                 rootTaskDisplayAreaOrganizer,
868                 syncQueue,
869                 transitions,
870                 shellTaskOrganizer,
871                 toggleResizeDesktopTaskTransitionHandler,
872                 returnToDragStartAnimator,
873                 desktopUserRepositories,
874                 desktopModeEventLogger,
875                 windowDecorTaskResourceLoader,
876                 focusTransitionObserver,
877                 mainExecutor
878         );
879     }
880 
881     @WMSingleton
882     @Provides
provideDesktopTaskChangeListener( Context context, @DynamicOverride DesktopUserRepositories desktopUserRepositories)883     static Optional<TaskChangeListener> provideDesktopTaskChangeListener(
884             Context context, @DynamicOverride DesktopUserRepositories desktopUserRepositories) {
885         if (ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue()
886                 && DesktopModeStatus.canEnterDesktopMode(context)) {
887             return Optional.of(new DesktopTaskChangeListener(desktopUserRepositories));
888         }
889         return Optional.empty();
890     }
891 
892     @WMSingleton
893     @Provides
provideDesktopTasksLimiter( Context context, Transitions transitions, @DynamicOverride DesktopUserRepositories desktopUserRepositories, ShellTaskOrganizer shellTaskOrganizer, DesksOrganizer desksOrganizer, InteractionJankMonitor interactionJankMonitor, @ShellMainThread Handler handler)894     static Optional<DesktopTasksLimiter> provideDesktopTasksLimiter(
895             Context context,
896             Transitions transitions,
897             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
898             ShellTaskOrganizer shellTaskOrganizer,
899             DesksOrganizer desksOrganizer,
900             InteractionJankMonitor interactionJankMonitor,
901             @ShellMainThread Handler handler) {
902         int maxTaskLimit = DesktopModeStatus.getMaxTaskLimit(context);
903         if (!DesktopModeStatus.canEnterDesktopMode(context)
904                 || !ENABLE_DESKTOP_WINDOWING_TASK_LIMIT.isTrue()) {
905             return Optional.empty();
906         }
907         return Optional.of(
908                 new DesktopTasksLimiter(
909                         transitions,
910                         desktopUserRepositories,
911                         shellTaskOrganizer,
912                         desksOrganizer,
913                         maxTaskLimit <= 0 ? null : maxTaskLimit,
914                         interactionJankMonitor,
915                         context,
916                         handler));
917     }
918 
919     @WMSingleton
920     @Provides
provideDesktopImmersiveController( Context context, ShellInit shellInit, Transitions transitions, @DynamicOverride DesktopUserRepositories desktopUserRepositories, DisplayController displayController, ShellTaskOrganizer shellTaskOrganizer, ShellCommandHandler shellCommandHandler)921     static Optional<DesktopImmersiveController> provideDesktopImmersiveController(
922             Context context,
923             ShellInit shellInit,
924             Transitions transitions,
925             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
926             DisplayController displayController,
927             ShellTaskOrganizer shellTaskOrganizer,
928             ShellCommandHandler shellCommandHandler) {
929         if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) {
930             return Optional.of(
931                     new DesktopImmersiveController(
932                             shellInit,
933                             transitions,
934                             desktopUserRepositories,
935                             displayController,
936                             shellTaskOrganizer,
937                             shellCommandHandler));
938         }
939         return Optional.empty();
940     }
941 
942     @WMSingleton
943     @Provides
provideReturnToDragStartAnimator( InteractionJankMonitor interactionJankMonitor)944     static ReturnToDragStartAnimator provideReturnToDragStartAnimator(
945             InteractionJankMonitor interactionJankMonitor) {
946         return new ReturnToDragStartAnimator(interactionJankMonitor);
947     }
948 
949     @WMSingleton
950     @Provides
provideDragToDesktopTransitionHandler( Context context, Transitions transitions, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, @DynamicOverride DesktopUserRepositories desktopUserRepositories, InteractionJankMonitor interactionJankMonitor, Optional<BubbleController> bubbleController)951     static DragToDesktopTransitionHandler provideDragToDesktopTransitionHandler(
952             Context context,
953             Transitions transitions,
954             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
955             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
956             InteractionJankMonitor interactionJankMonitor,
957             Optional<BubbleController> bubbleController) {
958         return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue()
959                 ? new SpringDragToDesktopTransitionHandler(
960                 context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
961                 interactionJankMonitor, bubbleController)
962                 : new DefaultDragToDesktopTransitionHandler(
963                         context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
964                         interactionJankMonitor, bubbleController);
965     }
966 
967     @WMSingleton
968     @Provides
provideDesktopWallpaperActivityTokenProvider()969     static DesktopWallpaperActivityTokenProvider provideDesktopWallpaperActivityTokenProvider() {
970         return new DesktopWallpaperActivityTokenProvider();
971     }
972 
973     @WMSingleton
974     @Provides
provideDragToDisplayTransitionHandler()975     static DragToDisplayTransitionHandler provideDragToDisplayTransitionHandler() {
976         return new DragToDisplayTransitionHandler();
977     }
978 
979     @WMSingleton
980     @Provides
provideMoveToDisplayTransitionHandler( InteractionJankMonitor interactionJankMonitor, @ShellMainThread Handler shellMainHandler, DisplayController displayController)981     static DesktopModeMoveToDisplayTransitionHandler provideMoveToDisplayTransitionHandler(
982             InteractionJankMonitor interactionJankMonitor,
983             @ShellMainThread Handler shellMainHandler,
984             DisplayController displayController) {
985         return new DesktopModeMoveToDisplayTransitionHandler(
986                 new SurfaceControl.Transaction(),
987                 interactionJankMonitor,
988                 shellMainHandler,
989                 displayController);
990     }
991 
992     @WMSingleton
993     @Provides
provideDesktopModeKeyGestureHandler( Context context, Optional<DesktopModeWindowDecorViewModel> desktopModeWindowDecorViewModel, Optional<DesktopTasksController> desktopTasksController, InputManager inputManager, ShellTaskOrganizer shellTaskOrganizer, FocusTransitionObserver focusTransitionObserver, @ShellMainThread ShellExecutor mainExecutor, DisplayController displayController)994     static Optional<DesktopModeKeyGestureHandler> provideDesktopModeKeyGestureHandler(
995             Context context,
996             Optional<DesktopModeWindowDecorViewModel> desktopModeWindowDecorViewModel,
997             Optional<DesktopTasksController> desktopTasksController,
998             InputManager inputManager,
999             ShellTaskOrganizer shellTaskOrganizer,
1000             FocusTransitionObserver focusTransitionObserver,
1001             @ShellMainThread ShellExecutor mainExecutor,
1002             DisplayController displayController) {
1003         if (DesktopModeStatus.canEnterDesktopMode(context) && useKeyGestureEventHandler()
1004                 && manageKeyGestures()
1005                 && (Flags.enableMoveToNextDisplayShortcut()
1006                 || DesktopModeFlags.ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS.isTrue())) {
1007             return Optional.of(new DesktopModeKeyGestureHandler(context,
1008                     desktopModeWindowDecorViewModel, desktopTasksController,
1009                     inputManager, shellTaskOrganizer, focusTransitionObserver,
1010                     mainExecutor, displayController));
1011         }
1012         return Optional.empty();
1013     }
1014 
1015     @WMSingleton
1016     @Provides
provideDesktopModeWindowDecorViewModel( Context context, @ShellMainThread ShellExecutor shellExecutor, @ShellMainThread Handler mainHandler, @ShellMainThread Choreographer mainChoreographer, @ShellMainThread MainCoroutineDispatcher mainDispatcher, @ShellBackgroundThread CoroutineScope bgScope, @ShellBackgroundThread ShellExecutor bgExecutor, ShellInit shellInit, ShellCommandHandler shellCommandHandler, IWindowManager windowManager, ShellTaskOrganizer taskOrganizer, @DynamicOverride DesktopUserRepositories desktopUserRepositories, DisplayController displayController, ShellController shellController, DisplayInsetsController displayInsetsController, SyncTransactionQueue syncQueue, Transitions transitions, Optional<DesktopTasksController> desktopTasksController, Optional<DesktopImmersiveController> desktopImmersiveController, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, InteractionJankMonitor interactionJankMonitor, AppToWebGenericLinksParser genericLinksParser, AssistContentRequester assistContentRequester, WindowDecorViewHostSupplier<WindowDecorViewHost> windowDecorViewHostSupplier, MultiInstanceHelper multiInstanceHelper, Optional<DesktopTasksLimiter> desktopTasksLimiter, AppHandleEducationController appHandleEducationController, AppToWebEducationController appToWebEducationController, AppHandleAndHeaderVisibilityHelper appHandleAndHeaderVisibilityHelper, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler, FocusTransitionObserver focusTransitionObserver, DesktopModeEventLogger desktopModeEventLogger, DesktopModeUiEventLogger desktopModeUiEventLogger, WindowDecorTaskResourceLoader taskResourceLoader, RecentsTransitionHandler recentsTransitionHandler, DesktopModeCompatPolicy desktopModeCompatPolicy, DesktopTilingDecorViewModel desktopTilingDecorViewModel, MultiDisplayDragMoveIndicatorController multiDisplayDragMoveIndicatorController, Optional<CompatUIHandler> compatUI, DesksOrganizer desksOrganizer )1017     static Optional<DesktopModeWindowDecorViewModel> provideDesktopModeWindowDecorViewModel(
1018             Context context,
1019             @ShellMainThread ShellExecutor shellExecutor,
1020             @ShellMainThread Handler mainHandler,
1021             @ShellMainThread Choreographer mainChoreographer,
1022             @ShellMainThread MainCoroutineDispatcher mainDispatcher,
1023             @ShellBackgroundThread CoroutineScope bgScope,
1024             @ShellBackgroundThread ShellExecutor bgExecutor,
1025             ShellInit shellInit,
1026             ShellCommandHandler shellCommandHandler,
1027             IWindowManager windowManager,
1028             ShellTaskOrganizer taskOrganizer,
1029             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
1030             DisplayController displayController,
1031             ShellController shellController,
1032             DisplayInsetsController displayInsetsController,
1033             SyncTransactionQueue syncQueue,
1034             Transitions transitions,
1035             Optional<DesktopTasksController> desktopTasksController,
1036             Optional<DesktopImmersiveController> desktopImmersiveController,
1037             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
1038             InteractionJankMonitor interactionJankMonitor,
1039             AppToWebGenericLinksParser genericLinksParser,
1040             AssistContentRequester assistContentRequester,
1041             WindowDecorViewHostSupplier<WindowDecorViewHost> windowDecorViewHostSupplier,
1042             MultiInstanceHelper multiInstanceHelper,
1043             Optional<DesktopTasksLimiter> desktopTasksLimiter,
1044             AppHandleEducationController appHandleEducationController,
1045             AppToWebEducationController appToWebEducationController,
1046             AppHandleAndHeaderVisibilityHelper appHandleAndHeaderVisibilityHelper,
1047             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
1048             Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler,
1049             FocusTransitionObserver focusTransitionObserver,
1050             DesktopModeEventLogger desktopModeEventLogger,
1051             DesktopModeUiEventLogger desktopModeUiEventLogger,
1052             WindowDecorTaskResourceLoader taskResourceLoader,
1053             RecentsTransitionHandler recentsTransitionHandler,
1054             DesktopModeCompatPolicy desktopModeCompatPolicy,
1055             DesktopTilingDecorViewModel desktopTilingDecorViewModel,
1056             MultiDisplayDragMoveIndicatorController multiDisplayDragMoveIndicatorController,
1057             Optional<CompatUIHandler> compatUI,
1058             DesksOrganizer desksOrganizer
1059     ) {
1060         if (!DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) {
1061             return Optional.empty();
1062         }
1063         return Optional.of(new DesktopModeWindowDecorViewModel(context, shellExecutor, mainHandler,
1064                 mainChoreographer, mainDispatcher, bgScope, bgExecutor,
1065                 shellInit, shellCommandHandler, windowManager,
1066                 taskOrganizer, desktopUserRepositories, displayController, shellController,
1067                 displayInsetsController, syncQueue, transitions, desktopTasksController,
1068                 desktopImmersiveController.get(),
1069                 rootTaskDisplayAreaOrganizer, interactionJankMonitor, genericLinksParser,
1070                 assistContentRequester, windowDecorViewHostSupplier, multiInstanceHelper,
1071                 desktopTasksLimiter, appHandleEducationController, appToWebEducationController,
1072                 appHandleAndHeaderVisibilityHelper, windowDecorCaptionHandleRepository,
1073                 activityOrientationChangeHandler, focusTransitionObserver, desktopModeEventLogger,
1074                 desktopModeUiEventLogger, taskResourceLoader, recentsTransitionHandler,
1075                 desktopModeCompatPolicy, desktopTilingDecorViewModel,
1076                 multiDisplayDragMoveIndicatorController, compatUI.orElse(null),
1077                 desksOrganizer));
1078     }
1079 
1080     @WMSingleton
1081     @Provides
1082     static MultiDisplayDragMoveIndicatorController
providesMultiDisplayDragMoveIndicatorController( DisplayController displayController, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, MultiDisplayDragMoveIndicatorSurface.Factory multiDisplayDragMoveIndicatorSurfaceFactory, @ShellDesktopThread ShellExecutor desktopExecutor )1083             providesMultiDisplayDragMoveIndicatorController(
1084             DisplayController displayController,
1085             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
1086             MultiDisplayDragMoveIndicatorSurface.Factory
1087                 multiDisplayDragMoveIndicatorSurfaceFactory,
1088             @ShellDesktopThread ShellExecutor desktopExecutor
1089     ) {
1090         return new MultiDisplayDragMoveIndicatorController(
1091                 displayController, rootTaskDisplayAreaOrganizer,
1092                 multiDisplayDragMoveIndicatorSurfaceFactory, desktopExecutor);
1093     }
1094 
1095     @WMSingleton
1096     @Provides
1097     static MultiDisplayDragMoveIndicatorSurface.Factory
providesMultiDisplayDragMoveIndicatorSurfaceFactory(Context context)1098             providesMultiDisplayDragMoveIndicatorSurfaceFactory(Context context) {
1099         return new MultiDisplayDragMoveIndicatorSurface.Factory(context);
1100     }
1101 
1102     @WMSingleton
1103     @Provides
provideAppHandleAndHeaderVisibilityHelper( @onNull Context context, @NonNull DisplayController displayController, @NonNull DesktopModeCompatPolicy desktopModeCompatPolicy)1104     static AppHandleAndHeaderVisibilityHelper provideAppHandleAndHeaderVisibilityHelper(
1105             @NonNull Context context,
1106             @NonNull DisplayController displayController,
1107             @NonNull DesktopModeCompatPolicy desktopModeCompatPolicy) {
1108         return new AppHandleAndHeaderVisibilityHelper(context, displayController,
1109                 desktopModeCompatPolicy);
1110     }
1111 
1112     @WMSingleton
1113     @Provides
provideWindowDecorTaskResourceLoader( @onNull Context context, @NonNull ShellInit shellInit, @NonNull ShellController shellController, @NonNull ShellCommandHandler shellCommandHandler, @NonNull UserProfileContexts userProfileContexts)1114     static WindowDecorTaskResourceLoader provideWindowDecorTaskResourceLoader(
1115             @NonNull Context context, @NonNull ShellInit shellInit,
1116             @NonNull ShellController shellController,
1117             @NonNull ShellCommandHandler shellCommandHandler,
1118             @NonNull UserProfileContexts userProfileContexts) {
1119         return new WindowDecorTaskResourceLoader(context, shellInit, shellController,
1120                 shellCommandHandler, userProfileContexts);
1121     }
1122 
1123     @WMSingleton
1124     @Provides
provideSystemModalsTransitionHandler( Context context, @ShellMainThread ShellExecutor mainExecutor, @ShellAnimationThread ShellExecutor animExecutor, ShellInit shellInit, Transitions transitions, @DynamicOverride DesktopUserRepositories desktopUserRepositories, DesktopModeCompatPolicy desktopModeCompatPolicy)1125     static Optional<SystemModalsTransitionHandler> provideSystemModalsTransitionHandler(
1126             Context context,
1127             @ShellMainThread ShellExecutor mainExecutor,
1128             @ShellAnimationThread ShellExecutor animExecutor,
1129             ShellInit shellInit,
1130             Transitions transitions,
1131             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
1132             DesktopModeCompatPolicy desktopModeCompatPolicy) {
1133         if (!DesktopModeStatus.canEnterDesktopMode(context)
1134                 || !ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue()
1135                 || !ENABLE_DESKTOP_SYSTEM_DIALOGS_TRANSITIONS.isTrue()) {
1136             return Optional.empty();
1137         }
1138         return Optional.of(
1139                 new SystemModalsTransitionHandler(
1140                         context, mainExecutor, animExecutor, shellInit, transitions,
1141                         desktopUserRepositories, desktopModeCompatPolicy));
1142     }
1143 
1144     @WMSingleton
1145     @Provides
provideEnterDesktopModeTaskTransitionHandler( Transitions transitions, Optional<DesktopTasksLimiter> desktopTasksLimiter, InteractionJankMonitor interactionJankMonitor, LatencyTracker latencyTracker)1146     static EnterDesktopTaskTransitionHandler provideEnterDesktopModeTaskTransitionHandler(
1147             Transitions transitions,
1148             Optional<DesktopTasksLimiter> desktopTasksLimiter,
1149             InteractionJankMonitor interactionJankMonitor,
1150             LatencyTracker latencyTracker) {
1151         return new EnterDesktopTaskTransitionHandler(
1152                 transitions, interactionJankMonitor, latencyTracker);
1153     }
1154 
1155     @WMSingleton
1156     @Provides
provideToggleResizeDesktopTaskTransitionHandler( Transitions transitions, InteractionJankMonitor interactionJankMonitor)1157     static ToggleResizeDesktopTaskTransitionHandler provideToggleResizeDesktopTaskTransitionHandler(
1158             Transitions transitions, InteractionJankMonitor interactionJankMonitor) {
1159         return new ToggleResizeDesktopTaskTransitionHandler(transitions, interactionJankMonitor);
1160     }
1161 
1162     @WMSingleton
1163     @Provides
provideExitDesktopTaskTransitionHandler( Transitions transitions, Context context, InteractionJankMonitor interactionJankMonitor, @ShellMainThread Handler handler)1164     static ExitDesktopTaskTransitionHandler provideExitDesktopTaskTransitionHandler(
1165             Transitions transitions,
1166             Context context,
1167             InteractionJankMonitor interactionJankMonitor,
1168             @ShellMainThread Handler handler) {
1169         return new ExitDesktopTaskTransitionHandler(
1170                 transitions, context, interactionJankMonitor, handler);
1171     }
1172 
1173     @WMSingleton
1174     @Provides
provideCloseDesktopTaskTransitionHandler( Context context, @ShellMainThread ShellExecutor mainExecutor, @ShellAnimationThread ShellExecutor animExecutor, @ShellAnimationThread Handler animHandler)1175     static CloseDesktopTaskTransitionHandler provideCloseDesktopTaskTransitionHandler(
1176             Context context,
1177             @ShellMainThread ShellExecutor mainExecutor,
1178             @ShellAnimationThread ShellExecutor animExecutor,
1179             @ShellAnimationThread Handler animHandler) {
1180         return new CloseDesktopTaskTransitionHandler(context, mainExecutor, animExecutor,
1181                 animHandler);
1182     }
1183 
1184     @WMSingleton
1185     @Provides
provideDesktopMinimizationTransitionHandler( @hellMainThread ShellExecutor mainExecutor, @ShellAnimationThread ShellExecutor animExecutor, DisplayController displayController, @ShellAnimationThread Handler mainHandler)1186     static DesktopMinimizationTransitionHandler provideDesktopMinimizationTransitionHandler(
1187             @ShellMainThread ShellExecutor mainExecutor,
1188             @ShellAnimationThread ShellExecutor animExecutor,
1189             DisplayController displayController,
1190             @ShellAnimationThread Handler mainHandler) {
1191         return new DesktopMinimizationTransitionHandler(mainExecutor, animExecutor,
1192                 displayController, mainHandler);
1193     }
1194 
1195     @WMSingleton
1196     @Provides
provideDesktopModeDragAndDropTransitionHandler( Transitions transitions)1197     static DesktopModeDragAndDropTransitionHandler provideDesktopModeDragAndDropTransitionHandler(
1198             Transitions transitions) {
1199         return new DesktopModeDragAndDropTransitionHandler(transitions);
1200     }
1201 
1202     @WMSingleton
1203     @Provides
1204     @DynamicOverride
provideDesktopUserRepositories( Context context, ShellInit shellInit, ShellController shellController, DesktopPersistentRepository desktopPersistentRepository, DesktopRepositoryInitializer desktopRepositoryInitializer, @ShellMainThread CoroutineScope mainScope, UserManager userManager )1205     static DesktopUserRepositories provideDesktopUserRepositories(
1206             Context context,
1207             ShellInit shellInit,
1208             ShellController shellController,
1209             DesktopPersistentRepository desktopPersistentRepository,
1210             DesktopRepositoryInitializer desktopRepositoryInitializer,
1211             @ShellMainThread CoroutineScope mainScope,
1212             UserManager userManager
1213     ) {
1214         return new DesktopUserRepositories(context, shellInit, shellController,
1215                 desktopPersistentRepository,
1216                 desktopRepositoryInitializer,
1217                 mainScope, userManager);
1218     }
1219 
1220     @WMSingleton
1221     @Provides
provideActivityOrientationHandler( Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, TaskStackListenerImpl taskStackListener, ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler, @DynamicOverride DesktopUserRepositories desktopUserRepositories, DisplayController displayController)1222     static Optional<DesktopActivityOrientationChangeHandler> provideActivityOrientationHandler(
1223             Context context,
1224             ShellInit shellInit,
1225             ShellTaskOrganizer shellTaskOrganizer,
1226             TaskStackListenerImpl taskStackListener,
1227             ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler,
1228             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
1229             DisplayController displayController) {
1230         if (DesktopModeStatus.canEnterDesktopMode(context)) {
1231             return Optional.of(
1232                     new DesktopActivityOrientationChangeHandler(
1233                             context,
1234                             shellInit,
1235                             shellTaskOrganizer,
1236                             taskStackListener,
1237                             toggleResizeDesktopTaskTransitionHandler,
1238                             desktopUserRepositories,
1239                             displayController));
1240         }
1241         return Optional.empty();
1242     }
1243 
1244     @WMSingleton
1245     @Provides
provideDesktopTasksTransitionObserver( Context context, Optional<DesktopUserRepositories> desktopUserRepositories, Transitions transitions, ShellTaskOrganizer shellTaskOrganizer, Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler, Optional<BackAnimationController> backAnimationController, DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider, ShellInit shellInit)1246     static Optional<DesktopTasksTransitionObserver> provideDesktopTasksTransitionObserver(
1247             Context context,
1248             Optional<DesktopUserRepositories> desktopUserRepositories,
1249             Transitions transitions,
1250             ShellTaskOrganizer shellTaskOrganizer,
1251             Optional<DesktopMixedTransitionHandler> desktopMixedTransitionHandler,
1252             Optional<BackAnimationController> backAnimationController,
1253             DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
1254             ShellInit shellInit) {
1255         return desktopUserRepositories.flatMap(
1256                 repository ->
1257                         Optional.of(
1258                                 new DesktopTasksTransitionObserver(
1259                                         context,
1260                                         repository,
1261                                         transitions,
1262                                         shellTaskOrganizer,
1263                                         desktopMixedTransitionHandler.get(),
1264                                         backAnimationController.get(),
1265                                         desktopWallpaperActivityTokenProvider,
1266                                         shellInit)));
1267     }
1268 
1269     @WMSingleton
1270     @Provides
provideDesksTransitionObserver( Context context, @DynamicOverride DesktopUserRepositories desktopUserRepositories, @NonNull DesksOrganizer desksOrganizer )1271     static Optional<DesksTransitionObserver> provideDesksTransitionObserver(
1272             Context context,
1273             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
1274             @NonNull DesksOrganizer desksOrganizer
1275     ) {
1276         if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) {
1277             return Optional.of(
1278                     new DesksTransitionObserver(desktopUserRepositories, desksOrganizer));
1279         }
1280         return Optional.empty();
1281     }
1282 
1283     @WMSingleton
1284     @Provides
provideDesktopMixedTransitionHandler( Context context, Transitions transitions, @DynamicOverride DesktopUserRepositories desktopUserRepositories, FreeformTaskTransitionHandler freeformTaskTransitionHandler, CloseDesktopTaskTransitionHandler closeDesktopTaskTransitionHandler, Optional<DesktopImmersiveController> desktopImmersiveController, DesktopMinimizationTransitionHandler desktopMinimizationTransitionHandler, InteractionJankMonitor interactionJankMonitor, @ShellMainThread Handler handler, ShellInit shellInit, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer )1285     static Optional<DesktopMixedTransitionHandler> provideDesktopMixedTransitionHandler(
1286             Context context,
1287             Transitions transitions,
1288             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
1289             FreeformTaskTransitionHandler freeformTaskTransitionHandler,
1290             CloseDesktopTaskTransitionHandler closeDesktopTaskTransitionHandler,
1291             Optional<DesktopImmersiveController> desktopImmersiveController,
1292             DesktopMinimizationTransitionHandler desktopMinimizationTransitionHandler,
1293             InteractionJankMonitor interactionJankMonitor,
1294             @ShellMainThread Handler handler,
1295             ShellInit shellInit,
1296             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer
1297     ) {
1298         if (!DesktopModeStatus.canEnterDesktopMode(context)
1299                 && !DesktopModeStatus.overridesShowAppHandle(context)) {
1300             return Optional.empty();
1301         }
1302         return Optional.of(
1303                 new DesktopMixedTransitionHandler(
1304                         context,
1305                         transitions,
1306                         desktopUserRepositories,
1307                         freeformTaskTransitionHandler,
1308                         closeDesktopTaskTransitionHandler,
1309                         desktopImmersiveController.get(),
1310                         desktopMinimizationTransitionHandler,
1311                         interactionJankMonitor,
1312                         handler,
1313                         shellInit,
1314                         rootTaskDisplayAreaOrganizer));
1315     }
1316 
1317     @WMSingleton
1318     @Provides
provideDesktopModeLoggerTransitionObserver( Context context, ShellInit shellInit, Transitions transitions, DesktopModeEventLogger desktopModeEventLogger, Optional<DesktopTasksLimiter> desktopTasksLimiter, ShellTaskOrganizer shellTaskOrganizer)1319     static DesktopModeLoggerTransitionObserver provideDesktopModeLoggerTransitionObserver(
1320             Context context,
1321             ShellInit shellInit,
1322             Transitions transitions,
1323             DesktopModeEventLogger desktopModeEventLogger,
1324             Optional<DesktopTasksLimiter> desktopTasksLimiter,
1325             ShellTaskOrganizer shellTaskOrganizer) {
1326         return new DesktopModeLoggerTransitionObserver(
1327                 context, shellInit, transitions, desktopModeEventLogger,
1328                 desktopTasksLimiter, shellTaskOrganizer);
1329     }
1330 
1331     @WMSingleton
1332     @Provides
provideDesktopModeEventLogger()1333     static DesktopModeEventLogger provideDesktopModeEventLogger() {
1334         return new DesktopModeEventLogger();
1335     }
1336 
1337     @WMSingleton
1338     @Provides
provideDesktopDisplayEventHandler( Context context, ShellInit shellInit, @ShellMainThread CoroutineScope mainScope, ShellController shellController, DisplayController displayController, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, Optional<DesktopUserRepositories> desktopUserRepositories, Optional<DesktopTasksController> desktopTasksController, Optional<DesktopDisplayModeController> desktopDisplayModeController, DesktopRepositoryInitializer desktopRepositoryInitializer )1339     static Optional<DesktopDisplayEventHandler> provideDesktopDisplayEventHandler(
1340             Context context,
1341             ShellInit shellInit,
1342             @ShellMainThread CoroutineScope mainScope,
1343             ShellController shellController,
1344             DisplayController displayController,
1345             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
1346             Optional<DesktopUserRepositories> desktopUserRepositories,
1347             Optional<DesktopTasksController> desktopTasksController,
1348             Optional<DesktopDisplayModeController> desktopDisplayModeController,
1349             DesktopRepositoryInitializer desktopRepositoryInitializer
1350     ) {
1351         if (!DesktopModeStatus.canEnterDesktopMode(context)) {
1352             return Optional.empty();
1353         }
1354         return Optional.of(
1355                 new DesktopDisplayEventHandler(
1356                         context,
1357                         shellInit,
1358                         mainScope,
1359                         shellController,
1360                         displayController,
1361                         rootTaskDisplayAreaOrganizer,
1362                         desktopRepositoryInitializer,
1363                         desktopUserRepositories.get(),
1364                         desktopTasksController.get(),
1365                         desktopDisplayModeController.get()));
1366     }
1367 
1368     @WMSingleton
1369     @Provides
provideAppHandleEducationDatastoreRepository( Context context)1370     static AppHandleEducationDatastoreRepository provideAppHandleEducationDatastoreRepository(
1371             Context context) {
1372         return new AppHandleEducationDatastoreRepository(context);
1373     }
1374 
1375     @WMSingleton
1376     @Provides
provideAppHandleEducationFilter( Context context, AppHandleEducationDatastoreRepository appHandleEducationDatastoreRepository)1377     static AppHandleEducationFilter provideAppHandleEducationFilter(
1378             Context context,
1379             AppHandleEducationDatastoreRepository appHandleEducationDatastoreRepository) {
1380         return new AppHandleEducationFilter(context, appHandleEducationDatastoreRepository);
1381     }
1382 
1383     @WMSingleton
1384     @Provides
provideAppHandleRepository()1385     static WindowDecorCaptionHandleRepository provideAppHandleRepository() {
1386         return new WindowDecorCaptionHandleRepository();
1387     }
1388 
1389     @WMSingleton
1390     @Provides
1391     static DesktopWindowingEducationTooltipController
provideDesktopWindowingEducationTooltipController( Context context, AdditionalSystemViewContainer.Factory additionalSystemViewContainerFactory, DisplayController displayController)1392     provideDesktopWindowingEducationTooltipController(
1393             Context context,
1394             AdditionalSystemViewContainer.Factory additionalSystemViewContainerFactory,
1395             DisplayController displayController) {
1396         return new DesktopWindowingEducationTooltipController(
1397                 context, additionalSystemViewContainerFactory, displayController);
1398     }
1399 
1400     @WMSingleton
1401     @Provides
provideDesktopWindowingEducationPromoController( Context context, AdditionalSystemViewContainer.Factory additionalSystemViewContainerFactory, DisplayController displayController )1402     static DesktopWindowingEducationPromoController provideDesktopWindowingEducationPromoController(
1403             Context context,
1404             AdditionalSystemViewContainer.Factory additionalSystemViewContainerFactory,
1405             DisplayController displayController
1406     ) {
1407         return new DesktopWindowingEducationPromoController(
1408                 context,
1409                 additionalSystemViewContainerFactory,
1410                 displayController
1411         );
1412     }
1413 
1414     @OptIn(markerClass = ExperimentalCoroutinesApi.class)
1415     @WMSingleton
1416     @Provides
provideAppHandleEducationController( Context context, AppHandleEducationFilter appHandleEducationFilter, AppHandleEducationDatastoreRepository appHandleEducationDatastoreRepository, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController, @ShellMainThread CoroutineScope applicationScope, @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher, DesktopModeUiEventLogger desktopModeUiEventLogger)1417     static AppHandleEducationController provideAppHandleEducationController(
1418             Context context,
1419             AppHandleEducationFilter appHandleEducationFilter,
1420             AppHandleEducationDatastoreRepository appHandleEducationDatastoreRepository,
1421             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
1422             DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController,
1423             @ShellMainThread CoroutineScope applicationScope,
1424             @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher,
1425             DesktopModeUiEventLogger desktopModeUiEventLogger) {
1426         return new AppHandleEducationController(
1427                 context,
1428                 appHandleEducationFilter,
1429                 appHandleEducationDatastoreRepository,
1430                 windowDecorCaptionHandleRepository,
1431                 desktopWindowingEducationTooltipController,
1432                 applicationScope,
1433                 backgroundDispatcher,
1434                 desktopModeUiEventLogger);
1435     }
1436 
1437     @WMSingleton
1438     @Provides
provideAppToWebEducationDatastoreRepository( Context context)1439     static AppToWebEducationDatastoreRepository provideAppToWebEducationDatastoreRepository(
1440             Context context) {
1441         return new AppToWebEducationDatastoreRepository(context);
1442     }
1443 
1444     @WMSingleton
1445     @Provides
provideAppToWebEducationFilter( Context context, AppToWebEducationDatastoreRepository appToWebEducationDatastoreRepository)1446     static AppToWebEducationFilter provideAppToWebEducationFilter(
1447             Context context,
1448             AppToWebEducationDatastoreRepository appToWebEducationDatastoreRepository) {
1449         return new AppToWebEducationFilter(context, appToWebEducationDatastoreRepository);
1450     }
1451 
1452     @OptIn(markerClass = ExperimentalCoroutinesApi.class)
1453     @WMSingleton
1454     @Provides
provideAppToWebEducationController( Context context, AppToWebEducationFilter appToWebEducationFilter, AppToWebEducationDatastoreRepository appToWebEducationDatastoreRepository, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, DesktopWindowingEducationPromoController desktopWindowingEducationPromoController, @ShellMainThread CoroutineScope applicationScope, @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher)1455     static AppToWebEducationController provideAppToWebEducationController(
1456             Context context,
1457             AppToWebEducationFilter appToWebEducationFilter,
1458             AppToWebEducationDatastoreRepository appToWebEducationDatastoreRepository,
1459             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
1460             DesktopWindowingEducationPromoController desktopWindowingEducationPromoController,
1461             @ShellMainThread CoroutineScope applicationScope,
1462             @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher) {
1463         return new AppToWebEducationController(context, appToWebEducationFilter,
1464                 appToWebEducationDatastoreRepository, windowDecorCaptionHandleRepository,
1465                 desktopWindowingEducationPromoController, applicationScope,
1466                 backgroundDispatcher);
1467     }
1468 
1469     @WMSingleton
1470     @Provides
provideDesktopPersistentRepository( Context context, @ShellBackgroundThread CoroutineScope bgScope)1471     static DesktopPersistentRepository provideDesktopPersistentRepository(
1472             Context context, @ShellBackgroundThread CoroutineScope bgScope) {
1473         return new DesktopPersistentRepository(context, bgScope);
1474     }
1475 
1476     @WMSingleton
1477     @Provides
provideDesktopRepositoryInitializer( Context context, DesktopPersistentRepository desktopPersistentRepository, @ShellMainThread CoroutineScope mainScope)1478     static DesktopRepositoryInitializer provideDesktopRepositoryInitializer(
1479             Context context,
1480             DesktopPersistentRepository desktopPersistentRepository,
1481             @ShellMainThread CoroutineScope mainScope) {
1482         return new DesktopRepositoryInitializerImpl(context, desktopPersistentRepository,
1483                 mainScope);
1484     }
1485 
1486     @WMSingleton
1487     @Provides
provideDesktopUiEventLogger( UiEventLogger uiEventLogger, PackageManager packageManager )1488     static DesktopModeUiEventLogger provideDesktopUiEventLogger(
1489             UiEventLogger uiEventLogger,
1490             PackageManager packageManager
1491     ) {
1492         return new DesktopModeUiEventLogger(uiEventLogger, packageManager);
1493     }
1494 
1495     @WMSingleton
1496     @Provides
provideDesktopDisplayModeController( Context context, Transitions transitions, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, IWindowManager windowManager, ShellTaskOrganizer shellTaskOrganizer, DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider, InputManager inputManager, DisplayController displayController, @ShellMainThread Handler mainHandler )1497     static Optional<DesktopDisplayModeController> provideDesktopDisplayModeController(
1498             Context context,
1499             Transitions transitions,
1500             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
1501             IWindowManager windowManager,
1502             ShellTaskOrganizer shellTaskOrganizer,
1503             DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
1504             InputManager inputManager,
1505             DisplayController displayController,
1506             @ShellMainThread Handler mainHandler
1507     ) {
1508         if (!DesktopModeStatus.canEnterDesktopMode(context)) {
1509             return Optional.empty();
1510         }
1511         return Optional.of(
1512                 new DesktopDisplayModeController(
1513                         context,
1514                         transitions,
1515                         rootTaskDisplayAreaOrganizer,
1516                         windowManager,
1517                         shellTaskOrganizer,
1518                         desktopWallpaperActivityTokenProvider,
1519                         inputManager,
1520                         displayController,
1521                         mainHandler));
1522     }
1523 
1524     @WMSingleton
1525     @Provides
provideDesktopImeHandler( DisplayImeController displayImeController, Context context, ShellInit shellInit)1526     static Optional<DesktopImeHandler> provideDesktopImeHandler(
1527             DisplayImeController displayImeController,
1528             Context context,
1529             ShellInit shellInit) {
1530         if (!DesktopModeStatus.canEnterDesktopMode(context)) {
1531             return Optional.empty();
1532         }
1533         return Optional.of(new DesktopImeHandler(displayImeController, shellInit));
1534     }
1535 
1536     //
1537     // App zoom out
1538     //
1539 
1540     @WMSingleton
1541     @Provides
provideAppZoomOutController( Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, DisplayController displayController, DisplayLayout displayLayout, @ShellMainThread ShellExecutor mainExecutor)1542     static AppZoomOutController provideAppZoomOutController(
1543             Context context,
1544             ShellInit shellInit,
1545             ShellTaskOrganizer shellTaskOrganizer,
1546             DisplayController displayController,
1547             DisplayLayout displayLayout,
1548             @ShellMainThread ShellExecutor mainExecutor) {
1549         return AppZoomOutController.create(context, shellInit, shellTaskOrganizer,
1550                 displayController, displayLayout, mainExecutor);
1551     }
1552 
1553     //
1554     // Drag and drop
1555     //
1556 
1557     @WMSingleton
1558     @Provides
provideGlobalDragListener( IWindowManager wmService, @ShellMainThread ShellExecutor mainExecutor)1559     static GlobalDragListener provideGlobalDragListener(
1560             IWindowManager wmService, @ShellMainThread ShellExecutor mainExecutor) {
1561         return new GlobalDragListener(wmService, mainExecutor);
1562     }
1563 
1564     @WMSingleton
1565     @Provides
provideDragAndDropController( Context context, ShellInit shellInit, ShellController shellController, ShellCommandHandler shellCommandHandler, ShellTaskOrganizer shellTaskOrganizer, DisplayController displayController, UiEventLogger uiEventLogger, IconProvider iconProvider, GlobalDragListener globalDragListener, Transitions transitions, Lazy<BubbleController> bubbleControllerLazy, @ShellMainThread ShellExecutor mainExecutor)1566     static DragAndDropController provideDragAndDropController(
1567             Context context,
1568             ShellInit shellInit,
1569             ShellController shellController,
1570             ShellCommandHandler shellCommandHandler,
1571             ShellTaskOrganizer shellTaskOrganizer,
1572             DisplayController displayController,
1573             UiEventLogger uiEventLogger,
1574             IconProvider iconProvider,
1575             GlobalDragListener globalDragListener,
1576             Transitions transitions,
1577             Lazy<BubbleController> bubbleControllerLazy,
1578             @ShellMainThread ShellExecutor mainExecutor) {
1579         return new DragAndDropController(
1580                 context,
1581                 shellInit,
1582                 shellController,
1583                 shellCommandHandler,
1584                 shellTaskOrganizer,
1585                 displayController,
1586                 uiEventLogger,
1587                 iconProvider,
1588                 globalDragListener,
1589                 transitions,
1590                 new Lazy<>() {
1591                     @Override
1592                     public BubbleBarDragListener get() {
1593                         return bubbleControllerLazy.get();
1594                     }
1595                 },
1596                 mainExecutor);
1597     }
1598 
1599     //
1600     // Misc
1601     //
1602 
1603     // TODO: Temporarily move dependencies to this instead of ShellInit since that is needed to add
1604     // the callback. We will be moving to a different explicit startup mechanism in a follow- up CL.
1605     @WMSingleton
1606     @ShellCreateTriggerOverride
1607     @Provides
1608     static Object provideIndependentShellComponentsToCreate(
1609             DragAndDropController dragAndDropController,
1610             @NonNull LetterboxTransitionObserver letterboxTransitionObserver,
1611             @NonNull LetterboxCommandHandler letterboxCommandHandler,
1612             Optional<DesktopTasksTransitionObserver> desktopTasksTransitionObserverOptional,
1613             Optional<DesktopDisplayEventHandler> desktopDisplayEventHandler,
1614             Optional<DesktopModeKeyGestureHandler> desktopModeKeyGestureHandler,
1615             Optional<SystemModalsTransitionHandler> systemModalsTransitionHandler,
1616             ShellCrashHandler shellCrashHandler) {
1617         return new Object();
1618     }
1619 
1620     @WMSingleton
1621     @Provides
1622     static OverviewToDesktopTransitionObserver provideOverviewToDesktopTransitionObserver(
1623             Transitions transitions, ShellInit shellInit) {
1624         return new OverviewToDesktopTransitionObserver(transitions, shellInit);
1625     }
1626 
1627     @WMSingleton
1628     @Provides
1629     static UserProfileContexts provideUserProfilesContexts(
1630             Context context,
1631             ShellController shellController,
1632             ShellInit shellInit) {
1633         return new UserProfileContexts(context, shellController, shellInit);
1634     }
1635 
1636     @WMSingleton
1637     @Provides
1638     static ShellCrashHandler provideShellCrashHandler(
1639             Context context,
1640             ShellTaskOrganizer shellTaskOrganizer,
1641             HomeIntentProvider homeIntentProvider,
1642             ShellInit shellInit) {
1643         return new ShellCrashHandler(context, shellTaskOrganizer, homeIntentProvider, shellInit);
1644     }
1645 
1646     @WMSingleton
1647     @Provides
1648     static HomeIntentProvider provideHomeIntentProvider(Context context) {
1649         return new HomeIntentProvider(context);
1650     }
1651 
1652 }
1653