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