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