diff options
author | 2022-02-15 05:03:09 +0000 | |
---|---|---|
committer | 2022-02-15 05:03:09 +0000 | |
commit | 17b449fc647318859bbdefb87b7a2103ee40faf8 (patch) | |
tree | 333c559c8a34bffa272b8051d2f28104c61bdfc7 | |
parent | 6f70c4810187c0a276daa68f947f47bf67d446ad (diff) | |
parent | 4c1978562d7b476952cb9c468be3e09ea64b1ccd (diff) |
Merge changes from topic "hardware_sensor_privacy_apis"
* changes:
Upadate sensor service to use new sensor privacy api
Sync native sensor privacy aidl with frameworks/base
6 files changed, 112 insertions, 101 deletions
diff --git a/libs/sensorprivacy/SensorPrivacyManager.cpp b/libs/sensorprivacy/SensorPrivacyManager.cpp index ef3ceda07c..2be98e7281 100644 --- a/libs/sensorprivacy/SensorPrivacyManager.cpp +++ b/libs/sensorprivacy/SensorPrivacyManager.cpp @@ -55,12 +55,12 @@ sp<hardware::ISensorPrivacyManager> SensorPrivacyManager::getService() return service; } -bool SensorPrivacyManager::supportsSensorToggle(int sensor) { +bool SensorPrivacyManager::supportsSensorToggle(int toggleType, int sensor) { if (mSupportedCache.find(sensor) == mSupportedCache.end()) { sp<hardware::ISensorPrivacyManager> service = getService(); if (service != nullptr) { bool result; - service->supportsSensorToggle(sensor, &result); + service->supportsSensorToggle(toggleType, sensor, &result); mSupportedCache[sensor] = result; return result; } @@ -80,12 +80,12 @@ void SensorPrivacyManager::addSensorPrivacyListener( } } -status_t SensorPrivacyManager::addIndividualSensorPrivacyListener(int userId, int sensor, +status_t SensorPrivacyManager::addToggleSensorPrivacyListener( const sp<hardware::ISensorPrivacyListener>& listener) { sp<hardware::ISensorPrivacyManager> service = getService(); if (service != nullptr) { - return service->addIndividualSensorPrivacyListener(userId, sensor, listener) + return service->addToggleSensorPrivacyListener(listener) .transactionError(); } return UNEXPECTED_NULL; @@ -100,12 +100,12 @@ void SensorPrivacyManager::removeSensorPrivacyListener( } } -void SensorPrivacyManager::removeIndividualSensorPrivacyListener(int sensor, +void SensorPrivacyManager::removeToggleSensorPrivacyListener( const sp<hardware::ISensorPrivacyListener>& listener) { sp<hardware::ISensorPrivacyManager> service = getService(); if (service != nullptr) { - service->removeIndividualSensorPrivacyListener(sensor, listener); + service->removeToggleSensorPrivacyListener(listener); } } @@ -121,24 +121,36 @@ bool SensorPrivacyManager::isSensorPrivacyEnabled() return false; } -bool SensorPrivacyManager::isIndividualSensorPrivacyEnabled(int userId, int sensor) +bool SensorPrivacyManager::isToggleSensorPrivacyEnabled(int sensor) +{ + sp<hardware::ISensorPrivacyManager> service = getService(); + if (service != nullptr) { + bool result; + service->isCombinedToggleSensorPrivacyEnabled(sensor, &result); + return result; + } + // if the SensorPrivacyManager is not available then assume sensor privacy is disabled + return false; +} + +bool SensorPrivacyManager::isToggleSensorPrivacyEnabled(int toggleType, int sensor) { sp<hardware::ISensorPrivacyManager> service = getService(); if (service != nullptr) { bool result; - service->isIndividualSensorPrivacyEnabled(userId, sensor, &result); + service->isToggleSensorPrivacyEnabled(toggleType, sensor, &result); return result; } // if the SensorPrivacyManager is not available then assume sensor privacy is disabled return false; } -status_t SensorPrivacyManager::isIndividualSensorPrivacyEnabled(int userId, int sensor, +status_t SensorPrivacyManager::isToggleSensorPrivacyEnabled(int toggleType, int sensor, bool &returnVal) { sp<hardware::ISensorPrivacyManager> service = getService(); if (service != nullptr) { - binder::Status res = service->isIndividualSensorPrivacyEnabled(userId, sensor, &returnVal); + binder::Status res = service->isToggleSensorPrivacyEnabled(toggleType, sensor, &returnVal); return res.transactionError(); } // if the SensorPrivacyManager is not available then assume sensor privacy is disabled diff --git a/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyListener.aidl b/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyListener.aidl index 58177d837f..eccd54c3eb 100644 --- a/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyListener.aidl +++ b/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyListener.aidl @@ -20,5 +20,5 @@ package android.hardware; * @hide */ oneway interface ISensorPrivacyListener { - void onSensorPrivacyChanged(boolean enabled); + void onSensorPrivacyChanged(int toggleType, int sensor, boolean enabled); } diff --git a/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl b/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl index 9564cba60d..49a1e1ea05 100644 --- a/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl +++ b/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl @@ -20,23 +20,25 @@ import android.hardware.ISensorPrivacyListener; /** @hide */ interface ISensorPrivacyManager { - boolean supportsSensorToggle(int sensor); + boolean supportsSensorToggle(int toggleType, int sensor); void addSensorPrivacyListener(in ISensorPrivacyListener listener); - void addIndividualSensorPrivacyListener(int userId, int sensor, in ISensorPrivacyListener listener); + void addToggleSensorPrivacyListener(in ISensorPrivacyListener listener); void removeSensorPrivacyListener(in ISensorPrivacyListener listener); - void removeIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener); + void removeToggleSensorPrivacyListener(in ISensorPrivacyListener listener); boolean isSensorPrivacyEnabled(); - boolean isIndividualSensorPrivacyEnabled(int userId, int sensor); + boolean isCombinedToggleSensorPrivacyEnabled(int sensor); + + boolean isToggleSensorPrivacyEnabled(int toggleType, int sensor); void setSensorPrivacy(boolean enable); - void setIndividualSensorPrivacy(int userId, int source, int sensor, boolean enable); + void setToggleSensorPrivacy(int userId, int source, int sensor, boolean enable); - void setIndividualSensorPrivacyForProfileGroup(int userId, int source, int sensor, boolean enable); + void setToggleSensorPrivacyForProfileGroup(int userId, int source, int sensor, boolean enable); } diff --git a/libs/sensorprivacy/include/sensorprivacy/SensorPrivacyManager.h b/libs/sensorprivacy/include/sensorprivacy/SensorPrivacyManager.h index af699d0b31..fc5fdf7900 100644 --- a/libs/sensorprivacy/include/sensorprivacy/SensorPrivacyManager.h +++ b/libs/sensorprivacy/include/sensorprivacy/SensorPrivacyManager.h @@ -31,22 +31,26 @@ class SensorPrivacyManager { public: enum { - INDIVIDUAL_SENSOR_MICROPHONE = 1, - INDIVIDUAL_SENSOR_CAMERA = 2 + TOGGLE_SENSOR_MICROPHONE = 1, + TOGGLE_SENSOR_CAMERA = 2 + }; + + enum { + TOGGLE_TYPE_SOFTWARE = 1, + TOGGLE_TYPE_HARDWARE = 2 }; SensorPrivacyManager(); - bool supportsSensorToggle(int sensor); + bool supportsSensorToggle(int toggleType, int sensor); void addSensorPrivacyListener(const sp<hardware::ISensorPrivacyListener>& listener); - status_t addIndividualSensorPrivacyListener(int userId, int sensor, - const sp<hardware::ISensorPrivacyListener>& listener); + status_t addToggleSensorPrivacyListener(const sp<hardware::ISensorPrivacyListener>& listener); void removeSensorPrivacyListener(const sp<hardware::ISensorPrivacyListener>& listener); - void removeIndividualSensorPrivacyListener(int sensor, - const sp<hardware::ISensorPrivacyListener>& listener); + void removeToggleSensorPrivacyListener(const sp<hardware::ISensorPrivacyListener>& listener); bool isSensorPrivacyEnabled(); - bool isIndividualSensorPrivacyEnabled(int userId, int sensor); - status_t isIndividualSensorPrivacyEnabled(int userId, int sensor, bool &result); + bool isToggleSensorPrivacyEnabled(int sensor); + bool isToggleSensorPrivacyEnabled(int toggleType, int sensor); + status_t isToggleSensorPrivacyEnabled(int toggleType, int sensor, bool &result); status_t linkToDeath(const sp<IBinder::DeathRecipient>& recipient); status_t unlinkToDeath(const sp<IBinder::DeathRecipient>& recipient); diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 971491dbef..3c164aadd9 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -134,6 +134,7 @@ SensorService::SensorService() mWakeLockAcquired(false), mLastReportedProxIsActive(false) { mUidPolicy = new UidPolicy(this); mSensorPrivacyPolicy = new SensorPrivacyPolicy(this); + mMicSensorPrivacyPolicy = new MicrophonePrivacyPolicy(this); } bool SensorService::initializeHmacKey() { @@ -369,6 +370,9 @@ void SensorService::onFirstRef() { // Start watching sensor privacy changes mSensorPrivacyPolicy->registerSelf(); + + // Start watching mic sensor privacy changes + mMicSensorPrivacyPolicy->registerSelf(); } } } @@ -439,9 +443,7 @@ SensorService::~SensorService() { } mUidPolicy->unregisterSelf(); mSensorPrivacyPolicy->unregisterSelf(); - for (auto const& [userId, policy] : mMicSensorPrivacyPolicies) { - policy->unregisterSelf(); - } + mMicSensorPrivacyPolicy->unregisterSelf(); } status_t SensorService::dump(int fd, const Vector<String16>& args) { @@ -773,33 +775,25 @@ void SensorService::enableAllSensorsLocked(ConnectionSafeAutolock* connLock) { checkAndReportProxStateChangeLocked(); } -void SensorService::capRates(userid_t userId) { +void SensorService::capRates() { ConnectionSafeAutolock connLock = mConnectionHolder.lock(mLock); for (const sp<SensorDirectConnection>& conn : connLock.getDirectConnections()) { - if (conn->getUserId() == userId) { - conn->onMicSensorAccessChanged(true); - } + conn->onMicSensorAccessChanged(true); } for (const sp<SensorEventConnection>& conn : connLock.getActiveConnections()) { - if (conn->getUserId() == userId) { - conn->onMicSensorAccessChanged(true); - } + conn->onMicSensorAccessChanged(true); } } -void SensorService::uncapRates(userid_t userId) { +void SensorService::uncapRates() { ConnectionSafeAutolock connLock = mConnectionHolder.lock(mLock); for (const sp<SensorDirectConnection>& conn : connLock.getDirectConnections()) { - if (conn->getUserId() == userId) { - conn->onMicSensorAccessChanged(false); - } + conn->onMicSensorAccessChanged(false); } for (const sp<SensorEventConnection>& conn : connLock.getActiveConnections()) { - if (conn->getUserId() == userId) { - conn->onMicSensorAccessChanged(false); - } + conn->onMicSensorAccessChanged(false); } } @@ -2243,7 +2237,6 @@ bool SensorService::isSensorInCappedSet(int sensorType) { status_t SensorService::adjustSamplingPeriodBasedOnMicAndPermission(nsecs_t* requestedPeriodNs, const String16& opPackageName) { - uid_t uid = IPCThreadState::self()->getCallingUid(); if (*requestedPeriodNs >= SENSOR_SERVICE_CAPPED_SAMPLING_PERIOD_NS) { return OK; } @@ -2255,7 +2248,7 @@ status_t SensorService::adjustSamplingPeriodBasedOnMicAndPermission(nsecs_t* req } return OK; } - if (isMicSensorPrivacyEnabledForUid(uid)) { + if (mMicSensorPrivacyPolicy->isSensorPrivacyEnabled()) { *requestedPeriodNs = SENSOR_SERVICE_CAPPED_SAMPLING_PERIOD_NS; return OK; } @@ -2264,7 +2257,6 @@ status_t SensorService::adjustSamplingPeriodBasedOnMicAndPermission(nsecs_t* req status_t SensorService::adjustRateLevelBasedOnMicAndPermission(int* requestedRateLevel, const String16& opPackageName) { - uid_t uid = IPCThreadState::self()->getCallingUid(); if (*requestedRateLevel <= SENSOR_SERVICE_CAPPED_SAMPLING_RATE_LEVEL) { return OK; } @@ -2276,7 +2268,7 @@ status_t SensorService::adjustRateLevelBasedOnMicAndPermission(int* requestedRat } return OK; } - if (isMicSensorPrivacyEnabledForUid(uid)) { + if (mMicSensorPrivacyPolicy->isSensorPrivacyEnabled()) { *requestedRateLevel = SENSOR_SERVICE_CAPPED_SAMPLING_RATE_LEVEL; return OK; } @@ -2293,69 +2285,63 @@ void SensorService::SensorPrivacyPolicy::registerSelf() { void SensorService::SensorPrivacyPolicy::unregisterSelf() { AutoCallerClear acc; SensorPrivacyManager spm; - if (mIsIndividualMic) { - spm.removeIndividualSensorPrivacyListener( - SensorPrivacyManager::INDIVIDUAL_SENSOR_MICROPHONE, this); - } else { - spm.removeSensorPrivacyListener(this); - } + spm.removeSensorPrivacyListener(this); } bool SensorService::SensorPrivacyPolicy::isSensorPrivacyEnabled() { return mSensorPrivacyEnabled; } -binder::Status SensorService::SensorPrivacyPolicy::onSensorPrivacyChanged(bool enabled) { +binder::Status SensorService::SensorPrivacyPolicy::onSensorPrivacyChanged(int toggleType __unused, + int sensor __unused, bool enabled) { mSensorPrivacyEnabled = enabled; sp<SensorService> service = mService.promote(); if (service != nullptr) { - if (mIsIndividualMic) { - if (enabled) { - service->capRates(mUserId); - } else { - service->uncapRates(mUserId); - } + if (enabled) { + service->disableAllSensors(); } else { - if (enabled) { - service->disableAllSensors(); - } else { - service->enableAllSensors(); - } + service->enableAllSensors(); } } return binder::Status::ok(); } -status_t SensorService::SensorPrivacyPolicy::registerSelfForIndividual(int userId) { - Mutex::Autolock _l(mSensorPrivacyLock); +void SensorService::MicrophonePrivacyPolicy::registerSelf() { AutoCallerClear acc; SensorPrivacyManager spm; - status_t err = spm.addIndividualSensorPrivacyListener(userId, - SensorPrivacyManager::INDIVIDUAL_SENSOR_MICROPHONE, this); - - if (err != OK) { - ALOGE("Cannot register a mic listener."); - return err; - } - mSensorPrivacyEnabled = spm.isIndividualSensorPrivacyEnabled(userId, - SensorPrivacyManager::INDIVIDUAL_SENSOR_MICROPHONE); + mSensorPrivacyEnabled = + spm.isToggleSensorPrivacyEnabled( + SensorPrivacyManager::TOGGLE_TYPE_SOFTWARE, + SensorPrivacyManager::TOGGLE_SENSOR_MICROPHONE) + || spm.isToggleSensorPrivacyEnabled( + SensorPrivacyManager::TOGGLE_TYPE_HARDWARE, + SensorPrivacyManager::TOGGLE_SENSOR_MICROPHONE); + spm.addToggleSensorPrivacyListener(this); +} - mIsIndividualMic = true; - mUserId = userId; - return OK; +void SensorService::MicrophonePrivacyPolicy::unregisterSelf() { + AutoCallerClear acc; + SensorPrivacyManager spm; + spm.removeToggleSensorPrivacyListener(this); } -bool SensorService::isMicSensorPrivacyEnabledForUid(uid_t uid) { - userid_t userId = multiuser_get_user_id(uid); - if (mMicSensorPrivacyPolicies.find(userId) == mMicSensorPrivacyPolicies.end()) { - sp<SensorPrivacyPolicy> userPolicy = new SensorPrivacyPolicy(this); - if (userPolicy->registerSelfForIndividual(userId) != OK) { - return false; +binder::Status SensorService::MicrophonePrivacyPolicy::onSensorPrivacyChanged(int toggleType __unused, + int sensor, bool enabled) { + if (sensor != SensorPrivacyManager::TOGGLE_SENSOR_MICROPHONE) { + return binder::Status::ok(); + } + mSensorPrivacyEnabled = enabled; + sp<SensorService> service = mService.promote(); + + if (service != nullptr) { + if (enabled) { + service->capRates(); + } else { + service->uncapRates(); } - mMicSensorPrivacyPolicies[userId] = userPolicy; } - return mMicSensorPrivacyPolicies[userId]->isSensorPrivacyEnabled(); + return binder::Status::ok(); } SensorService::ConnectionSafeAutolock::ConnectionSafeAutolock( diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h index b009829ed6..7194db3275 100644 --- a/services/sensorservice/SensorService.h +++ b/services/sensorservice/SensorService.h @@ -289,22 +289,32 @@ private: class SensorPrivacyPolicy : public hardware::BnSensorPrivacyListener { public: explicit SensorPrivacyPolicy(wp<SensorService> service) - : mService(service), mIsIndividualMic(false), mUserId(0) {} + : mService(service) {} void registerSelf(); void unregisterSelf(); - status_t registerSelfForIndividual(int userId); - bool isSensorPrivacyEnabled(); - binder::Status onSensorPrivacyChanged(bool enabled); + binder::Status onSensorPrivacyChanged(int toggleType, int sensor, + bool enabled); - private: + protected: + std::atomic_bool mSensorPrivacyEnabled; wp<SensorService> mService; + + private: Mutex mSensorPrivacyLock; - std::atomic_bool mSensorPrivacyEnabled; - bool mIsIndividualMic; - userid_t mUserId; + }; + + class MicrophonePrivacyPolicy : public SensorPrivacyPolicy { + public: + explicit MicrophonePrivacyPolicy(wp<SensorService> service) + : SensorPrivacyPolicy(service) {} + void registerSelf(); + void unregisterSelf(); + + binder::Status onSensorPrivacyChanged(int toggleType, int sensor, + bool enabled); }; // A class automatically clearing and restoring binder caller identity inside @@ -444,9 +454,9 @@ private: void enableAllSensorsLocked(ConnectionSafeAutolock* connLock); // Caps active direct connections (when the mic toggle is flipped to on) - void capRates(userid_t userId); + void capRates(); // Removes the capped rate on active direct connections (when the mic toggle is flipped to off) - void uncapRates(userid_t userId); + void uncapRates(); static inline bool isAudioServerOrSystemServerUid(uid_t uid) { return multiuser_get_app_id(uid) == AID_SYSTEM || uid == AID_AUDIOSERVER; @@ -497,10 +507,7 @@ private: static Mutex sPackageTargetVersionLock; static String16 sSensorInterfaceDescriptorPrefix; - // Map from user to SensorPrivacyPolicy - std::map<userid_t, sp<SensorPrivacyPolicy>> mMicSensorPrivacyPolicies; - // Checks if the mic sensor privacy is enabled for the uid - bool isMicSensorPrivacyEnabledForUid(uid_t uid); + sp<MicrophonePrivacyPolicy> mMicSensorPrivacyPolicy; // Keeps track of the handles of all proximity sensors in the system. std::vector<int32_t> mProxSensorHandles; |