X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fdialcentral_qt.py;h=0f4150b13e0b4d22149d5251347a31d1244feeca;hb=8af5627ea879c80cf6adb1dc64df17a36e1a4cb0;hp=887c9398b13e0e7182fd0a63a860681d7f9b2f42;hpb=4c6fadabf446a7e0e010961f8c9e48863d0b085e;p=gc-dialer diff --git a/src/dialcentral_qt.py b/src/dialcentral_qt.py index 887c939..0f4150b 100755 --- a/src/dialcentral_qt.py +++ b/src/dialcentral_qt.py @@ -8,11 +8,14 @@ import base64 import ConfigParser import functools import logging +import logging.handlers from PyQt4 import QtGui from PyQt4 import QtCore import constants +import alarm_handler +import led_handler from util import qtpie from util import qwrappers from util import qui_utils @@ -24,29 +27,6 @@ import session _moduleLogger = logging.getLogger(__name__) -class LedWrapper(object): - - def __init__(self): - self._ledHandler = None - self._init = False - - def off(self): - self._lazy_init() - if self._ledHandler is not None: - self._ledHandler.off() - - def _lazy_init(self): - if self._init: - return - self._init = True - try: - import led_handler - self._ledHandler = led_handler.LedHandler() - except Exception, e: - _moduleLogger.exception('Unable to initialize LED Handling: "%s"' % str(e)) - self._ledHandler = None - - class Dialcentral(qwrappers.ApplicationWrapper): _DATA_PATHS = [ @@ -57,24 +37,12 @@ class Dialcentral(qwrappers.ApplicationWrapper): def __init__(self, app): self._dataPath = None self._aboutDialog = None - self._ledHandler = LedWrapper() self.notifyOnMissed = False self.notifyOnVoicemail = False self.notifyOnSms = False - try: - import alarm_handler - if alarm_handler.AlarmHandler is not alarm_handler._NoneAlarmHandler: - self._alarmHandler = alarm_handler.AlarmHandler() - else: - self._alarmHandler = None - except (ImportError, OSError): - self._alarmHandler = None - except Exception: - _moduleLogger.exception("Notification failure") - self._alarmHandler = None - if self._alarmHandler is None: - _moduleLogger.info("No notification support") + self._ledHandler = led_handler.LedHandler() + self._alarmHandler = alarm_handler.AlarmHandler() qwrappers.ApplicationWrapper.__init__(self, app, constants) @@ -123,28 +91,27 @@ class Dialcentral(qwrappers.ApplicationWrapper): except Exception: _moduleLogger.exception("Unknown loading error") - if self._alarmHandler is not None: - try: - self._alarmHandler.load_settings(config, "alarm") - self.notifyOnMissed = config.getboolean("2 - Account Info", "notifyOnMissed") - self.notifyOnVoicemail = config.getboolean("2 - Account Info", "notifyOnVoicemail") - self.notifyOnSms = config.getboolean("2 - Account Info", "notifyOnSms") - except ConfigParser.NoOptionError, e: - _moduleLogger.info( - "Settings file %s is missing option %s" % ( - constants._user_settings_, - e.option, - ), - ) - except ConfigParser.NoSectionError, e: - _moduleLogger.info( - "Settings file %s is missing section %s" % ( - constants._user_settings_, - e.section, - ), - ) - except Exception: - _moduleLogger.exception("Unknown loading error") + try: + self._alarmHandler.load_settings(config, "alarm") + self.notifyOnMissed = config.getboolean("2 - Account Info", "notifyOnMissed") + self.notifyOnVoicemail = config.getboolean("2 - Account Info", "notifyOnVoicemail") + self.notifyOnSms = config.getboolean("2 - Account Info", "notifyOnSms") + except ConfigParser.NoOptionError, e: + _moduleLogger.info( + "Settings file %s is missing option %s" % ( + constants._user_settings_, + e.option, + ), + ) + except ConfigParser.NoSectionError, e: + _moduleLogger.info( + "Settings file %s is missing section %s" % ( + constants._user_settings_, + e.section, + ), + ) + except Exception: + _moduleLogger.exception("Unknown loading error") creds = ( base64.b64decode(blob) @@ -168,9 +135,8 @@ class Dialcentral(qwrappers.ApplicationWrapper): blob = base64.b64encode(value) config.set(constants.__pretty_app_name__, "bin_blob_%i" % i, blob) - if self._alarmHandler is not None: - config.add_section("alarm") - self._alarmHandler.save_settings(config, "alarm") + config.add_section("alarm") + self._alarmHandler.save_settings(config, "alarm") config.add_section("2 - Account Info") config.set("2 - Account Info", "notifyOnMissed", repr(self.notifyOnMissed)) config.set("2 - Account Info", "notifyOnVoicemail", repr(self.notifyOnVoicemail)) @@ -193,6 +159,17 @@ class Dialcentral(qwrappers.ApplicationWrapper): else: return None + def get_resource(self, name): + if self._dataPath is None: + for path in self._DATA_PATHS: + if os.path.exists(os.path.join(path, name)): + self._dataPath = path + break + if self._dataPath is not None: + return os.path.join(self._dataPath, name) + else: + return None + def _close_windows(self): qwrappers.ApplicationWrapper._close_windows(self) if self._aboutDialog is not None: @@ -342,7 +319,6 @@ class MainWindow(qwrappers.WindowWrapper): def __init__(self, parent, app): qwrappers.WindowWrapper.__init__(self, parent, app) self._window.setWindowTitle("%s" % constants.__pretty_app_name__) - #self._freezer = qwrappers.AutoFreezeWindowFeature(self._app, self._window) self._errorLog = self._app.errorLog self._session = session.Session(self._errorLog, constants._data_path_) @@ -350,6 +326,8 @@ class MainWindow(qwrappers.WindowWrapper): self._session.loggedIn.connect(self._on_login) self._session.loggedOut.connect(self._on_logout) self._session.draft.recipientsChanged.connect(self._on_recipients_changed) + self._session.newMessages.connect(self._on_new_message_alert) + self._app.alarmHandler.applicationNotifySignal.connect(self._on_app_alert) self._defaultCredentials = "", "" self._curentCredentials = "", "" self._currentTab = 0 @@ -521,7 +499,7 @@ class MainWindow(qwrappers.WindowWrapper): if not self._tabsContents[index].has_child(): tab = self._TAB_CLASS[index](self._app, self._session, self._errorLog) self._tabsContents[index].set_child(tab) - self._tabsContents[index].refresh(force=False) + self._tabsContents[index].refresh(force=False) def _prompt_for_login(self): if self._credentialsDialog is None: @@ -540,35 +518,60 @@ class MainWindow(qwrappers.WindowWrapper): if self._accountDialog is None: import dialogs self._accountDialog = dialogs.AccountDialog(self._app) - if self._app.alarmHandler is None: - self._accountDialog.setIfNotificationsSupported(False) - if self._app.alarmHandler is not None: - self._accountDialog.notifications = self._app.alarmHandler.isEnabled - self._accountDialog.notificationTime = self._app.alarmHandler.recurrence - self._accountDialog.notifyOnMissed = self._app.notifyOnMissed - self._accountDialog.notifyOnVoicemail = self._app.notifyOnVoicemail - self._accountDialog.notifyOnSms = self._app.notifyOnSms + self._accountDialog.setIfNotificationsSupported(self._app.alarmHandler.backgroundNotificationsSupported) + self._accountDialog.notifications = self._app.alarmHandler.alarmType + self._accountDialog.notificationTime = self._app.alarmHandler.recurrence + self._accountDialog.notifyOnMissed = self._app.notifyOnMissed + self._accountDialog.notifyOnVoicemail = self._app.notifyOnVoicemail + self._accountDialog.notifyOnSms = self._app.notifyOnSms self._accountDialog.set_callbacks( self._session.get_callback_numbers(), self._session.get_callback_number() ) - self._accountDialog.accountNumber = self._session.get_account_number() + accountNumberToDisplay = self._session.get_account_number() + if not accountNumberToDisplay: + accountNumberToDisplay = "Not Available (%s)" % self._session.state + self._accountDialog.set_account_number(accountNumberToDisplay) response = self._accountDialog.run(self.window) if response == QtGui.QDialog.Accepted: if self._accountDialog.doClear: self._session.logout_and_clear() + self._defaultCredentials = "", "" + self._curentCredentials = "", "" + for tab in self._tabsContents: + tab.disable() else: callbackNumber = self._accountDialog.selectedCallback self._session.set_callback_number(callbackNumber) - if self._app.alarmHandler is not None: - self._app.alarmHandler.apply_settings(self._accountDialog.notifications, self._accountDialog.notificationTime) - self._app.notifyOnMissed = self._accountDialog.notifyOnMissed - self._app.notifyOnVoicemail = self._accountDialog.notifyOnVoicemail - self._app.notifyOnSms = self._accountDialog.notifyOnSms + + if ( + self._accountDialog.notifyOnMissed or + self._accountDialog.notifyOnVoicemail or + self._accountDialog.notifyOnSms + ): + notifications = self._accountDialog.notifications + else: + notifications = self._accountDialog.ALARM_NONE + self._app.alarmHandler.apply_settings(notifications, self._accountDialog.notificationTime) + + self._app.notifyOnMissed = self._accountDialog.notifyOnMissed + self._app.notifyOnVoicemail = self._accountDialog.notifyOnVoicemail + self._app.notifyOnSms = self._accountDialog.notifyOnSms + self._app.save_settings() elif response == QtGui.QDialog.Rejected: _moduleLogger.info("Cancelled") else: _moduleLogger.info("Unknown response") + @QtCore.pyqtSlot() + @misc_utils.log_exception(_moduleLogger) + def _on_new_message_alert(self): + with qui_utils.notify_error(self._errorLog): + if self._app.alarmHandler.alarmType == self._app.alarmHandler.ALARM_APPLICATION: + if self._currentTab == self.MESSAGES_TAB or not self._app.ledHandler.isReal: + self._errorLog.push_message("New messages available") + else: + self._app.ledHandler.on() + @QtCore.pyqtSlot(str) @misc_utils.log_exception(_moduleLogger) def _on_session_error(self, message): @@ -588,6 +591,7 @@ class MainWindow(qwrappers.WindowWrapper): for tab in self._tabsContents: tab.enable() + self._initialize_tab(self._currentTab) @QtCore.pyqtSlot() @misc_utils.log_exception(_moduleLogger) @@ -598,6 +602,18 @@ class MainWindow(qwrappers.WindowWrapper): @QtCore.pyqtSlot() @misc_utils.log_exception(_moduleLogger) + def _on_app_alert(self): + with qui_utils.notify_error(self._errorLog): + if self._session.state == self._session.LOGGEDIN_STATE: + messageType = { + (True, True): self._session.MESSAGE_ALL, + (True, False): self._session.MESSAGE_TEXTS, + (False, True): self._session.MESSAGE_VOICEMAILS, + }[(self._app.notifyOnSms, self._app.notifyOnVoicemail)] + self._session.update_messages(messageType, force=True) + + @QtCore.pyqtSlot() + @misc_utils.log_exception(_moduleLogger) def _on_recipients_changed(self): with qui_utils.notify_error(self._errorLog): if self._session.draft.get_num_contacts() == 0: @@ -608,6 +624,7 @@ class MainWindow(qwrappers.WindowWrapper): self._smsEntryDialog = dialogs.SMSEntryWindow(self.window, self._app, self._session, self._errorLog) self._smsEntryDialog.window.destroyed.connect(self._on_child_close) self._smsEntryDialog.window.closed.connect(self._on_child_close) + self._smsEntryDialog.window.show() @misc_utils.log_exception(_moduleLogger) def _on_child_close(self, obj = None): @@ -626,6 +643,8 @@ class MainWindow(qwrappers.WindowWrapper): with qui_utils.notify_error(self._errorLog): self._currentTab = index self._initialize_tab(index) + if self._app.alarmHandler.alarmType == self._app.alarmHandler.ALARM_APPLICATION: + self._app.ledHandler.off() @QtCore.pyqtSlot() @QtCore.pyqtSlot(bool) @@ -653,10 +672,28 @@ class MainWindow(qwrappers.WindowWrapper): @misc_utils.log_exception(_moduleLogger) def _on_account(self, checked = True): with qui_utils.notify_error(self._errorLog): + assert self._session.state == self._session.LOGGEDIN_STATE, "Must be logged in for settings" self._show_account_dialog() def run(): + try: + os.makedirs(constants._data_path_) + except OSError, e: + if e.errno != 17: + raise + + logFormat = '(%(relativeCreated)5d) %(levelname)-5s %(threadName)s.%(name)s.%(funcName)s: %(message)s' + logging.basicConfig(level=logging.DEBUG, format=logFormat) + rotating = logging.handlers.RotatingFileHandler(constants._user_logpath_, maxBytes=512*1024, backupCount=1) + rotating.setFormatter(logging.Formatter(logFormat)) + root = logging.getLogger() + root.addHandler(rotating) + _moduleLogger.info("%s %s-%s" % (constants.__app_name__, constants.__version__, constants.__build__)) + _moduleLogger.info("OS: %s" % (os.uname()[0], )) + _moduleLogger.info("Kernel: %s (%s) for %s" % os.uname()[2:]) + _moduleLogger.info("Hostname: %s" % os.uname()[1]) + app = QtGui.QApplication([]) handle = Dialcentral(app) qtpie.init_pies() @@ -666,13 +703,5 @@ def run(): if __name__ == "__main__": import sys - logFormat = '(%(relativeCreated)5d) %(levelname)-5s %(threadName)s.%(name)s.%(funcName)s: %(message)s' - logging.basicConfig(level=logging.DEBUG, format=logFormat) - try: - os.makedirs(constants._data_path_) - except OSError, e: - if e.errno != 17: - raise - val = run() sys.exit(val)