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

Commit a9895a83 authored by Jesse Melhuish's avatar Jesse Melhuish Committed by Gerrit Code Review
Browse files

Merge "Floss: Add BAS support for dual mode devices"

parents 87cba5ea f5d0a872
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -54,8 +54,8 @@ pub enum BatteryServiceActions {
    OnCharacteristicRead(String, GattStatus, i32, Vec<u8>),
    /// Params: addr, handle, value
    OnNotify(String, i32, Vec<u8>),
    /// Params: remote_device
    Connect(BluetoothDevice),
    /// Params: remote_device, transport
    Connect(BluetoothDevice, BtTransport),
    /// Params: remote_device
    Disconnect(BluetoothDevice),
}
@@ -227,8 +227,11 @@ impl BatteryService {
                });
            }

            BatteryServiceActions::Connect(device) => {
                self.init_device(device.address);
            BatteryServiceActions::Connect(device, transport) => {
                if transport != BtTransport::Le {
                    return;
                }
                self.init_device(device.address, transport);
            }

            BatteryServiceActions::Disconnect(device) => {
@@ -256,7 +259,7 @@ impl BatteryService {
        battery_set.clone()
    }

    fn init_device(&self, remote_address: String) {
    fn init_device(&self, remote_address: String, transport: BtTransport) {
        let client_id = match self.client_id {
            Some(id) => id,
            None => return,
@@ -266,7 +269,7 @@ impl BatteryService {
            client_id,
            remote_address,
            false,
            BtTransport::Le,
            transport,
            false,
            LePhy::Phy1m,
        );
@@ -307,10 +310,7 @@ impl BatteryService {
        };
        let handle = match self.handles.get(&remote_address) {
            Some(id) => *id,
            None => {
                self.init_device(remote_address);
                return true;
            }
            None => return false,
        };
        self.gatt.lock().unwrap().read_characteristic(client_id, remote_address.clone(), handle, 0);
        true
+24 −2
Original line number Diff line number Diff line
@@ -1179,13 +1179,22 @@ impl BtifBluetoothCallbacks for Bluetooth {

                    match state {
                        BtAclState::Connected => {
                            let bluetooth_device = found.info.clone();
                            let acl_reported_transport = found.acl_reported_transport.clone();
                            Bluetooth::send_metrics_remote_device_info(found);
                            self.connection_callbacks.for_all_callbacks(|callback| {
                                callback.on_device_connected(device.clone());
                            });
                            let tx = self.tx.clone();
                            let transport = match self.get_remote_type(bluetooth_device.clone()) {
                                BtDeviceType::Bredr => BtTransport::Bredr,
                                BtDeviceType::Ble => BtTransport::Le,
                                _ => acl_reported_transport,
                            };
                            tokio::spawn(async move {
                                let _ = tx.send(Message::OnAclConnected(device.clone())).await;
                                let _ = tx
                                    .send(Message::OnAclConnected(bluetooth_device, transport))
                                    .await;
                            });
                        }
                        BtAclState::Disconnected => {
@@ -1812,11 +1821,24 @@ impl IBluetooth for Bluetooth {

                            Profile::Bas => {
                                let tx = self.tx.clone();
                                let transport =
                                    match self.get_remote_device_if_found(&device.address) {
                                        Some(context) => context.acl_reported_transport,
                                        None => return false,
                                    };
                                let device_to_send = device.clone();
                                let transport = match self.get_remote_type(device.clone()) {
                                    BtDeviceType::Bredr => BtTransport::Bredr,
                                    BtDeviceType::Ble => BtTransport::Le,
                                    _ => transport,
                                };
                                topstack::get_runtime().spawn(async move {
                                    let _ = tx
                                        .send(Message::BatteryService(
                                            BatteryServiceActions::Connect(device_to_send),
                                            BatteryServiceActions::Connect(
                                                device_to_send,
                                                transport,
                                            ),
                                        ))
                                        .await;
                                });
+11 −17
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ use crate::bluetooth_media::{BluetoothMedia, MediaActions};
use crate::socket_manager::{BluetoothSocketManager, SocketActions};
use crate::suspend::Suspend;
use bt_topshim::{
    btif::{BaseCallbacks, BtDeviceType},
    btif::{BaseCallbacks, BtTransport},
    profiles::{
        a2dp::A2dpCallbacks, avrcp::AvrcpCallbacks, gatt::GattAdvCallbacks,
        gatt::GattAdvInbandCallbacks, gatt::GattClientCallbacks, gatt::GattScannerCallbacks,
@@ -84,7 +84,7 @@ pub enum Message {

    // Follows IBluetooth's on_device_(dis)connected callback but doesn't require depending on
    // Bluetooth.
    OnAclConnected(BluetoothDevice),
    OnAclConnected(BluetoothDevice, BtTransport),
    OnAclDisconnected(BluetoothDevice),

    // Suspend related
@@ -239,27 +239,21 @@ impl Stack {
                // Any service needing an updated list of devices can have an
                // update method triggered from here rather than needing a
                // reference to Bluetooth.
                Message::OnAclConnected(device) => {
                    let dev_type = bluetooth.lock().unwrap().get_remote_type(device.clone());
                    if dev_type == BtDeviceType::Ble {
                Message::OnAclConnected(device, transport) => {
                    battery_service
                        .lock()
                        .unwrap()
                            .handle_action(BatteryServiceActions::Connect(device));
                    }
                        .handle_action(BatteryServiceActions::Connect(device, transport));
                }

                // For battery service, use this to clean up internal handles. GATT connection is
                // already dropped if ACL disconnect has occurred.
                Message::OnAclDisconnected(device) => {
                    let dev_type = bluetooth.lock().unwrap().get_remote_type(device.clone());
                    if dev_type == BtDeviceType::Ble {
                    battery_service
                        .lock()
                        .unwrap()
                        .handle_action(BatteryServiceActions::Disconnect(device));
                }
                }

                Message::SuspendCallbackRegistered(id) => {
                    suspend.lock().unwrap().callback_registered(id);