diff --git a/subiquitycore/controllers/network.py b/subiquitycore/controllers/network.py index 8acf86e7..fba29d31 100644 --- a/subiquitycore/controllers/network.py +++ b/subiquitycore/controllers/network.py @@ -341,6 +341,9 @@ class NetworkController(BaseController): meth, args, kw = self.view_stack.pop() meth(*args, **kw) + def start_scan(self, dev): + self.observer.wlan_listener.trigger_scan(dev.ifindex) + def cancel(self): if len(self.view_stack) <= 1: self.signal.emit_signal('prev-screen') diff --git a/subiquitycore/models/network.py b/subiquitycore/models/network.py index a567fed7..e0d3547e 100644 --- a/subiquitycore/models/network.py +++ b/subiquitycore/models/network.py @@ -262,6 +262,14 @@ class Networkdev: else: return None + @property + def actual_ssids(self): + return [ssid.decode('utf-8', 'replace') for ssid in self._net_info.ssids] + + @property + def scan_state(self): + return self._net_info.scan_state + @property def configured_ssid(self): aps = list(self._configuration.get('access-points', {}).keys()) diff --git a/subiquitycore/ui/views/network_configure_wlan_interface.py b/subiquitycore/ui/views/network_configure_wlan_interface.py index 468408be..21123e20 100644 --- a/subiquitycore/ui/views/network_configure_wlan_interface.py +++ b/subiquitycore/ui/views/network_configure_wlan_interface.py @@ -7,6 +7,27 @@ import logging log = logging.getLogger('subiquitycore.network.network_configure_wlan_interface') +class NetworkList(WidgetWrap): + + def __init__(self, parent, ssids): + self.parent = parent + button = cancel_btn(on_press=self.do_cancel) + ssid_list = [ + Color.menu_button( + Button(label=ssid, on_press=self.do_network), + focus_map="menu_button focus") + for ssid in ssids] + p = Pile([BoxAdapter(ListBox(ssid_list), height=10), Padding.fixed_10(button)]) + box = LineBox(p, title="Select a network") + super().__init__(box) + + def do_network(self, sender): + self.parent.ssid_input.value = sender.label + self.parent.remove_overlay() + + def do_cancel(self, sender): + self.parent.remove_overlay() + class NetworkConfigureWLANView(BaseView): def __init__(self, model, controller, name): @@ -31,7 +52,62 @@ class NetworkConfigureWLANView(BaseView): self.orig_w = None super().__init__(ListBox(self.body)) + def keypress(self, size, key): + if key == 'esc': + if self.orig_w is not None: + self.remove_overlay() + return + return super().keypress(size, key) + + def show_overlay(self, overlay_widget): + self.orig_w = self._w + self._w = Overlay(top_w=overlay_widget, + bottom_w=self._w, + align='center', + width=('relative', 60), + min_width=80, + valign='middle', + height='pack') + + def remove_overlay(self): + self._w = self.orig_w + self.orig_w = None + + def show_ssid_list(self, sender): + self.show_overlay(NetworkList(self, self.dev.actual_ssids)) + + def start_scan(self, sender): + self.keypress((0,0), 'up') + try: + self.controller.start_scan(self.dev) + except RuntimeError as r: + log.exception("start_scan failed") + self.error.set_text("%s" % (r,)) + def _build_iface_inputs(self): + if len(self.dev.actual_ssids) > 0: + networks_btn = Color.menu_button( + menu_btn("Choose a visible network", on_press=self.show_ssid_list), + focus_map="menu_button focus") + else: + networks_btn = Color.info_minor(Columns( + [ + ('fixed', 1, Text("")), + Text("No visible networks"), + ('fixed', 1, Text(">")) + ], dividechars=1)) + if not self.dev.scan_state: + scan_btn = Color.menu_button( + menu_btn("Scan for networks", on_press=self.start_scan), + focus_map="menu_button focus") + else: + scan_btn = Color.info_minor(Columns( + [ + ('fixed', 1, Text("")), + Text("Scanning for networks"), + ('fixed', 1, Text(">")) + ], dividechars=1)) + col = [ Padding.center_79(Color.info_minor(Text("Only open or WPA2/PSK networks are supported at this time."))), Padding.line_break(""), @@ -43,6 +119,18 @@ class NetworkConfigureWLANView(BaseView): focus_map="string_input focus")), ], dividechars=2 ), + Columns( + [ + ("weight", 1.0, + Padding.fixed_30(networks_btn)), + ] + ), + Columns( + [ + ("weight", 1.0, + Padding.fixed_30(scan_btn)), + ] + ), Columns( [ ("weight", 0.2, Text("Password:")),