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