1 /*
2  * Copyright (C) 2019 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.systemui.dagger;
18 
19 import com.android.systemui.BootCompleteCacheImpl;
20 import com.android.systemui.CoreStartable;
21 import com.android.systemui.Dependency;
22 import com.android.systemui.InitController;
23 import com.android.systemui.SystemUIAppComponentFactoryBase;
24 import com.android.systemui.dagger.qualifiers.PerUser;
25 import com.android.systemui.dump.DumpManager;
26 import com.android.systemui.keyguard.KeyguardSliceProvider;
27 import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionCli;
28 import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
29 import com.android.systemui.people.PeopleProvider;
30 import com.android.systemui.statusbar.NotificationInsetsModule;
31 import com.android.systemui.statusbar.QsFrameTranslateModule;
32 import com.android.systemui.statusbar.policy.ConfigurationController;
33 import com.android.systemui.unfold.FoldStateLogger;
34 import com.android.systemui.unfold.FoldStateLoggingProvider;
35 import com.android.systemui.unfold.SysUIUnfoldComponent;
36 import com.android.systemui.unfold.UnfoldLatencyTracker;
37 import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
38 import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder;
39 import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider;
40 import com.android.wm.shell.back.BackAnimation;
41 import com.android.wm.shell.bubbles.Bubbles;
42 import com.android.wm.shell.desktopmode.DesktopMode;
43 import com.android.wm.shell.displayareahelper.DisplayAreaHelper;
44 import com.android.wm.shell.keyguard.KeyguardTransitions;
45 import com.android.wm.shell.onehanded.OneHanded;
46 import com.android.wm.shell.pip.Pip;
47 import com.android.wm.shell.recents.RecentTasks;
48 import com.android.wm.shell.splitscreen.SplitScreen;
49 import com.android.wm.shell.startingsurface.StartingSurface;
50 import com.android.wm.shell.sysui.ShellInterface;
51 import com.android.wm.shell.taskview.TaskViewFactory;
52 import com.android.wm.shell.transition.ShellTransitions;
53 
54 import dagger.BindsInstance;
55 import dagger.Subcomponent;
56 
57 import java.util.Map;
58 import java.util.Optional;
59 
60 import javax.inject.Provider;
61 
62 /**
63  * An example Dagger Subcomponent for Core SysUI.
64  *
65  * See {@link ReferenceSysUIComponent} for the one actually used by AOSP.
66  */
67 @SysUISingleton
68 @Subcomponent(modules = {
69         DefaultComponentBinder.class,
70         DependencyProvider.class,
71         NotificationInsetsModule.class,
72         QsFrameTranslateModule.class,
73         SystemUIBinder.class,
74         SystemUIModule.class,
75         SystemUICoreStartableModule.class,
76         ReferenceSystemUIModule.class})
77 public interface SysUIComponent {
78 
79     /**
80      * Builder for a SysUIComponent.
81      */
82     @SysUISingleton
83     @Subcomponent.Builder
84     interface Builder {
85         @BindsInstance
setShell(ShellInterface s)86         Builder setShell(ShellInterface s);
87 
88         @BindsInstance
setPip(Optional<Pip> p)89         Builder setPip(Optional<Pip> p);
90 
91         @BindsInstance
setSplitScreen(Optional<SplitScreen> s)92         Builder setSplitScreen(Optional<SplitScreen> s);
93 
94         @BindsInstance
setOneHanded(Optional<OneHanded> o)95         Builder setOneHanded(Optional<OneHanded> o);
96 
97         @BindsInstance
setBubbles(Optional<Bubbles> b)98         Builder setBubbles(Optional<Bubbles> b);
99 
100         @BindsInstance
setTaskViewFactory(Optional<TaskViewFactory> t)101         Builder setTaskViewFactory(Optional<TaskViewFactory> t);
102 
103         @BindsInstance
setTransitions(ShellTransitions t)104         Builder setTransitions(ShellTransitions t);
105 
106         @BindsInstance
setKeyguardTransitions(KeyguardTransitions k)107         Builder setKeyguardTransitions(KeyguardTransitions k);
108 
109         @BindsInstance
setStartingSurface(Optional<StartingSurface> s)110         Builder setStartingSurface(Optional<StartingSurface> s);
111 
112         @BindsInstance
setDisplayAreaHelper(Optional<DisplayAreaHelper> h)113         Builder setDisplayAreaHelper(Optional<DisplayAreaHelper> h);
114 
115         @BindsInstance
setRecentTasks(Optional<RecentTasks> r)116         Builder setRecentTasks(Optional<RecentTasks> r);
117 
118         @BindsInstance
setBackAnimation(Optional<BackAnimation> b)119         Builder setBackAnimation(Optional<BackAnimation> b);
120 
121         @BindsInstance
setDesktopMode(Optional<DesktopMode> d)122         Builder setDesktopMode(Optional<DesktopMode> d);
123 
build()124         SysUIComponent build();
125     }
126 
127     /**
128      * Initializes all the SysUI components.
129      */
init()130     default void init() {
131         // Initialize components that have no direct tie to the dagger dependency graph,
132         // but are critical to this component's operation
133         getSysUIUnfoldComponent().ifPresent(c -> {
134             c.getUnfoldLightRevealOverlayAnimation().init();
135             c.getUnfoldTransitionWallpaperController().init();
136             c.getUnfoldHapticsPlayer();
137         });
138         getNaturalRotationUnfoldProgressProvider().ifPresent(o -> o.init());
139         // No init method needed, just needs to be gotten so that it's created.
140         getMediaMuteAwaitConnectionCli();
141         getNearbyMediaDevicesManager();
142         getUnfoldLatencyTracker().init();
143         getFoldStateLoggingProvider().ifPresent(FoldStateLoggingProvider::init);
144         getFoldStateLogger().ifPresent(FoldStateLogger::init);
145         getUnfoldTransitionProgressProvider().ifPresent((progressProvider) ->
146                 getUnfoldTransitionProgressForwarder().ifPresent((forwarder) ->
147                         progressProvider.addCallback(forwarder)
148                 ));
149     }
150 
151     /**
152      * Provides a BootCompleteCache.
153      */
154     @SysUISingleton
provideBootCacheImpl()155     BootCompleteCacheImpl provideBootCacheImpl();
156 
157     /**
158      * Creates a ContextComponentHelper.
159      */
160     @SysUISingleton
getConfigurationController()161     ConfigurationController getConfigurationController();
162 
163     /**
164      * Creates a ContextComponentHelper.
165      */
166     @SysUISingleton
getContextComponentHelper()167     ContextComponentHelper getContextComponentHelper();
168 
169     /**
170      * Creates a UnfoldLatencyTracker.
171      */
172     @SysUISingleton
getUnfoldLatencyTracker()173     UnfoldLatencyTracker getUnfoldLatencyTracker();
174 
175     /**
176      * Creates a UnfoldTransitionProgressProvider.
177      */
178     @SysUISingleton
getUnfoldTransitionProgressProvider()179     Optional<UnfoldTransitionProgressProvider> getUnfoldTransitionProgressProvider();
180 
181     /**
182      * Creates a UnfoldTransitionProgressForwarder.
183      */
184     @SysUISingleton
getUnfoldTransitionProgressForwarder()185     Optional<UnfoldTransitionProgressForwarder> getUnfoldTransitionProgressForwarder();
186 
187     /**
188      * Creates a FoldStateLoggingProvider.
189      */
190     @SysUISingleton
getFoldStateLoggingProvider()191     Optional<FoldStateLoggingProvider> getFoldStateLoggingProvider();
192 
193     /**
194      * Creates a FoldStateLogger.
195      */
196     @SysUISingleton
getFoldStateLogger()197     Optional<FoldStateLogger> getFoldStateLogger();
198 
199     /**
200      * Main dependency providing module.
201      */
202     @SysUISingleton
createDependency()203     Dependency createDependency();
204 
205     /** */
206     @SysUISingleton
createDumpManager()207     DumpManager createDumpManager();
208 
209     /**
210      * Creates a InitController.
211      */
212     @SysUISingleton
getInitController()213     InitController getInitController();
214 
215     /**
216      * For devices with a hinge: access objects within this component
217      */
getSysUIUnfoldComponent()218     Optional<SysUIUnfoldComponent> getSysUIUnfoldComponent();
219 
220     /**
221      * For devices with a hinge: the rotation animation
222      */
getNaturalRotationUnfoldProgressProvider()223     Optional<NaturalRotationUnfoldProgressProvider> getNaturalRotationUnfoldProgressProvider();
224 
225     /** */
getMediaMuteAwaitConnectionCli()226     MediaMuteAwaitConnectionCli getMediaMuteAwaitConnectionCli();
227 
228     /** */
getNearbyMediaDevicesManager()229     NearbyMediaDevicesManager getNearbyMediaDevicesManager();
230 
231     /**
232      * Returns {@link CoreStartable}s that should be started with the application.
233      */
getStartables()234     Map<Class<?>, Provider<CoreStartable>> getStartables();
235 
236     /**
237      * Returns {@link CoreStartable}s that should be started for every user.
238      */
getPerUserStartables()239     @PerUser Map<Class<?>, Provider<CoreStartable>> getPerUserStartables();
240 
241     /**
242      * Member injection into the supplied argument.
243      */
inject(SystemUIAppComponentFactoryBase factory)244     void inject(SystemUIAppComponentFactoryBase factory);
245 
246     /**
247      * Member injection into the supplied argument.
248      */
inject(KeyguardSliceProvider keyguardSliceProvider)249     void inject(KeyguardSliceProvider keyguardSliceProvider);
250 
251     /**
252      * Member injection into the supplied argument.
253      */
inject(PeopleProvider peopleProvider)254     void inject(PeopleProvider peopleProvider);
255 }
256