From 85b3b0321a43df61a40dff5588da9b9816802ca9 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 5 Dec 2023 21:34:32 -0800 Subject: [PATCH] Add android.hardware.health AIDL HAL V3. Bug: 309792384 Test: m Change-Id: I5e9183b840f523f4d5b81dec813d35983882f71d --- .../compatibility_matrix.9.xml | 2 +- health/aidl/Android.bp | 6 +-- .../hardware/health/BatteryHealthData.aidl | 2 + .../hardware/health/BatteryPartStatus.aidl | 40 +++++++++++++++++++ .../hardware/health/BatteryHealthData.aidl | 12 ++++++ .../hardware/health/BatteryPartStatus.aidl | 39 ++++++++++++++++++ health/aidl/default/Android.bp | 6 +-- health/aidl/default/Health.cpp | 2 + ...ndroid.hardware.health-service.example.xml | 2 +- health/aidl/vts/functional/Android.bp | 2 +- .../vts/functional/VtsHalHealthTargetTest.cpp | 28 ++++++++++++- health/utils/libhealthshim/Android.bp | 2 +- health/utils/libhealthshim/shim.cpp | 1 + 13 files changed, 132 insertions(+), 12 deletions(-) create mode 100644 health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryPartStatus.aidl create mode 100644 health/aidl/android/hardware/health/BatteryPartStatus.aidl diff --git a/compatibility_matrices/compatibility_matrix.9.xml b/compatibility_matrices/compatibility_matrix.9.xml index de2e1d14bf..baac0c90da 100644 --- a/compatibility_matrices/compatibility_matrix.9.xml +++ b/compatibility_matrices/compatibility_matrix.9.xml @@ -257,7 +257,7 @@ android.hardware.health - 1-2 + 3 IHealth default diff --git a/health/aidl/Android.bp b/health/aidl/Android.bp index e288f179bb..4691dd6432 100644 --- a/health/aidl/Android.bp +++ b/health/aidl/Android.bp @@ -48,7 +48,7 @@ aidl_interface { }, ], - frozen: true, + frozen: false, } @@ -80,7 +80,7 @@ cc_library { name: "android.hardware.health-translate-ndk", defaults: ["android.hardware.health-translate-ndk_defaults"], shared_libs: [ - "android.hardware.health-V2-ndk", + "android.hardware.health-V3-ndk", ], } @@ -97,7 +97,7 @@ java_library { name: "android.hardware.health-translate-java", srcs: ["android/hardware/health/Translate.java"], libs: [ - "android.hardware.health-V2-java", + "android.hardware.health-V3-java", "android.hardware.health-V2.0-java", "android.hardware.health-V2.1-java", ], diff --git a/health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryHealthData.aidl b/health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryHealthData.aidl index 2dd01b146f..089c8ac3ae 100644 --- a/health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryHealthData.aidl +++ b/health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryHealthData.aidl @@ -37,4 +37,6 @@ parcelable BatteryHealthData { long batteryManufacturingDateSeconds; long batteryFirstUsageSeconds; long batteryStateOfHealth; + @nullable String batterySerialNumber; + android.hardware.health.BatteryPartStatus batteryPartStatus = android.hardware.health.BatteryPartStatus.UNSUPPORTED; } diff --git a/health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryPartStatus.aidl b/health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryPartStatus.aidl new file mode 100644 index 0000000000..e013e31a24 --- /dev/null +++ b/health/aidl/aidl_api/android.hardware.health/current/android/hardware/health/BatteryPartStatus.aidl @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.health; +@Backing(type="int") @VintfStability +enum BatteryPartStatus { + UNSUPPORTED, + ORIGINAL, + REPLACED, +} diff --git a/health/aidl/android/hardware/health/BatteryHealthData.aidl b/health/aidl/android/hardware/health/BatteryHealthData.aidl index 594bcce576..7245298133 100644 --- a/health/aidl/android/hardware/health/BatteryHealthData.aidl +++ b/health/aidl/android/hardware/health/BatteryHealthData.aidl @@ -16,6 +16,8 @@ package android.hardware.health; +import android.hardware.health.BatteryPartStatus; + /* * Battery health data */ @@ -36,4 +38,14 @@ parcelable BatteryHealthData { * Otherwise, value must be in the range 0 to 100. */ long batteryStateOfHealth; + /** + * Serial number of the battery. Null if not supported. If supported, a string of at least 6 + * alphanumeric characters. Characters may either be upper or lower case, but for comparison + * and uniqueness purposes, must be treated as case-insensitive. + */ + @nullable String batterySerialNumber; + /** + * Indicator for part originality of the battery. + */ + BatteryPartStatus batteryPartStatus = BatteryPartStatus.UNSUPPORTED; } diff --git a/health/aidl/android/hardware/health/BatteryPartStatus.aidl b/health/aidl/android/hardware/health/BatteryPartStatus.aidl new file mode 100644 index 0000000000..6c2060ae77 --- /dev/null +++ b/health/aidl/android/hardware/health/BatteryPartStatus.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.health; + +/** + * Possible values for BatteryPartStatus. + * Note: These are currently in sync with BatteryManager and must not + * be extended / altered. + */ +@VintfStability +@Backing(type="int") +enum BatteryPartStatus { + /** + * Device cannot differentiate an original battery from a replaced battery. + */ + UNSUPPORTED = 0, + /** + * Device has the original battery it was manufactured with. + */ + ORIGINAL = 1, + /** + * Device has a replaced battery. + */ + REPLACED = 2, +} diff --git a/health/aidl/default/Android.bp b/health/aidl/default/Android.bp index b51e4f3ec7..2071f08f61 100644 --- a/health/aidl/default/Android.bp +++ b/health/aidl/default/Android.bp @@ -29,7 +29,7 @@ cc_defaults { "libcutils", "liblog", "libutils", - "android.hardware.health-V2-ndk", + "android.hardware.health-V3-ndk", // TODO(b/177269435): remove when BatteryMonitor works with AIDL HealthInfo. "libhidlbase", @@ -48,7 +48,7 @@ cc_defaults { name: "libhealth_aidl_charger_defaults", shared_libs: [ // common - "android.hardware.health-V2-ndk", + "android.hardware.health-V3-ndk", "libbase", "libcutils", "liblog", @@ -195,7 +195,7 @@ cc_fuzz { "service_fuzzer_defaults", ], static_libs: [ - "android.hardware.health-V2-ndk", + "android.hardware.health-V3-ndk", "libbase", "liblog", "fuzz_libhealth_aidl_impl", diff --git a/health/aidl/default/Health.cpp b/health/aidl/default/Health.cpp index 1d8cc132a7..8b512c4b4e 100644 --- a/health/aidl/default/Health.cpp +++ b/health/aidl/default/Health.cpp @@ -153,6 +153,8 @@ ndk::ScopedAStatus Health::getBatteryHealthData(BatteryHealthData* out) { !res.isOk()) { LOG(WARNING) << "Cannot get Battery_state_of_health: " << res.getDescription(); } + out->batterySerialNumber = std::nullopt; + out->batteryPartStatus = BatteryPartStatus::UNSUPPORTED; return ndk::ScopedAStatus::ok(); } diff --git a/health/aidl/default/android.hardware.health-service.example.xml b/health/aidl/default/android.hardware.health-service.example.xml index 1fe9b8d202..2acaabacbe 100644 --- a/health/aidl/default/android.hardware.health-service.example.xml +++ b/health/aidl/default/android.hardware.health-service.example.xml @@ -1,7 +1,7 @@ android.hardware.health - 2 + 3 IHealth/default diff --git a/health/aidl/vts/functional/Android.bp b/health/aidl/vts/functional/Android.bp index b735a87f2a..6d2b530a83 100644 --- a/health/aidl/vts/functional/Android.bp +++ b/health/aidl/vts/functional/Android.bp @@ -39,7 +39,7 @@ cc_test { "libbinder_ndk", ], static_libs: [ - "android.hardware.health-V2-ndk", + "android.hardware.health-V3-ndk", "libgmock", ], header_libs: [ diff --git a/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp b/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp index 783ce11d69..93607894de 100644 --- a/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp +++ b/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp @@ -84,6 +84,21 @@ Matcher IsValidEnum() { return AnyOfArray(enum_range().begin(), enum_range().end()); } +MATCHER(IsValidSerialNumber, "") { + if (!arg) { + return true; + } + if (arg->size() < 6) { + return false; + } + for (const auto& c : *arg) { + if (!isalnum(c)) { + return false; + } + } + return true; +} + class HealthAidl : public testing::TestWithParam { public: void SetUp() override { @@ -270,7 +285,7 @@ TEST_P(HealthAidl, setChargingPolicy) { ASSERT_THAT(static_cast(value), AnyOf(Eq(1), Eq(4))); } -MATCHER(IsValidHealthData, "") { +MATCHER_P(IsValidHealthData, version, "") { *result_listener << "value is " << arg.toString() << "."; if (!ExplainMatchResult(Ge(-1), arg.batteryManufacturingDateSeconds, result_listener)) { *result_listener << " for batteryManufacturingDateSeconds."; @@ -284,6 +299,15 @@ MATCHER(IsValidHealthData, "") { *result_listener << " for batteryStateOfHealth."; return false; } + if (!ExplainMatchResult(IsValidSerialNumber(), arg.batterySerialNumber, result_listener)) { + *result_listener << " for batterySerialNumber."; + return false; + } + if (!ExplainMatchResult(IsValidEnum(), arg.batteryPartStatus, + result_listener)) { + *result_listener << " for batteryPartStatus."; + return false; + } return true; } @@ -303,7 +327,7 @@ TEST_P(HealthAidl, getBatteryHealthData) { status = health->getBatteryHealthData(&value); ASSERT_THAT(status, AnyOf(IsOk(), ExceptionIs(EX_UNSUPPORTED_OPERATION))); if (!status.isOk()) return; - ASSERT_THAT(value, IsValidHealthData()); + ASSERT_THAT(value, IsValidHealthData(version)); } MATCHER(IsValidStorageInfo, "") { diff --git a/health/utils/libhealthshim/Android.bp b/health/utils/libhealthshim/Android.bp index 14c32aed49..b0ea743ea6 100644 --- a/health/utils/libhealthshim/Android.bp +++ b/health/utils/libhealthshim/Android.bp @@ -34,7 +34,7 @@ cc_defaults { "-Werror", ], static_libs: [ - "android.hardware.health-V2-ndk", + "android.hardware.health-V3-ndk", "android.hardware.health-translate-ndk", "android.hardware.health@1.0", "android.hardware.health@2.0", diff --git a/health/utils/libhealthshim/shim.cpp b/health/utils/libhealthshim/shim.cpp index 6a5f51277c..a5ba919dd9 100644 --- a/health/utils/libhealthshim/shim.cpp +++ b/health/utils/libhealthshim/shim.cpp @@ -230,6 +230,7 @@ ScopedAStatus HealthShim::getChargingPolicy(BatteryChargingPolicy* out) { ScopedAStatus HealthShim::getBatteryHealthData(BatteryHealthData* out) { out->batteryManufacturingDateSeconds = 0; out->batteryFirstUsageSeconds = 0; + out->batteryPartStatus = BatteryPartStatus::UNSUPPORTED; return ResultToStatus(Result::NOT_SUPPORTED); }