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

Commit 14c96b10 authored by Arthur Ishiguro's avatar Arthur Ishiguro
Browse files

Extend background app behavior for direct channel

Bug: 74395023
Test: Modify sensor logger to use direct channel. Check that connection
is not active when the app becomes idle, and becomes active once the app
is no longer idle.

Change-Id: Ib4ec4b639698bf81f58051af0047a4d0982124a5
parent d9c19846
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -93,6 +93,23 @@ sp<BitTube> SensorService::SensorDirectConnection::getSensorChannel() const {
    return nullptr;
}

void SensorService::SensorDirectConnection::updateSensorSubscriptions() {
    if (!hasSensorAccess()) {
        stopAll(true /* backupRecord */);
    } else {
        recoverAll();
    }
}

void SensorService::SensorDirectConnection::setSensorAccess(bool hasAccess) {
    mHasSensorAccess = hasAccess;
    updateSensorSubscriptions();
}

bool SensorService::SensorDirectConnection::hasSensorAccess() const {
    return mHasSensorAccess && !mService->mSensorPrivacyPolicy->isSensorPrivacyEnabled();
}

status_t SensorService::SensorDirectConnection::enableDisable(
        int handle, bool enabled, nsecs_t samplingPeriodNs, nsecs_t maxBatchReportLatencyNs,
        int reservedFlags) {
+6 −0
Original line number Diff line number Diff line
@@ -54,6 +54,9 @@ public:
    // called by SensorService when return to NORMAL mode.
    void recoverAll();

    void updateSensorSubscriptions();

    void setSensorAccess(bool hasAccess);
protected:
    virtual ~SensorDirectConnection();
    // ISensorEventConnection functions
@@ -66,6 +69,7 @@ protected:
    virtual int32_t configureChannel(int handle, int rateLevel);
    virtual void destroy();
private:
    bool hasSensorAccess() const;
    const sp<SensorService> mService;
    const uid_t mUid;
    const sensors_direct_mem_t mMem;
@@ -76,6 +80,8 @@ private:
    std::unordered_map<int, int> mActivated;
    std::unordered_map<int, int> mActivatedBackup;

    std::atomic_bool mHasSensorAccess = true;

    mutable Mutex mDestroyLock;
    bool mDestroyed;
};
+9 −2
Original line number Diff line number Diff line
@@ -302,6 +302,7 @@ void SensorService::onFirstRef() {
void SensorService::setSensorAccess(uid_t uid, bool hasAccess) {
    ConnectionSafeAutolock connLock = mConnectionHolder.lock(mLock);
    const auto& connections = connLock.getActiveConnections();
    const auto& directConnections = connLock.getDirectConnections();

    mLock.unlock();
    for (const sp<SensorEventConnection>& conn : connections) {
@@ -309,6 +310,12 @@ void SensorService::setSensorAccess(uid_t uid, bool hasAccess) {
            conn->setSensorAccess(hasAccess);
        }
    }

    for (const sp<SensorDirectConnection>& conn : directConnections) {
        if (conn->getUid() == uid) {
            conn->setSensorAccess(hasAccess);
        }
    }
}

const Sensor& SensorService::registerSensor(SensorInterface* s, bool isDebug, bool isVirtual) {
@@ -645,7 +652,7 @@ void SensorService::disableAllSensorsLocked(ConnectionSafeAutolock* connLock) {
        connection->updateSensorSubscriptions();
    }
    for (const sp<SensorDirectConnection>& connection : connLock->getDirectConnections()) {
        connection->stopAll(true /* backupRecord */);
        connection->updateSensorSubscriptions();
    }
    dev.disableAllSensors();
    // Clear all pending flush connections for all active sensors. If one of the active
@@ -676,7 +683,7 @@ void SensorService::enableAllSensorsLocked(ConnectionSafeAutolock* connLock) {
        connection->updateSensorSubscriptions();
    }
    for (const sp<SensorDirectConnection>& connection : connLock->getDirectConnections()) {
        connection->recoverAll();
        connection->updateSensorSubscriptions();
    }
}