Prepping notification support for Fremantle (untested) and another notification example
authorepage <eopage@byu.net>
Tue, 20 Oct 2009 02:38:13 +0000 (02:38 +0000)
committerepage <eopage@byu.net>
Tue, 20 Oct 2009 02:38:13 +0000 (02:38 +0000)
git-svn-id: file:///svnroot/gc-dialer/trunk@544 c39d3808-3fe2-4d86-a59f-b7f623ee9f21

src/alarm_handler.py
src/example_custom_notifier.py [deleted file]
src/examples/log_notifier.py [new file with mode: 0644]
src/examples/sound_notifier.py [new file with mode: 0644]

index d3a9bb9..779804a 100644 (file)
@@ -6,20 +6,167 @@ import datetime
 import ConfigParser
 
 import dbus
-import osso.alarmd as alarmd
 
 
-class AlarmHandler(object):
+_FREMANTLE_ALARM = "Fremantle"
+_DIABLO_ALARM = "Diablo"
+_NO_ALARM = "None"
+
+
+try:
+       import alarm
+       ALARM_TYPE = _FREMANTLE_ALARM
+except ImportError:
+       try:
+               import osso.alarmd as alarmd
+               ALARM_TYPE = _DIABLO_ALARM
+       except ImportError:
+               ALARM_TYPE = _NO_ALARM
+
+
+def _get_start_time(recurrence):
+       now = datetime.datetime.now()
+       startTimeMinute = now.minute + max(recurrence, 5) # being safe
+       startTimeHour = now.hour + int(startTimeMinute / 60)
+       startTimeMinute = startTimeMinute % 59
+       now.replace(minute=startTimeMinute)
+       timestamp = int(time.mktime(now.timetuple()))
+       return timestamp
+
+
+def _create_recurrence_mask(recurrence, base):
+       """
+       >>> bin(_create_recurrence_mask(60, 60))
+       '0b1'
+       >>> bin(_create_recurrence_mask(30, 60))
+       '0b1000000000000000000000000000001'
+       >>> bin(_create_recurrence_mask(2, 60))
+       '0b10101010101010101010101010101010101010101010101010101010101'
+       >>> bin(_create_recurrence_mask(1, 60))
+       '0b111111111111111111111111111111111111111111111111111111111111'
+       """
+       mask = 0
+       for i in xrange(base / recurrence):
+               mask |= 1 << (recurrence * i)
+       return mask
+
+
+def _unpack_minutes(recurrence):
+       """
+       >>> _unpack_minutes(0)
+       (0, 0, 0)
+       >>> _unpack_minutes(1)
+       (0, 0, 1)
+       >>> _unpack_minutes(59)
+       (0, 0, 59)
+       >>> _unpack_minutes(60)
+       (0, 1, 0)
+       >>> _unpack_minutes(129)
+       (0, 2, 9)
+       >>> _unpack_minutes(5 * 60 * 24 + 3 * 60 + 2)
+       (5, 3, 2)
+       >>> _unpack_minutes(12 * 60 * 24 + 3 * 60 + 2)
+       (5, 3, 2)
+       """
+       minutesInAnHour = 60
+       minutesInDay = 24 * minutesInAnHour
+       minutesInAWeek = minutesInDay * 7
+
+       days = recurrence / minutesInDay
+       daysOfWeek = days % 7
+       recurrence -= days * minutesInDay
+       hours = recurrence / minutesInAnHour
+       recurrence -= hours * minutesInAnHour
+       mins = recurrence % minutesInAnHour
+       recurrence -= mins
+       assert recurrence == 0, "Recurrence %d" % recurrence
+       return daysOfWeek, hours, mins
+
+
+class _FremantleAlarmHandler(object):
+
+       _INVALID_COOKIE = -1
+       _REPEAT_FOREVER = -1
+       _TITLE = "Dialcentral Notifications"
+       _LAUNCHER = os.path.abspath(os.path.join(os.path.dirname(__file__), "alarm_notify.py"))
+
+       def __init__(self):
+               self._recurrence = 5
+
+               self._alarmCookie = self._INVALID_COOKIE
+               self._launcher = self._LAUNCHER
+
+       def load_settings(self, config, sectionName):
+               try:
+                       self._recurrence = config.getint(sectionName, "recurrence")
+                       self._alarmCookie = config.getint(sectionName, "alarmCookie")
+                       launcher = config.get(sectionName, "notifier")
+                       if launcher:
+                               self._launcher = launcher
+               except ConfigParser.NoOptionError:
+                       pass
+
+       def save_settings(self, config, sectionName):
+               config.set(sectionName, "recurrence", str(self._recurrence))
+               config.set(sectionName, "alarmCookie", str(self._alarmCookie))
+               launcher = self._launcher if self._launcher != self._LAUNCHER else ""
+               config.set(sectionName, "notifier", launcher)
+
+       def apply_settings(self, enabled, recurrence):
+               if recurrence != self._recurrence or enabled != self.isEnabled:
+                       if self.isEnabled:
+                               self._clear_alarm()
+                       if enabled:
+                               self._set_alarm(recurrence)
+               self._recurrence = int(recurrence)
+
+       @property
+       def recurrence(self):
+               return self._recurrence
+
+       @property
+       def isEnabled(self):
+               return self._alarmCookie != self._INVALID_COOKIE
+
+       def _set_alarm(self, recurrenceMins):
+               assert 1 <= recurrenceMins, "Notifications set to occur too frequently: %d" % recurrenceMins
+               alarmTime = _get_start_time(recurrenceMins)
+
+               event = alarm.Event()
+               event.appid = self._TITLE
+               event.message = "GoogleVoice updates"
+               event.alarm_time = alarmTime
+               event.recurrences_left = -1
+
+               action = event.add_action(1)[0]
+               action.flags |= alarm.ACTION_TYPE_EXEC | alarm.ACTION_WHEN_TRIGGERED
+               action.command = self._launcher
+
+               recurrence = event.add_recurrence(1)[0]
+               recurrence.recurrences_left = self._REPEAT_FOREVER
+               recurrence.mask_min |= _create_recurrence_mask(recurrenceMins, 60)
+               recurrence.mask_hour |= alarm.RECUR_HOUR_DONTCARE
+               recurrence.mask_mday |= alarm.RECUR_MDAY_DONTCARE
+               recurrence.mask_wday |= alarm.RECUR_WDAY_DONTCARE
+               recurrence.mask_mon |= alarm.RECUR_MON_DONTCARE
+               recurrence.special |= alarm.RECUR_SPECIAL_NONE
+
+               assert event.is_sane()
+               self._alarmCookie = alarm.add_event(event)
+
+       def _clear_alarm(self):
+               if self._alarmCookie == self._INVALID_COOKIE:
+                       return
+               alarm.delete_event(self._alarmCookie)
+               self._alarmCookie = self._INVALID_COOKIE
+
+
+class _DiabloAlarmHandler(object):
 
        _INVALID_COOKIE = -1
        _TITLE = "Dialcentral Notifications"
        _LAUNCHER = os.path.abspath(os.path.join(os.path.dirname(__file__), "alarm_notify.py"))
        _REPEAT_FOREVER = -1
