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