Skip to content

Commit

Permalink
Exclude wireless section of control panel if there's no wireless hard…
Browse files Browse the repository at this point in the history
…ware.

Remove distracting interface elements when they are not needed.
Keep a clear and simple interface for Sugar.

To reveal if any wireless drivers are available in system memory,
the /sys/module/cfg80211/holders/ directory of the kernel module
database is listed. (NetworkManager on current OLPC systems do not
list wireless devices when the radio is disabled.)
  • Loading branch information
FGrose committed Jan 28, 2014
1 parent 1a77912 commit f58fec2
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 81 deletions.
173 changes: 92 additions & 81 deletions extensions/cpsection/network/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,20 @@ def __init__(self, model, alerts):
self.restart_alerts = alerts
self._jabber_sid = 0
self._jabber_valid = True
self._radio_valid = True
self._jabber_change_handler = None
self._radio_change_handler = None
self._wireless_configuration_reset_handler = None

self._radio_valid = True
self.wireless_available = \
self._model.network.wireless_driver_available()
if self.wireless_available:
self._radio_change_handler = None
self._wireless_configuration_reset_handler = None
self._radio_alert_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)

self.set_border_width(style.DEFAULT_SPACING * 2)
self.set_spacing(style.DEFAULT_SPACING)
group = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)

self._radio_alert_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._jabber_alert_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)

scrolled = Gtk.ScrolledWindow()
Expand All @@ -62,68 +66,72 @@ def __init__(self, model, alerts):
scrolled.add_with_viewport(workspace)
workspace.show()

separator_wireless = Gtk.HSeparator()
workspace.pack_start(separator_wireless, False, True, 0)
separator_wireless.show()

label_wireless = Gtk.Label(label=_('Wireless'))
label_wireless.set_alignment(0, 0)
workspace.pack_start(label_wireless, False, True, 0)
label_wireless.show()
box_wireless = Gtk.VBox()
box_wireless.set_border_width(style.DEFAULT_SPACING * 2)
box_wireless.set_spacing(style.DEFAULT_SPACING)

radio_info = Gtk.Label(label=_('The wireless radio may be turned'
' off to save battery life.'))
radio_info.set_alignment(0, 0)
radio_info.set_line_wrap(True)
radio_info.show()
box_wireless.pack_start(radio_info, False, True, 0)

box_radio = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._button = Gtk.CheckButton()
self._button.set_alignment(0, 0)
box_radio.pack_start(self._button, False, True, 0)
self._button.show()

label_radio = Gtk.Label(label=_('Radio'))
label_radio.set_alignment(0, 0.5)
box_radio.pack_start(label_radio, False, True, 0)
label_radio.show()

box_wireless.pack_start(box_radio, False, True, 0)
box_radio.show()

self._radio_alert = InlineAlert()
self._radio_alert_box.pack_start(self._radio_alert, False, True, 0)
box_radio.pack_end(self._radio_alert_box, False, True, 0)
self._radio_alert_box.show()
if 'radio' in self.restart_alerts:
self._radio_alert.props.msg = self.restart_msg
self._radio_alert.show()

wireless_info = Gtk.Label(label=_('Discard wireless connections if'
' you have trouble connecting to the network.'))
wireless_info.set_alignment(0, 0)
wireless_info.set_line_wrap(True)
wireless_info.show()
box_wireless.pack_start(wireless_info, False, True, 0)

box_clear_wireless = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._clear_wireless_button = Gtk.Button()
self._clear_wireless_button.set_label(_(
'Discard wireless connections'))
box_clear_wireless.pack_start(
self._clear_wireless_button, False, True, 0)
if not self._model.have_wireless_networks():
self._clear_wireless_button.set_sensitive(False)
self._clear_wireless_button.show()
box_wireless.pack_start(box_clear_wireless, False, True, 0)
box_clear_wireless.show()

workspace.pack_start(box_wireless, False, True, 0)
box_wireless.show()
if self.wireless_available:
separator_wireless = Gtk.HSeparator()
workspace.pack_start(separator_wireless, False, True, 0)
separator_wireless.show()

label_wireless = Gtk.Label(label=_('Wireless'))
label_wireless.set_alignment(0, 0)
workspace.pack_start(label_wireless, False, True, 0)
label_wireless.show()
box_wireless = Gtk.VBox()
box_wireless.set_border_width(style.DEFAULT_SPACING * 2)
box_wireless.set_spacing(style.DEFAULT_SPACING)

