Add dual-display support for aod brightness sensor

Depending on the posture, SystemUI can register for
different brightness sensors on AOD.

Test: manual, atest DozeSensorsTest
Bug: 192805135
Change-Id: I85e458623ae9cf868af80e0c02154fb0be11c615
This commit is contained in:
Beverly
2021-09-28 11:31:40 -04:00
committed by Beverly Tai
parent c8d3d1adf7
commit 541b6f8ea4
6 changed files with 117 additions and 24 deletions

View File

@@ -148,7 +148,7 @@ public class AmbientDisplayConfiguration {
/** {@hide} */
public String tapSensorType(int posture) {
return getSensorTypeForPosture(
return getSensorFromPostureMapping(
mContext.getResources().getStringArray(R.array.config_dozeTapSensorPostureMapping),
tapSensorType(),
posture
@@ -252,17 +252,18 @@ public class AmbientDisplayConfiguration {
return Settings.Secure.getIntForUser(mContext.getContentResolver(), name, def, user) != 0;
}
private String getSensorTypeForPosture(
/** {@hide} */
public static String getSensorFromPostureMapping(
String[] postureMapping,
String defaultSensorType,
String defaultValue,
int posture) {
String sensorType = defaultSensorType;
String sensorType = defaultValue;
if (posture < postureMapping.length) {
sensorType = postureMapping[posture];
} else {
Log.e(TAG, "Unsupported doze posture " + posture);
}
return TextUtils.isEmpty(sensorType) ? defaultSensorType : sensorType;
return TextUtils.isEmpty(sensorType) ? defaultValue : sensorType;
}
}

View File

@@ -220,6 +220,16 @@
always-on display) -->
<string name="doze_brightness_sensor_type" translatable="false"></string>
<!-- Name of a sensor per posture state that provides a low-power estimate of the desired
display brightness, suitable to listen to while the device is asleep (e.g. during
always-on display) -->
<string-array name="doze_brightness_sensor_name_posture_mapping" translatable="false">
<item></item> <!-- UNKNOWN -->
<item></item> <!-- CLOSED -->
<item></item> <!-- HALF_OPENED -->
<item></item> <!-- OPENED -->
</string-array>
<!-- Override value to use for proximity sensor. -->
<string name="proximity_sensor_type" translatable="false"></string>

View File

@@ -148,7 +148,7 @@ public class DozeSensors {
false /* requires prox */,
dozeLog),
new TriggerSensor(
findSensorWithType(config.doubleTapSensorType()),
findSensor(config.doubleTapSensorType()),
Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
true /* configured */,
DozeLog.REASON_SENSOR_DOUBLE_TAP,
@@ -156,7 +156,7 @@ public class DozeSensors {
true /* touchscreen */,
dozeLog),
new TriggerSensor(
findSensorWithType(config.tapSensorType(mDevicePosture)),
findSensor(config.tapSensorType(mDevicePosture)),
Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
true /* settingDef */,
true /* configured */,
@@ -167,7 +167,7 @@ public class DozeSensors {
dozeParameters.singleTapUsesProx(mDevicePosture) /* requiresProx */,
dozeLog),
new TriggerSensor(
findSensorWithType(config.longPressSensorType()),
findSensor(config.longPressSensorType()),
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
false /* settingDef */,
true /* configured */,
@@ -178,7 +178,7 @@ public class DozeSensors {
dozeParameters.longPressUsesProx() /* requiresProx */,
dozeLog),
new TriggerSensor(
findSensorWithType(config.udfpsLongPressSensorType()),
findSensor(config.udfpsLongPressSensorType()),
"doze_pulse_on_auth",
true /* settingDef */,
udfpsEnrolled && (alwaysOn || mScreenOffUdfpsEnabled),
@@ -206,7 +206,7 @@ public class DozeSensors {
mConfig.getWakeLockScreenDebounce(),
dozeLog),
new TriggerSensor(
findSensorWithType(config.quickPickupSensorType()),
findSensor(config.quickPickupSensorType()),
Settings.Secure.DOZE_QUICK_PICKUP_GESTURE,
true /* setting default */,
config.quickPickupSensorEnabled(KeyguardUpdateMonitor.getCurrentUser())
@@ -244,21 +244,29 @@ public class DozeSensors {
mDebounceFrom = SystemClock.uptimeMillis();
}
private Sensor findSensorWithType(String type) {
return findSensorWithType(mSensorManager, type);
private Sensor findSensor(String type) {
return findSensor(mSensorManager, type, null);
}
/**
* Utility method to find a {@link Sensor} for the supplied string type.
* Utility method to find a {@link Sensor} for the supplied string type and string name.
*
* Return the first sensor in the list that matches the specified inputs. Ignores type or name
* if the input is null or empty.
*
* @param type sensorType
* @parm name sensorName, to differentiate between sensors with the same type
*/
public static Sensor findSensorWithType(SensorManager sensorManager, String type) {
if (TextUtils.isEmpty(type)) {
return null;
}
List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor s : sensorList) {
if (type.equals(s.getStringType())) {
return s;
public static Sensor findSensor(SensorManager sensorManager, String type, String name) {
final boolean isNameSpecified = !TextUtils.isEmpty(name);
final boolean isTypeSpecified = !TextUtils.isEmpty(type);
if (isNameSpecified || isTypeSpecified) {
final List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensors) {
if ((!isNameSpecified || name.equals(sensor.getName()))
&& (!isTypeSpecified || type.equals(sensor.getStringType()))) {
return sensor;
}
}
}
return null;

View File

@@ -38,6 +38,7 @@ import com.android.systemui.doze.DozeTriggers;
import com.android.systemui.doze.DozeUi;
import com.android.systemui.doze.DozeWallpaperState;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.policy.DevicePostureController;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.WakeLock;
@@ -94,8 +95,15 @@ public abstract class DozeModule {
@Provides
@BrightnessSensor
static Optional<Sensor> providesBrightnessSensor(
AsyncSensorManager sensorManager, Context context) {
return Optional.ofNullable(DozeSensors.findSensorWithType(sensorManager,
context.getString(R.string.doze_brightness_sensor_type)));
AsyncSensorManager sensorManager,
Context context,
DozeParameters dozeParameters,
DevicePostureController devicePostureController) {
return Optional.ofNullable(
DozeSensors.findSensor(
sensorManager,
context.getString(R.string.doze_brightness_sensor_type),
dozeParameters.brightnessName(devicePostureController.getDevicePosture())
));
}
}

View File

@@ -282,6 +282,17 @@ public class DozeParameters implements
return mResources.getBoolean(R.bool.doze_long_press_uses_prox);
}
/**
* Sensor to use for brightness changes.
*/
public String brightnessName(@DevicePostureController.DevicePostureInt int posture) {
return AmbientDisplayConfiguration.getSensorFromPostureMapping(
mResources.getStringArray(R.array.doze_brightness_sensor_name_posture_mapping),
null /* defaultValue */,
posture
);
}
/**
* Callback to listen for DozeParameter changes.
*/

View File

@@ -19,6 +19,7 @@ package com.android.systemui.doze;
import static com.android.systemui.doze.DozeLog.REASON_SENSOR_TAP;
import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -59,6 +60,11 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
@RunWith(AndroidTestingRunner.class)
@@ -274,6 +280,36 @@ public class DozeSensorsTest extends SysuiTestCase {
verify(mAmbientDisplayConfiguration).tapSensorType(eq(mDevicePosture));
}
@Test
public void testFindSensor() throws Exception {
// GIVEN a prox sensor
List<Sensor> sensors = new ArrayList<>();
Sensor proxSensor =
createSensor(Sensor.TYPE_PROXIMITY, Sensor.STRING_TYPE_PROXIMITY);
sensors.add(proxSensor);
when(mSensorManager.getSensorList(anyInt())).thenReturn(sensors);
// WHEN we try to find the prox sensor with the same type and name
// THEN we find the added sensor
assertEquals(
proxSensor,
DozeSensors.findSensor(
mSensorManager,
Sensor.STRING_TYPE_PROXIMITY,
proxSensor.getName()));
// WHEN we try to find a prox sensor with a different name
// THEN no sensor is found
assertEquals(
null,
DozeSensors.findSensor(
mSensorManager,
Sensor.STRING_TYPE_PROXIMITY,
"some other name"));
}
private class TestableDozeSensors extends DozeSensors {
TestableDozeSensors() {
@@ -305,4 +341,23 @@ public class DozeSensorsTest extends SysuiTestCase {
mDozeLog);
}
}
public static void setSensorType(Sensor sensor, int type, String strType) throws Exception {
Method setter = Sensor.class.getDeclaredMethod("setType", Integer.TYPE);
setter.setAccessible(true);
setter.invoke(sensor, type);
if (strType != null) {
Field f = sensor.getClass().getDeclaredField("mStringType");
f.setAccessible(true);
f.set(sensor, strType);
}
}
public static Sensor createSensor(int type, String strType) throws Exception {
Constructor<Sensor> constr = Sensor.class.getDeclaredConstructor();
constr.setAccessible(true);
Sensor sensor = constr.newInstance();
setSensorType(sensor, type, strType);
return sensor;
}
}