Fix Reset option
[pedometerwidget] / src / usr / lib / hildon-desktop / pedometer_widget_home.py
index 5e1b735..00ca45d 100644 (file)
@@ -25,6 +25,10 @@ import gconf
 import gtk
 import cairo
 
+import pygst
+pygst.require("0.10")
+import gst
+
 import hildondesktop
 import hildon
 
@@ -378,61 +382,6 @@ class PedoRepositoryPickle(PedoRepository):
         except Exception, e:
             logger.error("Error while saving data to pickle: %s" % e)
 
-class AlarmController(Singleton):
-    enable = False
-    fname = "/home/user/MyDocs/.sounds/Ringtones/Bicycle.aac"
-    interval = 5
-    type = 0
-
-    def __init__(self):
-        self.client = gconf.client_get_default()
-        try:
-            self.enable = self.client.get_bool(ALARM_ENABLE)
-            self.fname = self.client.get_string(ALARM_FNAME)
-            self.interval = self.client.get_int(ALARM_INTERVAL)
-            self.type = self.client.get_int(ALARM_TYPE)
-        except:
-            self.client.set_bool(ALARM_ENABLE, self.enable)
-            self.client.set_string(ALARM_FNAME, self.fname)
-            self.client.set_int(ALARM_INTERVAL, self.interval)
-            self.client.set_int(ALARM_TYPE, self.type)
-
-    def update(self):
-        pass
-
-    def play(self):
-        pass
-
-    def set_enable(self, value):
-       self.enable = value
-       self.client.set_bool(ALARM_ENABLE, value)
-
-    def get_enable(self):
-        return self.enable
-
-    def set_alarm_file(self, fname):
-        self.fname = fname
-        self.client.set_string(ALARM_FNAME, fname)
-
-    def get_alarm_file(self):
-        if self.fname == None:
-            return ""
-        return self.fname
-
-    def set_interval(self, interval):
-        self.interval = interval
-        self.client.set_int(ALARM_INTERVAL, interval)
-
-    def get_interval(self):
-        return self.interval
-
-    def set_type(self, type):
-        self.type = type
-        self.client.set_int(ALARM_TYPE, type)
-
-    def get_type(self):
-        return self.type
-
 class PedoController(Singleton):
     mode = 0
     unit = 0
@@ -480,6 +429,10 @@ class PedoController(Singleton):
         self.pedometer.start()
         self.notify(True)
 
+    def reset_all_values(self):
+        self.repository.reset_values()
+        self.notify()
+
     def stop_pedometer(self):
         self.is_running = False
         self.pedometer.request_stop()
@@ -577,6 +530,117 @@ class PedoController(Singleton):
         for func in self.observers:
             func(optional)
 
+class AlarmController(Singleton):
+    enable = False
+    fname = "/home/user/MyDocs/.sounds/Ringtones/Bicycle.aac"
+    interval = 5
+    type = 0
+
+    player = None
+    is_playing = False
+    pedo_controller = None
+
+    def __init__(self):
+        self.client = gconf.client_get_default()
+        try:
+            self.enable = self.client.get_bool(ALARM_ENABLE)
+            self.fname = self.client.get_string(ALARM_FNAME)
+            self.interval = self.client.get_int(ALARM_INTERVAL)
+            self.type = self.client.get_int(ALARM_TYPE)
+        except:
+            self.client.set_bool(ALARM_ENABLE, self.enable)
+            self.client.set_string(ALARM_FNAME, self.fname)
+            self.client.set_int(ALARM_INTERVAL, self.interval)
+            self.client.set_int(ALARM_TYPE, self.type)
+
+        self.pedo_controller = PedoController()
+        if self.enable:
+            self.init_player()
+            self.pedo_controller.add_observer(self.update)
+            self.start_value = self.pedo_controller.get_first()
+
+    def init_player(self):
+        self.player = gst.element_factory_make("playbin2", "player")
+        fakesink = gst.element_factory_make("fakesink", "fakesink")
+        self.player.set_property("video-sink", fakesink)
+
+        bus = self.player.get_bus()
+        bus.add_signal_watch()
+        bus.connect("message", self.on_message)
+
+    def on_message(self, bus, message):
+        t = message.type
+        if t == gst.MESSAGE_EOS:
+            self.player.set_state(gst.STATE_NULL)
+            self.is_playing = False
+        elif t == gst.MESSAGE_ERROR:
+            self.player.set_state(gst.STATE_NULL)
+            self.is_playing = False
+            err, debug = message.parse_error()
+            logger.error("ERROR: %s, %s" % (err, debug) )
+
+    def update(self, optional):
+        diff = self.pedo_controller.get_first() - self.start_value
+        if self.type == 0 and diff.time >= self.interval * 60 or \
+                   self.type == 1 and diff.steps >= self.interval or \
+                   self.type == 2 and diff.dist >= self.interval or \
+                   self.type == 3 and diff.calories >= self.interval:
+            self.play()
+            #get new instance of current values
+            self.start_value = PedoValues() + self.pedo_controller.get_first()
+            logger.info("Alarm!")
+
+    def play(self):
+        if self.player is None:
+            self.init_player()
+        if self.is_playing:
+            self.player.set_state(gst.STATE_NULL)
+            self.is_playing = False
+        else:
+            self.player.set_property("uri", "file://" + self.fname)
+            self.player.set_state(gst.STATE_PLAYING)
+            self.is_playing = True
+
+    def stop(self):
+        self.player.set_state(gst.STATE_NULL)
+
+    def set_enable(self, value):
+       self.enable = value
+       self.client.set_bool(ALARM_ENABLE, value)
+       if self.enable:
+           self.init_player()
+           self.pedo_controller.add_observer(self.update)
+           self.start_value = self.pedo_controller.get_first()
+       else:
+           self.stop()
+           self.player = None
+           self.pedo_controller.remove_observer(self.update)
+
+    def get_enable(self):
+        return self.enable
+
+    def set_alarm_file(self, fname):
+        self.fname = fname
+        self.client.set_string(ALARM_FNAME, fname)
+
+    def get_alarm_file(self):
+        if self.fname == None:
+            return ""
+        return self.fname
+
+    def set_interval(self, interval):
+        self.interval = interval
+        self.client.set_int(ALARM_INTERVAL, interval)
+
+    def get_interval(self):
+        return self.interval
+
+    def set_type(self, type):
+        self.type = type
+        self.client.set_int(ALARM_TYPE, type)
+
+    def get_type(self):
+        return self.type
 
 class PedoCounter(Singleton):
     COORD_FNAME = "/sys/class/i2c-adapter/i2c-3/3-001d/coord"
