Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe/model/neighborhood.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/jarabe/model/neighborhood.py')
-rw-r--r--src/jarabe/model/neighborhood.py80
1 files changed, 64 insertions, 16 deletions
diff --git a/src/jarabe/model/neighborhood.py b/src/jarabe/model/neighborhood.py
index 5a4c5a5..7004283 100644
--- a/src/jarabe/model/neighborhood.py
+++ b/src/jarabe/model/neighborhood.py
@@ -47,6 +47,7 @@ from sugar.profile import get_profile
from jarabe.model.buddy import BuddyModel, get_owner_instance
from jarabe.model import bundleregistry
+from jarabe.model import shell
ACCOUNT_MANAGER_SERVICE = 'org.freedesktop.Telepathy.AccountManager'
@@ -341,6 +342,9 @@ class _Account(gobject.GObject):
connection.connect_to_signal('CurrentActivityChanged',
self.__current_activity_changed_cb)
+ home_model = shell.get_model()
+ home_model.connect('active-activity-changed',
+ self.__active_activity_changed_cb)
else:
logging.warning('Connection %s does not support OLPC buddy '
'properties', self._connection.object_path)
@@ -375,6 +379,29 @@ class _Account(gobject.GObject):
error_handler=partial(self.__error_handler_cb,
'Connection.GetMembers'))
+ def __active_activity_changed_cb(self, model, home_activity):
+ room_handle = 0
+ home_activity_id = home_activity.get_activity_id()
+ for handle, activity_id in self._activity_handles.items():
+ if home_activity_id == activity_id:
+ room_handle = handle
+ break
+ if room_handle == 0:
+ home_activity_id = ''
+
+ connection = self._connection[CONNECTION_INTERFACE_BUDDY_INFO]
+ connection.SetCurrentActivity(
+ home_activity_id,
+ room_handle,
+ reply_handler=self.__set_current_activity_cb,
+ error_handler=self.__set_current_activity_error_cb)
+
+ def __set_current_activity_cb(self):
+ logging.warning('_Account.__set_current_activity_cb')
+
+ def __set_current_activity_error_cb(self, error):
+ logging.debug('_Account.__set_current_activity__error_cb %r', error)
+
def __update_capabilities_cb(self):
pass
@@ -416,16 +443,18 @@ class _Account(gobject.GObject):
room_handle):
logging.debug('_Account.__get_current_activity_cb %r %r %r',
contact_handle, activity_id, room_handle)
- contact_id = self._buddy_handles[contact_handle]
- self.emit('current-activity-updated', contact_id, activity_id)
+
+ if contact_handle in self._buddy_handles:
+ contact_id = self._buddy_handles[contact_handle]
+ if not activity_id and room_handle:
+ activity_id = self._activity_handles.get(room_handle, '')
+ self.emit('current-activity-updated', contact_id, activity_id)
def __buddy_activities_changed_cb(self, buddy_handle, activities):
self._update_buddy_activities(buddy_handle, activities)
def _update_buddy_activities(self, buddy_handle, activities):
logging.debug('_Account._update_buddy_activities')
- if not buddy_handle in self._buddy_handles:
- self._buddy_handles[buddy_handle] = None
if not buddy_handle in self._activities_per_buddy:
self._activities_per_buddy[buddy_handle] = set()
@@ -433,6 +462,19 @@ class _Account(gobject.GObject):
for activity_id, room_handle in activities:
if room_handle not in self._activity_handles:
self._activity_handles[room_handle] = activity_id
+
+ if buddy_handle == self._self_handle:
+ home_model = shell.get_model()
+ activity = home_model.get_active_activity()
+ if activity.get_activity_id() == activity_id:
+ connection = self._connection[
+ CONNECTION_INTERFACE_BUDDY_INFO]
+ connection.SetCurrentActivity(
+ activity_id,
+ room_handle,
+ reply_handler=self.__set_current_activity_cb,
+ error_handler=self.__set_current_activity_error_cb)
+
self.emit('activity-added', room_handle, activity_id)
connection = self._connection[
@@ -443,23 +485,25 @@ class _Account(gobject.GObject):
error_handler=partial(self.__error_handler_cb,
'ActivityProperties.GetProperties'))
- # Sometimes we'll get CurrentActivityChanged before we get to
- # know about the activity so we miss the event. In that case,
- # request again the current activity for this buddy.
- connection = self._connection[CONNECTION_INTERFACE_BUDDY_INFO]
- connection.GetCurrentActivity(
- buddy_handle,
- reply_handler=partial(self.__get_current_activity_cb,
- buddy_handle),
- error_handler=partial(self.__error_handler_cb,
- 'BuddyInfo.GetCurrentActivity'))
+ if buddy_handle != self._self_handle:
+ # Sometimes we'll get CurrentActivityChanged before we get
+ # to know about the activity so we miss the event. In that
+ # case, request again the current activity for this buddy.
+ connection = self._connection[
+ CONNECTION_INTERFACE_BUDDY_INFO]
+ connection.GetCurrentActivity(
+ buddy_handle,
+ reply_handler=partial(self.__get_current_activity_cb,
+ buddy_handle),
+ error_handler=partial(self.__error_handler_cb,
+ 'BuddyInfo.GetCurrentActivity'))
if not activity_id in self._buddies_per_activity:
self._buddies_per_activity[activity_id] = set()
self._buddies_per_activity[activity_id].add(buddy_handle)
if activity_id not in self._activities_per_buddy[buddy_handle]:
self._activities_per_buddy[buddy_handle].add(activity_id)
- if self._buddy_handles[buddy_handle] is not None:
+ if buddy_handle != self._self_handle:
self.emit('buddy-joined-activity',
self._buddy_handles[buddy_handle],
activity_id)
@@ -483,7 +527,7 @@ class _Account(gobject.GObject):
if activity_id in self._activities_per_buddy[buddy_handle]:
self._activities_per_buddy[buddy_handle].remove(activity_id)
- if self._buddy_handles[buddy_handle] is not None:
+ if buddy_handle != self._self_handle:
self.emit('buddy-left-activity',
self._buddy_handles[buddy_handle],
activity_id)
@@ -647,6 +691,7 @@ class Neighborhood(gobject.GObject):
self._activities = {}
self._link_local_account = None
self._server_account = None
+ self._shell_model = shell.get_model()
client = gconf.client_get_default()
client.add_dir('/desktop/sugar/collaboration',
@@ -935,6 +980,8 @@ class Neighborhood(gobject.GObject):
activity.props.private = properties['private']
if is_new:
+ self._shell_model.add_shared_activity(activity_id,
+ activity.props.color)
self.emit('activity-added', activity)
def __activity_removed_cb(self, account, activity_id):
@@ -945,6 +992,7 @@ class Neighborhood(gobject.GObject):
return
activity = self._activities[activity_id]
del self._activities[activity_id]
+ self._shell_model.remove_shared_activity(activity_id)
if activity.props.bundle is not None:
self.emit('activity-removed', activity)