2 # -*- coding: utf-8 -*-
5 @todo Fix scrollto for Fremantle
6 @todo backgrounds need some resizing
7 @todo Re-use windows for better performance
8 @bug For some reason, the back/close button doesn't work when I nest multiple levels
9 @todo Need to confirm id's are persistent (not just for todos but broken behavior on transition)
14 @todo Reverse order option. Toggle between playing ascending/descending chronological order
15 @todo Podcast integration
18 from __future__ import with_statement
27 import dbus.mainloop.glib
37 import util.misc as misc_utils
45 _moduleLogger = logging.getLogger(__name__)
46 PROFILE_STARTUP = False
49 class MormonChannelProgram(hildonize.get_app_class()):
52 super(MormonChannelProgram, self).__init__()
53 currentPath = os.path.abspath(__file__)
54 storePath = os.path.join(os.path.split(os.path.dirname(currentPath))[0], "data")
55 self._store = imagestore.ImageStore(storePath, constants._cache_path_)
56 self._index = stream_index.AudioIndex()
57 self._player = player.Player(self._index)
62 if not hildonize.IS_HILDON_SUPPORTED:
63 _moduleLogger.info("No hildonization support")
66 self._osso_c = osso.Context(constants.__app_name__, constants.__version__, False)
67 self._deviceState = osso.DeviceState(self._osso_c)
68 self._deviceState.set_device_state_callback(self._on_device_state_change, 0)
70 _moduleLogger.info("No osso support")
72 self._deviceState = None
74 self._sourceSelector = windows.source.SourceSelector(self, self._player, self._store, self._index)
75 self._sourceSelector.window.connect("destroy", self._on_destroy)
76 self._sourceSelector.window.set_default_size(400, 800)
77 self._sourceSelector.show()
84 def _save_settings(self):
85 config = ConfigParser.SafeConfigParser()
87 self._sourceSelector.save_settings(config, "Windows")
89 with open(constants._user_settings_, "wb") as configFile:
90 config.write(configFile)
92 def _load_settings(self):
93 config = ConfigParser.SafeConfigParser()
94 config.read(constants._user_settings_)
96 self._sourceSelector.load_settings(config, "Windows")
98 @misc_utils.log_exception(_moduleLogger)
99 def _on_device_state_change(self, shutdown, save_unsaved_data, memory_low, system_inactivity, message, userData):
101 For system_inactivity, we have no background tasks to pause
103 @note Hildon specific
108 if save_unsaved_data or shutdown:
109 self._save_settings()
111 @misc_utils.log_exception(_moduleLogger)
112 def _on_destroy(self, widget = None, data = None):
117 self._save_settings()
123 self._deviceState.close()
124 except AttributeError:
125 pass # Either None or close was removed (in Fremantle)
128 except AttributeError:
129 pass # Either None or close was removed (in Fremantle)
133 @misc_utils.log_exception(_moduleLogger)
134 def _on_show_about(self, widget = None, data = None):
135 dialog = gtk.AboutDialog()
136 dialog.set_position(gtk.WIN_POS_CENTER)
137 dialog.set_name(constants.__pretty_app_name__)
138 dialog.set_version(constants.__version__)
139 dialog.set_copyright("")
140 dialog.set_website("")
141 comments = "Mormon Radio and Audiobook Player"
142 dialog.set_comments(comments)
143 dialog.set_authors(["Ed Page <eopage@byu.net>"])
149 gobject.threads_init()
150 gtk.gdk.threads_init()
151 l = dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
153 hildonize.set_application_title(constants.__pretty_app_name__)
154 app = MormonChannelProgram()
155 if not PROFILE_STARTUP:
158 except KeyboardInterrupt:
163 if __name__ == "__main__":
164 logging.basicConfig(level=logging.DEBUG)