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

Commit 75c7ddea authored by Aritra Sen's avatar Aritra Sen
Browse files

Add APIs to toggle Adapter discoverability between none, connectable and connectable/discoverable.

Added associated tests to validate the same.

Bug: 261602425
Test: mma -j $(nproc)
Test: ./build.py
Test: system/gd/cert/run --clean --topshim
Tag: #floss
Change-Id: I6fd70f06ba606404842a8bee58e8e1cf2e044635
parent 6581d0cb
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -148,9 +148,12 @@ message ToggleStackResponse {}

message SetDiscoveryModeRequest {
  bool enable_page_scan = 1;
  bool enable_inquiry_scan = 2;
}

message SetDiscoveryModeResponse {}
message SetDiscoveryModeResponse {
  int32 status = 1;
}

service MediaService {
  rpc StartA2dp(StartA2dpRequest) returns (StartA2dpResponse) {}
+13 −1
Original line number Diff line number Diff line
@@ -26,8 +26,20 @@ class AdapterTest(TopshimBaseTest):
    def test_verify_adapter_started(self):
        print("Adapter is verified when test starts")

    def test_enable_inquiry_scan(self):
        status, discovery_mode = self.dut().enable_inquiry_scan()
        assertThat(status).isEqualTo("Success")
        assertThat(discovery_mode).isEqualTo("ConnectableDiscoverable")

    def test_enable_page_scan(self):
        self.dut().enable_page_scan()
        status, discovery_mode = self.dut().enable_page_scan()
        assertThat(status).isEqualTo("Success")
        assertThat(discovery_mode).isEqualTo("Connectable")

    def test_disable_page_scan(self):
        status, discovery_mode = self.dut().disable_page_scan()
        assertThat(status).isEqualTo("Success")
        assertThat(discovery_mode).isEqualTo("None_")

    def test_set_local_io_caps(self):
        status, caps = self.dut().set_local_io_caps(3)
+8 −4
Original line number Diff line number Diff line
@@ -80,15 +80,20 @@ class AdapterClient(AsyncClosable):
        await self.__adapter_stub.ToggleStack(facade_pb2.ToggleStackRequest(start_stack=is_start))
        return await self._verify_adapter_started()

    async def enable_inquiry_scan(self):
        """Enable inquiry scan (Required to make device connectable and discoverable by other devices)"""
        await self.__adapter_stub.SetDiscoveryMode(facade_pb2.SetDiscoveryModeRequest(enable_inquiry_scan=True))
        return await self._listen_for_event(facade_pb2.EventType.ADAPTER_PROPERTY)

    async def enable_page_scan(self):
        """Enable page scan (might be used for A2dp sink to be discoverable)"""
        await self.__adapter_stub.SetDiscoveryMode(facade_pb2.SetDiscoveryModeRequest(enable_page_scan=True))
        return await self.le_rand()
        return await self._listen_for_event(facade_pb2.EventType.ADAPTER_PROPERTY)

    async def disable_page_scan(self):
        """Enable page scan (might be used for A2dp sink to be discoverable)"""
        await self.__adapter_stub.SetDiscoveryMode(facade_pb2.SetDiscoveryModeRequest(enable_page_scan=False))
        return await self.le_rand()
        return await self._listen_for_event(facade_pb2.EventType.ADAPTER_PROPERTY)

    async def clear_event_filter(self):
        await self.__adapter_stub.ClearEventFilter(empty_proto.Empty())
@@ -126,8 +131,7 @@ class AdapterClient(AsyncClosable):

    async def set_local_io_caps(self, io_capability):
        await self.__adapter_stub.SetLocalIoCaps(facade_pb2.SetLocalIoCapsRequest(io_capability=io_capability))
        future = await self._listen_for_event(facade_pb2.EventType.ADAPTER_PROPERTY)
        return future
        return await self._listen_for_event(facade_pb2.EventType.ADAPTER_PROPERTY)


class A2dpAutomationHelper():
+13 −2
Original line number Diff line number Diff line
@@ -105,11 +105,22 @@ class TopshimDevice(AsyncClosable):
        await asyncSafeClose(self.__hfp)
        await asyncSafeClose(self.__hf_client)

    def enable_inquiry_scan(self):
        f = self.__post(self.__adapter.enable_inquiry_scan())
        return self.__post(self.__discovery_mode_waiter(f))

    def enable_page_scan(self):
        self.__post(self.__adapter.enable_page_scan())
        f = self.__post(self.__adapter.enable_page_scan())
        return self.__post(self.__discovery_mode_waiter(f))

    def disable_page_scan(self):
        self.__post(self.__adapter.disable_page_scan())
        f = self.__post(self.__adapter.disable_page_scan())
        return self.__post(self.__discovery_mode_waiter(f))

    async def __discovery_mode_waiter(self, f):
        params = await f
        status, discovery_mode = params["status"].data[0], params["AdapterScanMode"].data[0]
        return (status, discovery_mode)

    def start_advertising(self):
        """
+16 −5
Original line number Diff line number Diff line
@@ -184,15 +184,26 @@ impl AdapterService for AdapterServiceImpl {
    fn set_discovery_mode(
        &mut self,
        ctx: RpcContext<'_>,
        _req: SetDiscoveryModeRequest,
        req: SetDiscoveryModeRequest,
        sink: UnarySink<SetDiscoveryModeResponse>,
    ) {
        self.btif_intf.lock().unwrap().set_adapter_property(
            btif::BluetoothProperty::AdapterScanMode(btif::BtScanMode::Connectable),
        );
        let scan_mode = if req.enable_inquiry_scan {
            btif::BtScanMode::ConnectableDiscoverable
        } else if req.enable_page_scan {
            btif::BtScanMode::Connectable
        } else {
            btif::BtScanMode::None_
        };
        let status = self
            .btif_intf
            .lock()
            .unwrap()
            .set_adapter_property(btif::BluetoothProperty::AdapterScanMode(scan_mode));

        let mut resp = SetDiscoveryModeResponse::new();
        resp.status = status;
        ctx.spawn(async move {
            sink.success(SetDiscoveryModeResponse::default()).await.unwrap();
            sink.success(resp).await.unwrap();
        })
    }