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