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