Add an API to return Health Info
Bug: 71860528
Test: vts-tradefed run vts -m VtsHalHealthV2_0
Change-Id: I5e0defdabcd8e44b32a6eab609492ff354512e64
diff --git a/health/2.0/Android.bp b/health/2.0/Android.bp
index 97704bf..c444165 100644
--- a/health/2.0/Android.bp
+++ b/health/2.0/Android.bp
@@ -18,6 +18,7 @@
types: [
"Result",
"DiskStats",
+ "HealthInfo",
"StorageAttribute",
"StorageInfo",
],
diff --git a/health/2.0/IHealth.hal b/health/2.0/IHealth.hal
index a33bb15..9303ba1 100644
--- a/health/2.0/IHealth.hal
+++ b/health/2.0/IHealth.hal
@@ -160,4 +160,15 @@
* The mapping is index 0->sda, 1->sdb and so on.
*/
getDiskStats() generates (Result result, vec<DiskStats> value);
+
+ /**
+ * Get Health Information.
+ *
+ * @return result SUCCESS if successful,
+ * NOT_SUPPORTED if this API is not supported,
+ * UNKNOWN for other errors.
+ * @return value Health information, to be ignored if result is not
+ * SUCCESS.
+ */
+ getHealthInfo() generates (Result result, @2.0::HealthInfo value);
};
diff --git a/health/2.0/IHealthInfoCallback.hal b/health/2.0/IHealthInfoCallback.hal
index 8e17bb9..737ea72 100644
--- a/health/2.0/IHealthInfoCallback.hal
+++ b/health/2.0/IHealthInfoCallback.hal
@@ -28,5 +28,5 @@
* registered callbacks after health info changes.
* @param info the updated HealthInfo
*/
- oneway healthInfoChanged(HealthInfo info);
+ oneway healthInfoChanged(@1.0::HealthInfo info);
};
diff --git a/health/2.0/default/Health.cpp b/health/2.0/default/Health.cpp
index 96f6d70..c1dd194 100644
--- a/health/2.0/default/Health.cpp
+++ b/health/2.0/default/Health.cpp
@@ -18,6 +18,7 @@
#include <health2/Health.h>
+#include <hal_conversion.h>
#include <hidl/HidlTransportSupport.h>
extern void healthd_battery_update_internal(bool);
@@ -199,6 +200,39 @@
return Void();
}
+Return<void> Health::getHealthInfo(getHealthInfo_cb _hidl_cb) {
+ using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
+
+ update();
+ struct android::BatteryProperties p = getBatteryProperties(battery_monitor_.get());
+
+ V1_0::HealthInfo batteryInfo;
+ convertToHealthInfo(&p, batteryInfo);
+
+ std::vector<StorageInfo> info;
+ get_storage_info(info);
+
+ std::vector<DiskStats> stats;
+ get_disk_stats(stats);
+
+ int32_t currentAvg = 0;
+
+ struct BatteryProperty prop;
+ status_t ret = battery_monitor_->getProperty(BATTERY_PROP_CURRENT_AVG, &prop);
+ if (ret == OK) {
+ currentAvg = static_cast<int32_t>(prop.valueInt64);
+ }
+
+ V2_0::HealthInfo healthInfo = {};
+ healthInfo.legacy = std::move(batteryInfo);
+ healthInfo.batteryCurrentAverage = currentAvg;
+ healthInfo.diskStats = stats;
+ healthInfo.storageInfos = info;
+
+ _hidl_cb(Result::SUCCESS, healthInfo);
+ return Void();
+}
+
void Health::serviceDied(uint64_t /* cookie */, const wp<IBase>& who) {
(void)unregisterCallbackInternal(who.promote());
}
diff --git a/health/2.0/default/include/health2/Health.h b/health/2.0/default/include/health2/Health.h
index 41ba9e9..fc86789 100644
--- a/health/2.0/default/include/health2/Health.h
+++ b/health/2.0/default/include/health2/Health.h
@@ -52,6 +52,7 @@
Return<void> getChargeStatus(getChargeStatus_cb _hidl_cb) override;
Return<void> getStorageInfo(getStorageInfo_cb _hidl_cb) override;
Return<void> getDiskStats(getDiskStats_cb _hidl_cb) override;
+ Return<void> getHealthInfo(getHealthInfo_cb _hidl_cb) override;
// Methods from ::android::hidl::base::V1_0::IBase follow.
Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& args) override;
diff --git a/health/2.0/types.hal b/health/2.0/types.hal
index 4e7a081..c74076e 100644
--- a/health/2.0/types.hal
+++ b/health/2.0/types.hal
@@ -124,3 +124,31 @@
*/
StorageAttribute attr;
};
+
+/**
+ * Combined Health Information.
+ */
+struct HealthInfo {
+ /**
+ * V1.0 HealthInfo.
+ * If a member is unsupported, it is filled with:
+ * - 0 (for integers);
+ * - false (for booleans);
+ * - empty string (for strings);
+ * - UNKNOWN (for BatteryStatus and BatteryHealth).
+ */
+ @1.0::HealthInfo legacy;
+ /**
+ * Average battery current in uA. Will be 0 if unsupported.
+ */
+ int64_t batteryCurrentAverage;
+ /**
+ * Disk Statistics. Will be an empty vector if unsupported.
+ */
+ vec<DiskStats> diskStats;
+ /**
+ * Information on storage devices. Will be an empty vector if
+ * unsupported.
+ */
+ vec<StorageInfo> storageInfos;
+};