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

Commit 379f0f04 authored by Jaikumar Ganesh's avatar Jaikumar Ganesh Committed by Android (Google) Code Review
Browse files

Merge "Fix activation issue with auto disabled sensors." into jb-mr2-dev

parents 187edf93 4c01b1ad
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -111,6 +111,15 @@ ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) {
    return c;
}

status_t SensorDevice::resetStateWithoutActuatingHardware(void *ident, int handle)
{
    if (!mSensorDevice) return NO_INIT;
    Info& info( mActivationCount.editValueFor(handle));
    Mutex::Autolock _l(mLock);
    info.rates.removeItem(ident);
    return NO_ERROR;
}

status_t SensorDevice::activate(void* ident, int handle, int enabled)
{
    if (!mSensorDevice) return NO_INIT;
+1 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ public:
    ssize_t poll(sensors_event_t* buffer, size_t count);
    status_t activate(void* ident, int handle, int enabled);
    status_t setDelay(void* ident, int handle, int64_t ns);
    status_t resetStateWithoutActuatingHardware(void *ident, int handle);
    void dump(String8& result, char* buffer, size_t SIZE);
};

+4 −0
Original line number Diff line number Diff line
@@ -54,6 +54,10 @@ status_t HardwareSensor::setDelay(void* ident, int handle, int64_t ns) {
    return mSensorDevice.setDelay(ident, handle, ns);
}

status_t HardwareSensor::resetStateWithoutActuatingHardware(void *ident, int handle) {
    return mSensorDevice.resetStateWithoutActuatingHardware(ident, handle);
}

Sensor HardwareSensor::getSensor() const {
    return mSensor;
}
+6 −0
Original line number Diff line number Diff line
@@ -40,6 +40,11 @@ public:
    virtual status_t setDelay(void* ident, int handle, int64_t ns) = 0;
    virtual Sensor getSensor() const = 0;
    virtual bool isVirtual() const = 0;
    virtual status_t resetStateWithoutActuatingHardware(void *ident, int handle) {
        // Override when you want to clean up for sensors which auto disable
        // after trigger, or when enabling sensors fail.
        return INVALID_OPERATION;
    }
};

// ---------------------------------------------------------------------------
@@ -61,6 +66,7 @@ public:
    virtual status_t setDelay(void* ident, int handle, int64_t ns);
    virtual Sensor getSensor() const;
    virtual bool isVirtual() const { return false; }
    virtual status_t resetStateWithoutActuatingHardware(void *ident, int handle);
};


+11 −0
Original line number Diff line number Diff line
@@ -242,10 +242,18 @@ status_t SensorService::dump(int fd, const Vector<String16>& args)

void SensorService::cleanupAutoDisabledSensor(const sp<SensorEventConnection>& connection,
        sensors_event_t const* buffer, const int count) {
    SensorInterface* sensor;
    status_t err = NO_ERROR;
    for (int i=0 ; i<count ; i++) {
        int handle = buffer[i].sensor;
        if (getSensorType(handle) == SENSOR_TYPE_SIGNIFICANT_MOTION) {
            if (connection->hasSensor(handle)) {
                sensor = mSensorMap.valueFor(handle);
                err = sensor ?sensor->resetStateWithoutActuatingHardware(connection.get(), handle)
                        : status_t(BAD_VALUE);
                if (err != NO_ERROR) {
                    ALOGE("Sensor Inteface: Resetting state failed with err: %d", err);
                }
                cleanupWithoutDisable(connection, handle);
            }
        }
@@ -530,6 +538,9 @@ status_t SensorService::enable(const sp<SensorEventConnection>& connection,
    status_t err = sensor ? sensor->activate(connection.get(), true) : status_t(BAD_VALUE);

    if (err != NO_ERROR) {
        // enable has failed, reset state in SensorDevice.
        status_t resetErr = sensor ? sensor->resetStateWithoutActuatingHardware(connection.get(),
                handle) : status_t(BAD_VALUE);
        // enable has failed, reset our state.
        cleanupWithoutDisable(connection, handle);
    }