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