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.doze.DozeAuthRemover;
26 import com.android.systemui.doze.DozeBrightnessHostForwarder;
27 import com.android.systemui.doze.DozeDockHandler;
28 import com.android.systemui.doze.DozeFalsingManagerAdapter;
29 import com.android.systemui.doze.DozeHost;
30 import com.android.systemui.doze.DozeMachine;
31 import com.android.systemui.doze.DozePauser;
32 import com.android.systemui.doze.DozeScreenBrightness;
33 import com.android.systemui.doze.DozeScreenState;
34 import com.android.systemui.doze.DozeScreenStatePreventingAdapter;
35 import com.android.systemui.doze.DozeSensors;
36 import com.android.systemui.doze.DozeSuspendScreenStatePreventingAdapter;
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.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 java.util.Arrays;
47 import java.util.HashMap;
48 import java.util.Map;
49 import java.util.Optional;
50 
51 import dagger.Module;
52 import dagger.Provides;
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.Builder delayedWakeLockBuilder, @Main Handler handler)74     static WakeLock providesDozeWakeLock(DelayedWakeLock.Builder delayedWakeLockBuilder,
75             @Main Handler handler) {
76         return delayedWakeLockBuilder.setHandler(handler).setTag("Doze").build();
77     }
78 
79     @Provides
providesDozeMachinePartes(DozePauser dozePauser, DozeFalsingManagerAdapter dozeFalsingManagerAdapter, DozeTriggers dozeTriggers, DozeUi dozeUi, DozeScreenState dozeScreenState, DozeScreenBrightness dozeScreenBrightness, DozeWallpaperState dozeWallpaperState, DozeDockHandler dozeDockHandler, DozeAuthRemover dozeAuthRemover)80     static DozeMachine.Part[] providesDozeMachinePartes(DozePauser dozePauser,
81             DozeFalsingManagerAdapter dozeFalsingManagerAdapter, DozeTriggers dozeTriggers,
82             DozeUi dozeUi, DozeScreenState dozeScreenState,
83             DozeScreenBrightness dozeScreenBrightness, DozeWallpaperState dozeWallpaperState,
84             DozeDockHandler dozeDockHandler, DozeAuthRemover dozeAuthRemover) {
85         return new DozeMachine.Part[]{
86                 dozePauser,
87                 dozeFalsingManagerAdapter,
88                 dozeTriggers,
89                 dozeUi,
90                 dozeScreenState,
91                 dozeScreenBrightness,
92                 dozeWallpaperState,
93                 dozeDockHandler,
94                 dozeAuthRemover
95         };
96     }
97 
98     @Provides
99     @BrightnessSensor
providesBrightnessSensors( AsyncSensorManager sensorManager, Context context, DozeParameters dozeParameters)100     static Optional<Sensor>[] providesBrightnessSensors(
101             AsyncSensorManager sensorManager,
102             Context context,
103             DozeParameters dozeParameters) {
104         String[] sensorNames = dozeParameters.brightnessNames();
105         if (sensorNames.length == 0 || sensorNames == null) {
106             // if no brightness names are specified, just use the brightness sensor type
107             return new Optional[]{
108                     Optional.ofNullable(DozeSensors.findSensor(
109                             sensorManager,
110                             context.getString(R.string.doze_brightness_sensor_type),
111                             null
112                     ))
113             };
114         }
115 
116         // length and index of brightnessMap correspond to DevicePostureController.DevicePostureInt:
117         final Optional<Sensor>[] brightnessSensorMap =
118                 new Optional[DevicePostureController.SUPPORTED_POSTURES_SIZE];
119         Arrays.fill(brightnessSensorMap, Optional.empty());
120 
121         // Map of sensorName => Sensor, so we reuse the same sensor if it's the same between
122         // postures
123         Map<String, Optional<Sensor>> nameToSensorMap = new HashMap<>();
124         for (int i = 0; i < sensorNames.length; i++) {
125             final String sensorName = sensorNames[i];
126             if (!nameToSensorMap.containsKey(sensorName)) {
127                 nameToSensorMap.put(sensorName,
128                         Optional.ofNullable(
129                                 DozeSensors.findSensor(
130                                         sensorManager,
131                                         context.getString(R.string.doze_brightness_sensor_type),
132                                         sensorNames[i]
133                                 )));
134             }
135             brightnessSensorMap[i] = nameToSensorMap.get(sensorName);
136         }
137         return brightnessSensorMap;
138     }
139 }
140