diff options
author | 2022-02-09 15:04:44 +0000 | |
---|---|---|
committer | 2022-02-09 15:04:44 +0000 | |
commit | ec9f965bb167b9d64ad4dc38641a8b9809d9cf6c (patch) | |
tree | f28b4990a6871eb45ed2f1773adab587859523a4 | |
parent | 577f4a6b99fc5f5c705e34b6659f37c4a30cc00e (diff) | |
parent | d35a5741259e3b5fa6e8f196a1cd8230c7c9abbd (diff) |
Merge "Add ASensorManager_getDynamicSensorList."
-rw-r--r-- | include/android/sensor.h | 27 | ||||
-rw-r--r-- | libs/sensor/SensorManager.cpp | 33 | ||||
-rw-r--r-- | libs/sensor/include/sensor/SensorManager.h | 3 |
3 files changed, 62 insertions, 1 deletions
diff --git a/include/android/sensor.h b/include/android/sensor.h index cf1ca02cb3..c714b05dd7 100644 --- a/include/android/sensor.h +++ b/include/android/sensor.h @@ -743,11 +743,36 @@ ASensorManager* ASensorManager_getInstance() __DEPRECATED_IN(26); ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) __INTRODUCED_IN(26); /** - * Returns the list of available sensors. + * Returns the list of available sensors. The returned list is owned by the + * sensor manager and will not change between calls to this function. + * + * \param manager the {@link ASensorManager} instance obtained from + * {@link ASensorManager_getInstanceForPackage}. + * \param list the returned list of sensors. + * \return positive number of returned sensors or negative error code. + * BAD_VALUE: manager is NULL. */ int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list); /** + * Returns the list of available dynamic sensors. If there are no dynamic + * sensors available, returns nullptr in list. + * + * Each time this is called, the previously returned list is deallocated and + * must no longer be used. + * + * Available since API level 33. + * + * \param manager the {@link ASensorManager} instance obtained from + * {@link ASensorManager_getInstanceForPackage}. + * \param list the returned list of dynamic sensors. + * \return positive number of returned sensors or negative error code. + * BAD_VALUE: manager is NULL. + */ +ssize_t ASensorManager_getDynamicSensorList( + ASensorManager* manager, ASensorList* list) __INTRODUCED_IN(33); + +/** * Returns the default sensor for the given type, or NULL if no sensor * of that type exists. */ diff --git a/libs/sensor/SensorManager.cpp b/libs/sensor/SensorManager.cpp index 62f4b4e3e2..0ba9704263 100644 --- a/libs/sensor/SensorManager.cpp +++ b/libs/sensor/SensorManager.cpp @@ -100,6 +100,7 @@ SensorManager::SensorManager(const String16& opPackageName) SensorManager::~SensorManager() { free(mSensorList); + free(mDynamicSensorList); } status_t SensorManager::waitForSensorService(sp<ISensorServer> *server) { @@ -130,6 +131,9 @@ void SensorManager::sensorManagerDied() { free(mSensorList); mSensorList = nullptr; mSensors.clear(); + free(mDynamicSensorList); + mDynamicSensorList = nullptr; + mDynamicSensors.clear(); } status_t SensorManager::assertStateLocked() { @@ -197,6 +201,35 @@ ssize_t SensorManager::getDynamicSensorList(Vector<Sensor> & dynamicSensors) { 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 09ac7edf27..8d0a8a45d9 100644 --- a/libs/sensor/include/sensor/SensorManager.h +++ b/libs/sensor/include/sensor/SensorManager.h @@ -58,6 +58,7 @@ public: 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 @@ private: 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; |