Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb45d588 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

RESTRICT AUTOMERGE Use Alternative Prox Sensor for Falsing

This allows new phones to use a sensor with a different
theshold when attempting to determine the devices proximity
to surfaces.

Bug: 149420648
Test: manual
Change-Id: Iee8568f7d9f58359dc1e72fd195a42abeaf2ddf3
parent c2daf3cb
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -201,6 +201,14 @@
         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/doze_brightness_sensor_type</string>

    <!-- If using proximity_sensor_type, specifies a threshold value to distinguish near and
         far break points. A sensor value less than or equal to this is considered "near". -->
    <item name="proximity_sensor_threshold" translatable="false" format="float" type="dimen">
        0</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>


+10 −8
Original line number Original line Diff line number Diff line
@@ -43,11 +43,11 @@ import androidx.annotation.VisibleForTesting;


import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.R;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.AsyncSensorManager;
import com.android.systemui.util.AsyncSensorManager;
import com.android.systemui.util.ProximitySensor;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLock;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -288,6 +288,7 @@ public class DozeSensors {
        final AlarmTimeout mCooldownTimer;
        final AlarmTimeout mCooldownTimer;
        final AlwaysOnDisplayPolicy mPolicy;
        final AlwaysOnDisplayPolicy mPolicy;
        final Sensor mSensor;
        final Sensor mSensor;
        private final float mSensorThreshold;
        final boolean mUsingBrightnessSensor;
        final boolean mUsingBrightnessSensor;


        public ProxSensor(AlwaysOnDisplayPolicy policy) {
        public ProxSensor(AlwaysOnDisplayPolicy policy) {
@@ -297,11 +298,14 @@ public class DozeSensors {


            // The default prox sensor can be noisy, so let's use a prox gated brightness sensor
            // The default prox sensor can be noisy, so let's use a prox gated brightness sensor
            // if available.
            // if available.
            Sensor sensor = DozeSensors.findSensorWithType(mSensorManager,
            Sensor sensor = ProximitySensor.findCustomProxSensor(mContext, mSensorManager);
                    mContext.getString(R.string.doze_brightness_sensor_type));
            mUsingBrightnessSensor = sensor != null;
            mUsingBrightnessSensor = sensor != null;
            if (sensor == null) {
            if (mUsingBrightnessSensor) {
                mSensorThreshold = ProximitySensor.getBrightnessSensorThreshold(
                        mContext.getResources());
            } else {
                sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
                sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
                mSensorThreshold = sensor.getMaximumRange();
            }
            }
            mSensor = sensor;
            mSensor = sensor;
        }
        }
@@ -343,11 +347,9 @@ public class DozeSensors {
            if (DEBUG) Log.d(TAG, "onSensorChanged " + event);
            if (DEBUG) Log.d(TAG, "onSensorChanged " + event);


            if (mUsingBrightnessSensor) {
            if (mUsingBrightnessSensor) {
                // The custom brightness sensor is gated by the proximity sensor and will return 0
                mCurrentlyFar = event.values[0] > mSensorThreshold;
                // whenever prox is covered.
                mCurrentlyFar = event.values[0] > 0;
            } else {
            } else {
                mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange();
                mCurrentlyFar = event.values[0] >= mSensorThreshold;
            }
            }
            mProxCallback.accept(mCurrentlyFar);
            mProxCallback.accept(mCurrentlyFar);


+8 −5
Original line number Original line Diff line number Diff line
@@ -41,10 +41,10 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.Preconditions;
import com.android.internal.util.Preconditions;
import com.android.systemui.Dependency;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert;
import com.android.systemui.util.Assert;
import com.android.systemui.util.ProximitySensor;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLock;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -431,15 +431,18 @@ public class DozeTriggers implements DozeMachine.Part {
        private boolean mFinished;
        private boolean mFinished;
        private float mMaxRange;
        private float mMaxRange;
        private boolean mUsingBrightnessSensor;
        private boolean mUsingBrightnessSensor;
        private float mSensorThreshold;


        protected abstract void onProximityResult(int result);
        protected abstract void onProximityResult(int result);


        public void check() {
        public void check() {
            Preconditions.checkState(!mFinished && !mRegistered);
            Preconditions.checkState(!mFinished && !mRegistered);
            Sensor sensor = DozeSensors.findSensorWithType(mSensorManager,
            Sensor sensor = ProximitySensor.findCustomProxSensor(mContext, mSensorManager);
                    mContext.getString(R.string.doze_brightness_sensor_type));
            mUsingBrightnessSensor = sensor != null;
            mUsingBrightnessSensor = sensor != null;
            if (sensor == null) {
            if (mUsingBrightnessSensor) {
                mSensorThreshold = ProximitySensor.getBrightnessSensorThreshold(
                        mContext.getResources());
            } else {
                sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
                sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
            }
            }
            if (sensor == null) {
            if (sensor == null) {
@@ -473,7 +476,7 @@ public class DozeTriggers implements DozeMachine.Part {
                if (mUsingBrightnessSensor) {
                if (mUsingBrightnessSensor) {
                    // The custom brightness sensor is gated by the proximity sensor and will
                    // The custom brightness sensor is gated by the proximity sensor and will
                    // return 0 whenever prox is covered.
                    // return 0 whenever prox is covered.
                    isNear = event.values[0] == 0;
                    isNear = event.values[0] <= mSensorThreshold;
                } else {
                } else {
                    isNear = event.values[0] < mMaxRange;
                    isNear = event.values[0] < mMaxRange;
                }
                }
+34 −9
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.util;
package com.android.systemui.util;


import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.hardware.Sensor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorEventListener;
@@ -40,7 +41,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 boolean mUsingBrightnessSensor;
    private final float mMaxRange;
    private final float mThreshold;


    private SensorEventListener mSensorEventListener = new SensorEventListener() {
    private SensorEventListener mSensorEventListener = new SensorEventListener() {
        @Override
        @Override
@@ -59,7 +60,7 @@ public class ProximitySensor {
    @Inject
    @Inject
    public ProximitySensor(Context context, AsyncSensorManager sensorManager) {
    public ProximitySensor(Context context, AsyncSensorManager sensorManager) {
        mSensorManager = sensorManager;
        mSensorManager = sensorManager;
        Sensor sensor = findBrightnessSensor(context, sensorManager);
        Sensor sensor = findCustomProxSensor(context, sensorManager);


        if (sensor == null) {
        if (sensor == null) {
            mUsingBrightnessSensor = false;
            mUsingBrightnessSensor = false;
@@ -69,9 +70,13 @@ public class ProximitySensor {
        }
        }
        mSensor = sensor;
        mSensor = sensor;
        if (mSensor != null) {
        if (mSensor != null) {
            mMaxRange = mSensor.getMaximumRange();
            if (mUsingBrightnessSensor) {
                mThreshold = getBrightnessSensorThreshold(context.getResources());
            } else {
                mThreshold = mSensor.getMaximumRange();
            }
        } else {
        } else {
            mMaxRange = 0;
            mThreshold = 0;
        }
        }
    }
    }


@@ -79,8 +84,18 @@ public class ProximitySensor {
        mTag = tag;
        mTag = tag;
    }
    }


    private Sensor findBrightnessSensor(Context context, SensorManager sensorManager) {
    /**
        String sensorType = context.getString(R.string.doze_brightness_sensor_type);
     * Returns a brightness sensor that can be used for proximity purposes.
     *
     * @deprecated This method exists for legacy purposes. Use the containing class directly.
     */
    @Deprecated
    public static Sensor findCustomProxSensor(Context context, SensorManager sensorManager) {
        String sensorType = context.getString(R.string.proximity_sensor_type);
        if (sensorType.isEmpty()) {
            return null;
        }

        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
        Sensor sensor = null;
        Sensor sensor = null;
        for (Sensor s : sensorList) {
        for (Sensor s : sensorList) {
@@ -93,6 +108,16 @@ public class ProximitySensor {
        return sensor;
        return sensor;
    }
    }


    /**
     * Returns a threshold value that can be used along with {@link #findCustomProxSensor}
     *
     * @deprecated This method exists for legacy purposes. Use the containing class directly.
     */
    @Deprecated
    public static float getBrightnessSensorThreshold(Resources resources) {
        return resources.getFloat(R.dimen.proximity_sensor_threshold);
    }

    /**
    /**
     * Returns {@code false} if a Proximity sensor is not available.
     * Returns {@code false} if a Proximity sensor is not available.
     */
     */
@@ -141,11 +166,11 @@ public class ProximitySensor {
    }
    }


    private void onSensorEvent(SensorEvent event) {
    private void onSensorEvent(SensorEvent event) {
        boolean near = event.values[0] < mMaxRange;
        if (mUsingBrightnessSensor) {
        if (mUsingBrightnessSensor) {
            near = event.values[0] == 0;
            mNear = event.values[0] <= mThreshold;
        } else {
            mNear = event.values[0] < mThreshold;
        }
        }
        mNear = near;
        mListeners.forEach(proximitySensorListener ->
        mListeners.forEach(proximitySensorListener ->
                proximitySensorListener.onProximitySensorEvent(
                proximitySensorListener.onProximitySensorEvent(
                        new ProximityEvent(mNear, event.timestamp)));
                        new ProximityEvent(mNear, event.timestamp)));