Removing a warning on startup
[gc-dialer] / src / gc_dialer.py
index 07ec3cc..e4d5ced 100755 (executable)
@@ -150,6 +150,9 @@ def make_idler(func):
 
 
 class DummyAddressBook(object):
+       """
+       Minimal example of both an addressbook factory and an addressbook
+       """
 
        def get_addressbooks(self):
                """
@@ -160,89 +163,29 @@ class DummyAddressBook(object):
        def open_addressbook(self, bookId):
                return self
 
-       def factory_name(self):
+       @staticmethod
+       def factory_short_name():
                return ""
 
-       def get_contacts(self):
+       @staticmethod
+       def factory_name():
+               return ""
+
+       @staticmethod
+       def get_contacts():
                """
                @returns Iterable of (contact id, contact name)
                """
                return []
 
-       def get_contact_details(self, contactId):
+       @staticmethod
+       def get_contact_details(contactId):
                """
                @returns Iterable of (Phone Type, Phone Number)
                """
                return []
 
 
-class SettingsDialog(object):
-
-       def __init__(self, widgetTree, gcDialer):
-               self._gcDialer = gcDialer
-               self._widgetTree = widgetTree
-               self._dialog = self._widgetTree.get_widget("settings_dialog")
-
-               self._applyButton = self._widgetTree.get_widget("apply_settings")
-               self._applyButton.connect("clicked", self.custom_button_response(gtk.RESPONSE_OK))
-
-               self._cancelButton = self._widgetTree.get_widget("cancel_settings")
-               self._cancelButton.connect("clicked", self.custom_button_response(gtk.RESPONSE_CANCEL))
-
-               self._booksList = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
-               for (factoryId, bookId), (factoryName, bookName) in self._gcDialer.get_addressbooks():
-                       row = (str(factoryId), bookId, factoryName, bookName)
-                       self._booksList.append(row)
-
-               self._booksView = self._widgetTree.get_widget("books_view")
-               self._booksView.set_model(self._booksList)
-
-               # Add the column to the treeview
-               column = gtk.TreeViewColumn("Addressbook")
-
-               textrenderer = gtk.CellRendererText()
-               column.pack_start(textrenderer, expand=False)
-               column.add_attribute(textrenderer, 'text', 2)
-
-               textrenderer = gtk.CellRendererText()
-               column.pack_start(textrenderer, expand=True)
-               column.add_attribute(textrenderer, 'text', 3)
-
-               column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
-               column.set_sort_column_id(2)
-               column.set_visible(True)
-               self._booksView.append_column(column)
-
-               self._booksViewSelection = self._booksView.get_selection()
-               self._booksViewSelection.set_mode(gtk.SELECTION_SINGLE)
-               self.reset()
-       
-       def reset(self):
-               pass
-       
-       def custom_button_response(self, response):
-
-               def button_handler(*args, **kwds):
-                       self._dialog.response(response)
-
-               return button_handler
-
-       def run(self):
-               userResponse = self._dialog.run()
-
-               if userResponse == gtk.RESPONSE_OK:
-                       model, itr = self._booksViewSelection.get_selected()
-                       if itr:
-                               factoryId = int(self._booksList.get_value(itr, 0))
-                               bookId = self._booksList.get_value(itr, 1)
-                               self._gcDialer.open_addressbook(factoryId, bookId)
-                               self._booksViewSelection.unselect_all()
-               else:
-                       self.reset()
-
-               self._dialog.hide()
-
-
 class PhoneTypeSelector(object):
 
        def __init__(self, widgetTree, gcBackend):
@@ -320,35 +263,15 @@ class Dialpad(object):
                self._clipboard = gtk.clipboard_get()
 
                self._deviceIsOnline = True
-               self.callbacklist = None
+               self._callbackList = None
                self._callbackNeedsSetup = True
 
                self._recenttime = 0.0
                self._recentmodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
                self._recentviewselection = None
 
-               self._gcContactText = "GC"
-               try:
-                       self._gcContactIcon = gtk.gdk.pixbuf_new_from_file_at_size('gc_contact.png', 16, 16)
-               except gobject.GError:
-                       self._gcContactIcon = None
                self._contactstime = 0.0
-               if self._gcContactIcon is not None:
-                       self._contactsmodel = gtk.ListStore(
-                               gtk.gdk.Pixbuf,
-                               gobject.TYPE_STRING,
-                               gobject.TYPE_STRING,
-                               gobject.TYPE_STRING,
-                               gobject.TYPE_STRING
-                       )
-               else:
-                       self._contactsmodel = gtk.ListStore(
-                               gobject.TYPE_STRING,
-                               gobject.TYPE_STRING,
-                               gobject.TYPE_STRING,
-                               gobject.TYPE_STRING,
-                               gobject.TYPE_STRING
-                       )
+               self._contactsmodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
                self._contactsviewselection = None
 
                for path in Dialpad._glade_files:
@@ -383,7 +306,7 @@ class Dialpad(object):
                        self._widgetTree.get_widget("usernameentry").set_property('hildon-input-mode', 7)
                        self._widgetTree.get_widget("passwordentry").set_property('hildon-input-mode', 7|(1 << 29))
 
-                       gtkMenu = self._widgetTree.get_widget("menubar1")
+                       gtkMenu = self._widgetTree.get_widget("dialpad_menubar")
                        menu = gtk.Menu()
                        for child in gtkMenu.get_children():
                                child.reparent(menu)
@@ -401,7 +324,6 @@ class Dialpad(object):
                        self._window.set_title("%s - Keypad" % self.__pretty_app_name__)
 
                self._osso = None
-               self._ebook = None
                if osso is not None:
                        self._osso = osso.Context(Dialpad.__app_name__, Dialpad.__version__, False)
                        device = osso.DeviceState(self._osso)
@@ -425,7 +347,6 @@ class Dialpad(object):
                        "on_dialpad_quit": self._on_close,
                        "on_paste": self._on_paste,
                        "on_clear_number": self._on_clear_number,
-                       "on_settings": self._on_settings,
 
                        "on_clearcookies_clicked": self._on_clearcookies_clicked,
                        "on_notebook_switch_page": self._on_notebook_switch_page,
@@ -438,6 +359,7 @@ class Dialpad(object):
                }
                self._widgetTree.signal_autoconnect(callbackMapping)
                self._widgetTree.get_widget("callbackcombo").get_child().connect("changed", self._on_callbackentry_changed)
+               self._widgetTree.get_widget("addressbook_combo").get_child().connect("changed", self._on_addressbook_entry_changed)
 
                if self._window:
                        self._window.connect("destroy", gtk.main_quit)
@@ -453,21 +375,34 @@ class Dialpad(object):
                self._addressBook = None
                self.open_addressbook(*self.get_addressbooks().next()[0][0:2])
 
+               self._booksList = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
+               for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks():
+                       if factoryName and bookName:
+                               entryName = "%s: %s" % (factoryName, bookName) 
+                       elif factoryName:
+                               entryName = factoryName
+                       elif bookName:
+                               entryName = bookName
+                       else:
+                               entryName = "Bad name (%d)" % factoryId
+                       row = (str(factoryId), bookId, entryName)
+                       self._booksList.append(row)
+
+               combobox = self._widgetTree.get_widget("addressbook_combo")
+               combobox.set_model(self._booksList)
+               combobox.set_text_column(2)
+               combobox.set_active(0)
+
                self._phoneTypeSelector = PhoneTypeSelector(self._widgetTree, self._gcBackend)
-               self._settingsDialog = SettingsDialog(self._widgetTree, self)
 
-               if not self._gcBackend.is_authed():
-                       self.attempt_login(2)
-               else:
+               self._init_recent_view()
+               self._init_contacts_view()
+               if self._gcBackend.is_authed():
                        self.set_account_number()
-               gobject.idle_add(self._idly_init_recent_view)
-               gobject.idle_add(self._idly_init_contacts_view)
-
-       def _idly_init_recent_view(self):
-               """
-               Deferred initalization of the recent view treeview
-               """
+               else:
+                       self.attempt_login(2)
 
+       def _init_recent_view(self):
                recentview = self._widgetTree.get_widget("recentview")
                recentview.set_model(self._recentmodel)
                textrenderer = gtk.CellRendererText()
@@ -483,25 +418,13 @@ class Dialpad(object):
 
                return False
 
-       def _idly_init_contacts_view(self):
-               """ deferred initalization of the contacts view treeview """
-
+       def _init_contacts_view(self):
                contactsview = self._widgetTree.get_widget("contactsview")
                contactsview.set_model(self._contactsmodel)
 
                # Add the column to the treeview
                column = gtk.TreeViewColumn("Contact")
 
-               if self._gcContactIcon is not None:
-                       iconrenderer = gtk.CellRendererPixbuf()
-                       column.pack_start(iconrenderer, expand=False)
-                       column.add_attribute(iconrenderer, 'pixbuf', 0)
-               else:
-                       warnings.warn("Contact icon unavailable", UserWarning, 1)
-                       textrenderer = gtk.CellRendererText()
-                       column.pack_start(textrenderer, expand=False)
-                       column.add_attribute(textrenderer, 'text', 0)
-
                textrenderer = gtk.CellRendererText()
                column.pack_start(textrenderer, expand=True)
                column.add_attribute(textrenderer, 'text', 1)
@@ -534,13 +457,14 @@ class Dialpad(object):
 
                return False
 
-       def _idly_setup_callback_combo(self):
+       def _idly_populate_callback_combo(self):
+               self._callbackList = gtk.ListStore(gobject.TYPE_STRING)
+               for number, description in self._gcBackend.get_callback_numbers().iteritems():
+                       self._callbackList.append((make_pretty(number),))
+
                combobox = self._widgetTree.get_widget("callbackcombo")
-               self.callbacklist = gtk.ListStore(gobject.TYPE_STRING)
-               combobox.set_model(self.callbacklist)
+               combobox.set_model(self._callbackList)
                combobox.set_text_column(0)
-               for number, description in self._gcBackend.get_callback_numbers().iteritems():
-                       self.callbacklist.append([make_pretty(number)])
 
                combobox.get_child().set_text(make_pretty(self._gcBackend.get_callback_number()))
                self._callbackNeedsSetup = False
@@ -565,11 +489,7 @@ class Dialpad(object):
                contactsview.freeze_child_notify()
                contactsview.set_model(None)
 
-               # get gc icon
-               if self._gcContactIcon is not None:
-                       contactType = (self._gcContactIcon,)
-               else:
-                       contactType = (self._gcContactText,)
+               contactType = (self._addressBook.factory_short_name(),)
                for contactId, contactName in self._addressBook.get_contacts():
                        self._contactsmodel.append(contactType + (contactName, "", contactId) + ("",))
                        yield
@@ -585,8 +505,12 @@ class Dialpad(object):
                @note Assumes that you are already logged in
                """
                assert 0 < numOfAttempts, "That was pointless having 0 or less login attempts"
