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

Commit 2e900897 authored by Jaikumar Ganesh's avatar Jaikumar Ganesh
Browse files

Fix race condition and disable call.

1. A dispatch event can happen as soon you call enabled,
and we won't be ready to receive it. Also add error checks
and not crash if such a thing happens.

2. Java layer shouldn't call disable on the native layer
for trigger sensors. Native layer will clean up on its own.

b/8165631

Change-Id: Icbe76bd1f50632c0bcb0b3b04975b2c2f20ff36b
parent 6d0c1d78
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -1387,14 +1387,14 @@ public abstract class SensorManager {
     * @throws IllegalArgumentException when sensor is a trigger sensor.
     * @throws IllegalArgumentException when sensor is a trigger sensor.
     */
     */
    public boolean cancelTriggerSensor(TriggerEventListener listener, Sensor sensor) {
    public boolean cancelTriggerSensor(TriggerEventListener listener, Sensor sensor) {
        return cancelTriggerSensorImpl(listener, sensor);
        return cancelTriggerSensorImpl(listener, sensor, true);
    }
    }


    /**
    /**
     * @hide
     * @hide
     */
     */
    protected abstract boolean cancelTriggerSensorImpl(TriggerEventListener listener,
    protected abstract boolean cancelTriggerSensorImpl(TriggerEventListener listener,
            Sensor sensor);
            Sensor sensor, boolean disable);




    private LegacySensorManager getLegacySensorManager() {
    private LegacySensorManager getLegacySensorManager() {
+28 −14
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.MessageQueue;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.SparseIntArray;
@@ -135,7 +136,7 @@ public class SystemSensorManager extends SensorManager {
                if (sensor == null) {
                if (sensor == null) {
                    result = queue.removeAllSensors();
                    result = queue.removeAllSensors();
                } else {
                } else {
                    result = queue.removeSensor(sensor);
                    result = queue.removeSensor(sensor, true);
                }
                }
                if (result && !queue.hasSensors()) {
                if (result && !queue.hasSensors()) {
                    mSensorListeners.remove(listener);
                    mSensorListeners.remove(listener);
@@ -170,7 +171,8 @@ public class SystemSensorManager extends SensorManager {


    /** @hide */
    /** @hide */
    @Override
    @Override
    protected boolean cancelTriggerSensorImpl(TriggerEventListener listener, Sensor sensor) {
    protected boolean cancelTriggerSensorImpl(TriggerEventListener listener, Sensor sensor,
            boolean disable) {
        if (sensor != null && Sensor.getReportingMode(sensor) != Sensor.REPORTING_MODE_ONE_SHOT) {
        if (sensor != null && Sensor.getReportingMode(sensor) != Sensor.REPORTING_MODE_ONE_SHOT) {
            return false;
            return false;
        }
        }
@@ -181,7 +183,7 @@ public class SystemSensorManager extends SensorManager {
                if (sensor == null) {
                if (sensor == null) {
                    result = queue.removeAllSensors();
                    result = queue.removeAllSensors();
                } else {
                } else {
                    result = queue.removeSensor(sensor);
                    result = queue.removeSensor(sensor, disable);
                }
                }
                if (result && !queue.hasSensors()) {
                if (result && !queue.hasSensors()) {
                    mTriggerListeners.remove(listener);
                    mTriggerListeners.remove(listener);
@@ -225,15 +227,18 @@ public class SystemSensorManager extends SensorManager {


        public boolean addSensor(Sensor sensor, int delay) {
        public boolean addSensor(Sensor sensor, int delay) {
            // Check if already present.
            // Check if already present.
            if (mActiveSensors.get(sensor.getHandle())) return false;
            int handle = sensor.getHandle();
            if (mActiveSensors.get(handle)) return false;


            if (enableSensor(sensor, delay) == 0) {
            // Get ready to receive events before calling enable.
                mActiveSensors.put(sensor.getHandle(), true);
            mActiveSensors.put(handle, true);
            addSensorEvent(sensor);
            addSensorEvent(sensor);
                return true;
            if (enableSensor(sensor, delay) != 0) {
            }
                removeSensor(sensor, false);
                return false;
                return false;
            }
            }
            return true;
        }


        public boolean removeAllSensors() {
        public boolean removeAllSensors() {
            for (int i=0 ; i<mActiveSensors.size(); i++) {
            for (int i=0 ; i<mActiveSensors.size(); i++) {
@@ -252,10 +257,10 @@ public class SystemSensorManager extends SensorManager {
            return true;
            return true;
        }
        }


        public boolean removeSensor(Sensor sensor) {
        public boolean removeSensor(Sensor sensor, boolean disable) {
            final int handle = sensor.getHandle();
            final int handle = sensor.getHandle();
            if (mActiveSensors.get(handle)) {
            if (mActiveSensors.get(handle)) {
                disableSensor(sensor);
                if (disable) disableSensor(sensor);
                mActiveSensors.put(sensor.getHandle(), false);
                mActiveSensors.put(sensor.getHandle(), false);
                removeSensorEvent(sensor);
                removeSensorEvent(sensor);
                return true;
                return true;
@@ -334,6 +339,10 @@ public class SystemSensorManager extends SensorManager {
                long timestamp) {
                long timestamp) {
            final Sensor sensor = sHandleToSensor.get(handle);
            final Sensor sensor = sHandleToSensor.get(handle);
            SensorEvent t = mSensorsEvents.get(handle);
            SensorEvent t = mSensorsEvents.get(handle);
            if (t == null) {
                Log.e(TAG, "Error: Sensor Event is null for Sensor: " + sensor);
                return;
            }
            // Copy from the values array.
            // Copy from the values array.
            System.arraycopy(values, 0, t.values, 0, t.values.length);
            System.arraycopy(values, 0, t.values, 0, t.values.length);
            t.timestamp = timestamp;
            t.timestamp = timestamp;
@@ -390,14 +399,19 @@ public class SystemSensorManager extends SensorManager {
                long timestamp) {
                long timestamp) {
            final Sensor sensor = sHandleToSensor.get(handle);
            final Sensor sensor = sHandleToSensor.get(handle);
            TriggerEvent t = mTriggerEvents.get(handle);
            TriggerEvent t = mTriggerEvents.get(handle);
            if (t == null) {
                Log.e(TAG, "Error: Trigger Event is null for Sensor: " + sensor);
                return;
            }


            // Copy from the values array.
            // Copy from the values array.
            System.arraycopy(values, 0, t.values, 0, t.values.length);
            System.arraycopy(values, 0, t.values, 0, t.values.length);
            t.timestamp = timestamp;
            t.timestamp = timestamp;
            t.sensor = sensor;
            t.sensor = sensor;


            // A trigger sensor should be auto disabled.
            // A trigger sensor is auto disabled. So just clean up and don't call native
            mManager.cancelTriggerSensorImpl(mListener, sensor);
            // disable.
            mManager.cancelTriggerSensorImpl(mListener, sensor, false);


            mListener.onTrigger(t);
            mListener.onTrigger(t);
        }
        }