Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/model/homeactivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'shell/model/homeactivity.py')
-rw-r--r--shell/model/homeactivity.py76
1 files changed, 69 insertions, 7 deletions
diff --git a/shell/model/homeactivity.py b/shell/model/homeactivity.py
index 2143ef2..efaa2bb 100644
--- a/shell/model/homeactivity.py
+++ b/shell/model/homeactivity.py
@@ -14,23 +14,73 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+import time
+import gobject
+import logging
+
from sugar.presence import PresenceService
from sugar.activity import Activity
from sugar import profile
-class HomeActivity:
- def __init__(self, registry, window):
+class HomeActivity(gobject.GObject):
+ __gsignals__ = {
+ 'launch-timeout': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([])),
+ }
+
+ def __init__(self, bundle, activity_id):
+ gobject.GObject.__init__(self)
+ self._window = None
+ self._xid = None
+ self._service = None
+ self._id = activity_id
+ self._type = bundle.get_service_name()
+ self._icon_name = bundle.get_icon()
+
+ self._launch_time = time.time()
+ self._launched = False
+ self._launch_timeout_id = gobject.timeout_add(10000, self._launch_timeout_cb)
+
+ logging.debug("Activity %s (%s) launching..." % (self._id, self._type))
+
+ def __del__(self):
+ gobject.source_remove(self._launch_timeout_id)
+ self._launch_timeout_id = 0
+
+ def _launch_timeout_cb(self, user_data=None):
+ logging.debug("Activity %s (%s) launch timed out" % (self._id, self._type))
+ self._launch_timeout_id = 0
+ self.emit('launch-timeout')
+ return False
+
+ def set_window(self, window):
+ """An activity is 'launched' once we get its window."""
+ logging.debug("Activity %s (%s) finished launching" % (self._id, self._type))
+ self._launched = True
+ gobject.source_remove(self._launch_timeout_id)
+ self._launch_timeout_id = 0
+
+ if self._window or self._xid:
+ raise RuntimeError("Activity is already launched!")
+ if not window:
+ raise ValueError("window must be valid")
+
self._window = window
self._xid = window.get_xid()
-
self._service = Activity.get_service(window.get_xid())
- self._id = self._service.get_id()
- self._type = self._service.get_type()
- info = registry.get_bundle(self._type)
- self._icon_name = info.get_icon()
+ # verify id and type details
+ act_id = self._service.get_id()
+ if act_id != self._id:
+ raise RuntimeError("Activity's real ID (%s) didn't match expected (%s)." % (act_id, self._id))
+ act_type = self._service.get_type()
+ if act_type != self._type:
+ raise RuntimeError("Activity's real type (%s) didn't match expected (%s)." % (act_type, self._type))
def get_title(self):
+ if not self._launched:
+ raise RuntimeError("Activity is still launching.")
return self._window.get_name()
def get_icon_name(self):
@@ -47,13 +97,25 @@ class HomeActivity:
return self._id
def get_xid(self):
+ if not self._launched:
+ raise RuntimeError("Activity is still launching.")
return self._xid
def get_window(self):
+ if not self._launched:
+ raise RuntimeError("Activity is still launching.")
return self._window
def get_type(self):
return self._type
def get_shared(self):
+ if not self._launched:
+ raise RuntimeError("Activity is still launching.")
return self._service.get_shared()
+
+ def get_launch_time(self):
+ return self._launch_time
+
+ def get_launched(self):
+ return self._launched