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.os.Handler; 21 import android.os.SystemClock; 22 23 import com.android.wm.shell.ShellTaskOrganizer; 24 import com.android.wm.shell.WindowManagerShellWrapper; 25 import com.android.wm.shell.common.DisplayController; 26 import com.android.wm.shell.common.ShellExecutor; 27 import com.android.wm.shell.common.SyncTransactionQueue; 28 import com.android.wm.shell.common.SystemWindows; 29 import com.android.wm.shell.common.TaskStackListenerImpl; 30 import com.android.wm.shell.common.annotations.ShellMainThread; 31 import com.android.wm.shell.pip.Pip; 32 import com.android.wm.shell.pip.PipAnimationController; 33 import com.android.wm.shell.pip.PipAppOpsListener; 34 import com.android.wm.shell.pip.PipMediaController; 35 import com.android.wm.shell.pip.PipParamsChangedForwarder; 36 import com.android.wm.shell.pip.PipSnapAlgorithm; 37 import com.android.wm.shell.pip.PipSurfaceTransactionHelper; 38 import com.android.wm.shell.pip.PipTaskOrganizer; 39 import com.android.wm.shell.pip.PipTransitionController; 40 import com.android.wm.shell.pip.PipTransitionState; 41 import com.android.wm.shell.pip.PipUiEventLogger; 42 import com.android.wm.shell.pip.phone.PipSizeSpecHandler; 43 import com.android.wm.shell.pip.tv.TvPipBoundsAlgorithm; 44 import com.android.wm.shell.pip.tv.TvPipBoundsController; 45 import com.android.wm.shell.pip.tv.TvPipBoundsState; 46 import com.android.wm.shell.pip.tv.TvPipController; 47 import com.android.wm.shell.pip.tv.TvPipMenuController; 48 import com.android.wm.shell.pip.tv.TvPipNotificationController; 49 import com.android.wm.shell.pip.tv.TvPipTaskOrganizer; 50 import com.android.wm.shell.pip.tv.TvPipTransition; 51 import com.android.wm.shell.splitscreen.SplitScreenController; 52 import com.android.wm.shell.sysui.ShellController; 53 import com.android.wm.shell.sysui.ShellInit; 54 import com.android.wm.shell.transition.Transitions; 55 56 import java.util.Optional; 57 58 import dagger.Module; 59 import dagger.Provides; 60 61 /** 62 * Provides TV specific dependencies for Pip. 63 */ 64 @Module(includes = {WMShellBaseModule.class}) 65 public abstract class TvPipModule { 66 @WMSingleton 67 @Provides providePip( Context context, ShellInit shellInit, ShellController shellController, TvPipBoundsState tvPipBoundsState, PipSizeSpecHandler pipSizeSpecHandler, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, TvPipBoundsController tvPipBoundsController, PipAppOpsListener pipAppOpsListener, PipTaskOrganizer pipTaskOrganizer, TvPipMenuController tvPipMenuController, PipMediaController pipMediaController, PipTransitionController pipTransitionController, TvPipNotificationController tvPipNotificationController, TaskStackListenerImpl taskStackListener, PipParamsChangedForwarder pipParamsChangedForwarder, DisplayController displayController, WindowManagerShellWrapper windowManagerShellWrapper, @ShellMainThread ShellExecutor mainExecutor)68 static Optional<Pip> providePip( 69 Context context, 70 ShellInit shellInit, 71 ShellController shellController, 72 TvPipBoundsState tvPipBoundsState, 73 PipSizeSpecHandler pipSizeSpecHandler, 74 TvPipBoundsAlgorithm tvPipBoundsAlgorithm, 75 TvPipBoundsController tvPipBoundsController, 76 PipAppOpsListener pipAppOpsListener, 77 PipTaskOrganizer pipTaskOrganizer, 78 TvPipMenuController tvPipMenuController, 79 PipMediaController pipMediaController, 80 PipTransitionController pipTransitionController, 81 TvPipNotificationController tvPipNotificationController, 82 TaskStackListenerImpl taskStackListener, 83 PipParamsChangedForwarder pipParamsChangedForwarder, 84 DisplayController displayController, 85 WindowManagerShellWrapper windowManagerShellWrapper, 86 @ShellMainThread ShellExecutor mainExecutor) { 87 return Optional.of( 88 TvPipController.create( 89 context, 90 shellInit, 91 shellController, 92 tvPipBoundsState, 93 pipSizeSpecHandler, 94 tvPipBoundsAlgorithm, 95 tvPipBoundsController, 96 pipAppOpsListener, 97 pipTaskOrganizer, 98 pipTransitionController, 99 tvPipMenuController, 100 pipMediaController, 101 tvPipNotificationController, 102 taskStackListener, 103 pipParamsChangedForwarder, 104 displayController, 105 windowManagerShellWrapper, 106 mainExecutor)); 107 } 108 109 @WMSingleton 110 @Provides provideTvPipBoundsController( Context context, @ShellMainThread Handler mainHandler, TvPipBoundsState tvPipBoundsState, TvPipBoundsAlgorithm tvPipBoundsAlgorithm)111 static TvPipBoundsController provideTvPipBoundsController( 112 Context context, 113 @ShellMainThread Handler mainHandler, 114 TvPipBoundsState tvPipBoundsState, 115 TvPipBoundsAlgorithm tvPipBoundsAlgorithm) { 116 return new TvPipBoundsController( 117 context, 118 SystemClock::uptimeMillis, 119 mainHandler, 120 tvPipBoundsState, 121 tvPipBoundsAlgorithm); 122 } 123 124 @WMSingleton 125 @Provides providePipSnapAlgorithm()126 static PipSnapAlgorithm providePipSnapAlgorithm() { 127 return new PipSnapAlgorithm(); 128 } 129 130 @WMSingleton 131 @Provides provideTvPipBoundsAlgorithm(Context context, TvPipBoundsState tvPipBoundsState, PipSnapAlgorithm pipSnapAlgorithm, PipSizeSpecHandler pipSizeSpecHandler)132 static TvPipBoundsAlgorithm provideTvPipBoundsAlgorithm(Context context, 133 TvPipBoundsState tvPipBoundsState, PipSnapAlgorithm pipSnapAlgorithm, 134 PipSizeSpecHandler pipSizeSpecHandler) { 135 return new TvPipBoundsAlgorithm(context, tvPipBoundsState, pipSnapAlgorithm, 136 pipSizeSpecHandler); 137 } 138 139 @WMSingleton 140 @Provides provideTvPipBoundsState(Context context, PipSizeSpecHandler pipSizeSpecHandler)141 static TvPipBoundsState provideTvPipBoundsState(Context context, 142 PipSizeSpecHandler pipSizeSpecHandler) { 143 return new TvPipBoundsState(context, pipSizeSpecHandler); 144 } 145 146 @WMSingleton 147 @Provides providePipSizeSpecHelper(Context context)148 static PipSizeSpecHandler providePipSizeSpecHelper(Context context) { 149 return new PipSizeSpecHandler(context); 150 } 151 152 // Handler needed for loadDrawableAsync() in PipControlsViewController 153 @WMSingleton 154 @Provides provideTvPipTransition( ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, PipAnimationController pipAnimationController, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, TvPipBoundsState tvPipBoundsState, TvPipMenuController pipMenuController)155 static PipTransitionController provideTvPipTransition( 156 ShellInit shellInit, 157 ShellTaskOrganizer shellTaskOrganizer, 158 Transitions transitions, 159 PipAnimationController pipAnimationController, 160 TvPipBoundsAlgorithm tvPipBoundsAlgorithm, 161 TvPipBoundsState tvPipBoundsState, TvPipMenuController pipMenuController) { 162 return new TvPipTransition(shellInit, shellTaskOrganizer, transitions, tvPipBoundsState, 163 pipMenuController, tvPipBoundsAlgorithm, pipAnimationController); 164 } 165 166 @WMSingleton 167 @Provides providesTvPipMenuController( Context context, TvPipBoundsState tvPipBoundsState, SystemWindows systemWindows, PipMediaController pipMediaController, @ShellMainThread Handler mainHandler)168 static TvPipMenuController providesTvPipMenuController( 169 Context context, 170 TvPipBoundsState tvPipBoundsState, 171 SystemWindows systemWindows, 172 PipMediaController pipMediaController, 173 @ShellMainThread Handler mainHandler) { 174 return new TvPipMenuController(context, tvPipBoundsState, systemWindows, pipMediaController, 175 mainHandler); 176 } 177 178 // Handler needed for registerReceiverForAllUsers() 179 @WMSingleton 180 @Provides provideTvPipNotificationController(Context context, PipMediaController pipMediaController, PipParamsChangedForwarder pipParamsChangedForwarder, TvPipBoundsState tvPipBoundsState, @ShellMainThread Handler mainHandler)181 static TvPipNotificationController provideTvPipNotificationController(Context context, 182 PipMediaController pipMediaController, 183 PipParamsChangedForwarder pipParamsChangedForwarder, 184 TvPipBoundsState tvPipBoundsState, 185 @ShellMainThread Handler mainHandler) { 186 return new TvPipNotificationController(context, pipMediaController, 187 pipParamsChangedForwarder, tvPipBoundsState, mainHandler); 188 } 189 190 @WMSingleton 191 @Provides providePipAnimationController(PipSurfaceTransactionHelper pipSurfaceTransactionHelper)192 static PipAnimationController providePipAnimationController(PipSurfaceTransactionHelper 193 pipSurfaceTransactionHelper) { 194 return new PipAnimationController(pipSurfaceTransactionHelper); 195 } 196 197 @WMSingleton 198 @Provides providePipTransitionState()199 static PipTransitionState providePipTransitionState() { 200 return new PipTransitionState(); 201 } 202 203 @WMSingleton 204 @Provides providePipTaskOrganizer(Context context, TvPipMenuController tvPipMenuController, SyncTransactionQueue syncTransactionQueue, TvPipBoundsState tvPipBoundsState, PipSizeSpecHandler pipSizeSpecHandler, PipTransitionState pipTransitionState, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, PipAnimationController pipAnimationController, PipTransitionController pipTransitionController, PipParamsChangedForwarder pipParamsChangedForwarder, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional<SplitScreenController> splitScreenControllerOptional, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor)205 static PipTaskOrganizer providePipTaskOrganizer(Context context, 206 TvPipMenuController tvPipMenuController, 207 SyncTransactionQueue syncTransactionQueue, 208 TvPipBoundsState tvPipBoundsState, 209 PipSizeSpecHandler pipSizeSpecHandler, 210 PipTransitionState pipTransitionState, 211 TvPipBoundsAlgorithm tvPipBoundsAlgorithm, 212 PipAnimationController pipAnimationController, 213 PipTransitionController pipTransitionController, 214 PipParamsChangedForwarder pipParamsChangedForwarder, 215 PipSurfaceTransactionHelper pipSurfaceTransactionHelper, 216 Optional<SplitScreenController> splitScreenControllerOptional, 217 DisplayController displayController, 218 PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, 219 @ShellMainThread ShellExecutor mainExecutor) { 220 return new TvPipTaskOrganizer(context, 221 syncTransactionQueue, pipTransitionState, tvPipBoundsState, pipSizeSpecHandler, 222 tvPipBoundsAlgorithm, tvPipMenuController, pipAnimationController, 223 pipSurfaceTransactionHelper, pipTransitionController, pipParamsChangedForwarder, 224 splitScreenControllerOptional, displayController, pipUiEventLogger, 225 shellTaskOrganizer, mainExecutor); 226 } 227 228 @WMSingleton 229 @Provides providePipParamsChangedForwarder()230 static PipParamsChangedForwarder providePipParamsChangedForwarder() { 231 return new PipParamsChangedForwarder(); 232 } 233 234 @WMSingleton 235 @Provides providePipAppOpsListener(Context context, PipTaskOrganizer pipTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor)236 static PipAppOpsListener providePipAppOpsListener(Context context, 237 PipTaskOrganizer pipTaskOrganizer, 238 @ShellMainThread ShellExecutor mainExecutor) { 239 return new PipAppOpsListener(context, pipTaskOrganizer::removePip, mainExecutor); 240 } 241 } 242