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 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.ShellExecutor; 26 import com.android.wm.shell.common.SyncTransactionQueue; 27 import com.android.wm.shell.common.SystemWindows; 28 import com.android.wm.shell.common.TaskStackListenerImpl; 29 import com.android.wm.shell.common.annotations.ShellMainThread; 30 import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; 31 import com.android.wm.shell.pip.Pip; 32 import com.android.wm.shell.pip.PipAnimationController; 33 import com.android.wm.shell.pip.PipBoundsAlgorithm; 34 import com.android.wm.shell.pip.PipBoundsState; 35 import com.android.wm.shell.pip.PipMediaController; 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.tv.TvPipController; 43 import com.android.wm.shell.pip.tv.TvPipMenuController; 44 import com.android.wm.shell.pip.tv.TvPipNotificationController; 45 import com.android.wm.shell.pip.tv.TvPipTransition; 46 import com.android.wm.shell.splitscreen.SplitScreenController; 47 import com.android.wm.shell.transition.Transitions; 48 49 import java.util.Optional; 50 51 import dagger.Module; 52 import dagger.Provides; 53 54 /** 55 * Provides TV specific dependencies for Pip. 56 */ 57 @Module(includes = {WMShellBaseModule.class}) 58 public abstract class TvPipModule { 59 @WMSingleton 60 @Provides providePip( Context context, PipBoundsState pipBoundsState, PipBoundsAlgorithm pipBoundsAlgorithm, PipTaskOrganizer pipTaskOrganizer, TvPipMenuController tvPipMenuController, PipMediaController pipMediaController, PipTransitionController pipTransitionController, TvPipNotificationController tvPipNotificationController, TaskStackListenerImpl taskStackListener, WindowManagerShellWrapper windowManagerShellWrapper, @ShellMainThread ShellExecutor mainExecutor)61 static Optional<Pip> providePip( 62 Context context, 63 PipBoundsState pipBoundsState, 64 PipBoundsAlgorithm pipBoundsAlgorithm, 65 PipTaskOrganizer pipTaskOrganizer, 66 TvPipMenuController tvPipMenuController, 67 PipMediaController pipMediaController, 68 PipTransitionController pipTransitionController, 69 TvPipNotificationController tvPipNotificationController, 70 TaskStackListenerImpl taskStackListener, 71 WindowManagerShellWrapper windowManagerShellWrapper, 72 @ShellMainThread ShellExecutor mainExecutor) { 73 return Optional.of( 74 TvPipController.create( 75 context, 76 pipBoundsState, 77 pipBoundsAlgorithm, 78 pipTaskOrganizer, 79 pipTransitionController, 80 tvPipMenuController, 81 pipMediaController, 82 tvPipNotificationController, 83 taskStackListener, 84 windowManagerShellWrapper, 85 mainExecutor)); 86 } 87 88 @WMSingleton 89 @Provides providePipSnapAlgorithm()90 static PipSnapAlgorithm providePipSnapAlgorithm() { 91 return new PipSnapAlgorithm(); 92 } 93 94 @WMSingleton 95 @Provides providePipBoundsAlgorithm(Context context, PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm)96 static PipBoundsAlgorithm providePipBoundsAlgorithm(Context context, 97 PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm) { 98 return new PipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm); 99 } 100 101 @WMSingleton 102 @Provides providePipBoundsState(Context context)103 static PipBoundsState providePipBoundsState(Context context) { 104 return new PipBoundsState(context); 105 } 106 107 // Handler needed for loadDrawableAsync() in PipControlsViewController 108 @WMSingleton 109 @Provides provideTvPipTransition( Transitions transitions, ShellTaskOrganizer shellTaskOrganizer, PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, TvPipMenuController pipMenuController)110 static PipTransitionController provideTvPipTransition( 111 Transitions transitions, ShellTaskOrganizer shellTaskOrganizer, 112 PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm, 113 PipBoundsState pipBoundsState, TvPipMenuController pipMenuController) { 114 return new TvPipTransition(pipBoundsState, pipMenuController, 115 pipBoundsAlgorithm, pipAnimationController, transitions, shellTaskOrganizer); 116 } 117 118 @WMSingleton 119 @Provides providesTvPipMenuController( Context context, PipBoundsState pipBoundsState, SystemWindows systemWindows, PipMediaController pipMediaController, @ShellMainThread Handler mainHandler)120 static TvPipMenuController providesTvPipMenuController( 121 Context context, 122 PipBoundsState pipBoundsState, 123 SystemWindows systemWindows, 124 PipMediaController pipMediaController, 125 @ShellMainThread Handler mainHandler) { 126 return new TvPipMenuController(context, pipBoundsState, systemWindows, pipMediaController, 127 mainHandler); 128 } 129 130 // Handler needed for registerReceiverForAllUsers() 131 @WMSingleton 132 @Provides provideTvPipNotificationController(Context context, PipMediaController pipMediaController, @ShellMainThread Handler mainHandler)133 static TvPipNotificationController provideTvPipNotificationController(Context context, 134 PipMediaController pipMediaController, 135 @ShellMainThread Handler mainHandler) { 136 return new TvPipNotificationController(context, pipMediaController, mainHandler); 137 } 138 139 @WMSingleton 140 @Provides providePipAnimationController(PipSurfaceTransactionHelper pipSurfaceTransactionHelper)141 static PipAnimationController providePipAnimationController(PipSurfaceTransactionHelper 142 pipSurfaceTransactionHelper) { 143 return new PipAnimationController(pipSurfaceTransactionHelper); 144 } 145 146 @WMSingleton 147 @Provides providePipTransitionState()148 static PipTransitionState providePipTransitionState() { 149 return new PipTransitionState(); 150 } 151 152 @WMSingleton 153 @Provides providePipTaskOrganizer(Context context, TvPipMenuController tvPipMenuController, SyncTransactionQueue syncTransactionQueue, PipBoundsState pipBoundsState, PipTransitionState pipTransitionState, PipBoundsAlgorithm pipBoundsAlgorithm, PipAnimationController pipAnimationController, PipTransitionController pipTransitionController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional<LegacySplitScreenController> splitScreenOptional, Optional<SplitScreenController> newSplitScreenOptional, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor)154 static PipTaskOrganizer providePipTaskOrganizer(Context context, 155 TvPipMenuController tvPipMenuController, 156 SyncTransactionQueue syncTransactionQueue, 157 PipBoundsState pipBoundsState, 158 PipTransitionState pipTransitionState, 159 PipBoundsAlgorithm pipBoundsAlgorithm, 160 PipAnimationController pipAnimationController, 161 PipTransitionController pipTransitionController, 162 PipSurfaceTransactionHelper pipSurfaceTransactionHelper, 163 Optional<LegacySplitScreenController> splitScreenOptional, 164 Optional<SplitScreenController> newSplitScreenOptional, 165 DisplayController displayController, 166 PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, 167 @ShellMainThread ShellExecutor mainExecutor) { 168 return new PipTaskOrganizer(context, 169 syncTransactionQueue, pipTransitionState, pipBoundsState, pipBoundsAlgorithm, 170 tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper, 171 pipTransitionController, splitScreenOptional, newSplitScreenOptional, 172 displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); 173 } 174 } 175