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.keyguard.clock.ClockOptionsProvider;
20 import com.android.systemui.BootCompleteCacheImpl;
21 import com.android.systemui.Dependency;
22 import com.android.systemui.InitController;
23 import com.android.systemui.SystemUIAppComponentFactory;
24 import com.android.systemui.dump.DumpManager;
25 import com.android.systemui.keyguard.KeyguardSliceProvider;
26 import com.android.systemui.people.PeopleProvider;
27 import com.android.systemui.statusbar.policy.ConfigurationController;
28 import com.android.systemui.unfold.SysUIUnfoldComponent;
29 import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider;
30 import com.android.wm.shell.ShellCommandHandler;
31 import com.android.wm.shell.TaskViewFactory;
32 import com.android.wm.shell.apppairs.AppPairs;
33 import com.android.wm.shell.bubbles.Bubbles;
34 import com.android.wm.shell.compatui.CompatUI;
35 import com.android.wm.shell.displayareahelper.DisplayAreaHelper;
36 import com.android.wm.shell.draganddrop.DragAndDrop;
37 import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
38 import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
39 import com.android.wm.shell.onehanded.OneHanded;
40 import com.android.wm.shell.pip.Pip;
41 import com.android.wm.shell.recents.RecentTasks;
42 import com.android.wm.shell.splitscreen.SplitScreen;
43 import com.android.wm.shell.startingsurface.StartingSurface;
44 import com.android.wm.shell.tasksurfacehelper.TaskSurfaceHelper;
45 import com.android.wm.shell.transition.ShellTransitions;
46 
47 import java.util.Optional;
48 
49 import dagger.BindsInstance;
50 import dagger.Subcomponent;
51 
52 /**
53  * Dagger Subcomponent for Core SysUI.
54  */
55 @SysUISingleton
56 @Subcomponent(modules = {
57         DefaultComponentBinder.class,
58         DependencyProvider.class,
59         SystemUIBinder.class,
60         SystemUIModule.class,
61         SystemUIDefaultModule.class})
62 public interface SysUIComponent {
63 
64     /**
65      * Builder for a SysUIComponent.
66      */
67     @SysUISingleton
68     @Subcomponent.Builder
69     interface Builder {
70         @BindsInstance
setPip(Optional<Pip> p)71         Builder setPip(Optional<Pip> p);
72 
73         @BindsInstance
setLegacySplitScreen(Optional<LegacySplitScreen> s)74         Builder setLegacySplitScreen(Optional<LegacySplitScreen> s);
75 
76         @BindsInstance
setSplitScreen(Optional<SplitScreen> s)77         Builder setSplitScreen(Optional<SplitScreen> s);
78 
79         @BindsInstance
setAppPairs(Optional<AppPairs> s)80         Builder setAppPairs(Optional<AppPairs> s);
81 
82         @BindsInstance
setOneHanded(Optional<OneHanded> o)83         Builder setOneHanded(Optional<OneHanded> o);
84 
85         @BindsInstance
setBubbles(Optional<Bubbles> b)86         Builder setBubbles(Optional<Bubbles> b);
87 
88         @BindsInstance
setTaskViewFactory(Optional<TaskViewFactory> t)89         Builder setTaskViewFactory(Optional<TaskViewFactory> t);
90 
91         @BindsInstance
setHideDisplayCutout(Optional<HideDisplayCutout> h)92         Builder setHideDisplayCutout(Optional<HideDisplayCutout> h);
93 
94         @BindsInstance
setShellCommandHandler(Optional<ShellCommandHandler> shellDump)95         Builder setShellCommandHandler(Optional<ShellCommandHandler> shellDump);
96 
97         @BindsInstance
setTransitions(ShellTransitions t)98         Builder setTransitions(ShellTransitions t);
99 
100         @BindsInstance
setStartingSurface(Optional<StartingSurface> s)101         Builder setStartingSurface(Optional<StartingSurface> s);
102 
103         @BindsInstance
setDisplayAreaHelper(Optional<DisplayAreaHelper> h)104         Builder setDisplayAreaHelper(Optional<DisplayAreaHelper> h);
105 
106         @BindsInstance
setTaskSurfaceHelper(Optional<TaskSurfaceHelper> t)107         Builder setTaskSurfaceHelper(Optional<TaskSurfaceHelper> t);
108 
109         @BindsInstance
setRecentTasks(Optional<RecentTasks> r)110         Builder setRecentTasks(Optional<RecentTasks> r);
111 
112         @BindsInstance
setCompatUI(Optional<CompatUI> s)113         Builder setCompatUI(Optional<CompatUI> s);
114 
115         @BindsInstance
setDragAndDrop(Optional<DragAndDrop> d)116         Builder setDragAndDrop(Optional<DragAndDrop> d);
117 
build()118         SysUIComponent build();
119     }
120 
121     /**
122      * Initializes all the SysUI components.
123      */
init()124     default void init() {
125         // Initialize components that have no direct tie to the dagger dependency graph,
126         // but are critical to this component's operation
127         // TODO(b/205034537): I think this is a good idea?
128         getSysUIUnfoldComponent().ifPresent(c -> {
129             c.getUnfoldLightRevealOverlayAnimation().init();
130             c.getUnfoldTransitionWallpaperController().init();
131         });
132         getNaturalRotationUnfoldProgressProvider().ifPresent(o -> o.init());
133     }
134 
135     /**
136      * Provides a BootCompleteCache.
137      */
138     @SysUISingleton
provideBootCacheImpl()139     BootCompleteCacheImpl provideBootCacheImpl();
140 
141     /**
142      * Creates a ContextComponentHelper.
143      */
144     @SysUISingleton
getConfigurationController()145     ConfigurationController getConfigurationController();
146 
147     /**
148      * Creates a ContextComponentHelper.
149      */
150     @SysUISingleton
getContextComponentHelper()151     ContextComponentHelper getContextComponentHelper();
152 
153     /**
154      * Main dependency providing module.
155      */
156     @SysUISingleton
createDependency()157     Dependency createDependency();
158 
159     /** */
160     @SysUISingleton
createDumpManager()161     DumpManager createDumpManager();
162 
163     /**
164      * Creates a InitController.
165      */
166     @SysUISingleton
getInitController()167     InitController getInitController();
168 
169     /**
170      * For devices with a hinge: access objects within this component
171      */
getSysUIUnfoldComponent()172     Optional<SysUIUnfoldComponent> getSysUIUnfoldComponent();
173 
174     /**
175      * For devices with a hinge: the rotation animation
176      */
getNaturalRotationUnfoldProgressProvider()177     Optional<NaturalRotationUnfoldProgressProvider> getNaturalRotationUnfoldProgressProvider();
178 
179     /**
180      * Member injection into the supplied argument.
181      */
inject(SystemUIAppComponentFactory factory)182     void inject(SystemUIAppComponentFactory factory);
183 
184     /**
185      * Member injection into the supplied argument.
186      */
inject(KeyguardSliceProvider keyguardSliceProvider)187     void inject(KeyguardSliceProvider keyguardSliceProvider);
188 
189     /**
190      * Member injection into the supplied argument.
191      */
inject(ClockOptionsProvider clockOptionsProvider)192     void inject(ClockOptionsProvider clockOptionsProvider);
193 
194     /**
195      * Member injection into the supplied argument.
196      */
inject(PeopleProvider peopleProvider)197     void inject(PeopleProvider peopleProvider);
198 }
199