Ensure activity uniquness in the shell
This commit is contained in:
@@ -248,6 +248,7 @@ class Activity(Window, gtk.Container):
|
||||
self._jobject.metadata['title'] = _('%s Activity') % get_bundle_name()
|
||||
self._jobject.metadata['title_set_by_user'] = '0'
|
||||
self._jobject.metadata['activity'] = self.get_service_name()
|
||||
self._jobject.metadata['activity_id'] = self.get_id()
|
||||
self._jobject.metadata['keep'] = '0'
|
||||
#self._jobject.metadata['buddies'] = ''
|
||||
self._jobject.metadata['preview'] = ''
|
||||
|
||||
@@ -90,24 +90,32 @@ class ActivityCreationHandler(gobject.GObject):
|
||||
self._activity_handle = activity_handle
|
||||
|
||||
bus = dbus.SessionBus()
|
||||
object_path = '/' + service_name.replace('.', '/')
|
||||
proxy_obj = bus.get_object(service_name, object_path,
|
||||
follow_name_owner_changes=True)
|
||||
factory = dbus.Interface(proxy_obj, _ACTIVITY_FACTORY_INTERFACE)
|
||||
|
||||
factory.create(self._activity_handle.get_dict(),
|
||||
reply_handler=self._no_reply_handler,
|
||||
error_handler=self._create_error_handler)
|
||||
|
||||
bus = dbus.SessionBus()
|
||||
bus_object = bus.get_object(_SHELL_SERVICE, _SHELL_PATH)
|
||||
self._shell = dbus.Interface(bus_object, _SHELL_IFACE)
|
||||
|
||||
object_path = '/' + service_name.replace('.', '/')
|
||||
proxy_obj = bus.get_object(service_name, object_path,
|
||||
follow_name_owner_changes=True)
|
||||
self._factory = dbus.Interface(proxy_obj, _ACTIVITY_FACTORY_INTERFACE)
|
||||
|
||||
if self.get_activity_id() != None:
|
||||
self._shell.ActivateActivity(self.get_activity_id(),
|
||||
reply_handler=self._activate_reply_handler,
|
||||
error_handler=self._activate_error_handler)
|
||||
else:
|
||||
self._launch_activity()
|
||||
|
||||
def _launch_activity(self):
|
||||
self._shell.NotifyLaunch(
|
||||
service_name, self.get_activity_id(),
|
||||
self._service_name, self.get_activity_id(),
|
||||
reply_handler=self._no_reply_handler,
|
||||
error_handler=self._notify_launch_error_handler)
|
||||
|
||||
self._factory.create(self._activity_handle.get_dict(),
|
||||
reply_handler=self._no_reply_handler,
|
||||
error_handler=self._create_error_handler)
|
||||
|
||||
def get_activity_id(self):
|
||||
"""Retrieve the unique identity for this activity"""
|
||||
return self._activity_handle.activity_id
|
||||
@@ -121,6 +129,13 @@ class ActivityCreationHandler(gobject.GObject):
|
||||
def _notify_launch_error_handler(self, err):
|
||||
logging.debug('Notify launch failed %s' % err)
|
||||
|
||||
def _activate_reply_handler(self, activated):
|
||||
if not activated:
|
||||
self._launch_activity()
|
||||
|
||||
def _activate_error_handler(self, err):
|
||||
logging.debug("Activity activation request failed %s" % err)
|
||||
|
||||
def _create_reply_handler(self, xid):
|
||||
logging.debug("Activity created %s (%s)." %
|
||||
(self._activity_handle.activity_id, self._service_name))
|
||||
|
||||
@@ -20,8 +20,8 @@ from sugar.presence import presenceservice
|
||||
class ActivityHandle(object):
|
||||
"""Data structure storing simple activity metadata"""
|
||||
def __init__(
|
||||
self, activity_id, pservice_id=None,
|
||||
object_id=None,uri=None
|
||||
self, activity_id=None, pservice_id=None,
|
||||
object_id=None, uri=None
|
||||
):
|
||||
"""Initialise the handle from activity_id
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ from sugar.datastore import dbus_helpers
|
||||
from sugar import activity
|
||||
from sugar.activity.bundle import Bundle
|
||||
from sugar.activity import activityfactory
|
||||
from sugar.activity.activityhandle import ActivityHandle
|
||||
|
||||
class DSMetadata(gobject.GObject):
|
||||
__gsignals__ = {
|
||||
@@ -38,7 +39,8 @@ class DSMetadata(gobject.GObject):
|
||||
else:
|
||||
self._props = props
|
||||
|
||||
default_keys = ['activity', 'mime_type', 'title_set_by_user']
|
||||
default_keys = ['activity', 'activity_id',
|
||||
'mime_type', 'title_set_by_user']
|
||||
for key in default_keys:
|
||||
if not self._props.has_key(key):
|
||||
self._props[key] = ''
|
||||
@@ -116,9 +118,13 @@ class DSObject:
|
||||
|
||||
activityfactory.create(bundle.get_service_name())
|
||||
else:
|
||||
activity_info = self.get_activities()[0]
|
||||
activityfactory.create_with_object_id(activity_info.service_name,
|
||||
self.object_id)
|
||||
service_name = self.get_activities()[0].service_name
|
||||
|
||||
handle = ActivityHandle(object_id=self.object_id)
|
||||
if self.metadata['activity_id']:
|
||||
handle.activity_id = self.metadata['activity_id']
|
||||
|
||||
activityfactory.create(service_name, handle)
|
||||
|
||||
def get(object_id):
|
||||
logging.debug('datastore.get')
|
||||
|
||||
Reference in New Issue
Block a user