Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activities/browser/BrowserActivity.py13
-rw-r--r--activities/browser/browser.activity1
-rw-r--r--shell/ActivitiesModel.py8
-rw-r--r--shell/ActivityRegistry.py18
-rw-r--r--shell/HomeWindow.py7
-rwxr-xr-xshell/sugar-activity5
-rw-r--r--sugar/activity/Activity.py39
7 files changed, 59 insertions, 32 deletions
diff --git a/activities/browser/BrowserActivity.py b/activities/browser/BrowserActivity.py
index 53cf37b..86b61bc 100644
--- a/activities/browser/BrowserActivity.py
+++ b/activities/browser/BrowserActivity.py
@@ -14,7 +14,6 @@ from sugar.p2p.model.RemoteModel import RemoteModel
from NotificationBar import NotificationBar
from NavigationToolbar import NavigationToolbar
-_BROWSER_ACTIVITY_TYPE = "_web_olpc._udp"
_SERVICE_URI_TAG = "URI"
_SERVICE_TITLE_TAG = "Title"
@@ -23,8 +22,8 @@ class BrowserActivity(Activity):
FOLLOWING = 2
LEADING = 3
- def __init__(self, args):
- Activity.__init__(self, _BROWSER_ACTIVITY_TYPE)
+ def __init__(self, service, args):
+ Activity.__init__(self, service)
if len(args) > 0:
self.uri = args[0]
@@ -65,7 +64,6 @@ class BrowserActivity(Activity):
logging.debug('Track browser activities')
self._pservice.connect('service-appeared', self._service_appeared_cb)
- self._pservice.track_service_type(_BROWSER_ACTIVITY_TYPE)
self._pservice.track_service_type(LocalModel.SERVICE_TYPE)
# Join the shared activity if we were started from one
@@ -89,8 +87,9 @@ class BrowserActivity(Activity):
self._model = RemoteModel(self._model_service, self._notif_service)
self._model.add_listener(self.__shared_location_changed_cb)
- def get_default_type(self):
- return _BROWSER_ACTIVITY_TYPE
+ def set_default_type(self, default_type):
+ Activity.set_default_type(self, default_type)
+ self._pservice.track_service_type(default_type)
def _update_shared_location(self):
address = self.embed.get_address()
@@ -125,7 +124,7 @@ class BrowserActivity(Activity):
# Publish ourselves on the network
properties = {_SERVICE_URI_TAG: escaped_url, _SERVICE_TITLE_TAG: escaped_title}
self._share_service = self._pservice.share_activity(self,
- stype=_BROWSER_ACTIVITY_TYPE, properties=properties)
+ stype=self._default_type, properties=properties)
# Create our activity-specific browser sharing service
self._model = LocalModel(self, self._pservice, self._share_service)
diff --git a/activities/browser/browser.activity b/activities/browser/browser.activity
index 238a6c5..c7dfdac 100644
--- a/activities/browser/browser.activity
+++ b/activities/browser/browser.activity
@@ -2,3 +2,4 @@
name = Web
id = com.redhat.Sugar.BrowserActivity
python_module = BrowserActivity.BrowserActivity
+default_type = _web_olpc._udp
diff --git a/shell/ActivitiesModel.py b/shell/ActivitiesModel.py
index 514076c..6ed2eb4 100644
--- a/shell/ActivitiesModel.py
+++ b/shell/ActivitiesModel.py
@@ -1,5 +1,7 @@
import gobject
+from sugar.presence.PresenceService import PresenceService
+
class ActivityInfo:
def __init__(self, service):
self._service = service
@@ -15,10 +17,12 @@ class ActivitiesModel(gobject.GObject):
__gsignals__ = {
'activity-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
([gobject.TYPE_PYOBJECT])),
+ 'activity-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([gobject.TYPE_PYOBJECT]))
}
def __init__(self):
- gobject.GObject(self)
+ gobject.GObject.__init__(self)
self._activities = []
@@ -33,7 +37,7 @@ class ActivitiesModel(gobject.GObject):
self.emit('activity-added', activity_info)
def __iter__(self):
- return activities.__iter__()
+ return self._activities.__iter__()
def _on_new_service_adv_cb(self, pservice, activity_id, short_stype):
if activity_id:
diff --git a/shell/ActivityRegistry.py b/shell/ActivityRegistry.py
index 957d436..6d296bb 100644
--- a/shell/ActivityRegistry.py
+++ b/shell/ActivityRegistry.py
@@ -29,6 +29,14 @@ class ActivityModule:
def get_directory(self):
"""Get the path to activity directory."""
return self._directory
+
+ def get_default_type(self):
+ """Get the the type of the default activity service."""
+ return self._default_type
+
+ def set_default_type(self, default_type):
+ """Set the the type of the default activity service."""
+ self._default_type = default_type
class ActivityRegistry:
"""Service that tracks the available activities"""
@@ -65,12 +73,20 @@ class ActivityRegistry:
logging.error('%s miss the required name option' % (path))
return False
+ if cp.has_option('Activity', 'default_type'):
+ default_type = cp.get('Activity', 'default_type')
+ else:
+ default_type = None
+
if cp.has_option('Activity', 'exec'):
activity_exec = cp.get('Activity', 'exec')
elif cp.has_option('Activity', 'python_module'):
python_module = cp.get('Activity', 'python_module')
+ python_module = cp.get('Activity', 'python_module')
activity_exec = '%s %s %s' % (env.get_activity_runner(),
activity_id, python_module)
+ if default_type:
+ activity_exec += ' ' + default_type
env.add_to_python_path(directory)
else:
logging.error('%s must specifiy exec or python_module' % (path))
@@ -79,6 +95,8 @@ class ActivityRegistry:
module = ActivityModule(name, activity_id, activity_exec, directory)
self._activities.append(module)
+ module.set_default_type(default_type)
+
return True
def list_activities(self):
diff --git a/shell/HomeWindow.py b/shell/HomeWindow.py
index 10cd1d7..a88e18f 100644
--- a/shell/HomeWindow.py
+++ b/shell/HomeWindow.py
@@ -4,6 +4,7 @@ import gtk
import wnck
from sugar.activity import Activity
+from ActivitiesModel import ActivitiesModel
class NewActivityButton(gtk.MenuToolButton):
def __init__(self, home):
@@ -45,13 +46,13 @@ class ActivitiesGrid(gtk.VBox):
for activity in model:
self._add(activity)
- screen.connect('activity-added', self.__activity_added_cb)
- screen.connect('activity-removed', self.__activity_removed_cb)
+ model.connect('activity-added', self.__activity_added_cb)
+ model.connect('activity-removed', self.__activity_removed_cb)
def __activity_added_cb(self, model, activity):
self._add(activity)
- def __activity_closed_cb(self, model, activity):
+ def __activity_removed_cb(self, model, activity):
self._remove(window)
def _remove(self, activity):
diff --git a/shell/sugar-activity b/shell/sugar-activity
index bc6e38a..b572c12 100755
--- a/shell/sugar-activity
+++ b/shell/sugar-activity
@@ -13,4 +13,7 @@ theme.setup()
lw = LogWriter(sys.argv[1])
lw.start()
-Activity.register_factory(sys.argv[1], sys.argv[2])
+if len(sys.argv) == 4:
+ Activity.register_factory(sys.argv[1], sys.argv[2], sys.argv[3])
+else:
+ Activity.register_factory(sys.argv[1], sys.argv[2])
diff --git a/sugar/activity/Activity.py b/sugar/activity/Activity.py
index 2b16f91..9adf0c6 100644
--- a/sugar/activity/Activity.py
+++ b/sugar/activity/Activity.py
@@ -31,7 +31,8 @@ def get_factory(activity_name):
class ActivityFactory(dbus.service.Object):
"""Dbus service that takes care of creating new instances of an activity"""
- def __init__(self, activity_name, activity_class):
+ def __init__(self, name, activity_class, default_type):
+ self._default_type = default_type
splitted_module = activity_class.rsplit('.', 1)
module_name = splitted_module[0]
class_name = splitted_module[1]
@@ -50,21 +51,19 @@ class ActivityFactory(dbus.service.Object):
self._class = getattr(module, class_name)
bus = dbus.SessionBus()
- factory = get_factory(activity_name)
+ factory = get_factory(name)
bus_name = dbus.service.BusName(factory, bus = bus)
dbus.service.Object.__init__(self, bus_name, get_path(factory))
@dbus.service.method("com.redhat.Sugar.ActivityFactory")
def create_with_service(self, serialized_service, args):
- service = None
- if serialized_service is not None:
- service = Service.deserialize(serialized_service)
-
- activity = self._class(args)
+ service = Service.deserialize(serialized_service)
+ activity = self._class(service, args)
@dbus.service.method("com.redhat.Sugar.ActivityFactory")
def create(self):
- self.create_with_service(None, [])
+ activity = self._class(None, [])
+ activity.set_default_type(self._default_type)
def create(activity_name, service = None, args = None):
"""Create a new activity from his name."""
@@ -82,9 +81,9 @@ def create(activity_name, service = None, args = None):
else:
factory.create()
-def register_factory(activity_name, activity_class):
+def register_factory(name, activity_class, default_type=None):
"""Register the activity factory."""
- factory = ActivityFactory(activity_name, activity_class)
+ factory = ActivityFactory(name, activity_class, default_type)
gtk.main()
@@ -143,21 +142,20 @@ class ActivityDbusService(dbus.service.Object):
class Activity(gtk.Window):
"""Base Activity class that all other Activities derive from."""
- def __init__(self, default_type, activity_id = None):
+ def __init__(self, service = None):
gtk.Window.__init__(self)
- if activity_id is None:
- self._activity_id = sugar.util.unique_id()
+ if service and service.has_key('activity_id'):
+ self._activity_id = service['activity_id']
+ self._shared = True
else:
- self._activity_id = activity_id
+ self._activity_id = sugar.util.unique_id()
+ self._shared = False
self._dbus_service = None
self._initial_service = None
self._activity_object = None
- self._shared = False
- if type(default_type) != type("") or not len(default_type):
- raise ValueError("Default type must be a valid string.")
- self._default_type = default_type
+ self._default_type = None
keybindings.setup_global_keys(self)
@@ -186,7 +184,10 @@ class Activity(gtk.Window):
Allows subclasses to use their own dbus service object if they choose."""
return ActivityDbusService(self.window.xid, self)
- def default_type(self):
+ def set_default_type(self, default_type):
+ self._default_type = default_type
+
+ def get_default_type(self):
return self._default_type
def set_shared(self):