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