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