Home | History | Annotate | Download | only in systemui
      1 /*
      2  * Copyright (C) 2016 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;
     18 
     19 import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
     20 import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME;
     21 
     22 import android.annotation.Nullable;
     23 import android.app.AlarmManager;
     24 import android.content.Context;
     25 import android.os.Handler;
     26 import android.os.Looper;
     27 import android.util.Log;
     28 import android.view.ViewGroup;
     29 
     30 import com.android.internal.colorextraction.ColorExtractor.GradientColors;
     31 import com.android.internal.util.function.TriConsumer;
     32 import com.android.internal.widget.LockPatternUtils;
     33 import com.android.keyguard.KeyguardUpdateMonitor;
     34 import com.android.keyguard.ViewMediatorCallback;
     35 import com.android.systemui.assist.AssistManager;
     36 import com.android.systemui.classifier.FalsingManagerFactory;
     37 import com.android.systemui.dock.DockManager;
     38 import com.android.systemui.fragments.FragmentService;
     39 import com.android.systemui.keyguard.DismissCallbackRegistry;
     40 import com.android.systemui.plugins.statusbar.StatusBarStateController;
     41 import com.android.systemui.power.EnhancedEstimates;
     42 import com.android.systemui.power.EnhancedEstimatesImpl;
     43 import com.android.systemui.statusbar.KeyguardIndicationController;
     44 import com.android.systemui.statusbar.NotificationListener;
     45 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
     46 import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
     47 import com.android.systemui.statusbar.NotificationMediaManager;
     48 import com.android.systemui.statusbar.ScrimView;
     49 import com.android.systemui.statusbar.notification.NotificationEntryManager;
     50 import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
     51 import com.android.systemui.statusbar.notification.collection.NotificationData;
     52 import com.android.systemui.statusbar.phone.DozeParameters;
     53 import com.android.systemui.statusbar.phone.KeyguardBouncer;
     54 import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl;
     55 import com.android.systemui.statusbar.phone.LockIcon;
     56 import com.android.systemui.statusbar.phone.LockscreenWallpaper;
     57 import com.android.systemui.statusbar.phone.NotificationIconAreaController;
     58 import com.android.systemui.statusbar.phone.ScrimController;
     59 import com.android.systemui.statusbar.phone.ScrimState;
     60 import com.android.systemui.statusbar.phone.ShadeController;
     61 import com.android.systemui.statusbar.phone.StatusBar;
     62 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
     63 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
     64 import com.android.systemui.util.InjectionInflationController;
     65 import com.android.systemui.util.leak.GarbageMonitor;
     66 import com.android.systemui.volume.VolumeDialogComponent;
     67 
     68 import java.util.function.Consumer;
     69 
     70 import javax.inject.Named;
     71 import javax.inject.Singleton;
     72 
     73 import dagger.Component;
     74 import dagger.Module;
     75 import dagger.Provides;
     76 
     77 /**
     78  * Class factory to provide customizable SystemUI components.
     79  */
     80 @Module
     81 public class SystemUIFactory {
     82     private static final String TAG = "SystemUIFactory";
     83 
     84     static SystemUIFactory mFactory;
     85     private SystemUIRootComponent mRootComponent;
     86 
     87     public static <T extends SystemUIFactory> T getInstance() {
     88         return (T) mFactory;
     89     }
     90 
     91     public static void createFromConfig(Context context) {
     92         final String clsName = context.getString(R.string.config_systemUIFactoryComponent);
     93         if (clsName == null || clsName.length() == 0) {
     94             throw new RuntimeException("No SystemUIFactory component configured");
     95         }
     96 
     97         try {
     98             Class<?> cls = null;
     99             cls = context.getClassLoader().loadClass(clsName);
    100             mFactory = (SystemUIFactory) cls.newInstance();
    101             mFactory.init(context);
    102         } catch (Throwable t) {
    103             Log.w(TAG, "Error creating SystemUIFactory component: " + clsName, t);
    104             throw new RuntimeException(t);
    105         }
    106     }
    107 
    108     public SystemUIFactory() {}
    109 
    110     protected void init(Context context) {
    111         mRootComponent = DaggerSystemUIFactory_SystemUIRootComponent.builder()
    112                 .systemUIFactory(this)
    113                 .dependencyProvider(new com.android.systemui.DependencyProvider())
    114                 .contextHolder(new ContextHolder(context))
    115                 .build();
    116     }
    117 
    118     public SystemUIRootComponent getRootComponent() {
    119         return mRootComponent;
    120     }
    121 
    122     public StatusBarKeyguardViewManager createStatusBarKeyguardViewManager(Context context,
    123             ViewMediatorCallback viewMediatorCallback, LockPatternUtils lockPatternUtils) {
    124         return new StatusBarKeyguardViewManager(context, viewMediatorCallback, lockPatternUtils);
    125     }
    126 
    127     public KeyguardBouncer createKeyguardBouncer(Context context, ViewMediatorCallback callback,
    128             LockPatternUtils lockPatternUtils,  ViewGroup container,
    129             DismissCallbackRegistry dismissCallbackRegistry,
    130             KeyguardBouncer.BouncerExpansionCallback expansionCallback) {
    131         return new KeyguardBouncer(context, callback, lockPatternUtils, container,
    132                 dismissCallbackRegistry, FalsingManagerFactory.getInstance(context),
    133                 expansionCallback, KeyguardUpdateMonitor.getInstance(context),
    134                 new Handler(Looper.getMainLooper()));
    135     }
    136 
    137     public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
    138             LockscreenWallpaper lockscreenWallpaper,
    139             TriConsumer<ScrimState, Float, GradientColors> scrimStateListener,
    140             Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
    141             AlarmManager alarmManager) {
    142         return new ScrimController(scrimBehind, scrimInFront, scrimStateListener,
    143                 scrimVisibleListener, dozeParameters, alarmManager);
    144     }
    145 
    146     public NotificationIconAreaController createNotificationIconAreaController(Context context,
    147             StatusBar statusBar, StatusBarStateController statusBarStateController) {
    148         return new NotificationIconAreaController(context, statusBar, statusBarStateController,
    149                 Dependency.get(NotificationMediaManager.class));
    150     }
    151 
    152     public KeyguardIndicationController createKeyguardIndicationController(Context context,
    153             ViewGroup indicationArea, LockIcon lockIcon) {
    154         return new KeyguardIndicationController(context, indicationArea, lockIcon);
    155     }
    156 
    157     public VolumeDialogComponent createVolumeDialogComponent(SystemUI systemUi, Context context) {
    158         return new VolumeDialogComponent(systemUi, context);
    159     }
    160 
    161     @Singleton
    162     @Provides
    163     public NotificationData.KeyguardEnvironment provideKeyguardEnvironment(Context context) {
    164         return new KeyguardEnvironmentImpl();
    165     }
    166 
    167     @Singleton
    168     @Provides
    169     public NotificationLockscreenUserManager provideNotificationLockscreenUserManager(
    170             Context context) {
    171         return new NotificationLockscreenUserManagerImpl(context);
    172     }
    173 
    174     @Singleton
    175     @Provides
    176     public AssistManager provideAssistManager(DeviceProvisionedController controller,
    177             Context context) {
    178         return new AssistManager(controller, context);
    179     }
    180 
    181     @Singleton
    182     @Provides
    183     @Nullable
    184     public DockManager provideDockManager(Context context) {
    185         return null;
    186     }
    187 
    188     @Singleton
    189     @Provides
    190     public NotificationEntryManager provideNotificationEntryManager(Context context) {
    191         return new NotificationEntryManager(context);
    192     }
    193 
    194     @Singleton
    195     @Provides
    196     public EnhancedEstimates provideEnhancedEstimates(Context context) {
    197         return new EnhancedEstimatesImpl();
    198     }
    199 
    200     @Singleton
    201     @Provides
    202     @Named(LEAK_REPORT_EMAIL_NAME)
    203     @Nullable
    204     public String provideLeakReportEmail() {
    205         return null;
    206     }
    207 
    208     @Singleton
    209     @Provides
    210     public NotificationListener provideNotificationListener(Context context) {
    211         return new NotificationListener(context);
    212     }
    213 
    214     @Singleton
    215     @Provides
    216     public NotificationInterruptionStateProvider provideNotificationInterruptionStateProvider(
    217             Context context) {
    218         return new NotificationInterruptionStateProvider(context);
    219     }
    220 
    221     @Singleton
    222     @Provides
    223     @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME)
    224     public boolean provideAllowNotificationLongPress() {
    225         return true;
    226     }
    227 
    228     @Singleton
    229     @Provides
    230     public ShadeController provideShadeController(Context context) {
    231         return SysUiServiceProvider.getComponent(context, StatusBar.class);
    232     }
    233 
    234     @Module
    235     protected static class ContextHolder {
    236         private Context mContext;
    237 
    238         public ContextHolder(Context context) {
    239             mContext = context;
    240         }
    241 
    242         @Provides
    243         public Context provideContext() {
    244             return mContext;
    245         }
    246     }
    247 
    248     @Singleton
    249     @Component(modules = {SystemUIFactory.class, DependencyProvider.class, DependencyBinder.class,
    250             ContextHolder.class})
    251     public interface SystemUIRootComponent {
    252         @Singleton
    253         Dependency.DependencyInjector createDependency();
    254 
    255         @Singleton
    256         StatusBar.StatusBarInjector getStatusBarInjector();
    257 
    258         /**
    259          * FragmentCreator generates all Fragments that need injection.
    260          */
    261         @Singleton
    262         FragmentService.FragmentCreator createFragmentCreator();
    263 
    264         /**
    265          * ViewCreator generates all Views that need injection.
    266          */
    267         InjectionInflationController.ViewCreator createViewCreator();
    268 
    269         @Singleton
    270         GarbageMonitor createGarbageMonitor();
    271     }
    272 }
    273