Moving more calls to deferred operation
[gc-dialer] / gc_dialer / gc_dialer.py
index 37cf6cd..b42f2c1 100755 (executable)
@@ -103,9 +103,12 @@ class Dialpad(object):
                self.phonenumber = ""
                self.prettynumber = ""
                self.areacode = "518"
-               self.gcd = GCDialer()
                self.clipboard = gtk.clipboard_get()
                self.wTree = gtk.Builder()
+               self.recentmodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
+               self.recentviewselection = None
+               self.callbackNeedsSetup = True
+               self.recenttime = 0.0
 
                for path in [ './gc_dialer.xml',
                                '../lib/gc_dialer.xml',
@@ -115,32 +118,25 @@ class Dialpad(object):
                                break
                else:
                        self.ErrPopUp("Cannot find gc_dialer.xml")
-                       sys.exit(1)#@todo Is this the best way to force a quit on error?
+                       gtk.main_quit()
+                       return
+
 
-               self.window = self.wTree.get_object("Dialpad")
                #Get the buffer associated with the number display
                self.numberdisplay = self.wTree.get_object("numberdisplay")
                self.setNumber("")
-
-               self.recentview = self.wTree.get_object("recentview")
-               self.recentmodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
-               self.recentview.set_model(self.recentmodel)
-               textrenderer = gtk.CellRendererText()
-
-               # Add the column to the treeview
-               column = gtk.TreeViewColumn("Calls", textrenderer, text=1)
-               column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
-               self.recentview.append_column(column)
-
-               self.recentviewselection = self.recentview.get_selection()
-               self.recentviewselection.set_mode(gtk.SELECTION_SINGLE)
-               self.recenttime = 0.0
-
                self.notebook = self.wTree.get_object("notebook")
 
                self.isHildon = False
+
+               self.window = self.wTree.get_object("Dialpad")
                #if True:
                try:
+                       #self.osso = osso.Context("gc_dialer", "0.6.0", False)
+                       #device = osso.DeviceState(self.osso)
+                       #device.set_device_state_callback(self.on_device_state_change, None)
+                       #abook.init_with_name("gc_dialer", self.osso)
+                       #self.ebook = evo.open_addressbook("default")
                        self.app = hildon.Program()
                        self.wTree.get_object("callbackentry").set_property('hildon-input-mode', 1|(1 << 4))
                        self.isHildon = True
@@ -164,18 +160,48 @@ class Dialpad(object):
                }
                self.wTree.connect_signals(callbackMapping)
 
-               self.attemptLogin(3)
-               if self.gcd.getCallbackNumber() is None:
-                       self.gcd.setSaneCallback()
+               # Defer initalization of recent view
+               self.gcd = GCDialer()
 
-               self.setAccountNumber()
-               self.setupCallbackCombo()
-               self.reduce_memory()
+               gobject.idle_add(self.init_grandcentral)
+               gobject.idle_add(self.init_recentview)
 
-       def reduce_memory(self):
-               re.purge()
-               num = gc.collect()
-               #print "collect %d objects" % ( num )
+               #self.reduce_memory()
+
+       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()
+                               self.setAccountNumber()
+               except:
+                       self.setAccountNumber()
+
+               return False
+
+       def init_recentview(self):
+               """ deferred initalization of the recent view treeview """
+
+               recentview = self.wTree.get_object("recentview")
+               recentview.set_model(self.recentmodel)
+               textrenderer = gtk.CellRendererText()
+
+               # Add the column to the treeview
+               column = gtk.TreeViewColumn("Calls", textrenderer, text=1)
+               column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+
+               recentview.append_column(column)
+
+               self.recentviewselection = recentview.get_selection()
+               self.recentviewselection.set_mode(gtk.SELECTION_SINGLE)
+
+               return False
+
+#              re.purge()
+#              #print "collect %d objects" % ( num )
 
        def on_recentview_row_activated(self, treeview, path, view_column):
                model, itr = self.recentviewselection.get_selected()
@@ -188,7 +214,9 @@ class Dialpad(object):
 
        def on_notebook_switch_page(self, notebook, page, page_num):
                if page_num == 1 and (time.time() - self.recenttime) > 300:
-                       self.populate_recentview()
+                       gobject.idle_add(self.populate_recentview)
+               elif page_num ==2 and self.callbackNeedsSetup:
+                       gobject.idle_add(self.setupCallbackCombo)
 
        def populate_recentview(self):
                print "Populating"
@@ -197,9 +225,15 @@ class Dialpad(object):
                        self.recentmodel.append(item)
                self.recenttime = time.time()
 
+               return False
+
        def on_clearcookies_clicked(self, data=None):
                self.gcd.reset()
-               self.attemptLogin(3)
+               self.callbackNeedsSetup = True
+               self.recenttime = 0.0
+       
+               # re-run the inital grandcentral setup
+               gobject.idle_add(self.init_grandcentral)
 
        def setupCallbackCombo(self):
                combobox = self.wTree.get_object("callbackcombo")
@@ -210,13 +244,14 @@ class Dialpad(object):
                        self.callbacklist.append([makepretty(number)] )
 
                self.wTree.get_object("callbackentry").set_text(makepretty(self.gcd.getCallbackNumber()))
+               self.callbackNeedsSetup = False
 
        def on_callbackentry_changed(self, data=None):
                text = makeugly(self.wTree.get_object("callbackentry").get_text())
                if self.gcd.validate(text) and text != self.gcd.getCallbackNumber():
                        self.gcd.setCallbackNumber(text)
                        self.wTree.get_object("callbackentry").set_text(self.wTree.get_object("callbackentry").get_text())
-               self.reduce_memory()
+               #self.reduce_memory()
 
        def attemptLogin(self, times = 1):
                if self.isHildon:
@@ -245,6 +280,8 @@ class Dialpad(object):
                if self.isHildon:
                        dialog.destroy()
 
+               return False
+
        def ErrPopUp(self, msg):
                error_dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg)
 
@@ -281,7 +318,14 @@ class Dialpad(object):
 
                self.recentmodel.clear()
                self.recenttime = 0.0
-               self.reduce_memory()
+               #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)