From 5e0b9eda8e26740919abd0ca5c969c5e091ae821 Mon Sep 17 00:00:00 2001 From: Vishal Rao Date: Wed, 2 Sep 2026 15:19:46 +0530 Subject: [PATCH 1/2] Handle case where no bluetooth adapters available --- src/MainView.vala | 21 ++++++++++++++------- src/Services/Manager.vala | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/MainView.vala b/src/MainView.vala index d392fa14..bb7bb193 100644 --- a/src/MainView.vala +++ b/src/MainView.vala @@ -103,11 +103,8 @@ public class Bluetooth.MainView : Switchboard.SettingsPage { child = box; manager = Bluetooth.Services.ObjectManager.get_default (); - if (manager.retrieve_finished) { - complete_setup (); - } else { - manager.notify["retrieve-finished"].connect (complete_setup); - } + complete_setup (); + manager.notify["retrieve-finished"].connect (complete_setup); list_box.row_activated.connect ((row) => { ((DeviceRow) row).on_activate.begin (); @@ -126,6 +123,7 @@ public class Bluetooth.MainView : Switchboard.SettingsPage { update_description (); status_switch.active = manager.is_powered; + status_switch.visible = manager.has_object; /* Now retrieve finished, we can connect manager signals */ manager.device_added.connect (on_device_added); @@ -152,8 +150,13 @@ public class Bluetooth.MainView : Switchboard.SettingsPage { update_description (); }); + manager.notify["has-object"].connect (() => { + update_description (); + }); + manager.bind_property ("is-discovering", discovery_spinner, "spinning", DEFAULT); manager.bind_property ("is-powered", status_switch, "active", GLib.BindingFlags.DEFAULT); + manager.bind_property ("has-object", status_switch, "visible", GLib.BindingFlags.DEFAULT); } private void on_device_added (Services.Device device) { @@ -210,20 +213,24 @@ public class Bluetooth.MainView : Switchboard.SettingsPage { private void update_description () { string? name = manager.get_name (); var powered = manager.is_powered; - if (powered && manager.discoverable) { + var available = manager.has_object; + if (powered && manager.discoverable && available) { //TRANSLATORS: \"%s\" represents the name of the adapter description = _("Now discoverable as \"%s\". Not discoverable when this page is closed").printf (name ?? _("Unknown")); } else if (!powered) { description = _("Not discoverable while Bluetooth is powered off"); + } else if (!available) { + description = _("No Bluetooth adapters available"); } else { description = _("Not discoverable"); } - if (powered) { + if (powered && available) { icon = new ThemedIcon ("bluetooth"); } else { icon = new ThemedIcon ("bluetooth-disabled"); } + child.visible = available; } private Gtk.Widget create_widget_func (Object obj) { diff --git a/src/Services/Manager.vala b/src/Services/Manager.vala index cc788b8f..0f2d9b50 100644 --- a/src/Services/Manager.vala +++ b/src/Services/Manager.vala @@ -325,9 +325,9 @@ public class Bluetooth.Services.ObjectManager : Object { public async void start_discovery () { var adapters = get_adapters (); - is_discovering = true; foreach (var adapter in adapters) { try { + is_discovering = true; yield adapter.start_discovery (); debug ("Adapter %s started", adapter.name); } catch (Error e) { From eb28eda8bc1819aadab128202fe3d8f06c3cfe78 Mon Sep 17 00:00:00 2001 From: Vishal Rao Date: Wed, 2 Sep 2026 18:19:21 +0530 Subject: [PATCH 2/2] Address review comments --- src/MainView.vala | 3 +-- src/Services/Manager.vala | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/MainView.vala b/src/MainView.vala index bb7bb193..f602c2a5 100644 --- a/src/MainView.vala +++ b/src/MainView.vala @@ -123,7 +123,6 @@ public class Bluetooth.MainView : Switchboard.SettingsPage { update_description (); status_switch.active = manager.is_powered; - status_switch.visible = manager.has_object; /* Now retrieve finished, we can connect manager signals */ manager.device_added.connect (on_device_added); @@ -156,7 +155,7 @@ public class Bluetooth.MainView : Switchboard.SettingsPage { manager.bind_property ("is-discovering", discovery_spinner, "spinning", DEFAULT); manager.bind_property ("is-powered", status_switch, "active", GLib.BindingFlags.DEFAULT); - manager.bind_property ("has-object", status_switch, "visible", GLib.BindingFlags.DEFAULT); + manager.bind_property ("has-object", status_switch, "visible", GLib.BindingFlags.SYNC_CREATE); } private void on_device_added (Services.Device device) { diff --git a/src/Services/Manager.vala b/src/Services/Manager.vala index 0f2d9b50..41df72e1 100644 --- a/src/Services/Manager.vala +++ b/src/Services/Manager.vala @@ -325,9 +325,9 @@ public class Bluetooth.Services.ObjectManager : Object { public async void start_discovery () { var adapters = get_adapters (); + is_discovering = adapters.size > 0; foreach (var adapter in adapters) { try { - is_discovering = true; yield adapter.start_discovery (); debug ("Adapter %s started", adapter.name); } catch (Error e) {