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