diff options
author | Chris Kuiper <ckuiper@google.com> | 2021-10-12 16:30:01 -0700 |
---|---|---|
committer | Chris Kuiper <ckuiper@google.com> | 2021-10-14 14:02:23 -0700 |
commit | df11ff29247cf049d26bcc09368d1e899705ba80 (patch) | |
tree | d1ebd8211bb6fc628cea18efe8ac2aa0a32c4b3d | |
parent | 41b552872df5a10a996340b0faa13ccceedb5f14 (diff) | |
download | native-df11ff29247cf049d26bcc09368d1e899705ba80.tar.gz |
sensorservice: Refactor tracking logic for the Proximity sensor.
This simplifies the code that tracks if the proximity sensor is
active by removing all counting of clients and simply checking the
sensor's isSensorActive() method and reporting changes to it.
Bug: b/202328704
Tests: See b/202328704#comment9 for tests done.
Change-Id: Idd72b82ed0fd5ee089e795ab4b233241350979c2
-rw-r--r-- | services/sensorservice/SensorInterface.cpp | 20 | ||||
-rw-r--r-- | services/sensorservice/SensorInterface.h | 7 | ||||
-rw-r--r-- | services/sensorservice/SensorService.cpp | 53 | ||||
-rw-r--r-- | services/sensorservice/SensorService.h | 12 |
4 files changed, 31 insertions, 61 deletions
diff --git a/services/sensorservice/SensorInterface.cpp b/services/sensorservice/SensorInterface.cpp index c285c00623..46f00e8329 100644 --- a/services/sensorservice/SensorInterface.cpp +++ b/services/sensorservice/SensorInterface.cpp @@ -92,31 +92,13 @@ ProximitySensor::ProximitySensor(const sensor_t& sensor, SensorService& service) } status_t ProximitySensor::activate(void* ident, bool enabled) { - bool lastState = mSensorDevice.isSensorActive(mSensor.getHandle()); - status_t status = HardwareSensor::activate(ident, enabled); if (status != NO_ERROR) { return status; } - - bool currentState = mSensorDevice.isSensorActive(mSensor.getHandle()); - if (currentState != lastState) { - mSensorService.onProximityActiveLocked(currentState); - } + mSensorService.checkAndReportProxStateChangeLocked(); return NO_ERROR; } -void ProximitySensor::willDisableAllSensors() { - if (mSensorDevice.isSensorActive(mSensor.getHandle())) { - mSensorService.onProximityActiveLocked(false); - } -} - -void ProximitySensor::didEnableAllSensors() { - if (mSensorDevice.isSensorActive(mSensor.getHandle())) { - mSensorService.onProximityActiveLocked(true); - } -} - // --------------------------------------------------------------------------- }; // namespace android diff --git a/services/sensorservice/SensorInterface.h b/services/sensorservice/SensorInterface.h index 4e9f7bf9c8..57043592c5 100644 --- a/services/sensorservice/SensorInterface.h +++ b/services/sensorservice/SensorInterface.h @@ -44,9 +44,6 @@ public: virtual const Sensor& getSensor() const = 0; virtual bool isVirtual() const = 0; virtual void autoDisable(void* /*ident*/, int /*handle*/) = 0; - - virtual void willDisableAllSensors() = 0; - virtual void didEnableAllSensors() = 0; }; class BaseSensor : public SensorInterface { @@ -70,8 +67,6 @@ public: virtual const Sensor& getSensor() const override { return mSensor; } virtual void autoDisable(void* /*ident*/, int /*handle*/) override { } - virtual void willDisableAllSensors() override { } - virtual void didEnableAllSensors() override { } protected: SensorDevice& mSensorDevice; Sensor mSensor; @@ -115,8 +110,6 @@ public: status_t activate(void* ident, bool enabled) override; - void willDisableAllSensors() override; - void didEnableAllSensors() override; private: SensorService& mSensorService; }; diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 726fe8ea84..3529798d00 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -103,7 +103,7 @@ static const String16 sManageSensorsPermission("android.permission.MANAGE_SENSOR SensorService::SensorService() : mInitCheck(NO_INIT), mSocketBufferSize(SOCKET_BUFFER_SIZE_NON_BATCHED), - mWakeLockAcquired(false), mProximityActiveCount(0) { + mWakeLockAcquired(false), mLastReportedProxIsActive(false) { mUidPolicy = new UidPolicy(this); mSensorPrivacyPolicy = new SensorPrivacyPolicy(this); } @@ -204,9 +204,11 @@ void SensorService::onFirstRef() { } if (useThisSensor) { if (list[i].type == SENSOR_TYPE_PROXIMITY) { - registerSensor(new ProximitySensor(list[i], *this)); + SensorInterface* s = new ProximitySensor(list[i], *this); + registerSensor(s); + mProxSensorHandles.push_back(s->getSensor().getHandle()); } else { - registerSensor( new HardwareSensor(list[i]) ); + registerSensor(new HardwareSensor(list[i])); } } } @@ -680,11 +682,8 @@ void SensorService::disableAllSensorsLocked(ConnectionSafeAutolock* connLock) { bool hasAccess = hasSensorAccessLocked(conn->getUid(), conn->getOpPackageName()); conn->onSensorAccessChanged(hasAccess); } - mSensors.forEachEntry([](const SensorServiceUtil::SensorList::Entry& e) { - e.si->willDisableAllSensors(); - return true; - }); dev.disableAllSensors(); + checkAndReportProxStateChangeLocked(); // Clear all pending flush connections for all active sensors. If one of the active // connections has called flush() and the underlying sensor has been disabled before a // flush complete event is returned, we need to remove the connection from this queue. @@ -709,14 +708,11 @@ void SensorService::enableAllSensorsLocked(ConnectionSafeAutolock* connLock) { } SensorDevice& dev(SensorDevice::getInstance()); dev.enableAllSensors(); - mSensors.forEachEntry([](const SensorServiceUtil::SensorList::Entry& e) { - e.si->didEnableAllSensors(); - return true; - }); for (const sp<SensorDirectConnection>& conn : connLock->getDirectConnections()) { bool hasAccess = hasSensorAccessLocked(conn->getUid(), conn->getOpPackageName()); conn->onSensorAccessChanged(hasAccess); } + checkAndReportProxStateChangeLocked(); } void SensorService::capRates(userid_t userId) { @@ -1538,10 +1534,7 @@ status_t SensorService::resetToNormalModeLocked() { if (err == NO_ERROR) { mCurrentOperatingMode = NORMAL; dev.enableAllSensors(); - mSensors.forEachEntry([](const SensorServiceUtil::SensorList::Entry& e) { - e.si->didEnableAllSensors(); - return true; - }); + checkAndReportProxStateChangeLocked(); } return err; } @@ -1606,28 +1599,26 @@ void SensorService::cleanupConnection(SensorDirectConnection* c) { mConnectionHolder.removeDirectConnection(c); } -void SensorService::onProximityActiveLocked(bool isActive) { - int prevCount = mProximityActiveCount; - bool activeStateChanged = false; - if (isActive) { - mProximityActiveCount++; - activeStateChanged = prevCount == 0; - } else { - mProximityActiveCount--; - if (mProximityActiveCount < 0) { - ALOGE("Proximity active count is negative (%d)!", mProximityActiveCount); +void SensorService::checkAndReportProxStateChangeLocked() { + if (mProxSensorHandles.empty()) return; + + SensorDevice& dev(SensorDevice::getInstance()); + bool isActive = false; + for (auto& sensor : mProxSensorHandles) { + if (dev.isSensorActive(sensor)) { + isActive = true; + break; } - activeStateChanged = prevCount > 0 && mProximityActiveCount <= 0; } - - if (activeStateChanged) { - notifyProximityStateLocked(mProximityActiveListeners); + if (isActive != mLastReportedProxIsActive) { + notifyProximityStateLocked(isActive, mProximityActiveListeners); + mLastReportedProxIsActive = isActive; } } void SensorService::notifyProximityStateLocked( + const bool isActive, const std::vector<sp<ProximityActiveListener>>& listeners) { - const bool isActive = mProximityActiveCount > 0; const uint64_t mySeq = ++curProxCallbackSeq; std::thread t([isActive, mySeq, listenersCopy = listeners]() { while (completedCallbackSeq.load() != mySeq - 1) @@ -1655,7 +1646,7 @@ status_t SensorService::addProximityActiveListener(const sp<ProximityActiveListe mProximityActiveListeners.push_back(callback); std::vector<sp<ProximityActiveListener>> listener(1, callback); - notifyProximityStateLocked(listener); + notifyProximityStateLocked(mLastReportedProxIsActive, listener); return OK; } diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h index def661177c..b059e61130 100644 --- a/services/sensorservice/SensorService.h +++ b/services/sensorservice/SensorService.h @@ -103,8 +103,9 @@ public: void cleanupConnection(SensorDirectConnection* c); // Call with mLock held. - void onProximityActiveLocked(bool isActive); - void notifyProximityStateLocked(const std::vector<sp<ProximityActiveListener>>& listeners); + void checkAndReportProxStateChangeLocked(); + void notifyProximityStateLocked(const bool isActive, + const std::vector<sp<ProximityActiveListener>>& listeners); status_t enable(const sp<SensorEventConnection>& connection, int handle, nsecs_t samplingPeriodNs, nsecs_t maxBatchReportLatencyNs, int reservedFlags, @@ -496,8 +497,11 @@ private: // Checks if the mic sensor privacy is enabled for the uid bool isMicSensorPrivacyEnabledForUid(uid_t uid); - // Counts how many proximity sensors are currently active. - int mProximityActiveCount; + // Keeps track of the handles of all proximity sensors in the system. + std::vector<int32_t> mProxSensorHandles; + // The last proximity sensor active state reported to listeners. + bool mLastReportedProxIsActive; + // Listeners subscribed to receive updates on the proximity sensor active state. std::vector<sp<ProximityActiveListener>> mProximityActiveListeners; }; |