diff options
author | Ajay Garg <ajay@activitycentral.com> | 2013-02-16 05:31:03 (GMT) |
---|---|---|
committer | Ajay Garg <ajay@activitycentral.com> | 2013-02-16 06:45:02 (GMT) |
commit | beb6ec9c2ec07e8a2ec6380961a7a490871cfba7 (patch) | |
tree | ac5e5d8892650a111c0e1adccde588bd3a5e0d8d /extensions | |
parent | f874d7f74d1b0f6dd6ae3e027ee373ea645a9128 (diff) |
sdxo#1143: "Hidden-SSIDs" feature.
Note that following are the UI changes from the earlier implementation:
* No explicit "Save" button.
* Instead, the "tick" toolbar button will do this job (taking into proper
considerations for the "Cancel Changes","Later" and "Restart" scenarios).
This keeps it consistent with the rest of the sections in the "Network" panel.
* No explicit "Please reboot your XO to effect changes" message.
* Instead the top-toolbar gives this message when the "tick" button is clicked.
This keeps it consistent with the rest of the sections in the "Network" panel.
Following are the backend changes from the earlier implementation:
* The "iwconfig" network-scanning will now be done at "sugar" (re)start, instead of "system"" (re)start.
This helps solve the following issues :
* No startup terminal-text problems now.
* No dependency on any external package ("z-sugar-hidden-network").
* The "restart" notification in "My Settings" -> "Network", is now also consistent, as
the restart here refers to "sugar" restart. Thus, "sugar" restart is what is now all
that is needed to make the hidden wireless networks appear in the Neighborhood-View.
The only caveat: "sudo" must be available for the "olpc" user (without needing a password).
Signed-off-by: Ajay Garg <ajay@activitycentral.com>
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/cpsection/network/model.py | 28 | ||||
-rw-r--r-- | extensions/cpsection/network/view.py | 180 |
2 files changed, 208 insertions, 0 deletions
diff --git a/extensions/cpsection/network/model.py b/extensions/cpsection/network/model.py index 83c3cf1..c635b79 100644 --- a/extensions/cpsection/network/model.py +++ b/extensions/cpsection/network/model.py @@ -26,6 +26,7 @@ from gettext import gettext as _ from gi.repository import GConf from jarabe.model import network +from jarabe.journal.misc import HIDDEN_SSID_FILE _NM_SERVICE = 'org.freedesktop.NetworkManager' @@ -162,6 +163,33 @@ def set_publish_information(value): return 0 +def get_ssids(): + from jarabe.journal.misc import get_hidden_ssids + return get_hidden_ssids() + + +def set_ssids(ssids): + + # First remove the old ssid-file, if it exists. + if os.path.exists(HIDDEN_SSID_FILE): + try: + os.remove(HIDDEN_SSID_FILE) + except: + _logger.exception('Error removing file.') + return + + # Do nothing and return, if the values-list is empty + if len(ssids) == 0: + return + + # If we reach here, we have a non-empty ssid-values-list. + f = open(HIDDEN_SSID_FILE, 'w') + for ssid in ssids: + if len(ssid) > 0: + f.write(ssid + '\n') + f.close() + + def launch_nm_connection_editor(): environment = os.environ.copy() environment['PATH'] = '%s:/usr/sbin' % (environment['PATH'], ) diff --git a/extensions/cpsection/network/view.py b/extensions/cpsection/network/view.py index 376d292..de47633 100644 --- a/extensions/cpsection/network/view.py +++ b/extensions/cpsection/network/view.py @@ -27,6 +27,8 @@ import subprocess import logging from sugar3.graphics import style +from sugar3.graphics.alert import Alert +from sugar3.graphics.icon import Icon from jarabe.controlpanel.sectionview import SectionView from jarabe.controlpanel.inlinealert import InlineAlert @@ -505,6 +507,152 @@ class GConfOptionalSettingsBox(OptionalSettingsBox, GConfMixin): self.pack_start(self._settings_box, False, False, 0) +class AddRemoveWidget(Gtk.HBox): + + def __init__(self, label, add_button_clicked_cb, + remove_button_clicked_cb, index): + Gtk.Box.__init__(self) + self.set_homogeneous(False) + self.set_spacing(10) + + self._index = index + self._add_button_added = False + self._remove_button_added = False + + self._entry_box = Gtk.Entry() + self._entry_box.set_text(label) + self.pack_start(self._entry_box, False, False, 0) + self._entry_box.show() + + add_icon = Icon(icon_name='list-add') + self._add_button = Gtk.Button() + self._add_button.set_image(add_icon) + self._add_button.connect('clicked', + add_button_clicked_cb, + self) + + remove_icon = Icon(icon_name='list-remove') + self._remove_button = Gtk.Button() + self._remove_button.set_image(remove_icon) + self._remove_button.connect('clicked', + remove_button_clicked_cb, + self) + + self.__add_add_button() + self.__add_remove_button() + + def _get_index(self): + return self._index + + def _set_index(self, value): + self._index = value + + def _get_entry(self): + return self._entry_box.get_text() + + def __add_add_button(self): + self.pack_start(self._add_button, False, False, 0) + self._add_button.show() + self._add_button_added = True + + def _remove_remove_button_if_not_already(self): + if self._remove_button_added: + self.__remove_remove_button() + + def __remove_remove_button(self): + self.remove(self._remove_button) + self._remove_button_added = False + + def _add_remove_button_if_not_already(self): + if not self._remove_button_added: + self.__add_remove_button() + + def __add_remove_button(self): + self.pack_start(self._remove_button, False, False, 0) + self._remove_button.show() + self._remove_button_added = True + + +class MultiWidget(Gtk.VBox): + + def __init__(self, current_entries, model): + Gtk.VBox.__init__(self) + self._initial_entries = current_entries + self._model = model + + self.fill_entries(self._initial_entries) + + def fill_entries(self, entries_list): + if len(entries_list) == 0: + self._add_widget('') + else: + for entry in entries_list: + self._add_widget(entry) + + def _add_widget(self, label): + new_widget = AddRemoveWidget(label, + self.__add_button_clicked_cb, + self.__remove_button_clicked_cb, + len(self.get_children())) + self.add(new_widget) + new_widget.show() + self.show() + self._update_remove_button_statuses() + + def __add_button_clicked_cb(self, add_button, + add_button_container): + self._add_widget('') + self._update_remove_button_statuses() + + def __remove_button_clicked_cb(self, remove_button, + remove_button_container): + for child in self.get_children(): + if child._get_index() > remove_button_container._get_index(): + child._set_index(child._get_index() - 1) + + self.remove(remove_button_container) + self._update_remove_button_statuses() + + def _update_remove_button_statuses(self): + children = self.get_children() + + # Now, if there is only one entry, remove-button + # should not be shown. + if len(children) == 1: + children[0]._remove_remove_button_if_not_already() + + # Alternatively, if there are more than 1 entries, + # remove-button should be shown for all. + if len(children) > 1: + for child in children: + child._add_remove_button_if_not_already() + + def _get_entries(self): + entries = [] + for child in self.get_children(): + entry = child._get_entry() + if len(entry) > 0: + entries.append(child._get_entry()) + + return entries + + def _commit(self, widget): + current_list = self._get_entries() + self._model.set_ssids(current_list) + + def undo(self): + current_list = self._get_entries() + if current_list != self._initial_entries: + for child in self.get_children(): + self.remove(child) + + self.fill_entries(self._initial_entries) + + def changed(self): + current_list = self._get_entries() + return current_list != self._initial_entries + + class Network(SectionView): def __init__(self, model, alerts): SectionView.__init__(self) @@ -658,6 +806,9 @@ class Network(SectionView): self._add_proxy_section(workspace) + if client.get_bool('/desktop/sugar/extensions/network/configure_hidden_ssids_feature_available') is True: + self._setup_hidden_ssid_section(workspace) + if client.get_bool('/desktop/sugar/extensions/network/show_nm_connection_editor') is True: box_nm_connection_editor = self.add_nm_connection_editor_launcher(workspace) @@ -830,6 +981,35 @@ class Network(SectionView): proxy_box.pack_start(no_proxy_box, False, False, 0) self._undo_objects.append(no_proxy_box) + + def _setup_hidden_ssid_section(self, workspace): + separator_hidden_network = Gtk.HSeparator() + workspace.pack_start(separator_hidden_network, False, False, 0) + separator_hidden_network.show() + + label_hidden_network = Gtk.Label(_('Hidden Networks')) + label_hidden_network.set_alignment(0, 0) + workspace.pack_start(label_hidden_network, False, False, 0) + label_hidden_network.show() + box_hidden_network = Gtk.VBox() + box_hidden_network.set_border_width(style.DEFAULT_SPACING * 2) + box_hidden_network.set_spacing(style.DEFAULT_SPACING) + + info = Gtk.Label(_("Enter the SSIDs of the hidden networks.")) + info.set_alignment(0, 0) + info.set_line_wrap(True) + box_hidden_network.pack_start(info, False, False, 0) + info.show() + + self._widget_table = MultiWidget(self._model.get_ssids(), self._model) + box_hidden_network.pack_start(self._widget_table, False, False, 0) + self._widget_table.show() + + workspace.pack_start(box_hidden_network, False, False, 0) + box_hidden_network.show() + + self._undo_objects.append(self._widget_table) + def setup(self): self._old_jabber_entry = self._model.get_jabber() self._entry.set_text(self._old_jabber_entry) |