Merge "Use alternative prox sensor when specified." into rvc-dev

This commit is contained in:
Dave Mankoff
2020-02-26 20:07:35 +00:00
committed by Android (Google) Code Review
3 changed files with 44 additions and 20 deletions

View File

@@ -201,6 +201,13 @@
always-on display) --> always-on display) -->
<string name="doze_brightness_sensor_type" translatable="false"></string> <string name="doze_brightness_sensor_type" translatable="false"></string>
<!-- Override value to use for proximity sensor. -->
<string name="proximity_sensor_type" translatable="false"></string>
<!-- If using proximity_sensor_type, specifies a threshold value to distinguish near and
far break points. A sensor value less than this is considered "near". -->
<item name="proximity_sensor_threshold" translatable="false" format="float" type="dimen"></item>
<!-- Doze: pulse parameter - how long does it take to fade in? --> <!-- Doze: pulse parameter - how long does it take to fade in? -->
<integer name="doze_pulse_duration_in">130</integer> <integer name="doze_pulse_duration_in">130</integer>

View File

@@ -44,8 +44,7 @@ public class ProximitySensor {
private final Sensor mSensor; private final Sensor mSensor;
private final AsyncSensorManager mSensorManager; private final AsyncSensorManager mSensorManager;
private final boolean mUsingBrightnessSensor; private final float mThreshold;
private final float mMaxRange;
private List<ProximitySensorListener> mListeners = new ArrayList<>(); private List<ProximitySensorListener> mListeners = new ArrayList<>();
private String mTag = null; private String mTag = null;
@VisibleForTesting ProximityEvent mLastEvent; @VisibleForTesting ProximityEvent mLastEvent;
@@ -68,20 +67,27 @@ public class ProximitySensor {
public ProximitySensor(@Main Resources resources, public ProximitySensor(@Main Resources resources,
AsyncSensorManager sensorManager) { AsyncSensorManager sensorManager) {
mSensorManager = sensorManager; mSensorManager = sensorManager;
Sensor sensor = findBrightnessSensor(resources);
Sensor sensor = findCustomProxSensor(resources);
float threshold = 0;
if (sensor != null) {
try {
threshold = getCustomProxThreshold(resources);
} catch (IllegalStateException e) {
Log.e(TAG, "Can not load custom proximity sensor.", e);
sensor = null;
}
}
if (sensor == null) { if (sensor == null) {
mUsingBrightnessSensor = false;
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
} else { if (sensor != null) {
mUsingBrightnessSensor = true; threshold = sensor.getMaximumRange();
}
} }
mThreshold = threshold;
mSensor = sensor; mSensor = sensor;
if (mSensor != null) {
mMaxRange = mSensor.getMaximumRange();
} else {
mMaxRange = 0;
}
} }
public void setTag(String tag) { public void setTag(String tag) {
@@ -107,9 +113,15 @@ public class ProximitySensor {
mPaused = false; mPaused = false;
registerInternal(); registerInternal();
} }
/**
* Returns a brightness sensor that can be used for proximity purposes.
*/
private Sensor findCustomProxSensor(Resources resources) {
String sensorType = resources.getString(R.string.proximity_sensor_type);
if (sensorType.isEmpty()) {
return null;
}
private Sensor findBrightnessSensor(Resources resources) {
String sensorType = resources.getString(R.string.doze_brightness_sensor_type);
List<Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); List<Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
Sensor sensor = null; Sensor sensor = null;
for (Sensor s : sensorList) { for (Sensor s : sensorList) {
@@ -122,6 +134,17 @@ public class ProximitySensor {
return sensor; return sensor;
} }
/**
* Returns a threshold value that can be used along with {@link #findCustomProxSensor}
*/
private float getCustomProxThreshold(Resources resources) {
try {
return resources.getFloat(R.dimen.proximity_sensor_threshold);
} catch (Resources.NotFoundException e) {
throw new IllegalStateException("R.dimen.proximity_sensor_threshold must be set.");
}
}
/** /**
* Returns true if we are registered with the SensorManager. * Returns true if we are registered with the SensorManager.
*/ */
@@ -157,7 +180,6 @@ public class ProximitySensor {
if (mRegistered || mPaused || mListeners.isEmpty()) { if (mRegistered || mPaused || mListeners.isEmpty()) {
return; return;
} }
logDebug("Using brightness sensor? " + mUsingBrightnessSensor);
logDebug("Registering sensor listener"); logDebug("Registering sensor listener");
mRegistered = true; mRegistered = true;
mSensorManager.registerListener(mSensorEventListener, mSensor, mSensorDelay); mSensorManager.registerListener(mSensorEventListener, mSensor, mSensorDelay);
@@ -196,10 +218,7 @@ public class ProximitySensor {
} }
private void onSensorEvent(SensorEvent event) { private void onSensorEvent(SensorEvent event) {
boolean near = event.values[0] < mMaxRange; boolean near = event.values[0] < mThreshold;
if (mUsingBrightnessSensor) {
near = event.values[0] == 0;
}
mLastEvent = new ProximityEvent(near, event.timestamp); mLastEvent = new ProximityEvent(near, event.timestamp);
alertListeners(); alertListeners();
} }

View File

@@ -20,11 +20,9 @@ import android.content.res.Resources;
public class FakeProximitySensor extends ProximitySensor { public class FakeProximitySensor extends ProximitySensor {
private boolean mAvailable; private boolean mAvailable;
private boolean mPaused;
public FakeProximitySensor(Resources resources, AsyncSensorManager sensorManager) { public FakeProximitySensor(Resources resources, AsyncSensorManager sensorManager) {
super(resources, sensorManager); super(resources, sensorManager);
mAvailable = true; mAvailable = true;
} }