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

Commit 81c1afd0 authored by RajaaAbdallah's avatar RajaaAbdallah Committed by JohnLai
Browse files

Floss: Ensure all APIs are present before registering clients

After aosp/c/2748695, some API interfaces will be present later than
Adapter interface.

This CL makes sure all APIs are present than registering client
callbacks.

Bug: 318050299
Test: mma packages/modules/Bluetooth
Tag: #floss
Flag: EXEMPT floss only changes
Change-Id: Ia5f0fdf82fc53401b0297bacb8a897a380429aa1
parent c9b09f2b
Loading
Loading
Loading
Loading
+38 −18
Original line number Diff line number Diff line
@@ -104,6 +104,39 @@ class Bluetooth(object):
        while not self.mainloop_quit.is_set():
            self.mainloop.run()

    def register_clients_callback(self):
        """Registers callback for all interfaces.

        Returns:
            True on success, False otherwise.
        """
        if not self.adapter_client.register_callbacks():
            logging.error('adapter_client: Failed to register callbacks')
            return False
        if not self.advertising_client.register_advertiser_callback():
            logging.error('advertising_client: Failed to register advertiser callbacks')
            return False
        if not self.scanner_client.register_scanner_callback():
            logging.error('scanner_client: Failed to register callbacks')
            return False
        return True

    def is_bluetoothd_proxy_valid(self):
        """Checks whether the proxy objects for Floss are ok and registers client callbacks."""

        proxy_ready = all([
            self.manager_client.has_proxy(),
            self.adapter_client.has_proxy(),
            self.advertising_client.has_proxy(),
            self.scanner_client.has_proxy()
        ])

        if not proxy_ready:
            logging.info('Some proxy has not yet ready.')
            return False

        return self.register_clients_callback()

    def set_powered(self, powered: bool):
        """Set the power of bluetooth adapter and bluetooth clients.

@@ -118,9 +151,6 @@ class Bluetooth(object):
        def _is_adapter_down(client):
            return lambda: not client.has_proxy()

        def _is_adapter_ready(client):
            return lambda: client.has_proxy() and client.get_address()

        if powered:
            # FIXME: Close rootcanal will cause manager_client failed call has_default_adapter.
            # if not self.manager_client.has_default_adapter():
@@ -133,7 +163,8 @@ class Bluetooth(object):
            self.scanner_client = scanner_client.FlossScannerClient(self.bus, default_adapter)

            try:
                utils.poll_for_condition(condition=_is_adapter_ready(self.adapter_client),
                utils.poll_for_condition(
                    condition=lambda: self.is_bluetoothd_proxy_valid() and self.adapter_client.get_address(),
                    desc='Wait for adapter start',
                    sleep_interval=self.ADAPTER_CLIENT_POLL_INTERVAL,
                    timeout=self.ADAPTER_DAEMON_TIMEOUT_SEC)
@@ -141,17 +172,6 @@ class Bluetooth(object):
                logging.error('timeout: error starting adapter daemon: %s', e)
                logging.error(traceback.format_exc())
                return False

            # We need to observe callbacks for proper operation.
            if not self.adapter_client.register_callbacks():
                logging.error('adapter_client: Failed to register callbacks')
                return False
            if not self.advertising_client.register_advertiser_callback():
                logging.error('advertising_client: Failed to register advertiser callbacks')
                return False
            if not self.scanner_client.register_scanner_callback():
                logging.error('scanner_client: Failed to register callbacks')
                return False
        else:
            self.manager_client.stop(default_adapter)
            try: