Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e4e8cab authored by Andrew Cheng's avatar Andrew Cheng Committed by Automerger Merge Worker
Browse files

Merge "Remote device battery level reported incorrectly" into tm-dev am: 174b3ed0

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/16945513

Change-Id: I3fe1d50b1cead21d149d07bc16111ee8c4c24d0c
parents 8026ab8f 174b3ed0
Loading
Loading
Loading
Loading
+51 −1
Original line number Diff line number Diff line
@@ -72,6 +72,24 @@ final class RemoteDevices {
    private final HashMap<String, String> mDualDevicesMap;
    private Queue<String> mDeviceQueue;

    /**
     * Bluetooth HFP v1.8 specifies the Battery Charge indicator of AG can take values from
     * {@code 0} to {@code 5}, but it does not specify how to map the values back to percentages.
     * The following mapping is used:
     *   - Level 0:                 0%
     *   - Level 1: midpoint of  1-25%
     *   - Level 2: midpoint of 26-50%
     *   - Level 3: midpoint of 51-75%
     *   - Level 4: midpoint of 76-99%
     *   - Level 5:               100%
     */
    private static final int HFP_BATTERY_CHARGE_INDICATOR_0 = 0;
    private static final int HFP_BATTERY_CHARGE_INDICATOR_1 = 13;
    private static final int HFP_BATTERY_CHARGE_INDICATOR_2 = 38;
    private static final int HFP_BATTERY_CHARGE_INDICATOR_3 = 63;
    private static final int HFP_BATTERY_CHARGE_INDICATOR_4 = 88;
    private static final int HFP_BATTERY_CHARGE_INDICATOR_5 = 100;

    private final Handler mHandler;
    private class RemoteDevicesHandler extends Handler {

@@ -574,6 +592,38 @@ final class RemoteDevices {
                Utils.getTempAllowlistBroadcastOptions());
    }

    /**
     * Converts HFP's Battery Charge indicator values of {@code 0 -- 5} to an integer percentage.
     */
    @VisibleForTesting
    static int batteryChargeIndicatorToPercentge(int indicator) {
        int percent;
        switch (indicator) {
            case 5:
                percent = HFP_BATTERY_CHARGE_INDICATOR_5;
                break;
            case 4:
                percent = HFP_BATTERY_CHARGE_INDICATOR_4;
                break;
            case 3:
                percent = HFP_BATTERY_CHARGE_INDICATOR_3;
                break;
            case 2:
                percent = HFP_BATTERY_CHARGE_INDICATOR_2;
                break;
            case 1:
                percent = HFP_BATTERY_CHARGE_INDICATOR_1;
                break;
            case 0:
                percent = HFP_BATTERY_CHARGE_INDICATOR_0;
                break;
            default:
                percent = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
        }
        Log.d(TAG, "Battery charge indicator: " + indicator + "; converted to: " + percent + "%");
        return percent;
    }

    private static boolean areUuidsEqual(ParcelUuid[] uuids1, ParcelUuid[] uuids2) {
        final int length1 = uuids1 == null ? 0 : uuids1.length;
        final int length2 = uuids2 == null ? 0 : uuids2.length;
@@ -1079,7 +1129,7 @@ final class RemoteDevices {

        if (intent.hasExtra(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL)) {
            int batteryLevel = intent.getIntExtra(BluetoothHeadsetClient.EXTRA_BATTERY_LEVEL, -1);
            updateBatteryLevel(device, batteryLevel);
            updateBatteryLevel(device, batteryChargeIndicatorToPercentge(batteryLevel));
        }
    }

+3 −2
Original line number Diff line number Diff line
@@ -487,7 +487,7 @@ public class RemoteDevicesTest {

    @Test
    public void testAGIndicatorParser_testCorrectValue() {
        int batteryLevel = 10;
        int batteryLevel = 3;

        // Verify that device property is null initially
        Assert.assertNull(mRemoteDevices.getDeviceProperties(mDevice1));
@@ -497,7 +497,8 @@ public class RemoteDevicesTest {
                getAgIndicatorIntent(mDevice1, null, null, null, new Integer(batteryLevel), null));
        verify(mAdapterService).sendBroadcast(mIntentArgument.capture(), mStringArgument.capture(),
                any(Bundle.class));
        verifyBatteryLevelChangedIntent(mDevice1, batteryLevel, mIntentArgument);
        verifyBatteryLevelChangedIntent(mDevice1,
                RemoteDevices.batteryChargeIndicatorToPercentge(batteryLevel), mIntentArgument);
        Assert.assertEquals(BLUETOOTH_CONNECT, mStringArgument.getValue());
    }