-       _DEFAULT_FLAGS = (
-               alarmd.ALARM_EVENT_NO_DIALOG |
-               alarmd.ALARM_EVENT_NO_SNOOZE |
-               alarmd.ALARM_EVENT_CONNECTED
-       )
 
        def __init__(self):
                self._recurrence = 5
@@ -61,22 +208,18 @@ class AlarmHandler(object):
        def isEnabled(self):
                return self._alarmCookie != self._INVALID_COOKIE
 
-       def _get_start_time(self, recurrence):
-               now = datetime.datetime.now()
-               startTimeMinute = now.minute + max(recurrence, 5) # being safe
-               startTimeHour = now.hour + int(startTimeMinute / 60)
-               startTimeMinute = startTimeMinute % 59
-               now.replace(minute=startTimeMinute)
-               timestamp = int(time.mktime(now.timetuple()))
-               return timestamp
-
        def _set_alarm(self, recurrence):
                assert 1 <= recurrence, "Notifications set to occur too frequently: %d" % recurrence
-               alarmTime = self._get_start_time(recurrence)
+               alarmTime = _get_start_time(recurrence)
 
                #Setup the alarm arguments so that they can be passed to the D-Bus add_event method
+               _DEFAULT_FLAGS = (
+                       alarmd.ALARM_EVENT_NO_DIALOG |
+                       alarmd.ALARM_EVENT_NO_SNOOZE |
+                       alarmd.ALARM_EVENT_CONNECTED
+               )
                action = []
