Bumping to 1.0.10-7
[gc-dialer] / src / dc_glade.py
index 541c0cf..28fec31 100755 (executable)
@@ -82,6 +82,7 @@ class Dialcentral(object):
                self._initDone = False
                self._connection = None
                self._osso = None
+               self._deviceState = None
                self._clipboard = gtk.clipboard_get()
 
                self._credentials = ("", "")
@@ -91,7 +92,7 @@ class Dialcentral(object):
                self._dialpads = None
                self._accountViews = None
                self._messagesViews = None
-               self._recentViews = None
+               self._historyViews = None
                self._contactsViews = None
                self._alarmHandler = None
                self._ledHandler = None
@@ -118,7 +119,7 @@ class Dialcentral(object):
                hildonize.hildonize_password_entry(self._widgetTree.get_widget("passwordentry"))
 
                for scrollingWidgetName in (
-                       'recent_scrolledwindow',
+                       'history_scrolledwindow',
                        'message_scrolledwindow',
                        'contacts_scrolledwindow',
                        "smsMessages_scrolledwindow",
@@ -148,12 +149,20 @@ class Dialcentral(object):
                        assert button is not None, buttonName
                        hildonize.set_button_thumb_selectable(button)
 
-               replacementButtons = [gtk.Button("Test")]
                menu = hildonize.hildonize_menu(
                        self._window,
                        self._widgetTree.get_widget("dialpad_menubar"),
-                       replacementButtons
                )
+               if not hildonize.GTK_MENU_USED:
+                       button = gtk.Button("New Login")
+                       button.connect("clicked", self._on_clearcookies_clicked)
+                       menu.append(button)
+
+                       button= gtk.Button("Refresh")
+                       button.connect("clicked", self._on_menu_refresh)
+                       menu.append(button)
+
+                       menu.show_all()
 
                self._window.connect("key-press-event", self._on_key_press)
                self._window.connect("window-state-event", self._on_window_state_change)
@@ -164,7 +173,7 @@ class Dialcentral(object):
 
                self._window.connect("destroy", self._on_close)
                self._window.set_default_size(800, 300)
-               self._window.show()
+               self._window.show_all()
 
                self._loginSink = gtk_toolbox.threaded_stage(
                        gtk_toolbox.comap(
@@ -186,20 +195,20 @@ class Dialcentral(object):
                """
                # Barebones UI handlers
                try:
-                       import null_backend
+                       from backends import null_backend
                        import null_views
 
                        self._phoneBackends = {self.NULL_BACKEND: null_backend.NullDialer()}
                        with gtk_toolbox.gtk_lock():
                                self._dialpads = {self.NULL_BACKEND: null_views.Dialpad(self._widgetTree)}
                                self._accountViews = {self.NULL_BACKEND: null_views.AccountInfo(self._widgetTree)}
-                               self._recentViews = {self.NULL_BACKEND: null_views.RecentCallsView(self._widgetTree)}
+                               self._historyViews = {self.NULL_BACKEND: null_views.CallHistoryView(self._widgetTree)}
                                self._messagesViews = {self.NULL_BACKEND: null_views.MessagesView(self._widgetTree)}
                                self._contactsViews = {self.NULL_BACKEND: null_views.ContactsView(self._widgetTree)}
 
                                self._dialpads[self._selectedBackendId].enable()
                                self._accountViews[self._selectedBackendId].enable()
-                               self._recentViews[self._selectedBackendId].enable()
+                               self._historyViews[self._selectedBackendId].enable()
                                self._messagesViews[self._selectedBackendId].enable()
                                self._contactsViews[self._selectedBackendId].enable()
                except Exception, e:
@@ -213,10 +222,11 @@ class Dialcentral(object):
                        except (ImportError, OSError):
                                osso = None
                        self._osso = None
+                       self._deviceState = None
                        if osso is not None:
                                self._osso = osso.Context(constants.__app_name__, constants.__version__, False)
-                               device = osso.DeviceState(self._osso)
-                               device.set_device_state_callback(self._on_device_state_change, 0)
+                               self._deviceState = osso.DeviceState(self._osso)
+                               self._deviceState.set_device_state_callback(self._on_device_state_change, 0)
                        else:
                                _moduleLogger.warning("No device state support")
 
@@ -261,9 +271,10 @@ class Dialcentral(object):
 
                # Setup costly backends
                try:
-                       import gv_backend
-                       import file_backend
+                       from backends import gv_backend
+                       from backends import file_backend
                        import gv_views
+                       from backends import merge_backend
 
                        try:
                                os.makedirs(constants._data_path_)
@@ -286,8 +297,8 @@ class Dialcentral(object):
                                        ),
                                })
                                self._accountViews[self.GV_BACKEND].save_everything = self._save_settings
-                               self._recentViews.update({
-                                       self.GV_BACKEND: gv_views.RecentCallsView(
+                               self._historyViews.update({
+                                       self.GV_BACKEND: gv_views.CallHistoryView(
                                                self._widgetTree, self._phoneBackends[self.GV_BACKEND], self._errorDisplay
                                        ),
                                })
@@ -306,7 +317,7 @@ class Dialcentral(object):
                        fileBackend = file_backend.FilesystemAddressBookFactory(fsContactsPath)
 
                        self._dialpads[self.GV_BACKEND].number_selected = self._select_action
-                       self._recentViews[self.GV_BACKEND].number_selected = self._select_action
+                       self._historyViews[self.GV_BACKEND].number_selected = self._select_action
                        self._messagesViews[self.GV_BACKEND].number_selected = self._select_action
                        self._contactsViews[self.GV_BACKEND].number_selected = self._select_action
 
@@ -314,7 +325,7 @@ class Dialcentral(object):
                                self._phoneBackends[self.GV_BACKEND],
                                fileBackend,
                        ]
-                       mergedBook = gv_views.MergedAddressBook(addressBooks, gv_views.MergedAddressBook.advanced_lastname_sorter)
+                       mergedBook = merge_backend.MergedAddressBook(addressBooks, merge_backend.MergedAddressBook.advanced_lastname_sorter)
                        self._contactsViews[self.GV_BACKEND].append(mergedBook)
                        self._contactsViews[self.GV_BACKEND].extend(addressBooks)
                        self._contactsViews[self.GV_BACKEND].open_addressbook(*self._contactsViews[self.GV_BACKEND].get_addressbooks().next()[0][0:2])
@@ -342,8 +353,6 @@ class Dialcentral(object):
                        self._notebookTapHandler.on_holding = self._set_tab_refresh
                        self._notebookTapHandler.on_cancel = self._reset_tab_refresh
 
-                       self._initDone = True
-
                        config = ConfigParser.SafeConfigParser()
                        config.read(constants._user_settings_)
                        with gtk_toolbox.gtk_lock():
@@ -352,6 +361,7 @@ class Dialcentral(object):
                        with gtk_toolbox.gtk_lock():
                                self._errorDisplay.push_exception()
                finally:
+                       self._initDone = True
                        self._spawn_attempt_login()
 
        def _spawn_attempt_login(self, *args):
@@ -388,6 +398,10 @@ class Dialcentral(object):
                                        hildonize.show_information_banner(self._window, "Logged In")
                                else:
                                        hildonize.show_information_banner(self._window, "Login Failed")
+                               if not self._phoneBackends[self._defaultBackendId].get_callback_number():
+                                       # subtle reminder to the users to configure things
+                                       self._notebook.set_current_page(self.ACCOUNT_TAB)
+
                except Exception, e:
                        with gtk_toolbox.gtk_lock():
                                self._errorDisplay.push_exception()
@@ -411,15 +425,29 @@ class Dialcentral(object):
                """
                @note Thread agnostic
                """
-               loggedIn = self._phoneBackends[self._defaultBackendId].is_authed()
+               loggedIn = False
+
+               isQuickLoginPossible = self._phoneBackends[self._defaultBackendId].is_quick_login_possible()
+               if self._credentials != ("", "") and isQuickLoginPossible:
+                       if not loggedIn:
+                               loggedIn = self._phoneBackends[self._defaultBackendId].is_authed()
+
                if loggedIn:
                        _moduleLogger.info("Logged into %r through cookies" % self._phoneBackends[self._defaultBackendId])
+               else:
+                       # If the cookies are bad, scratch them completely
+                       self._phoneBackends[self._defaultBackendId].logout()
+
                return loggedIn
 
        def _login_by_settings(self):
                """
                @note Thread agnostic
                """
+               if self._credentials == ("", ""):
+                       # Don't bother with the settings if they are blank
+                       return False
+
                username, password = self._credentials
                loggedIn = self._phoneBackends[self._defaultBackendId].login(username, password)
                if loggedIn:
@@ -438,10 +466,6 @@ class Dialcentral(object):
                                credentials = self._credentialsDialog.request_credentials(
                                        defaultCredentials = self._credentials
                                )
-                               if not self._phoneBackends[tmpServiceId].get_callback_number():
-                                       # subtle reminder to the users to configure things
-                                       self._notebook.set_current_page(self.ACCOUNT_TAB)
-
                                banner = hildonize.show_busy_banner_start(self._window, "Logging In...")
                        try:
                                username, password = credentials
@@ -477,19 +501,16 @@ class Dialcentral(object):
 
                self._dialpads[oldStatus].disable()
                self._accountViews[oldStatus].disable()
-               self._recentViews[oldStatus].disable()
+               self._historyViews[oldStatus].disable()
                self._messagesViews[oldStatus].disable()
                self._contactsViews[oldStatus].disable()
 
                self._dialpads[newStatus].enable()
                self._accountViews[newStatus].enable()
-               self._recentViews[newStatus].enable()
+               self._historyViews[newStatus].enable()
                self._messagesViews[newStatus].enable()
                self._contactsViews[newStatus].enable()
 
-               if self._phoneBackends[self._selectedBackendId].get_callback_number() is None:
-                       self._phoneBackends[self._selectedBackendId].set_sane_callback()
-
                self._selectedBackendId = newStatus
 
                self._accountViews[self._selectedBackendId].update()
@@ -516,6 +537,10 @@ class Dialcentral(object):
 
                        if self._alarmHandler is not None:
                                self._alarmHandler.load_settings(config, "alarm")
+
+                       isFullscreen = config.getboolean(constants.__pretty_app_name__, "fullscreen")
+                       if isFullscreen:
+                               self._window.fullscreen()
                except ConfigParser.NoOptionError, e:
                        _moduleLogger.exception(
                                "Settings file %s is missing section %s" % (
@@ -535,7 +560,7 @@ class Dialcentral(object):
                        self._dialpads.iteritems(),
                        self._accountViews.iteritems(),
                        self._messagesViews.iteritems(),
-                       self._recentViews.iteritems(),
+                       self._historyViews.iteritems(),
                        self._contactsViews.iteritems(),
                ):
                        sectionName = "%s - %s" % (backendId, view.name())
@@ -591,6 +616,7 @@ class Dialcentral(object):
                config.add_section(constants.__pretty_app_name__)
                config.set(constants.__pretty_app_name__, "active", str(backend))
                config.set(constants.__pretty_app_name__, "orientation", str(int(gtk_toolbox.get_screen_orientation())))
+               config.set(constants.__pretty_app_name__, "fullscreen", str(self._isFullScreen))
                for i, value in enumerate(self._credentials):
                        blob = base64.b64encode(value)
                        config.set(constants.__pretty_app_name__, "bin_blob_%i" % i, blob)
@@ -602,7 +628,7 @@ class Dialcentral(object):
                        self._dialpads.iteritems(),
                        self._accountViews.iteritems(),
                        self._messagesViews.iteritems(),
-                       self._recentViews.iteritems(),
+                       self._historyViews.iteritems(),
                        self._contactsViews.iteritems(),
                ):
                        sectionName = "%s - %s" % (backendId, view.name())
@@ -623,7 +649,7 @@ class Dialcentral(object):
                if pageIndex == self.CONTACTS_TAB:
                        self._contactsViews[self._selectedBackendId].update(force=True)
                elif pageIndex == self.RECENT_TAB:
-                       self._recentViews[self._selectedBackendId].update(force=True)
+                       self._historyViews[self._selectedBackendId].update(force=True)
                elif pageIndex == self.MESSAGES_TAB:
                        self._messagesViews[self._selectedBackendId].update(force=True)
 
@@ -631,13 +657,20 @@ class Dialcentral(object):
                        if self._ledHandler is not None:
                                self._ledHandler.off()
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_close(self, *args, **kwds):
                try:
-                       if self._osso is not None:
-                               self._osso.close()
-
                        if self._initDone:
                                self._save_settings()
+
+                       try:
+                               self._deviceState.close()
+                       except AttributeError:
+                               pass # Either None or close was removed (in Fremantle)
+                       try:
+                               self._osso.close()
+                       except AttributeError:
+                               pass # Either None or close was removed (in Fremantle)
                finally:
                        gtk.main_quit()
 
@@ -708,6 +741,18 @@ class Dialcentral(object):
                                        self._window.unfullscreen()
                                else:
                                        self._window.fullscreen()
+                       elif event.keyval == gtk.keysyms.l and event.get_state() & gtk.gdk.CONTROL_MASK:
+                               with open(constants._user_logpath_, "r") as f:
+                                       logLines = f.xreadlines()
+                                       log = "".join(logLines)
+                                       self._clipboard.set_text(str(log))
+                       elif (
+                               event.keyval in (gtk.keysyms.w, gtk.keysyms.q) and
+                               event.get_state() & gtk.gdk.CONTROL_MASK
+                       ):
+                               self._window.destroy()
+                       elif event.keyval == gtk.keysyms.r and event.get_state() & gtk.gdk.CONTROL_MASK:
+                               self._refresh_active_tab()
                except Exception, e:
                        self._errorDisplay.push_exception()
 
@@ -715,7 +760,7 @@ class Dialcentral(object):
                try:
                        self._phoneBackends[self._selectedBackendId].logout()
                        self._accountViews[self._selectedBackendId].clear()
-                       self._recentViews[self._selectedBackendId].clear()
+                       self._historyViews[self._selectedBackendId].clear()
                        self._messagesViews[self._selectedBackendId].clear()
                        self._contactsViews[self._selectedBackendId].clear()
                        self._change_loggedin_status(self.NULL_BACKEND)
@@ -732,7 +777,7 @@ class Dialcentral(object):
                        didMessagesUpdate = False
 
                        if pageIndex == self.RECENT_TAB:
-                               didRecentUpdate = self._recentViews[self._selectedBackendId].update()
+                               didRecentUpdate = self._historyViews[self._selectedBackendId].update()
                        elif pageIndex == self.MESSAGES_TAB:
                                didMessagesUpdate = self._messagesViews[self._selectedBackendId].update()
                        elif pageIndex == self.CONTACTS_TAB:
@@ -793,6 +838,7 @@ class Dialcentral(object):
                        try:
                                self._phoneBackends[self._selectedBackendId].send_sms(number, message)
                                hildonize.show_information_banner(self._window, "Sending to %s" % number)
+                               _moduleLogger.info("Sending SMS to %s" % number)
                                dialed = True
                        except Exception, e:
                                self._errorDisplay.push_exception()
@@ -821,8 +867,9 @@ class Dialcentral(object):
                        dialed = False
                        try:
                                assert self._phoneBackends[self._selectedBackendId].get_callback_number() != "", "No callback number specified"
-                               self._phoneBackends[self._selectedBackendId].dial(number)
+                               self._phoneBackends[self._selectedBackendId].call(number)
                                hildonize.show_information_banner(self._window, "Calling %s" % number)
+                               _moduleLogger.info("Calling %s" % number)
                                dialed = True
                        except Exception, e:
                                self._errorDisplay.push_exception()
@@ -854,7 +901,7 @@ class Dialcentral(object):
                        dlg.set_copyright("Copyright 2008 - LGPL")
                        dlg.set_comments("Dialcentral is a touch screen enhanced interface to your GoogleVoice account.  This application is not affiliated with Google in any way")
                        dlg.set_website("http://gc-dialer.garage.maemo.org/")
-                       dlg.set_authors(["<z2n@merctech.com>", "Eric Warnke <ericew@gmail.com>", "Ed Page <edpage@byu.net>"])
+                       dlg.set_authors(["<z2n@merctech.com>", "Eric Warnke <ericew@gmail.com>", "Ed Page <eopage@byu.net>"])
                        dlg.run()
                        dlg.destroy()
                except Exception, e: