Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorAjay Garg <ajay@activitycentral.com>2013-02-16 05:31:03 (GMT)
committer Ajay Garg <ajay@activitycentral.com>2013-02-16 06:45:02 (GMT)
commitbeb6ec9c2ec07e8a2ec6380961a7a490871cfba7 (patch)
treeac5e5d8892650a111c0e1adccde588bd3a5e0d8d /extensions
parentf874d7f74d1b0f6dd6ae3e027ee373ea645a9128 (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.py28
-rw-r--r--extensions/cpsection/network/view.py180
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)