From 98a29ae12cdf0d5b1f18f8153508a4b115478780 Mon Sep 17 00:00:00 2001 From: Martin Abente Lahaye Date: Fri, 6 Jun 2014 11:12:39 -0400 Subject: [PATCH] Save spent time on activities Use set_active and save events to keep track of the time, in seconds, that the activity is on the main screen. The time is calculated and stored each time an activity is open/resumed and closed. Therefore, each activity entry will have an array of seconds for each time it was used. This makes a 1 to 1 relationship between the spent and lauch times. In orders words, we can reflect not only the "when", but also the " for how long". Even though this time does not necessarily represents the real time the user "used" the activity, it is a low-cost approach for reflecting time. This is a long requested featured from deployments that have been using statistics tools on journal metadata, and this patch is already being used by OLPC-AU. Signed-off-by: Martin Abente Lahaye --- src/sugar3/activity/activity.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/sugar3/activity/activity.py b/src/sugar3/activity/activity.py index 6e88096a..d56c6203 100644 --- a/src/sugar3/activity/activity.py +++ b/src/sugar3/activity/activity.py @@ -327,6 +327,8 @@ class Activity(Window, Gtk.Container): self.connect('delete-event', self.__delete_event_cb) self._active = False + self._active_time = None + self._spent_time = 0 self._activity_id = handle.activity_id self.shared_activity = None self._join_id = None @@ -367,6 +369,11 @@ class Activity(Window, Gtk.Container): self._jobject.metadata['launch-times'] = \ str(int(time.time())) + if 'spent-times' in self._jobject.metadata: + self._jobject.metadata['spent-times'] += ', 0' + else: + self._jobject.metadata['spent-times'] = '0' + self.shared_activity = None self._join_id = None @@ -420,6 +427,7 @@ class Activity(Window, Gtk.Container): jobject.metadata['share-scope'] = SCOPE_PRIVATE jobject.metadata['icon-color'] = icon_color jobject.metadata['launch-times'] = str(int(time.time())) + jobject.metadata['spent-times'] = '0' jobject.file_path = '' # FIXME: We should be able to get an ID synchronously from the DS, @@ -485,9 +493,21 @@ class Activity(Window, Gtk.Container): def get_active(self): return self._active + def _update_spent_time(self): + if self._active is True and self._active_time is None: + self._active_time = time.time() + elif self._active is False and self._active_time is not None: + self._spent_time += time.time() - self._active_time + self._active_time = None + elif self._active is True and self._active_time is not None: + current = time.time() + self._spent_time += current - self._active_time + self._active_time = current + def set_active(self, active): if self._active != active: self._active = active + self._update_spent_time() if not self._active and self._jobject: self.save() @@ -778,6 +798,19 @@ class Activity(Window, Gtk.Container): self.metadata['buddies_id'] = json.dumps(buddies_dict.keys()) self.metadata['buddies'] = json.dumps(self._get_buddies()) + # update spent time before saving + self._update_spent_time() + + def set_last_value(values_list, new_value): + if ', ' not in values_list: + return '%d' % new_value + else: + partial_list = ', '.join(values_list.split(', ')[:-1]) + return partial_list + ', %d' % new_value + + self.metadata['spent-times'] = set_last_value( + self.metadata['spent-times'], self._spent_time) + preview = self.get_preview() if preview is not None: self.metadata['preview'] = dbus.ByteArray(preview)