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