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

Commit 4a695b5c authored by Kyunglyul Hyun's avatar Kyunglyul Hyun Committed by Automerger Merge Worker
Browse files

Merge "Reset the battery level when disconnected" am: 8876b15d

parents 551c9c77 8876b15d
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.bluetooth.bas;

import static android.bluetooth.BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
import static android.bluetooth.BluetoothDevice.PHY_LE_1M_MASK;
import static android.bluetooth.BluetoothDevice.PHY_LE_2M_MASK;
import static android.bluetooth.BluetoothDevice.TRANSPORT_LE;
@@ -238,6 +239,27 @@ public class BatteryStateMachine extends StateMachine {
        return mBluetoothGatt != null;
    }

    @VisibleForTesting
    void updateBatteryLevel(byte[] value) {
        if (value.length == 0) {
            return;
        }
        int batteryLevel = value[0] & 0xFF;

        BatteryService service = mServiceRef.get();
        if (service != null) {
            service.handleBatteryChanged(mDevice, batteryLevel);
        }
    }

    @VisibleForTesting
    void resetBatteryLevel() {
        BatteryService service = mServiceRef.get();
        if (service != null) {
            service.handleBatteryChanged(mDevice, BATTERY_LEVEL_UNKNOWN);
        }
    }

    @Override
    protected void log(String msg) {
        if (DBG) {
@@ -479,6 +501,8 @@ public class BatteryStateMachine extends StateMachine {
        public void exit() {
            log(TAG, "Exit (" + mDevice + "): "
                    + messageWhatToString(getCurrentMessage().what));
            // Reset the battery level only after connected
            resetBatteryLevel();
            mLastConnectionState = BluetoothProfile.STATE_CONNECTED;
        }

@@ -594,18 +618,5 @@ public class BatteryStateMachine extends StateMachine {
                Log.w(TAG, "Failed to write descriptor " + descriptor.getUuid());
            }
        }

        @VisibleForTesting
        void updateBatteryLevel(byte[] value) {
            if (value.length <= 0) {
                return;
            }
            int batteryLevel = value[0] & 0xFF;

            BatteryService service = mServiceRef.get();
            if (service != null) {
                service.handleBatteryChanged(mDevice, batteryLevel);
            }
        }
    }
}
+6 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@

package com.android.bluetooth.btservice;

import static android.bluetooth.BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
import static android.bluetooth.BluetoothDevice.TRANSPORT_AUTO;
import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
@@ -7016,8 +7017,12 @@ public class AdapterService extends Service {
     * Sets the battery level of the remote device
     */
    public void setBatteryLevel(BluetoothDevice device, int batteryLevel) {
        if (batteryLevel == BATTERY_LEVEL_UNKNOWN) {
            mRemoteDevices.resetBatteryLevel(device);
        } else {
            mRemoteDevices.updateBatteryLevel(device, batteryLevel);
        }
    }

    public boolean interopMatchAddr(InteropFeature feature, String address) {
        return interopMatchAddrNative(feature.name(), address);
+1 −0
Original line number Diff line number Diff line
@@ -1153,6 +1153,7 @@ final class RemoteDevices {
                }
                resetBatteryLevel(device);
            }

            if (mAdapterService.isAllProfilesUnknown(device)) {
                DeviceProperties deviceProp = getDeviceProperties(device);
                if (deviceProp != null) {
+44 −6
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.bluetooth.bas;

import static android.bluetooth.BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
import static android.bluetooth.BluetoothGatt.GATT_SUCCESS;

import static com.google.common.truth.Truth.assertThat;
@@ -282,9 +283,7 @@ public class BatteryStateMachineTest {
        allowConnection(true);
        allowConnectGatt(true);

        // To create a callback
        mBatteryStateMachine.connectGatt();
        mBatteryStateMachine.mGattCallback.updateBatteryLevel(new byte[]{(byte)0x30});
        mBatteryStateMachine.updateBatteryLevel(new byte[] {(byte) 0x30});

        verify(mBatteryService, timeout(TIMEOUT_MS))
                .handleBatteryChanged(any(BluetoothDevice.class), eq(0x30));
@@ -295,10 +294,8 @@ public class BatteryStateMachineTest {
        allowConnection(true);
        allowConnectGatt(true);

        // To create a callback
        mBatteryStateMachine.connectGatt();
        try {
            mBatteryStateMachine.mGattCallback.updateBatteryLevel(new byte[0]);
            mBatteryStateMachine.updateBatteryLevel(new byte[0]);
        } catch (Exception ex) {
            fail();
        }
@@ -307,6 +304,47 @@ public class BatteryStateMachineTest {
                .handleBatteryChanged(any(BluetoothDevice.class), anyInt());
    }

    @Test
    public void testDisconnetResetBatteryLevel() {
        allowConnection(true);
        allowConnectGatt(true);

        // Inject an event for when incoming connection is requested
        mBatteryStateMachine.sendMessage(BatteryStateMachine.CONNECT);

        verify(mBatteryService, timeout(TIMEOUT_MS))
                .handleConnectionStateChanged(
                        any(BatteryStateMachine.class),
                        eq(BluetoothProfile.STATE_DISCONNECTED),
                        eq(BluetoothProfile.STATE_CONNECTING));

        Assert.assertThat(
                mBatteryStateMachine.getCurrentState(),
                IsInstanceOf.instanceOf(BatteryStateMachine.Connecting.class));

        mBatteryStateMachine.notifyConnectionStateChanged(
                GATT_SUCCESS, BluetoothProfile.STATE_CONNECTED);

        verify(mBatteryService, timeout(TIMEOUT_MS))
                .handleConnectionStateChanged(
                        any(BatteryStateMachine.class),
                        eq(BluetoothProfile.STATE_CONNECTING),
                        eq(BluetoothProfile.STATE_CONNECTED));

        Assert.assertThat(
                mBatteryStateMachine.getCurrentState(),
                IsInstanceOf.instanceOf(BatteryStateMachine.Connected.class));
        // update the battery level
        mBatteryStateMachine.updateBatteryLevel(new byte[] {(byte) 0x30});
        verify(mBatteryService, timeout(TIMEOUT_MS))
                .handleBatteryChanged(any(BluetoothDevice.class), eq(0x30));

        // Disconnect should reset the battery level
        mBatteryStateMachine.sendMessage(BatteryStateMachine.DISCONNECT);
        verify(mBatteryService, timeout(TIMEOUT_MS))
                .handleBatteryChanged(any(BluetoothDevice.class), eq(BATTERY_LEVEL_UNKNOWN));
    }

    private void reconnect() {
        // Inject an event for when incoming connection is requested
        mBatteryStateMachine.sendMessage(BatteryStateMachine.CONNECT);