• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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.doze.dagger;
18 
19 import android.content.Context;
20 import android.hardware.Sensor;
21 
22 import com.android.systemui.doze.DozeAuthRemover;
23 import com.android.systemui.doze.DozeBrightnessHostForwarder;
24 import com.android.systemui.doze.DozeDockHandler;
25 import com.android.systemui.doze.DozeFalsingManagerAdapter;
26 import com.android.systemui.doze.DozeHost;
27 import com.android.systemui.doze.DozeMachine;
28 import com.android.systemui.doze.DozePauser;
29 import com.android.systemui.doze.DozeScreenBrightness;
30 import com.android.systemui.doze.DozeScreenState;
31 import com.android.systemui.doze.DozeScreenStatePreventingAdapter;
32 import com.android.systemui.doze.DozeSensors;
33 import com.android.systemui.doze.DozeSuppressor;
34 import com.android.systemui.doze.DozeSuspendScreenStatePreventingAdapter;
35 import com.android.systemui.doze.DozeTransitionListener;
36 import com.android.systemui.doze.DozeTriggers;
37 import com.android.systemui.doze.DozeUi;
38 import com.android.systemui.doze.DozeWallpaperState;
39 import com.android.systemui.res.R;
40 import com.android.systemui.statusbar.phone.DozeParameters;
41 import com.android.systemui.statusbar.policy.DevicePostureController;
42 import com.android.systemui.util.sensors.AsyncSensorManager;
43 import com.android.systemui.util.wakelock.DelayedWakeLock;
44 import com.android.systemui.util.wakelock.WakeLock;
45 
46 import dagger.Module;
47 import dagger.Provides;
48 
49 import java.util.Arrays;
50 import java.util.HashMap;
51 import java.util.Map;
52 import java.util.Optional;
53 
54 /** Dagger module for use with {@link com.android.systemui.doze.dagger.DozeComponent}. */
55 @Module
56 public abstract class DozeModule {
57     @Provides
58     @DozeScope
59     @WrappedService
providesWrappedService(DozeMachine.Service dozeMachineService, DozeHost dozeHost, DozeParameters dozeParameters)60     static DozeMachine.Service providesWrappedService(DozeMachine.Service dozeMachineService,
61             DozeHost dozeHost, DozeParameters dozeParameters) {
62         DozeMachine.Service wrappedService = dozeMachineService;
63         wrappedService = new DozeBrightnessHostForwarder(wrappedService, dozeHost);
64         wrappedService = DozeScreenStatePreventingAdapter.wrapIfNeeded(
65                 wrappedService, dozeParameters);
66         wrappedService = DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(
67                 wrappedService, dozeParameters);
68 
69         return wrappedService;
70     }
71 
72     @Provides
73     @DozeScope
providesDozeWakeLock(DelayedWakeLock.Factory delayedWakeLockFactory)74     static WakeLock providesDozeWakeLock(DelayedWakeLock.Factory delayedWakeLockFactory) {
75         return delayedWakeLockFactory.create("Doze");
76     }
77 
78     @Provides
providesDozeMachineParts(DozePauser dozePauser, DozeFalsingManagerAdapter dozeFalsingManagerAdapter, DozeTriggers dozeTriggers, DozeUi dozeUi, DozeScreenState dozeScreenState, DozeScreenBrightness dozeScreenBrightness, DozeWallpaperState dozeWallpaperState, DozeDockHandler dozeDockHandler, DozeAuthRemover dozeAuthRemover, DozeSuppressor dozeSuppressor, DozeTransitionListener dozeTransitionListener)79     static DozeMachine.Part[] providesDozeMachineParts(DozePauser dozePauser,
80             DozeFalsingManagerAdapter dozeFalsingManagerAdapter, DozeTriggers dozeTriggers,
81             DozeUi dozeUi, DozeScreenState dozeScreenState,
82             DozeScreenBrightness dozeScreenBrightness, DozeWallpaperState dozeWallpaperState,
83             DozeDockHandler dozeDockHandler, DozeAuthRemover dozeAuthRemover,
84             DozeSuppressor dozeSuppressor, DozeTransitionListener dozeTransitionListener) {
85         return new DozeMachine.Part[]{
86                 dozePauser,
87                 dozeFalsingManagerAdapter,
88                 dozeTriggers,
89                 dozeUi,
90                 dozeScreenBrightness,
91                 dozeScreenState,
92                 dozeWallpaperState,
93                 dozeDockHandler,
94                 dozeAuthRemover,
95                 dozeSuppressor,
96                 dozeTransitionListener
97         };
98     }
99 
100     @Provides
101     @BrightnessSensor
providesBrightnessSensors( AsyncSensorManager sensorManager, Context context, DozeParameters dozeParameters)102     static Optional<Sensor>[] providesBrightnessSensors(
103             AsyncSensorManager sensorManager,
104             Context context,
105             DozeParameters dozeParameters) {
106         String[] sensorNames = dozeParameters.brightnessNames();
107         if (sensorNames.length == 0 || sensorNames == null) {
108             // if no brightness names are specified, just use the brightness sensor type
109             return new Optional[]{
110                     Optional.ofNullable(DozeSensors.findSensor(
111                             sensorManager,
112                             context.getString(R.string.doze_brightness_sensor_type),
113                             null
114                     ))
115             };
116         }
117 
118         // length and index of brightnessMap correspond to DevicePostureController.DevicePostureInt:
119         final Optional<Sensor>[] brightnessSensorMap =
120                 new Optional[DevicePostureController.SUPPORTED_POSTURES_SIZE];
121         Arrays.fill(brightnessSensorMap, Optional.empty());
122 
123         // Map of sensorName => Sensor, so we reuse the same sensor if it's the same between
124         // postures
125         Map<String, Optional<Sensor>> nameToSensorMap = new HashMap<>();
126         for (int i = 0; i < sensorNames.length; i++) {
127             final String sensorName = sensorNames[i];
128             if (!nameToSensorMap.containsKey(sensorName)) {
129                 nameToSensorMap.put(sensorName,
130                         Optional.ofNullable(
131                                 DozeSensors.findSensor(
132                                         sensorManager,
133                                         context.getString(R.string.doze_brightness_sensor_type),
134                                         sensorNames[i]
135                                 )));
136             }
137             brightnessSensorMap[i] = nameToSensorMap.get(sensorName);
138         }
139         return brightnessSensorMap;
140     }
141 }
142