mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 05:49:27 +00:00
Merge changes from topic "health_report_api"
* changes: Test API returning health information Add an API to return Health Info
This commit is contained in:
committed by
Android (Google) Code Review
commit
759987d939
@@ -18,6 +18,7 @@ hidl_interface {
|
||||
types: [
|
||||
"Result",
|
||||
"DiskStats",
|
||||
"HealthInfo",
|
||||
"StorageAttribute",
|
||||
"StorageInfo",
|
||||
],
|
||||
|
||||
@@ -160,4 +160,15 @@ interface IHealth {
|
||||
* 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);
|
||||
};
|
||||
|
||||
@@ -28,5 +28,5 @@ interface IHealthInfoCallback {
|
||||
* registered callbacks after health info changes.
|
||||
* @param info the updated HealthInfo
|
||||
*/
|
||||
oneway healthInfoChanged(HealthInfo info);
|
||||
oneway healthInfoChanged(@1.0::HealthInfo info);
|
||||
};
|
||||
|
||||
@@ -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> Health::getDiskStats(getDiskStats_cb _hidl_cb) {
|
||||
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());
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ struct Health : public IHealth, hidl_death_recipient {
|
||||
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;
|
||||
|
||||
@@ -124,3 +124,31 @@ struct DiskStats {
|
||||
*/
|
||||
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;
|
||||
};
|
||||
|
||||
@@ -35,7 +35,6 @@ namespace health {
|
||||
namespace V2_0 {
|
||||
|
||||
using V1_0::BatteryStatus;
|
||||
using V1_0::HealthInfo;
|
||||
|
||||
// Test environment for graphics.composer
|
||||
class HealthHidlEnvironment : public VtsHalHidlTargetTestEnvBase {
|
||||
@@ -69,7 +68,7 @@ class HealthHidlTest : public ::testing::VtsHalHidlTargetTestBase {
|
||||
|
||||
class Callback : public IHealthInfoCallback {
|
||||
public:
|
||||
Return<void> healthInfoChanged(const HealthInfo&) override {
|
||||
Return<void> healthInfoChanged(const V1_0::HealthInfo&) override {
|
||||
std::lock_guard<std::mutex> lock(mMutex);
|
||||
mInvoked = true;
|
||||
mInvokedNotify.notify_all();
|
||||
@@ -203,6 +202,43 @@ bool verifyDiskStats(const hidl_vec<struct DiskStats>& stats) {
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool verifyEnum(T value) {
|
||||
for (auto it : hidl_enum_iterator<T>()) {
|
||||
if (it == value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool verifyHealthInfo(const HealthInfo& health_info) {
|
||||
if (!verifyStorageInfo(health_info.storageInfos) || !verifyDiskStats(health_info.diskStats)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
using V1_0::BatteryStatus;
|
||||
using V1_0::BatteryHealth;
|
||||
|
||||
if (!((health_info.legacy.batteryChargeCounter > 0) &&
|
||||
(health_info.legacy.batteryCurrent != INT32_MIN) &&
|
||||
(0 <= health_info.legacy.batteryLevel && health_info.legacy.batteryLevel <= 100) &&
|
||||
verifyEnum<BatteryHealth>(health_info.legacy.batteryHealth) &&
|
||||
(health_info.legacy.batteryStatus != BatteryStatus::UNKNOWN) &&
|
||||
verifyEnum<BatteryStatus>(health_info.legacy.batteryStatus))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests the values returned by getChargeCounter(),
|
||||
* getCurrentNow(), getCurrentAverage(), getCapacity(), getEnergyCounter(),
|
||||
* getChargeStatus(), getStorageInfo(), getDiskStats() and getHealthInfo() from
|
||||
* interface IHealth.
|
||||
*/
|
||||
TEST_F(HealthHidlTest, Properties) {
|
||||
EXPECT_OK(mHealth->getChargeCounter([](auto result, auto value) {
|
||||
EXPECT_VALID_OR_UNSUPPORTED_PROP(result, std::to_string(value), value > 0);
|
||||
@@ -222,15 +258,17 @@ TEST_F(HealthHidlTest, Properties) {
|
||||
EXPECT_OK(mHealth->getChargeStatus([](auto result, auto value) {
|
||||
EXPECT_VALID_OR_UNSUPPORTED_PROP(
|
||||
result, toString(value),
|
||||
value == BatteryStatus::CHARGING || value == BatteryStatus::DISCHARGING ||
|
||||
value == BatteryStatus::NOT_CHARGING || value == BatteryStatus::FULL);
|
||||
value != BatteryStatus::UNKNOWN && verifyEnum<BatteryStatus>(value));
|
||||
}));
|
||||
EXPECT_OK(mHealth->getStorageInfo([](auto result, auto& value) {
|
||||
EXPECT_VALID_OR_UNSUPPORTED_PROP(result, toString(value), (verifyStorageInfo(value)));
|
||||
EXPECT_VALID_OR_UNSUPPORTED_PROP(result, toString(value), verifyStorageInfo(value));
|
||||
}));
|
||||
EXPECT_OK(mHealth->getDiskStats([](auto result, auto& value) {
|
||||
EXPECT_VALID_OR_UNSUPPORTED_PROP(result, toString(value), verifyDiskStats(value));
|
||||
}));
|
||||
EXPECT_OK(mHealth->getHealthInfo([](auto result, auto& value) {
|
||||
EXPECT_VALID_OR_UNSUPPORTED_PROP(result, toString(value), verifyHealthInfo(value));
|
||||
}));
|
||||
}
|
||||
|
||||
} // namespace V2_0
|
||||
|
||||
Reference in New Issue
Block a user