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

Commit bee945c6 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski Committed by Android (Google) Code Review
Browse files

Merge "Native runtime sensors direct connection support." into udc-dev

parents a0cff095 4871f09f
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -139,10 +139,12 @@ public:
    }

    virtual sp<ISensorEventConnection> createSensorDirectConnection(const String16& opPackageName,
            uint32_t size, int32_t type, int32_t format, const native_handle_t *resource) {
            int deviceId, uint32_t size, int32_t type, int32_t format,
            const native_handle_t *resource) {
        Parcel data, reply;
        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
        data.writeString16(opPackageName);
        data.writeInt32(deviceId);
        data.writeUint32(size);
        data.writeInt32(type);
        data.writeInt32(format);
@@ -237,6 +239,7 @@ status_t BnSensorServer::onTransact(
        case CREATE_SENSOR_DIRECT_CONNECTION: {
            CHECK_INTERFACE(ISensorServer, data, reply);
            const String16& opPackageName = data.readString16();
            const int deviceId = data.readInt32();
            uint32_t size = data.readUint32();
            int32_t type = data.readInt32();
            int32_t format = data.readInt32();
@@ -246,8 +249,8 @@ status_t BnSensorServer::onTransact(
                return BAD_VALUE;
            }
            native_handle_set_fdsan_tag(resource);
            sp<ISensorEventConnection> ch =
                    createSensorDirectConnection(opPackageName, size, type, format, resource);
            sp<ISensorEventConnection> ch = createSensorDirectConnection(
                    opPackageName, deviceId, size, type, format, resource);
            native_handle_close_with_tag(resource);
            native_handle_delete(resource);
            reply->writeStrongBinder(IInterface::asBinder(ch));
+7 −1
Original line number Diff line number Diff line
@@ -315,6 +315,12 @@ bool SensorManager::isDataInjectionEnabled() {

int SensorManager::createDirectChannel(
        size_t size, int channelType, const native_handle_t *resourceHandle) {
    static constexpr int DEFAULT_DEVICE_ID = 0;
    return createDirectChannel(DEFAULT_DEVICE_ID, size, channelType, resourceHandle);
}

int SensorManager::createDirectChannel(
        int deviceId, size_t size, int channelType, const native_handle_t *resourceHandle) {
    Mutex::Autolock _l(mLock);
    if (assertStateLocked() != NO_ERROR) {
        return NO_INIT;
@@ -327,7 +333,7 @@ int SensorManager::createDirectChannel(
    }

    sp<ISensorEventConnection> conn =
              mSensorServer->createSensorDirectConnection(mOpPackageName,
              mSensorServer->createSensorDirectConnection(mOpPackageName, deviceId,
                  static_cast<uint32_t>(size),
                  static_cast<int32_t>(channelType),
                  SENSOR_DIRECT_FMT_SENSORS_EVENT, resourceHandle);
+2 −1
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ public:
    virtual int32_t isDataInjectionEnabled() = 0;

    virtual sp<ISensorEventConnection> createSensorDirectConnection(const String16& opPackageName,
            uint32_t size, int32_t type, int32_t format, const native_handle_t *resource) = 0;
            int deviceId, uint32_t size, int32_t type, int32_t format,
            const native_handle_t *resource) = 0;

    virtual int setOperationParameter(
            int32_t handle, int32_t type, const Vector<float> &floats, const Vector<int32_t> &ints) = 0;
+2 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ public:
        String8 packageName = String8(""), int mode = 0, String16 attributionTag = String16(""));
    bool isDataInjectionEnabled();
    int createDirectChannel(size_t size, int channelType, const native_handle_t *channelData);
    int createDirectChannel(
        int deviceId, size_t size, int channelType, const native_handle_t *channelData);
    void destroyDirectChannel(int channelNativeHandle);
    int configureDirectChannel(int channelNativeHandle, int sensorHandle, int rateLevel);
    int setOperationParameter(int handle, int type, const Vector<float> &floats, const Vector<int32_t> &ints);
+19 −15
Original line number Diff line number Diff line
@@ -28,10 +28,10 @@ using util::ProtoOutputStream;

SensorService::SensorDirectConnection::SensorDirectConnection(const sp<SensorService>& service,
        uid_t uid, const sensors_direct_mem_t *mem, int32_t halChannelHandle,
        const String16& opPackageName)
        const String16& opPackageName, int deviceId)
        : mService(service), mUid(uid), mMem(*mem),
        mHalChannelHandle(halChannelHandle),
        mOpPackageName(opPackageName), mDestroyed(false) {
        mOpPackageName(opPackageName), mDeviceId(deviceId), mDestroyed(false) {
    mUserId = multiuser_get_user_id(mUid);
    ALOGD_IF(DEBUG_CONNECTIONS, "Created SensorDirectConnection");
}
@@ -180,8 +180,7 @@ int32_t SensorService::SensorDirectConnection::configureChannel(int handle, int
    };

    Mutex::Autolock _l(mConnectionLock);
    SensorDevice& dev(SensorDevice::getInstance());
    int ret = dev.configureDirectChannel(handle, getHalChannelHandle(), &config);
    int ret = configure(handle, &config);

    if (rateLevel == SENSOR_DIRECT_RATE_STOP) {
        if (ret == NO_ERROR) {
@@ -224,7 +223,6 @@ void SensorService::SensorDirectConnection::capRates() {
    std::unordered_map<int, int>& existingConnections =
                    (!temporarilyStopped) ? mActivated : mActivatedBackup;

    SensorDevice& dev(SensorDevice::getInstance());
    for (auto &i : existingConnections) {
        int handle = i.first;
        int rateLevel = i.second;
@@ -239,8 +237,8 @@ void SensorService::SensorDirectConnection::capRates() {
                // Only reconfigure the channel if it's ongoing
                if (!temporarilyStopped) {
                    // Stopping before reconfiguring is the well-tested path in CTS
                    dev.configureDirectChannel(handle, getHalChannelHandle(), &stopConfig);
                    dev.configureDirectChannel(handle, getHalChannelHandle(), &capConfig);
                    configure(handle, &stopConfig);
                    configure(handle, &capConfig);
                }
            }
        }
@@ -258,7 +256,6 @@ void SensorService::SensorDirectConnection::uncapRates() {
    const struct sensors_direct_cfg_t stopConfig = {
        .rate_level = SENSOR_DIRECT_RATE_STOP
    };
    SensorDevice& dev(SensorDevice::getInstance());
    for (auto &i : mMicRateBackup) {
        int handle = i.first;
        int rateLevel = i.second;
@@ -273,13 +270,23 @@ void SensorService::SensorDirectConnection::uncapRates() {
        // Only reconfigure the channel if it's ongoing
        if (!temporarilyStopped) {
            // Stopping before reconfiguring is the well-tested path in CTS
            dev.configureDirectChannel(handle, getHalChannelHandle(), &stopConfig);
            dev.configureDirectChannel(handle, getHalChannelHandle(), &config);
            configure(handle, &stopConfig);
            configure(handle, &config);
        }
    }
    mMicRateBackup.clear();
}

int SensorService::SensorDirectConnection::configure(
        int handle, const sensors_direct_cfg_t* config) {
    if (mDeviceId == RuntimeSensor::DEFAULT_DEVICE_ID) {
        SensorDevice& dev(SensorDevice::getInstance());
        return dev.configureDirectChannel(handle, getHalChannelHandle(), config);
    } else {
        return mService->configureRuntimeSensorDirectChannel(handle, this, config);
    }
}

void SensorService::SensorDirectConnection::stopAll(bool backupRecord) {
    Mutex::Autolock _l(mConnectionLock);
    stopAllLocked(backupRecord);
@@ -290,9 +297,8 @@ void SensorService::SensorDirectConnection::stopAllLocked(bool backupRecord) {
        .rate_level = SENSOR_DIRECT_RATE_STOP
    };

    SensorDevice& dev(SensorDevice::getInstance());
    for (auto &i : mActivated) {
        dev.configureDirectChannel(i.first, getHalChannelHandle(), &config);
        configure(i.first, &config);
    }

    if (backupRecord && mActivatedBackup.empty()) {
@@ -306,8 +312,6 @@ void SensorService::SensorDirectConnection::recoverAll() {
    if (!mActivatedBackup.empty()) {
        stopAllLocked(false);

        SensorDevice& dev(SensorDevice::getInstance());

        // recover list of report from backup
        ALOG_ASSERT(mActivated.empty(),
                    "mActivated must be empty if mActivatedBackup was non-empty");
@@ -319,7 +323,7 @@ void SensorService::SensorDirectConnection::recoverAll() {
            struct sensors_direct_cfg_t config = {
                .rate_level = i.second
            };
            dev.configureDirectChannel(i.first, getHalChannelHandle(), &config);
            configure(i.first, &config);
        }
    }
}
Loading