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

Commit d35a5741 authored by Erik Staats's avatar Erik Staats
Browse files

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
parent 7ae2eac6
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -631,10 +631,35 @@ 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.
+33 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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;