radio_info = Gtk.Label(label=_('The wireless radio may be turned'
' off to save battery life.'))
radio_info.set_alignment(0, 0)
radio_info.set_line_wrap(True)
radio_info.show()
box_wireless.pack_start(radio_info, False, True, 0)

box_radio = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._button = Gtk.CheckButton()
self._button.set_alignment(0, 0)
box_radio.pack_start(self._button, False, True, 0)
self._button.show()

label_radio = Gtk.Label(label=_('Radio'))
label_radio.set_alignment(0, 0.5)
box_radio.pack_start(label_radio, False, True, 0)
label_radio.show()

box_wireless.pack_start(box_radio, False, True, 0)
box_radio.show()

self._radio_alert = InlineAlert()
self._radio_alert_box.pack_start(self._radio_alert, False, True, 0)
box_radio.pack_end(self._radio_alert_box, False, True, 0)
self._radio_alert_box.show()
if 'radio' in self.restart_alerts:
self._radio_alert.props.msg = self.restart_msg
self._radio_alert.show()

wireless_info = Gtk.Label(label=_('Discard wireless connections if'
' you have trouble connecting to the network.'))
wireless_info.set_alignment(0, 0)
wireless_info.set_line_wrap(True)
wireless_info.show()
box_wireless.pack_start(wireless_info, False, True, 0)

box_clear_wireless = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._clear_wireless_button = Gtk.Button()
self._clear_wireless_button.set_label(_(
'Discard wireless connections'))
box_clear_wireless.pack_start(
self._clear_wireless_button, False, True, 0)
if not self._model.have_wireless_networks():
self._clear_wireless_button.set_sensitive(False)
self._clear_wireless_button.show()
box_wireless.pack_start(box_clear_wireless, False, True, 0)
box_clear_wireless.show()

workspace.pack_start(box_wireless, False, True, 0)
box_wireless.show()
else:
# Delete radio code objects in memory for this invocation.
del self._model._options['radio']

separator_mesh = Gtk.HSeparator()
workspace.pack_start(separator_mesh, False, False, 0)
Expand Down Expand Up @@ -181,31 +189,34 @@ def __init__(self, model, alerts):

def setup(self):
self._entry.set_text(self._model.get_jabber())
try:
radio_state = self._model.get_radio()
except self._model.ReadError, detail:
self._radio_alert.props.msg = detail
self._radio_alert.show()
else:
self._button.set_active(radio_state)

if self.wireless_available:
try:
radio_state = self._model.get_radio()
except self._model.ReadError, detail:
self._radio_alert.props.msg = detail
self._radio_alert.show()
else:
self._button.set_active(radio_state)
self._radio_change_handler = self._button.connect(
'toggled', self.__radio_toggled_cb)
self._wireless_configuration_reset_handler = \
self._clear_wireless_button.connect(
'clicked', self.__wireless_configuration_reset_cb)
self._radio_valid = True

self._jabber_valid = True
self._radio_valid = True
self.needs_restart = False
self._radio_change_handler = self._button.connect(
'toggled', self.__radio_toggled_cb)
self._jabber_change_handler = self._entry.connect(
'changed', self.__jabber_changed_cb)
self._wireless_configuration_reset_handler = \
self._clear_wireless_button.connect(
'clicked', self.__wireless_configuration_reset_cb)

def undo(self):
self._button.disconnect(self._radio_change_handler)
if self.wireless_available:
self._button.disconnect(self._radio_change_handler)
self._radio_alert.hide()
self._entry.disconnect(self._jabber_change_handler)
self._model.undo()
self._jabber_alert.hide()
self._radio_alert.hide()

def _validate(self):
if self._jabber_valid and self._radio_valid:
Expand Down
8 changes: 8 additions & 0 deletions src/jarabe/model/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -1043,6 +1043,14 @@ def find_gsm_connection():
return find_connection_by_id(GSM_CONNECTION_ID)


def wireless_driver_available():
"""
Check for the presence of a wireless driver in kernel memory.
"""
return any(os.listdir(os.path.join(os.sep,
'sys', 'module', 'cfg80211', 'holders')))


def disconnect_access_points(ap_paths):
"""
Disconnect all devices connected to any of the given access points.
Expand Down

0 comments on commit f58fec2

Please sign in to comment.