import ConfigParser
import itertools
import warnings
-import traceback
import gtk
import gtk.glade
fsContactsPath = os.path.join(self._data_path, "contacts")
fileBackend = file_backend.FilesystemAddressBookFactory(fsContactsPath)
for backendId in (self.GV_BACKEND, self.GC_BACKEND):
- self._dialpads[backendId].dial = self._on_dial_clicked
- self._recentViews[backendId].number_selected = self._on_number_selected
- self._messagesViews[backendId].number_selected = self._on_number_selected
- self._contactsViews[backendId].number_selected = self._on_number_selected
+ self._dialpads[backendId].number_selected = self._select_action
+ self._recentViews[backendId].number_selected = self._select_action
+ self._messagesViews[backendId].number_selected = self._select_action
+ self._contactsViews[backendId].number_selected = self._select_action
addressBooks = [
self._phoneBackends[backendId],
self.attempt_login(2)
- return False
-
def attempt_login(self, numOfAttempts = 10, force = False):
"""
@todo Handle user notification better like attempting to login and failed login
-
- @note Not meant to be called directly, but run as a seperate thread.
"""
- assert 0 < numOfAttempts, "That was pointless having 0 or less login attempts"
-
- if self._phoneBackends is None or len(self._phoneBackends) < len(self.BACKENDS):
- warnings.warn(
- "Attempted to login before initialization is complete, did an event fire early?"
- )
- return False
-
- with gtk_toolbox.gtk_lock():
- if not self._deviceIsOnline:
- self._errorDisplay.push_message(
- "Unable to login, device is not online"
- )
- return False
-
- loggedIn = False
try:
- username, password = self._credentials
- serviceId = self._defaultBackendId
+ assert 0 <= numOfAttempts, "That was pointless having 0 or less login attempts"
+ assert self._initDone, "Attempting login before app is fully loaded"
+ if not self._deviceIsOnline:
+ raise RuntimeError("Unable to login, device is not online")
+ serviceId = self.NULL_BACKEND
+ loggedIn = False
if not force:
- loggedIn, username, password = self._login_by_cookie(username, password)
- if not loggedIn:
- loggedIn, username, password = self._login_by_settings(username, password)
+ self.refresh_session()
+ serviceId = self._defaultBackendId
+ loggedIn = True
+
if not loggedIn:
- loggedIn, username, password = self._login_by_user(username, password, numOfAttempts)
- except RuntimeError, e:
- warnings.warn(traceback.format_exc())
- self._errorDisplay.push_exception_with_lock(e)
+ with gtk_toolbox.gtk_lock():
+ loggedIn, serviceId = self._login_by_user(numOfAttempts)
- with gtk_toolbox.gtk_lock():
- if loggedIn:
- self._credentials = username, password
+ with gtk_toolbox.gtk_lock():
self._change_loggedin_status(serviceId)
- else:
- self._errorDisplay.push_message("Login Failed")
- self._change_loggedin_status(self.NULL_BACKEND)
- return loggedIn
+ except StandardError, e:
+ with gtk_toolbox.gtk_lock():
+ self._errorDisplay.push_exception(e)
+
+ def refresh_session(self):
+ assert self._initDone, "Attempting login before app is fully loaded"
+ if not self._deviceIsOnline:
+ raise RuntimeError("Unable to login, device is not online")
+
+ loggedIn = False
+ if not loggedIn:
+ loggedIn = self._login_by_cookie()
+ if not loggedIn:
+ loggedIn = self._login_by_settings()
+
+ if not loggedIn:
+ raise RuntimeError("Login Failed")
- def _login_by_cookie(self, username, password):
+ def _login_by_cookie(self):
loggedIn = self._phoneBackends[self._defaultBackendId].is_authed()
if loggedIn:
warnings.warn(
"Logged into %r through cookies" % self._phoneBackends[self._defaultBackendId],
UserWarning, 2
)
- return loggedIn, username, password
+ return loggedIn
- def _login_by_settings(self, username, password):
- if username and password:
- loggedIn = self._phoneBackends[self._defaultBackendId].login(username, password)
- if loggedIn:
- warnings.warn(
- "Logged into %r through settings" % self._phoneBackends[self._defaultBackendId],
- UserWarning, 2
- )
- return loggedIn, username, password
+ def _login_by_settings(self):
+ username, password = self._credentials
+ loggedIn = self._phoneBackends[self._defaultBackendId].login(username, password)
+ if loggedIn:
+ self._credentials = username, password
+ warnings.warn(
+ "Logged into %r through settings" % self._phoneBackends[self._defaultBackendId],
+ UserWarning, 2
+ )
+ return loggedIn
- def _login_by_user(self, username, password, numOfAttempts):
- loggedIn = False
+ def _login_by_user(self, numOfAttempts):
+ loggedIn, (username, password) = False, self._credentials
+ tmpServiceId = self.NULL_BACKEND
for attemptCount in xrange(numOfAttempts):
if loggedIn:
break
- with gtk_toolbox.gtk_lock():
- availableServices = {
- self.GV_BACKEND: "Google Voice",
- self.GC_BACKEND: "Grand Central",
- }
- credentials = self._credentialsDialog.request_credentials_from(
- availableServices, defaultCredentials = self._credentials
- )
- serviceId, username, password = credentials
+ availableServices = {
+ self.GV_BACKEND: "Google Voice",
+ self.GC_BACKEND: "Grand Central",
+ }
+ credentials = self._credentialsDialog.request_credentials_from(
+ availableServices, defaultCredentials = self._credentials
+ )
+ tmpServiceId, username, password = credentials
+ loggedIn = self._phoneBackends[tmpServiceId].login(username, password)
- loggedIn = self._phoneBackends[serviceId].login(username, password)
- if 0 < attemptCount:
+ if loggedIn:
+ serviceId = tmpServiceId
+ self._credentials = username, password
warnings.warn(
"Logged into %r through user request" % self._phoneBackends[serviceId],
UserWarning, 2
)
- return loggedIn, username, password
+ else:
+ serviceId = self.NULL_BACKEND
- def _on_close(self, *args, **kwds):
- try:
- if self._osso is not None:
- self._osso.close()
+ return loggedIn, serviceId
- if self._initDone:
- self._save_settings()
- finally:
- gtk.main_quit()
+ def _select_action(self, action, number, message):
+ self.refresh_session()
+ if action == "select":
+ self._dialpads[self._selectedBackendId].set_number(number)
+ self._notebook.set_current_page(self.KEYPAD_TAB)
+ elif action == "dial":
+ self._on_dial_clicked(number)
+ elif action == "sms":
+ self._on_sms_clicked(number, message)
+ else:
+ assert False, "Unknown action: %s" % action
def _change_loggedin_status(self, newStatus):
oldStatus = self._selectedBackendId
"""
@note UI Thread
"""
- self._defaultBackendId = int(config.get(self.__pretty_app_name__, "active"))
try:
+ self._defaultBackendId = int(config.get(self.__pretty_app_name__, "active"))
blobs = (
config.get(self.__pretty_app_name__, "bin_blob_%i" % i)
for i in xrange(len(self._credentials))
with open(self._user_settings, "wb") as configFile:
config.write(configFile)
+ def _on_close(self, *args, **kwds):
+ try:
+ if self._osso is not None:
+ self._osso.close()
+
+ if self._initDone:
+ self._save_settings()
+ finally:
+ gtk.main_quit()
+
def _on_device_state_change(self, shutdown, save_unsaved_data, memory_low, system_inactivity, message, userData):
"""
For shutdown or save_unsaved_data, our only state is cookies and I think the cookie manager handles that for us.
else:
self._window.set_title("%s - %s" % (self.__pretty_app_name__, tabTitle))
- def _on_number_selected(self, action, number, message):
- if action == "select":
- self._dialpads[self._selectedBackendId].set_number(number)
- self._notebook.set_current_page(self.KEYPAD_TAB)
- elif action == "dial":
- self._on_dial_clicked(number)
- elif action == "sms":
- self._on_sms_clicked(number, message)
- else:
- assert False, "Unknown action: %s" % action
-
def _on_sms_clicked(self, number, message):
"""
@todo Potential blocking on web access, maybe we should defer parts of this or put up a dialog?
<child internal-child="image">
<widget class="GtkImage" id="image3">
<property name="visible">True</property>
- <property name="stock">gtk-missing-image</property>
+ <property name="stock">gtk-connect</property>
</widget>
</child>
</widget>
<child internal-child="image">
<widget class="GtkImage" id="image4">
<property name="visible">True</property>
- <property name="stock">gtk-missing-image</property>
+ <property name="stock">gtk-delete</property>
</widget>
</child>
</widget>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="c" signal="clicked"/>
- <accelerator key="b" signal="clicked"/>
- <accelerator key="a" signal="clicked"/>
<accelerator key="2" signal="clicked"/>
+ <accelerator key="a" signal="clicked"/>
+ <accelerator key="b" signal="clicked"/>
+ <accelerator key="c" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label10">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="f" signal="clicked"/>
- <accelerator key="e" signal="clicked"/>
- <accelerator key="d" signal="clicked"/>
<accelerator key="3" signal="clicked"/>
+ <accelerator key="d" signal="clicked"/>
+ <accelerator key="e" signal="clicked"/>
+ <accelerator key="f" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label11">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="i" signal="clicked"/>
- <accelerator key="h" signal="clicked"/>
- <accelerator key="g" signal="clicked"/>
<accelerator key="4" signal="clicked"/>
+ <accelerator key="g" signal="clicked"/>
+ <accelerator key="h" signal="clicked"/>
+ <accelerator key="i" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label13">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="l" signal="clicked"/>
- <accelerator key="k" signal="clicked"/>
- <accelerator key="j" signal="clicked"/>
<accelerator key="5" signal="clicked"/>
+ <accelerator key="j" signal="clicked"/>
+ <accelerator key="k" signal="clicked"/>
+ <accelerator key="l" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label14">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="o" signal="clicked"/>
- <accelerator key="n" signal="clicked"/>
- <accelerator key="m" signal="clicked"/>
<accelerator key="6" signal="clicked"/>
+ <accelerator key="m" signal="clicked"/>
+ <accelerator key="n" signal="clicked"/>
+ <accelerator key="o" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label15">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="s" signal="clicked"/>
- <accelerator key="r" signal="clicked"/>
- <accelerator key="q" signal="clicked"/>
- <accelerator key="p" signal="clicked"/>
<accelerator key="7" signal="clicked"/>
+ <accelerator key="p" signal="clicked"/>
+ <accelerator key="q" signal="clicked"/>
+ <accelerator key="r" signal="clicked"/>
+ <accelerator key="s" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label16">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="v" signal="clicked"/>
- <accelerator key="u" signal="clicked"/>
- <accelerator key="t" signal="clicked"/>
<accelerator key="8" signal="clicked"/>
+ <accelerator key="t" signal="clicked"/>
+ <accelerator key="u" signal="clicked"/>
+ <accelerator key="v" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label17">
<property name="visible">True</property>
<property name="receives_default">False</property>
<property name="focus_on_click">False</property>
<signal name="clicked" handler="on_digit_clicked"/>
- <accelerator key="z" signal="clicked"/>
- <accelerator key="y" signal="clicked"/>
- <accelerator key="x" signal="clicked"/>
- <accelerator key="w" signal="clicked"/>
<accelerator key="9" signal="clicked"/>
+ <accelerator key="w" signal="clicked"/>
+ <accelerator key="x" signal="clicked"/>
+ <accelerator key="y" signal="clicked"/>
+ <accelerator key="z" signal="clicked"/>
<child>
<widget class="GtkLabel" id="label18">
<property name="visible">True</property>
<widget class="GtkTreeView" id="recentview">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="headers_visible">True</property>
<property name="rules_hint">True</property>
<property name="enable_grid_lines">horizontal</property>
<property name="enable_tree_lines">True</property>