-               dialog = self._widgetTree.get_widget("login_dialog")
 
+               if not self._deviceIsOnline:
+                       warnings.warn("Attempted to login while device was offline", UserWarning, 2)
+                       return False
+
+               dialog = self._widgetTree.get_widget("login_dialog")
                for i in range(numOfAttempts):
                        dialog.run()
 
@@ -639,9 +563,10 @@ class Dialpad(object):
                Displays current account number
                """
                accountnumber = self._gcBackend.get_account_number()
-               self._widgetTree.get_widget("gcnumberlabel").set_label("<span size='23000' weight='bold'>%s</span>" % (accountnumber))
+               self._widgetTree.get_widget("gcnumber_display").set_label("<span size='23000' weight='bold'>%s</span>" % (accountnumber))
 
-       def _on_close(self, *args):
+       @staticmethod
+       def _on_close(*args, **kwds):
                gtk.main_quit()
 
        def _on_device_state_change(self, shutdown, save_unsaved_data, memory_low, system_inactivity, message, userData):
@@ -668,6 +593,8 @@ class Dialpad(object):
                if status == conic.STATUS_CONNECTED:
                        self._window.set_sensitive(True)
                        self._deviceIsOnline = True
+                       if not self._gcBackend.is_authed():
+                               self.attempt_login(2)
                elif status == conic.STATUS_DISCONNECTED:
                        self._window.set_sensitive(False)
                        self._deviceIsOnline = False
@@ -681,9 +608,6 @@ class Dialpad(object):
                else:
                        self._isFullScreen = False
        
-       def _on_settings(self, *args, **kwds):
-               self._settingsDialog.run()
-
        def _on_key_press(self, widget, event, *args):
                """
                @note Hildon specific
