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