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