diff options
| author | 2024-01-18 03:02:32 +0000 | |
|---|---|---|
| committer | 2024-01-18 03:02:32 +0000 | |
| commit | 79132bde924c17e9010b0033c59932527a1e9cae (patch) | |
| tree | f8733010bf201a9b0a1dee64006c280e6104674f | |
| parent | bc87e3226319a1b3b83c059619aa4e86c2811bdf (diff) | |
| parent | da893ff40f836950b8148d2148c600513ad16221 (diff) | |
Merge "BatteryManager: Add new battery properties from the Health V3 HAL." into main
| -rw-r--r-- | core/api/current.txt | 1 | ||||
| -rw-r--r-- | core/api/system-current.txt | 5 | ||||
| -rw-r--r-- | core/java/android/os/BatteryManager.java | 87 | ||||
| -rw-r--r-- | core/java/android/os/BatteryProperty.java | 19 | ||||
| -rw-r--r-- | core/java/android/os/flags.aconfig | 8 | ||||
| -rw-r--r-- | services/core/java/com/android/server/BatteryService.java | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/health/HealthServiceWrapperAidl.java | 14 |
7 files changed, 133 insertions, 3 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index f052b85a9f44..f09a73e0f0fc 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -31851,6 +31851,7 @@ package android.os { method public long computeChargeTimeRemaining(); method public int getIntProperty(int); method public long getLongProperty(int); + method @FlaggedApi("android.os.battery_part_status_api") @Nullable public String getStringProperty(int); method public boolean isCharging(); field public static final String ACTION_CHARGING = "android.os.action.CHARGING"; field public static final String ACTION_DISCHARGING = "android.os.action.DISCHARGING"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 2596f9c6c39c..e0c58d5d1193 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -10044,12 +10044,17 @@ package android.os { field @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_CHARGING_POLICY = 9; // 0x9 field @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_FIRST_USAGE_DATE = 8; // 0x8 field @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_MANUFACTURING_DATE = 7; // 0x7 + field @FlaggedApi("android.os.battery_part_status_api") @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_PART_STATUS = 12; // 0xc + field @FlaggedApi("android.os.battery_part_status_api") @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_SERIAL_NUMBER = 11; // 0xb field public static final int CHARGING_POLICY_ADAPTIVE_AC = 3; // 0x3 field public static final int CHARGING_POLICY_ADAPTIVE_AON = 2; // 0x2 field public static final int CHARGING_POLICY_ADAPTIVE_LONGLIFE = 4; // 0x4 field public static final int CHARGING_POLICY_DEFAULT = 1; // 0x1 field public static final String EXTRA_EVENTS = "android.os.extra.EVENTS"; field public static final String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP"; + field @FlaggedApi("android.os.battery_part_status_api") public static final int PART_STATUS_ORIGINAL = 1; // 0x1 + field @FlaggedApi("android.os.battery_part_status_api") public static final int PART_STATUS_REPLACED = 2; // 0x2 + field @FlaggedApi("android.os.battery_part_status_api") public static final int PART_STATUS_UNSUPPORTED = 0; // 0x0 } public final class BatterySaverPolicyConfig implements android.os.Parcelable { diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 25fba60b9bb5..b9bb059bef42 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -17,9 +17,11 @@ package android.os; import static android.os.Flags.FLAG_STATE_OF_HEALTH_PUBLIC; +import static android.os.Flags.FLAG_BATTERY_PART_STATUS_API; import android.Manifest.permission; import android.annotation.FlaggedApi; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; @@ -236,6 +238,31 @@ public class BatteryManager { public static final int CHARGING_POLICY_ADAPTIVE_LONGLIFE = OsProtoEnums.CHARGING_POLICY_ADAPTIVE_LONGLIFE; // = 4 + // values for "battery part status" property + /** + * Battery part status is not supported. + * @hide + */ + @SystemApi + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int PART_STATUS_UNSUPPORTED = 0; + + /** + * Battery is the original device battery. + * @hide + */ + @SystemApi + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int PART_STATUS_ORIGINAL = 1; + + /** + * Battery has been replaced. + * @hide + */ + @SystemApi + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int PART_STATUS_REPLACED = 2; + /** @hide */ @SuppressLint("UnflaggedApi") // TestApi without associated feature. @TestApi @@ -366,6 +393,32 @@ public class BatteryManager { @FlaggedApi(FLAG_STATE_OF_HEALTH_PUBLIC) public static final int BATTERY_PROPERTY_STATE_OF_HEALTH = 10; + /** + * Battery part serial number. + * + * <p class="note"> + * The sender must hold the {@link android.Manifest.permission#BATTERY_STATS} permission. + * + * @hide + */ + @RequiresPermission(permission.BATTERY_STATS) + @SystemApi + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_PROPERTY_SERIAL_NUMBER = 11; + + /** + * Battery part status from a BATTERY_PART_STATUS_* value. + * + * <p class="note"> + * The sender must hold the {@link android.Manifest.permission#BATTERY_STATS} permission. + * + * @hide + */ + @RequiresPermission(permission.BATTERY_STATS) + @SystemApi + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_PROPERTY_PART_STATUS = 12; + private final Context mContext; private final IBatteryStats mBatteryStats; private final IBatteryPropertiesRegistrar mBatteryPropertiesRegistrar; @@ -431,6 +484,25 @@ public class BatteryManager { } /** + * Same as queryProperty, but for strings. + */ + private String queryStringProperty(int id) { + if (mBatteryPropertiesRegistrar == null) { + return null; + } + + try { + BatteryProperty prop = new BatteryProperty(); + if (mBatteryPropertiesRegistrar.getProperty(id, prop) == 0) { + return prop.getString(); + } + return null; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Return the value of a battery property of integer type. * * @param id identifier of the requested property @@ -464,6 +536,21 @@ public class BatteryManager { } /** + * Return the value of a battery property of String type. If the + * platform does not provide the property queried, this value will + * be null. + * + * @param id identifier of the requested property. + * + * @return the property value, or null if not supported. + */ + @Nullable + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public String getStringProperty(int id) { + return queryStringProperty(id); + } + + /** * Return true if the plugType given is wired * @param plugType {@link #BATTERY_PLUGGED_AC}, {@link #BATTERY_PLUGGED_USB}, * or {@link #BATTERY_PLUGGED_WIRELESS} diff --git a/core/java/android/os/BatteryProperty.java b/core/java/android/os/BatteryProperty.java index b40988a938bc..464577f58241 100644 --- a/core/java/android/os/BatteryProperty.java +++ b/core/java/android/os/BatteryProperty.java @@ -28,12 +28,14 @@ import android.os.Parcelable; */ public class BatteryProperty implements Parcelable { private long mValueLong; + private String mValueString; /** * @hide */ public BatteryProperty() { mValueLong = Long.MIN_VALUE; + mValueString = null; } /** @@ -46,14 +48,23 @@ public class BatteryProperty implements Parcelable { /** * @hide */ + public String getString() { + return mValueString; + } + + /** + * @hide + */ public void setLong(long val) { mValueLong = val; } - /* - * Parcel read/write code must be kept in sync with - * frameworks/native/services/batteryservice/BatteryProperty.cpp + /** + * @hide */ + public void setString(String val) { + mValueString = val; + } private BatteryProperty(Parcel p) { readFromParcel(p); @@ -61,10 +72,12 @@ public class BatteryProperty implements Parcelable { public void readFromParcel(Parcel p) { mValueLong = p.readLong(); + mValueString = p.readString8(); } public void writeToParcel(Parcel p, int flags) { p.writeLong(mValueLong); + p.writeString8(mValueString); } public static final @android.annotation.NonNull Parcelable.Creator<BatteryProperty> CREATOR diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig index 0db90bff48fd..82518bfbfd8d 100644 --- a/core/java/android/os/flags.aconfig +++ b/core/java/android/os/flags.aconfig @@ -106,3 +106,11 @@ flag { bug: "305311707" is_fixed_read_only: true } + +flag { + name: "battery_part_status_api" + namespace: "phoenix" + description: "Feature flag for adding Health HAL v3 APIs." + is_fixed_read_only: true + bug: "309792384" +} diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 5a44ac803cb4..9d9e7c9345be 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -1387,6 +1387,8 @@ public final class BatteryService extends SystemService { case BatteryManager.BATTERY_PROPERTY_MANUFACTURING_DATE: case BatteryManager.BATTERY_PROPERTY_FIRST_USAGE_DATE: case BatteryManager.BATTERY_PROPERTY_CHARGING_POLICY: + case BatteryManager.BATTERY_PROPERTY_SERIAL_NUMBER: + case BatteryManager.BATTERY_PROPERTY_PART_STATUS: mContext.enforceCallingPermission( android.Manifest.permission.BATTERY_STATS, null); break; diff --git a/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java b/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java index 1153cc37e3da..8a3a56cdc9ca 100644 --- a/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java +++ b/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java @@ -16,6 +16,8 @@ package com.android.server.health; +import static android.os.Flags.batteryPartStatusApi; + import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.health.BatteryHealthData; @@ -150,6 +152,18 @@ class HealthServiceWrapperAidl extends HealthServiceWrapper { healthData = service.getBatteryHealthData(); prop.setLong(healthData.batteryStateOfHealth); break; + case BatteryManager.BATTERY_PROPERTY_SERIAL_NUMBER: + if (batteryPartStatusApi()) { + healthData = service.getBatteryHealthData(); + prop.setString(healthData.batterySerialNumber); + } + break; + case BatteryManager.BATTERY_PROPERTY_PART_STATUS: + if (batteryPartStatusApi()) { + healthData = service.getBatteryHealthData(); + prop.setLong(healthData.batteryPartStatus); + } + break; } } catch (UnsupportedOperationException e) { // Leave prop untouched. |