@@ -1229,6 +1293,7 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem):
 
         dialog.vbox.add(enableButton)
         dialog.vbox.add(fileButton)
+        dialog.vbox.add(testButton)
         dialog.vbox.add(typePicker)
         dialog.vbox.add(hbox)
         dialog.show_all()
@@ -1247,10 +1312,12 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem):
 
     def show_settings(self, widget):
         def reset_total_counter(arg):
-            widget.totalCounter = 0
-            widget.totalTime = 0
-            widget.update_total()
-            hildon.hildon_banner_show_information(self, "None", "Total counter was resetted")
+            note = hildon.hildon_note_new_confirmation(self.dialog, "Are you sure you want to delete all your pedometer history?")
+            ret = note.run()
+            if ret == gtk.RESPONSE_OK:
+                self.controller.reset_all_values()
+                hildon.hildon_banner_show_information(self, "None", "All history was deleted")
+            note.destroy()
 
         def alarmButton_pressed(widget):
             self.show_alarm_settings(widget)
@@ -1287,12 +1354,12 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem):
         dialog = gtk.Dialog()
         dialog.set_title("Settings")
         dialog.add_button("OK", gtk.RESPONSE_OK)
+        self.dialog = dialog
 
-
-        button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
-        button.set_title("Reset total counter")
-        button.set_alignment(0, 0.8, 1, 1)
-        button.connect("clicked", reset_total_counter)
+        resetButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
+        resetButton.set_title("Reset total counter")
+        resetButton.set_alignment(0, 0.8, 1, 1)
+        resetButton.connect("clicked", reset_total_counter)
 
         alarmButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
         alarmButton.set_title("Alarm")
@@ -1368,13 +1435,13 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem):
 
         pan_area = hildon.PannableArea()
         vbox = gtk.VBox()
-        vbox.add(button)
         vbox.add(alarmButton)
         vbox.add(modePicker)
         vbox.add(heightPicker)
         vbox.add(unitPicker)
         vbox.add(UIPicker)
         vbox.add(idleButton)
+        vbox.add(resetButton)
         #vbox.add(logButton)
 
         pan_area.add_with_viewport(vbox)
@@ -1450,16 +1517,6 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem):
 
 hd_plugin_type = PedometerHomePlugin
 
-# The code below is just for testing purposes.
-# It allows to run the widget as a standalone process.
-if __name__ == "__main__":
-    import gobject
-    gobject.type_register(hd_plugin_type)
-    obj = gobject.new(hd_plugin_type, plugin_id="plugin_id")
-    obj.show_all()
-    gtk.main()
-
-############### old pedometer.py ###
 import math
 import logging
 
@@ -1471,3 +1528,11 @@ formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(messag
 ch.setFormatter(formatter)
 logger.addHandler(ch)
 
+# The code below is just for testing purposes.
+# It allows to run the widget as a standalone process.
+if __name__ == "__main__":
+    import gobject
+    gobject.type_register(hd_plugin_type)
+    obj = gobject.new(hd_plugin_type, plugin_id="plugin_id")
+    obj.show_all()
+    gtk.main()