diff --git a/health/2.0/default/Health.cpp b/health/2.0/default/Health.cpp index 4a4bee06fb..a2b81d1ba1 100644 --- a/health/2.0/default/Health.cpp +++ b/health/2.0/default/Health.cpp @@ -58,7 +58,7 @@ Return Health::registerCallback(const sp& callback) // ignore the error } - return update(); + return updateAndNotify(callback); } bool Health::unregisterCallbackInternal(const sp& callback) { @@ -156,6 +156,18 @@ Return Health::update() { return Result::SUCCESS; } +Return Health::updateAndNotify(const sp& callback) { + std::lock_guard lock(callbacks_lock_); + std::vector> storedCallbacks{std::move(callbacks_)}; + callbacks_.clear(); + if (callback != nullptr) { + callbacks_.push_back(callback); + } + Return result = update(); + callbacks_ = std::move(storedCallbacks); + return result; +} + void Health::notifyListeners(HealthInfo* healthInfo) { std::vector info; get_storage_info(info); @@ -233,7 +245,7 @@ Return Health::getDiskStats(getDiskStats_cb _hidl_cb) { Return Health::getHealthInfo(getHealthInfo_cb _hidl_cb) { using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo; - update(); + updateAndNotify(nullptr); struct android::BatteryProperties p = getBatteryProperties(battery_monitor_.get()); V1_0::HealthInfo batteryInfo; diff --git a/health/2.0/default/include/health2/Health.h b/health/2.0/default/include/health2/Health.h index b960358bfd..6410474511 100644 --- a/health/2.0/default/include/health2/Health.h +++ b/health/2.0/default/include/health2/Health.h @@ -64,6 +64,10 @@ struct Health : public IHealth, hidl_death_recipient { std::unique_ptr battery_monitor_; bool unregisterCallbackInternal(const sp& cb); + + // update() and only notify the given callback, but none of the other callbacks. + // If cb is null, do not notify any callback at all. + Return updateAndNotify(const sp& cb); }; } // namespace implementation