1 /* 2 * Copyright (C) 2023 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.pip; 18 19 import android.content.Context; 20 import android.os.Handler; 21 22 import com.android.wm.shell.ShellTaskOrganizer; 23 import com.android.wm.shell.WindowManagerShellWrapper; 24 import com.android.wm.shell.common.DisplayController; 25 import com.android.wm.shell.common.DisplayInsetsController; 26 import com.android.wm.shell.common.FloatingContentCoordinator; 27 import com.android.wm.shell.common.ShellExecutor; 28 import com.android.wm.shell.common.SyncTransactionQueue; 29 import com.android.wm.shell.common.SystemWindows; 30 import com.android.wm.shell.common.TabletopModeController; 31 import com.android.wm.shell.common.TaskStackListenerImpl; 32 import com.android.wm.shell.common.annotations.ShellMainThread; 33 import com.android.wm.shell.common.pip.PhonePipKeepClearAlgorithm; 34 import com.android.wm.shell.common.pip.PipAppOpsListener; 35 import com.android.wm.shell.common.pip.PipBoundsAlgorithm; 36 import com.android.wm.shell.common.pip.PipBoundsState; 37 import com.android.wm.shell.common.pip.PipDisplayLayoutState; 38 import com.android.wm.shell.common.pip.PipMediaController; 39 import com.android.wm.shell.common.pip.PipSnapAlgorithm; 40 import com.android.wm.shell.common.pip.PipUiEventLogger; 41 import com.android.wm.shell.common.pip.PipUtils; 42 import com.android.wm.shell.common.pip.SizeSpecSource; 43 import com.android.wm.shell.dagger.WMShellBaseModule; 44 import com.android.wm.shell.dagger.WMSingleton; 45 import com.android.wm.shell.onehanded.OneHandedController; 46 import com.android.wm.shell.pip.Pip; 47 import com.android.wm.shell.pip.PipAnimationController; 48 import com.android.wm.shell.pip.PipParamsChangedForwarder; 49 import com.android.wm.shell.pip.PipSurfaceTransactionHelper; 50 import com.android.wm.shell.pip.PipTaskOrganizer; 51 import com.android.wm.shell.pip.PipTransition; 52 import com.android.wm.shell.pip.PipTransitionController; 53 import com.android.wm.shell.pip.PipTransitionState; 54 import com.android.wm.shell.pip.phone.PhonePipMenuController; 55 import com.android.wm.shell.pip.phone.PipController; 56 import com.android.wm.shell.pip.phone.PipMotionHelper; 57 import com.android.wm.shell.pip.phone.PipTouchHandler; 58 import com.android.wm.shell.splitscreen.SplitScreenController; 59 import com.android.wm.shell.sysui.ShellCommandHandler; 60 import com.android.wm.shell.sysui.ShellController; 61 import com.android.wm.shell.sysui.ShellInit; 62 import com.android.wm.shell.transition.Transitions; 63 64 import dagger.Module; 65 import dagger.Provides; 66 67 import java.util.Optional; 68 69 /** 70 * Provides dependencies from {@link com.android.wm.shell.pip}, this implementation is meant to be 71 * replaced by the sibling {@link Pip2Module}. 72 */ 73 @Module(includes = { 74 Pip1SharedModule.class, 75 WMShellBaseModule.class 76 }) 77 public abstract class Pip1Module { 78 @WMSingleton 79 @Provides providePip1(Context context, ShellInit shellInit, ShellCommandHandler shellCommandHandler, ShellController shellController, DisplayController displayController, PipAnimationController pipAnimationController, PipAppOpsListener pipAppOpsListener, PipBoundsAlgorithm pipBoundsAlgorithm, PhonePipKeepClearAlgorithm pipKeepClearAlgorithm, PipBoundsState pipBoundsState, PipDisplayLayoutState pipDisplayLayoutState, 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)80 static Optional<Pip> providePip1(Context context, 81 ShellInit shellInit, 82 ShellCommandHandler shellCommandHandler, 83 ShellController shellController, 84 DisplayController displayController, 85 PipAnimationController pipAnimationController, 86 PipAppOpsListener pipAppOpsListener, 87 PipBoundsAlgorithm pipBoundsAlgorithm, 88 PhonePipKeepClearAlgorithm pipKeepClearAlgorithm, 89 PipBoundsState pipBoundsState, 90 PipDisplayLayoutState pipDisplayLayoutState, 91 PipMotionHelper pipMotionHelper, 92 PipMediaController pipMediaController, 93 PhonePipMenuController phonePipMenuController, 94 PipTaskOrganizer pipTaskOrganizer, 95 PipTransitionState pipTransitionState, 96 PipTouchHandler pipTouchHandler, 97 PipTransitionController pipTransitionController, 98 WindowManagerShellWrapper windowManagerShellWrapper, 99 TaskStackListenerImpl taskStackListener, 100 PipParamsChangedForwarder pipParamsChangedForwarder, 101 DisplayInsetsController displayInsetsController, 102 TabletopModeController pipTabletopController, 103 Optional<OneHandedController> oneHandedController, 104 @ShellMainThread ShellExecutor mainExecutor) { 105 if (PipUtils.isPip2ExperimentEnabled()) { 106 return Optional.empty(); 107 } else { 108 return Optional.ofNullable(PipController.create( 109 context, shellInit, shellCommandHandler, shellController, 110 displayController, pipAnimationController, pipAppOpsListener, 111 pipBoundsAlgorithm, 112 pipKeepClearAlgorithm, pipBoundsState, pipDisplayLayoutState, 113 pipMotionHelper, pipMediaController, phonePipMenuController, pipTaskOrganizer, 114 pipTransitionState, pipTouchHandler, pipTransitionController, 115 windowManagerShellWrapper, taskStackListener, pipParamsChangedForwarder, 116 displayInsetsController, pipTabletopController, oneHandedController, 117 mainExecutor)); 118 } 119 } 120 121 // Handler is used by Icon.loadDrawableAsync 122 @WMSingleton 123 @Provides providesPipPhoneMenuController(Context context, PipBoundsState pipBoundsState, PipMediaController pipMediaController, SystemWindows systemWindows, Optional<SplitScreenController> splitScreenOptional, PipUiEventLogger pipUiEventLogger, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler)124 static PhonePipMenuController providesPipPhoneMenuController(Context context, 125 PipBoundsState pipBoundsState, PipMediaController pipMediaController, 126 SystemWindows systemWindows, 127 Optional<SplitScreenController> splitScreenOptional, 128 PipUiEventLogger pipUiEventLogger, 129 @ShellMainThread ShellExecutor mainExecutor, 130 @ShellMainThread Handler mainHandler) { 131 return new PhonePipMenuController(context, pipBoundsState, pipMediaController, 132 systemWindows, splitScreenOptional, pipUiEventLogger, mainExecutor, mainHandler); 133 } 134 135 @WMSingleton 136 @Provides providePipTouchHandler(Context context, ShellInit shellInit, PhonePipMenuController menuPhoneController, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, SizeSpecSource sizeSpecSource, PipTaskOrganizer pipTaskOrganizer, PipMotionHelper pipMotionHelper, FloatingContentCoordinator floatingContentCoordinator, PipUiEventLogger pipUiEventLogger, @ShellMainThread ShellExecutor mainExecutor)137 static PipTouchHandler providePipTouchHandler(Context context, 138 ShellInit shellInit, 139 PhonePipMenuController menuPhoneController, 140 PipBoundsAlgorithm pipBoundsAlgorithm, 141 PipBoundsState pipBoundsState, 142 SizeSpecSource sizeSpecSource, 143 PipTaskOrganizer pipTaskOrganizer, 144 PipMotionHelper pipMotionHelper, 145 FloatingContentCoordinator floatingContentCoordinator, 146 PipUiEventLogger pipUiEventLogger, 147 @ShellMainThread ShellExecutor mainExecutor) { 148 return new PipTouchHandler(context, shellInit, menuPhoneController, pipBoundsAlgorithm, 149 pipBoundsState, sizeSpecSource, pipTaskOrganizer, pipMotionHelper, 150 floatingContentCoordinator, pipUiEventLogger, mainExecutor); 151 } 152 153 @WMSingleton 154 @Provides providePipTransitionState()155 static PipTransitionState providePipTransitionState() { 156 return new PipTransitionState(); 157 } 158 159 @WMSingleton 160 @Provides providePipTaskOrganizer(Context context, SyncTransactionQueue syncTransactionQueue, PipTransitionState pipTransitionState, PipBoundsState pipBoundsState, PipDisplayLayoutState pipDisplayLayoutState, PipBoundsAlgorithm pipBoundsAlgorithm, PhonePipMenuController menuPhoneController, PipAnimationController pipAnimationController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, PipTransitionController pipTransitionController, PipParamsChangedForwarder pipParamsChangedForwarder, Optional<SplitScreenController> splitScreenControllerOptional, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor)161 static PipTaskOrganizer providePipTaskOrganizer(Context context, 162 SyncTransactionQueue syncTransactionQueue, 163 PipTransitionState pipTransitionState, 164 PipBoundsState pipBoundsState, 165 PipDisplayLayoutState pipDisplayLayoutState, 166 PipBoundsAlgorithm pipBoundsAlgorithm, 167 PhonePipMenuController menuPhoneController, 168 PipAnimationController pipAnimationController, 169 PipSurfaceTransactionHelper pipSurfaceTransactionHelper, 170 PipTransitionController pipTransitionController, 171 PipParamsChangedForwarder pipParamsChangedForwarder, 172 Optional<SplitScreenController> splitScreenControllerOptional, 173 DisplayController displayController, 174 PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, 175 @ShellMainThread ShellExecutor mainExecutor) { 176 return new PipTaskOrganizer(context, 177 syncTransactionQueue, pipTransitionState, pipBoundsState, pipDisplayLayoutState, 178 pipBoundsAlgorithm, menuPhoneController, pipAnimationController, 179 pipSurfaceTransactionHelper, pipTransitionController, pipParamsChangedForwarder, 180 splitScreenControllerOptional, displayController, pipUiEventLogger, 181 shellTaskOrganizer, mainExecutor); 182 } 183 184 @WMSingleton 185 @Provides providePipTransition(Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, PipDisplayLayoutState pipDisplayLayoutState, PipTransitionState pipTransitionState, PhonePipMenuController pipMenuController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional<SplitScreenController> splitScreenOptional)186 static PipTransition providePipTransition(Context context, 187 ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, 188 PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm, 189 PipBoundsState pipBoundsState, PipDisplayLayoutState pipDisplayLayoutState, 190 PipTransitionState pipTransitionState, PhonePipMenuController pipMenuController, 191 PipSurfaceTransactionHelper pipSurfaceTransactionHelper, 192 Optional<SplitScreenController> splitScreenOptional) { 193 return new PipTransition(context, shellInit, shellTaskOrganizer, transitions, 194 pipBoundsState, pipDisplayLayoutState, pipTransitionState, pipMenuController, 195 pipBoundsAlgorithm, pipAnimationController, pipSurfaceTransactionHelper, 196 splitScreenOptional); 197 } 198 199 @WMSingleton 200 @Provides providePipAppOpsListener(Context context, PipTouchHandler pipTouchHandler, @ShellMainThread ShellExecutor mainExecutor)201 static PipAppOpsListener providePipAppOpsListener(Context context, 202 PipTouchHandler pipTouchHandler, 203 @ShellMainThread ShellExecutor mainExecutor) { 204 return new PipAppOpsListener(context, pipTouchHandler.getMotionHelper(), mainExecutor); 205 } 206 207 @WMSingleton 208 @Provides providePipMotionHelper(Context context, PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, PhonePipMenuController menuController, PipSnapAlgorithm pipSnapAlgorithm, PipTransitionController pipTransitionController, FloatingContentCoordinator floatingContentCoordinator)209 static PipMotionHelper providePipMotionHelper(Context context, 210 PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, 211 PhonePipMenuController menuController, PipSnapAlgorithm pipSnapAlgorithm, 212 PipTransitionController pipTransitionController, 213 FloatingContentCoordinator floatingContentCoordinator) { 214 return new PipMotionHelper(context, pipBoundsState, pipTaskOrganizer, 215 menuController, pipSnapAlgorithm, pipTransitionController, 216 floatingContentCoordinator); 217 } 218 219 @WMSingleton 220 @Provides providePipParamsChangedForwarder()221 static PipParamsChangedForwarder providePipParamsChangedForwarder() { 222 return new PipParamsChangedForwarder(); 223 } 224 } 225