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