@@ -711,7 +635,7 @@ class Dialpad(object):
 
                # re-run the inital grandcentral setup
                self.attempt_login(2)
-               gobject.idle_add(self._idly_setup_callback_combo)
+               gobject.idle_add(self._idly_populate_callback_combo)
 
        def _on_callbackentry_changed(self, *args):
                """
@@ -720,10 +644,10 @@ class Dialpad(object):
                text = make_ugly(self._widgetTree.get_widget("callbackcombo").get_child().get_text())
                if not self._gcBackend.is_valid_syntax(text):
                        warnings.warn("%s is not a valid callback number" % text, UserWarning, 2)
-               elif text != self._gcBackend.get_callback_number():
-                       self._gcBackend.set_callback_number(text)
-               else:
+               elif text == self._gcBackend.get_callback_number():
                        warnings.warn("Callback number already is %s" % self._gcBackend.get_callback_number(), UserWarning, 2)
+               else:
+                       self._gcBackend.set_callback_number(text)
 
        def _on_recentview_row_activated(self, treeview, path, view_column):
                model, itr = self._recentviewselection.get_selected()
@@ -734,6 +658,14 @@ class Dialpad(object):
                self._notebook.set_current_page(0)
                self._recentviewselection.unselect_all()
 
+       def _on_addressbook_entry_changed(self, *args, **kwds):
+               combobox = self._widgetTree.get_widget("addressbook_combo")
+               itr = combobox.get_active_iter()
+
+               factoryId = int(self._booksList.get_value(itr, 0))
+               bookId = self._booksList.get_value(itr, 1)
+               self.open_addressbook(factoryId, bookId)
+
        def _on_contactsview_row_activated(self, treeview, path, view_column):
                model, itr = self._contactsviewselection.get_selected()
                if not itr:
@@ -762,7 +694,7 @@ class Dialpad(object):
                elif page_num == 2 and 300 < (time.time() - self._recenttime):
                        gobject.idle_add(self._idly_populate_recentview)
                elif page_num == 3 and self._callbackNeedsSetup:
-                       gobject.idle_add(self._idly_setup_callback_combo)
+                       gobject.idle_add(self._idly_populate_callback_combo)
 
                tabTitle = self._notebook.get_tab_label(self._notebook.get_nth_page(page_num)).get_text()
                if hildon is not None: