Blob Blame History Raw
From 061799e5d58feebceafa75887b422e38ec32cb1d Mon Sep 17 00:00:00 2001
From: James Ross <itzexor@gmail.com>
Date: Thu, 24 Oct 2019 23:45:00 -0700
Subject: [PATCH] rfkillMagic: support hotpluggable bt devices

by unconditionally starting the event monitor and handling finding
and losing devices.
---
 usr/lib/blueberry/blueberry.py   |  5 +++
 usr/lib/blueberry/rfkillMagic.py | 53 +++++++++++++++-----------------
 2 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/usr/lib/blueberry/blueberry.py b/usr/lib/blueberry/blueberry.py
index 2819a3b..68de8c4 100755
--- a/usr/lib/blueberry/blueberry.py
+++ b/usr/lib/blueberry/blueberry.py
@@ -232,7 +232,11 @@ class Blueberry(Gtk.Application):
         return label
 
     def get_default_adapter_name(self):
+        if not self.rfkill.have_adapter:
+            return None
+
         name = None
+
         try:
             output = subprocess.check_output(["timeout", "2s", "bt-adapter", "-i"]).decode("utf-8").strip()
             for line in output.split("\n"):
@@ -242,6 +246,7 @@ class Blueberry(Gtk.Application):
                     break
         except Exception as cause:
             print ("Could not retrieve the BT adapter name with 'bt-adapter -i': %s" % cause)
+
         return name
 
     def update_status(self, path=None, iter=None, data=None):
diff --git a/usr/lib/blueberry/rfkillMagic.py b/usr/lib/blueberry/rfkillMagic.py
index 6d54308..b1863cd 100644
--- a/usr/lib/blueberry/rfkillMagic.py
+++ b/usr/lib/blueberry/rfkillMagic.py
@@ -26,13 +26,12 @@ def __init__(self, output_callback, debug):
 
         self.monitor_killer = False
 
-        self.have_adapter = self.adapter_check()
-
-        if self.have_adapter:
-            self.start_event_monitor()
+        self.adapter_check()
+        self.start_event_monitor()
 
     def adapter_check(self):
         res = subprocess.check_output(RFKILL_CHK).decode('utf-8')
+        have_adapter = False
 
         '''
         Assume the output of:
@@ -46,21 +45,20 @@ def adapter_check(self):
             Hard blocked: no
         '''
 
-        self.debug("adapter_check full output:\n%s" % res)
-
-        if not res:
+        if res:
+            self.debug("adapter_check full output:\n%s" % res)
+            reslines = res.split('\n')
+            for line in reslines:
+                if "Bluetooth" in line:
+                    self.adapter_index = int(line[0])
+                    self.debug("adapter_check found adapter at %d" % self.adapter_index)
+                    have_adapter = True
+                    break
+        else:
             self.debug("adapter_check no output (no adapter)")
-            self.have_adapter = False
-            return False
-
-        reslines = res.split('\n')
-        for line in reslines:
-            if "Bluetooth" in line:
-                self.adapter_index = int(line[0])
-                self.debug("adapter_check found adapter at %d" % self.adapter_index)
-                return True
 
-        return False
+        self.have_adapter = have_adapter
+        return have_adapter
 
     def start_event_monitor(self):
         if not self.tproc and not self.monitor_killer:
@@ -72,9 +70,6 @@ def event_monitor_thread(self, data):
             l = self.tproc.stdout.readline().decode('utf-8') # This blocks until it receives a newline.
             self.update_state(l)
 
-        self.tproc = None
-        thread.exit()
-
     def update_state(self, line):
         self.debug("update_state line: %s" % line)
 
@@ -95,15 +90,17 @@ def update_state(self, line):
         2017-12-08 11:54:16,972431-0800: idx 1 type 1 op 0 soft 0 hard 0
         2017-12-08 11:54:16,972474-0800: idx 4 type 2 op 0 soft 0 hard 0
         '''
+        if not self.have_adapter:
+            self.adapter_check()
 
-        match = re.search(r'idx (?P<idx>\d+) type (?P<type>\d+) op (?P<op>\d+) soft (?P<soft>\d+) hard (?P<hard>\d+)', line)
-
-        if not match:
-            return
-
-        if int(match.group('idx')) == self.adapter_index:
-            self.soft_block = int(match.group('soft')) == 1
-            self.hard_block = int(match.group('hard')) == 1
+        if self.have_adapter:
+            match = re.search(r'idx (?P<idx>\d+) type (?P<type>\d+) op (?P<op>\d+) soft (?P<soft>\d+) hard (?P<hard>\d+)', line)
+            if match:
+                if int(match.group('idx')) == self.adapter_index:
+                    if int(match.group('op')) == 1:
+                        self.adapter_check()
+                    self.soft_block = int(match.group('soft')) == 1
+                    self.hard_block = int(match.group('hard')) == 1
 
         self.update_ui()