diff --git a/src/sugar3/activity/activity.py b/src/sugar3/activity/activity.py index a8f7f3c7..6e88096a 100644 --- a/src/sugar3/activity/activity.py +++ b/src/sugar3/activity/activity.py @@ -82,7 +82,7 @@ from sugar3.graphics.window import Window from sugar3.graphics.alert import Alert from sugar3.graphics.icon import Icon from sugar3.datastore import datastore -from sugar3.bundle.activitybundle import ActivityBundle +from sugar3.bundle.activitybundle import get_bundle_instance from gi.repository import SugarExt _ = lambda msg: gettext.dgettext('sugar-toolkit-gtk3', msg) @@ -334,7 +334,7 @@ class Activity(Window, Gtk.Container): self._closing = False self._quit_requested = False self._deleting = False - self._max_participants = 0 + self._max_participants = None self._invites_queue = [] self._jobject = None self._read_file_called = False @@ -495,6 +495,11 @@ class Activity(Window, Gtk.Container): type=bool, default=False, getter=get_active, setter=set_active) def get_max_participants(self): + # If max_participants has not been set in the activity, get it + # from the bundle. + if self._max_participants is None: + bundle = get_bundle_instance(get_bundle_path()) + self._max_participants = bundle.get_max_participants() return self._max_participants def set_max_participants(self, participants): @@ -643,7 +648,7 @@ class Activity(Window, Gtk.Container): Display a notification with the given summary and body. The notification will go under the activities icon in the frame. """ - bundle = ActivityBundle(get_bundle_path()) + bundle = get_bundle_instance(get_bundle_path()) icon = bundle.get_icon() bus = dbus.SessionBus() diff --git a/src/sugar3/activity/widgets.py b/src/sugar3/activity/widgets.py index c07a7966..ddd105e3 100644 --- a/src/sugar3/activity/widgets.py +++ b/src/sugar3/activity/widgets.py @@ -27,7 +27,7 @@ from sugar3.graphics.radiopalette import RadioPalette, RadioMenuButton from sugar3.graphics.radiotoolbutton import RadioToolButton from sugar3.graphics.xocolor import XoColor from sugar3.graphics.icon import Icon -from sugar3.bundle.activitybundle import ActivityBundle +from sugar3.bundle.activitybundle import get_bundle_instance from sugar3.graphics import style from sugar3.graphics.palettemenu import PaletteMenuBox from sugar3 import profile @@ -43,7 +43,7 @@ def _create_activity_icon(metadata): color = profile.get_color() from sugar3.activity.activity import get_bundle_path - bundle = ActivityBundle(get_bundle_path()) + bundle = get_bundle_instance(get_bundle_path()) icon = Icon(file=bundle.get_icon(), xo_color=color) return icon diff --git a/src/sugar3/bundle/activitybundle.py b/src/sugar3/bundle/activitybundle.py index 76dd50c6..b73faac9 100644 --- a/src/sugar3/bundle/activitybundle.py +++ b/src/sugar3/bundle/activitybundle.py @@ -34,6 +34,9 @@ from sugar3.bundle.bundleversion import NormalizedVersion from sugar3.bundle.bundleversion import InvalidVersionError +_bundle_instances = {} + + def _expand_lang(locale): # Private method from gettext.py locale = normalize(locale) @@ -86,7 +89,8 @@ def _expand_lang(locale): class ActivityBundle(Bundle): """A Sugar activity bundle - See http://wiki.laptop.org/go/Activity_bundles for details + See http://wiki.sugarlabs.org/go/Development_Team/Almanac/Activity_Bundles + for details """ MIME_TYPE = 'application/vnd.olpc-sugar' @@ -109,6 +113,7 @@ class ActivityBundle(Bundle): self._activity_version = '0' self._summary = None self._single_instance = False + self._max_participants = 1 info_file = self.get_file('activity/activity.info') if info_file is None: @@ -120,6 +125,8 @@ class ActivityBundle(Bundle): if linfo_file: self._parse_linfo(linfo_file) + _bundle_instances[path] = self + def _parse_info(self, info_file): cp = ConfigParser() cp.readfp(info_file) @@ -187,6 +194,15 @@ class ActivityBundle(Bundle): if cp.get(section, 'single_instance') == 'yes': self._single_instance = True + if cp.has_option(section, 'max_participants'): + max_participants = cp.get(section, 'max_participants') + try: + self._max_participants = int(max_participants) + except ValueError: + raise MalformedBundleException( + 'Activity bundle %s has invalid max_participants %s' % + (self._path, max_participants)) + def _get_linfo_file(self): # Using method from gettext.py, first find languages from environ languages = [] @@ -291,6 +307,10 @@ class ActivityBundle(Bundle): """Get whether there should be a single instance for the activity""" return self._single_instance + def get_max_participants(self): + """Get maximum number of participants in share""" + return self._max_participants + def get_show_launcher(self): """Get whether there should be a visible launcher for the activity""" return self._show_launcher @@ -397,3 +417,10 @@ class ActivityBundle(Bundle): def is_user_activity(self): return self.get_path().startswith(env.get_user_activities_path()) + + +def get_bundle_instance(path, translated=True): + global _bundle_instances + if path not in _bundle_instances: + _bundle_instances[path] = ActivityBundle(path, translated=translated) + return _bundle_instances[path]