import sys
-#import gc
+import gc
import os
-import re
-import time
import threading
-import contextlib
+import time
+import re
+import warnings
+
import gobject
import gtk
import gtk.glade
except ImportError:
hildon = None
-#try:
-# if hasattr(gtk, "Builder"):
-# #detected that this is not a legacy system
-# raise ImportError
-# #Legacy support
-# import gtk.glade
-#except ImportError:
-# gtk.glade = None
-
try:
import osso
try:
osso = None
try:
+ import conic
+except ImportError:
+ conic = None
+
+try:
import doctest
import optparse
except ImportError:
from gcbackend import GCDialer
import socket
-socket.setdefaulttimeout(5)
-@contextlib.contextmanager
-def gtk_critical_section():
- #The API changed and I hope these are the right calls
- gtk.gdk.threads_enter()
- yield
- gtk.gdk.threads_leave()
+
+socket.setdefaulttimeout(5)
def makeugly(prettynumber):
__app_name__ = "gc_dialer"
__version__ = "0.7.0"
+ __app_magic__ = 0xdeadbeef
+ _glade_files = [
+ './gc_dialer.glade',
+ '../lib/gc_dialer.glade',
+ '/usr/local/lib/gc_dialer.glade',
+ ]
def __init__(self):
self.phonenumber = ""
self.callbackNeedsSetup = True
self.recenttime = 0.0
- for path in [ './gc_dialer.glade',
- '../lib/gc_dialer.glade',
- '/usr/local/lib/gc_dialer.glade' ]:
+ for path in Dialpad._glade_files:
if os.path.isfile(path):
- #if gtk.glade is None:
- # self.wTree = gtk.Builder()
- # self.wTree.add_from_file(path)
- #else:
self.wTree = gtk.glade.XML(path)
break
else:
self.notebook = self.wTree.get_widget("notebook")
self.window = self.wTree.get_widget("Dialpad")
- if hildon is not None:
+
+ global hildon
+ self.app = None
+ if hildon is not None and isinstance(self.window, gtk.Window):
+ warnings.warn("Hildon installed but glade file not updated to work with hildon", UserWarning, 2)
+ hildon = None
+ elif hildon is not None:
self.app = hildon.Program()
self.window.set_title("Keypad")
self.app.add_window(self.window)
self.wTree.get_widget("usernameentry").set_property('hildon-input-mode', 7)
self.wTree.get_widget("passwordentry").set_property('hildon-input-mode', 7|(1 << 29))
else:
- print "No Hildon"
+ warnings.warn("No Hildon", UserWarning, 2)
+ self.osso = None
+ self.ebook = None
if osso is not None:
self.osso = osso.Context(__name__, Dialpad.__version__, False)
device = osso.DeviceState(self.osso)
abook.init_with_name(__name__, self.osso)
self.ebook = evo.open_addressbook("default")
else:
- print "No abook and No evolution address book support"
+ warnings.warn("No abook and No evolution address book support", UserWarning, 2)
else:
- print "No OSSO"
+ warnings.warn("No OSSO", UserWarning, 2)
+
+ self.connection = None
+ if conic is not None:
+ self.connection = conic.Connection()
+ self.connection.connect("connection-event", on_connection_change, Dialpad.__app_magic__)
+ self.connection.request_connection(conic.CONNECT_FLAG_NONE)
if self.window:
self.window.connect("destroy", gtk.main_quit)
"on_digit_clicked" : self.on_digit_clicked,
"on_dial_clicked" : self.on_dial_clicked,
"on_loginbutton_clicked" : self.on_loginbutton_clicked,
+ "on_loginclose_clicked" : self.on_loginclose_clicked,
"on_clearcookies_clicked" : self.on_clearcookies_clicked,
- # "on_callbackentry_changed" : self.on_callbackentry_changed,
"on_notebook_switch_page" : self.on_notebook_switch_page,
"on_recentview_row_activated" : self.on_recentview_row_activated,
- "on_back_clicked" : self.Backspace
+ "on_back_clicked" : self.on_backspace
}
self.wTree.signal_autoconnect(callbackMapping)
self.wTree.get_widget("callbackcombo").get_child().connect("changed", self.on_callbackentry_changed)
self.gcd = GCDialer()
self.attemptLogin(2)
- gobject.idle_add(self.init_grandcentral)
- #self.init_grandcentral()
- gobject.idle_add(self.init_recentview)
-
- #self.reduce_memory()
+ gobject.idle_add(self._init_grandcentral)
+ gobject.idle_add(self._init_recent_view)
- def init_grandcentral(self):
+ def _init_grandcentral(self):
""" deferred initalization of the grandcentral info """
try:
- #self.attemptLogin(2)
if self.gcd.isAuthed():
if self.gcd.getCallbackNumber() is None:
self.gcd.setSaneCallback()
print "exit init_gc"
return False
- def init_recentview(self):
+ def _init_recent_view(self):
""" deferred initalization of the recent view treeview """
recentview = self.wTree.get_widget("recentview")
return False
- def on_recentview_row_activated(self, treeview, path, view_column):
- model, itr = self.recentviewselection.get_selected()
- if not itr:
- return
-
- self.setNumber(self.recentmodel.get_value(itr, 0))
- self.notebook.set_current_page(0)
- self.recentviewselection.unselect_all()
-
- def on_notebook_switch_page(self, notebook, page, page_num):
- if page_num == 1 and (time.time() - self.recenttime) > 300:
- gobject.idle_add(self.populate_recentview)
- elif page_num ==2 and self.callbackNeedsSetup:
- gobject.idle_add(self.setupCallbackCombo)
- if hildon:
- try:
- self.window.set_title(self.notebook.get_tab_label(self.notebook.get_nth_page(page_num)).get_text())
- except:
- self.window.set_title("")
-
- def populate_recentview(self):
- print "Populating"
- self.recentmodel.clear()
- for item in self.gcd.get_recent():
- self.recentmodel.append(item)
- self.recenttime = time.time()
-
- return False
-
- def on_clearcookies_clicked(self, data=None):
- self.gcd.reset()
- self.callbackNeedsSetup = True
- self.recenttime = 0.0
- self.recentmodel.clear()
- self.wTree.get_widget("callbackcombo").get_child().set_text("")
-
- # re-run the inital grandcentral setup
- self.attemptLogin(2)
- gobject.idle_add(self.init_grandcentral)
-
- def setupCallbackCombo(self):
+ def _setupCallbackCombo(self):
combobox = self.wTree.get_widget("callbackcombo")
self.callbacklist = gtk.ListStore(gobject.TYPE_STRING)
combobox.set_model(self.callbacklist)
self.wTree.get_widget("callbackcombo").get_child().set_text(makepretty(self.gcd.getCallbackNumber()))
self.callbackNeedsSetup = False
- def on_callbackentry_changed(self, data=None):
- text = makeugly(self.wTree.get_widget("callbackcombo").get_child().get_text())
- if self.gcd.validate(text) and text != self.gcd.getCallbackNumber():
- self.gcd.setCallbackNumber(text)
- #self.wTree.get_widget("callbackentry").set_text(self.wTree.get_object("callbackentry").get_text())
- #self.reduce_memory()
+ def populate_recentview(self):
+ print "Populating"
+ self.recentmodel.clear()
+ for item in self.gcd.get_recent():
+ self.recentmodel.append(item)
+ self.recenttime = time.time()
+
+ return False
def attemptLogin(self, times = 1):
- #if self.isHildon:
- # dialog = hildon.LoginDialog(self.window)
- # dialog.set_message("Grandcentral Login")
- #else:
dialog = self.wTree.get_widget("login_dialog")
while (0 < times) and not self.gcd.isAuthed():
times = 0
continue
- #if self.isHildon:
- # username = dialog.get_username()
- # password = dialog.get_password()
- #else:
username = self.wTree.get_widget("usernameentry").get_text()
password = self.wTree.get_widget("passwordentry").get_text()
self.wTree.get_widget("passwordentry").set_text("")
dialog.hide()
times = times - 1
- #if self.isHildon:
- # print "destroy dialog"
- # dialog.destroy()
-
return False
def ErrPopUp(self, msg):
editor.about_dialog = None
dialog.destroy()
error_dialog.connect("response", close, self)
- self.error_dialog = error_dialog
error_dialog.run()
- def on_paste(self, data=None):
- contents = self.clipboard.wait_for_text()
- phoneNumber = re.sub('\D', '', contents)
- self.setNumber(phoneNumber)
-
+ def setNumber(self, number):
+ self.phonenumber = makeugly(number)
+ self.prettynumber = makepretty(self.phonenumber)
+ self.numberdisplay.set_label("<span size='30000' weight='bold'>%s</span>" % ( self.prettynumber ) )
+
+ def setAccountNumber(self):
+ accountnumber = self.gcd.getAccountNumber()
+ self.wTree.get_widget("gcnumberlabel").set_label("<span size='23000' weight='bold'>%s</span>" % (accountnumber))
+
+ 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.
+ For system_inactivity, we have no background tasks to pause
+
+ @note Hildon specific
+ """
+ if memory_low:
+ self.gcd.clear_caches()
+ re.purge()
+ gc.collect()
+
+ def on_connection_change(self, connection, event, magicIdentifier):
+ """
+ @note Hildon specific
+ """
+ status = event.get_status()
+ error = event.get_error()
+ iap_id = event.get_iap_id()
+ bearer = event.get_bearer_type()
+
+ if status == conic.STATUS_CONNECTED:
+ self.window.set_sensitive(True)
+ elif status == conic.STATUS_DISCONNECTED:
+ self.window.set_sensitive(False)
+
def on_loginbutton_clicked(self, data=None):
self.wTree.get_widget("login_dialog").response(gtk.RESPONSE_OK)
+ def on_loginclose_clicked(self, data=None):
+ sys.exit(0)
+
+ def on_clearcookies_clicked(self, data=None):
+ self.gcd.reset()
+ self.callbackNeedsSetup = True
+ self.recenttime = 0.0
+ self.recentmodel.clear()
+ self.wTree.get_widget("callbackcombo").get_child().set_text("")
+
+ # re-run the inital grandcentral setup
+ self.attemptLogin(2)
+ gobject.idle_add(self._init_grandcentral)
+
+ def on_callbackentry_changed(self, data=None):
+ text = makeugly(self.wTree.get_widget("callbackcombo").get_child().get_text())
+ if self.gcd.validate(text) and text != self.gcd.getCallbackNumber():
+ self.gcd.setCallbackNumber(text)
+
+ def on_recentview_row_activated(self, treeview, path, view_column):
+ model, itr = self.recentviewselection.get_selected()
+ if not itr:
+ return
+
+ self.setNumber(self.recentmodel.get_value(itr, 0))
+ self.notebook.set_current_page(0)
+ self.recentviewselection.unselect_all()
+
+ def on_notebook_switch_page(self, notebook, page, page_num):
+ if page_num == 1 and (time.time() - self.recenttime) > 300:
+ gobject.idle_add(self.populate_recentview)
+ elif page_num ==2 and self.callbackNeedsSetup:
+ gobject.idle_add(self._setupCallbackCombo)
+ if hildon:
+ try:
+ self.window.set_title(self.notebook.get_tab_label(self.notebook.get_nth_page(page_num)).get_text())
+ except:
+ self.window.set_title("")
+
def on_dial_clicked(self, widget):
self.attemptLogin(3)
self.ErrPopUp("Backend link with grandcentral is not working, please try again")
return
- #if len(self.phonenumber) == 7:
- # #add default area code
- # self.phonenumber = self.areacode + self.phonenumber
-
try:
callSuccess = self.gcd.dial(self.phonenumber)
except ValueError, e:
self.recentmodel.clear()
self.recenttime = 0.0
- #self.reduce_memory()
- def on_device_state_change(self, shutdown, save_unsaved_data, memory_low, system_inactivity, message, userData):
- """
- @todo Might be useful to do something when going in offline mode or low memory
- @note Hildon specific
- """
- pass
-
- def setNumber(self, number):
- self.phonenumber = makeugly(number)
- self.prettynumber = makepretty(self.phonenumber)
- self.numberdisplay.set_label("<span size='30000' weight='bold'>%s</span>" % ( self.prettynumber ) )
-
- def setAccountNumber(self):
- accountnumber = self.gcd.getAccountNumber()
- self.wTree.get_widget("gcnumberlabel").set_label("<span size='23000' weight='bold'>%s</span>" % (accountnumber))
-
- def Backspace(self, widget):
- self.setNumber(self.phonenumber[:-1])
-
+ def on_paste(self, data=None):
+ contents = self.clipboard.wait_for_text()
+ phoneNumber = re.sub('\D', '', contents)
+ self.setNumber(phoneNumber)
+
def on_digit_clicked(self, widget):
self.setNumber(self.phonenumber + widget.get_name()[5])
+ def on_backspace(self, widget):
+ self.setNumber(self.phonenumber[:-1])
+
def run_doctest():
failureCount, testCount = doctest.testmod()
def run_dialpad():
- #gc.set_threshold(50, 3, 3)
gtk.gdk.threads_init()
title = 'Dialpad'
handle = Dialpad()
gtk.main()
- sys.exit(1)
+ sys.exit(0)
class DummyOptions(object):