Add ASensorManager_getDynamicSensorList.
Bug: 217890463
Test: Used uhid-sample to add a dynamic sensor and verified it can be
used with sensor_test.
Change-Id: Ida2ce53c3d94ed530ba4981d299fa4855c35e337
diff --git a/libs/sensor/SensorManager.cpp b/libs/sensor/SensorManager.cpp
index 62f4b4e..0ba9704 100644
--- a/libs/sensor/SensorManager.cpp
+++ b/libs/sensor/SensorManager.cpp
@@ -100,6 +100,7 @@
SensorManager::~SensorManager() {
free(mSensorList);
+ free(mDynamicSensorList);
}
status_t SensorManager::waitForSensorService(sp<ISensorServer> *server) {
@@ -130,6 +131,9 @@
free(mSensorList);
mSensorList = nullptr;
mSensors.clear();
+ free(mDynamicSensorList);
+ mDynamicSensorList = nullptr;
+ mDynamicSensors.clear();
}
status_t SensorManager::assertStateLocked() {
@@ -197,6 +201,35 @@
return static_cast<ssize_t>(count);
}
+ssize_t SensorManager::getDynamicSensorList(Sensor const* const** list) {
+ Mutex::Autolock _l(mLock);
+ status_t err = assertStateLocked();
+ if (err < 0) {
+ return static_cast<ssize_t>(err);
+ }
+
+ free(mDynamicSensorList);
+ mDynamicSensorList = nullptr;
+ mDynamicSensors = mSensorServer->getDynamicSensorList(mOpPackageName);
+ size_t dynamicCount = mDynamicSensors.size();
+ if (dynamicCount > 0) {
+ mDynamicSensorList = static_cast<Sensor const**>(
+ malloc(dynamicCount * sizeof(Sensor*)));
+ if (mDynamicSensorList == nullptr) {
+ ALOGE("Failed to allocate dynamic sensor list for %zu sensors.",
+ dynamicCount);
+ return static_cast<ssize_t>(NO_MEMORY);
+ }
+
+ for (size_t i = 0; i < dynamicCount; i++) {
+ mDynamicSensorList[i] = mDynamicSensors.array() + i;
+ }
+ }
+
+ *list = mDynamicSensorList;
+ return static_cast<ssize_t>(mDynamicSensors.size());
+}
+
Sensor const* SensorManager::getDefaultSensor(int type)
{
Mutex::Autolock _l(mLock);
diff --git a/libs/sensor/include/sensor/SensorManager.h b/libs/sensor/include/sensor/SensorManager.h
index 09ac7ed..8d0a8a4 100644
--- a/libs/sensor/include/sensor/SensorManager.h
+++ b/libs/sensor/include/sensor/SensorManager.h
@@ -58,6 +58,7 @@
ssize_t getSensorList(Sensor const* const** list);
ssize_t getDynamicSensorList(Vector<Sensor>& list);
+ ssize_t getDynamicSensorList(Sensor const* const** list);
Sensor const* getDefaultSensor(int type);
sp<SensorEventQueue> createEventQueue(
String8 packageName = String8(""), int mode = 0, String16 attributionTag = String16(""));
@@ -83,6 +84,8 @@
sp<ISensorServer> mSensorServer;
Sensor const** mSensorList;
Vector<Sensor> mSensors;
+ Sensor const** mDynamicSensorList = nullptr;
+ Vector<Sensor> mDynamicSensors;
sp<IBinder::DeathRecipient> mDeathObserver;
const String16 mOpPackageName;
std::unordered_map<int, sp<ISensorEventConnection>> mDirectConnection;