HFP : Correct headset battery level percentage calculation for vendor specific XEVENT event
* XEVENT report the battery level is a zero-based integer that designates the rough charge level
think of this as the number of bars on the hypothetical battery meter in the headset.
* XEVENT report the numberOfLevels is an integer that describes the number of battery levels possible.
If the hypothetical battery meter has a range of 0-4, this value will be 5.
Bug: 109652276
Test: paired with Plantronics headset and check the headset battery
percentage.
Change-Id: Ifdd8560626ecd124360973e0ef8fd2b5a2d6edde
diff --git a/src/com/android/bluetooth/btservice/RemoteDevices.java b/src/com/android/bluetooth/btservice/RemoteDevices.java
index 0ace54c..96b6592 100644
--- a/src/com/android/bluetooth/btservice/RemoteDevices.java
+++ b/src/com/android/bluetooth/btservice/RemoteDevices.java
@@ -829,13 +829,13 @@
}
int batteryLevel = (Integer) args[1];
int numberOfLevels = (Integer) args[2];
- if (batteryLevel < 0 || numberOfLevels < 0 || batteryLevel > numberOfLevels) {
+ if (batteryLevel < 0 || numberOfLevels <= 1 || batteryLevel > numberOfLevels) {
Log.w(TAG, "getBatteryLevelFromXEventVsc() wrong event value, batteryLevel="
+ String.valueOf(batteryLevel) + ", numberOfLevels=" + String.valueOf(
numberOfLevels));
return BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
}
- return batteryLevel * 100 / numberOfLevels;
+ return batteryLevel * 100 / (numberOfLevels - 1);
}
private static void errorLog(String msg) {
diff --git a/tests/unit/src/com/android/bluetooth/btservice/RemoteDevicesTest.java b/tests/unit/src/com/android/bluetooth/btservice/RemoteDevicesTest.java
index 35215ef..bc5f0dc 100644
--- a/tests/unit/src/com/android/bluetooth/btservice/RemoteDevicesTest.java
+++ b/tests/unit/src/com/android/bluetooth/btservice/RemoteDevicesTest.java
@@ -336,7 +336,7 @@
BluetoothAssignedNumbers.PLANTRONICS, BluetoothHeadset.AT_CMD_TYPE_SET,
getXEventArray(3, 8), mDevice1));
verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture());
- verifyBatteryLevelChangedIntent(mDevice1, 37, mIntentArgument);
+ verifyBatteryLevelChangedIntent(mDevice1, 42, mIntentArgument);
Assert.assertEquals(AdapterService.BLUETOOTH_PERM, mStringArgument.getValue());
}
@@ -364,8 +364,11 @@
@Test
public void testGetBatteryLevelFromXEventVsc() {
- Assert.assertEquals(37, RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(3, 8)));
- Assert.assertEquals(100, RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(1, 1)));
+ Assert.assertEquals(42, RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(3, 8)));
+ Assert.assertEquals(100,
+ RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(10, 11)));
+ Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
+ RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(1, 1)));
Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,
RemoteDevices.getBatteryLevelFromXEventVsc(getXEventArray(3, 1)));
Assert.assertEquals(BluetoothDevice.BATTERY_LEVEL_UNKNOWN,