-               action.extend(['flags', self._DEFAULT_FLAGS])
+               action.extend(['flags', _DEFAULT_FLAGS])
                action.extend(['title', self._TITLE])
                action.extend(['path', self._launcher])
                action.extend([
@@ -106,6 +249,36 @@ class AlarmHandler(object):
                assert deleteResult != -1, "Deleting of alarm event failed"
 
 
+class _NoneAlarmHandler(object):
+
+       def __init__(self):
+               pass
+
+       def load_settings(self, config, sectionName):
+               pass
+
+       def save_settings(self, config, sectionName):
+               pass
+
+       def apply_settings(self, enabled, recurrence):
+               pass
+
+       @property
+       def recurrence(self):
+               return 0
+
+       @property
+       def isEnabled(self):
+               return False
+
+
+AlarmHandler = {
+       _FREMANTLE_ALARM: _FremantleAlarmHandler,
+       _DIABLO_ALARM: _DiabloAlarmHandler,
+       _NO_ALARM: _NoneAlarmHandler,
+}[ALARM_TYPE]
+
+
 def main():
        import ConfigParser
        import constants
diff --git a/src/example_custom_notifier.py b/src/example_custom_notifier.py
deleted file mode 100644 (file)
index 3679b5b..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-
-
-sys.path.insert(0,"/usr/lib/dialcentral/")
-
-
-import alarm_notify
-
-
-def notify_on_change():
-       notifyUser = alarm_notify.is_changed()
-
-       if notifyUser:
-               import subprocess
-               import led_handler
-               led = led_handler.LedHandler()
-               led.on()
-               soundOn = subprocess.call("/usr/bin/dbus-send --dest=com.nokia.osso_media_server --print-reply /com/nokia/osso_media_server com.nokia.osso_media_server.music.play_media string:file:///usr/lib/gv-notifier/alert.mp3",shell=True)
-
-
-if __name__ == "__main__":
-       notify_on_change()
diff --git a/src/examples/log_notifier.py b/src/examples/log_notifier.py
new file mode 100644 (file)
index 0000000..7dc3b97
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+import sys
+import datetime
+
+
+sys.path.insert(0,"/usr/lib/dialcentral/")
+
+
+import constants
+import alarm_notify
+
+
+def notify_on_change():
+       filename = "%s/notification.log" % constants._data_path_
+       with open(filename, "a") as file:
+               file.write("Notification: %r\n" % (datetime.datetime.now(), ))
+               notifyUser = alarm_notify.is_changed()
+               if notifyUser:
+                       file.write("\tChange occurred\n")
+
+
+if __name__ == "__main__":
+       notify_on_change()
diff --git a/src/examples/sound_notifier.py b/src/examples/sound_notifier.py
new file mode 100644 (file)
index 0000000..3679b5b
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+import sys
+
+
+sys.path.insert(0,"/usr/lib/dialcentral/")
+
+
+import alarm_notify
+
+
+def notify_on_change():
+       notifyUser = alarm_notify.is_changed()
+
+       if notifyUser:
+               import subprocess
+               import led_handler
+               led = led_handler.LedHandler()
+               led.on()
+               soundOn = subprocess.call("/usr/bin/dbus-send --dest=com.nokia.osso_media_server --print-reply /com/nokia/osso_media_server com.nokia.osso_media_server.music.play_media string:file:///usr/lib/gv-notifier/alert.mp3",shell=True)
+
+
+if __name__ == "__main__":
+       notify_on_change()