Fix activation issue with auto disabled sensors.
Auto disabled sensors get auto disabled after trigger.
An activation after this wasn't working because the
state was not being reset.
b/8609561
Change-Id: If72c9f27345e91671d7ad0a7a066f6dc3d255b78
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
index b256cce..16dabe8 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -111,6 +111,15 @@
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;
diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h
index b423f40..c0b357d 100644
--- a/services/sensorservice/SensorDevice.h
+++ b/services/sensorservice/SensorDevice.h
@@ -56,6 +56,7 @@
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);
};
diff --git a/services/sensorservice/SensorInterface.cpp b/services/sensorservice/SensorInterface.cpp
index 468aa61..cf0a11d 100644
--- a/services/sensorservice/SensorInterface.cpp
+++ b/services/sensorservice/SensorInterface.cpp
@@ -54,6 +54,10 @@
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;
}
diff --git a/services/sensorservice/SensorInterface.h b/services/sensorservice/SensorInterface.h
index fb357d7..2e709ae 100644
--- a/services/sensorservice/SensorInterface.h
+++ b/services/sensorservice/SensorInterface.h
@@ -40,6 +40,11 @@
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 @@
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);
};
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 9ca6b45..ebf5cf0 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -242,10 +242,18 @@
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 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);
}