X-Git-Url: http://git.maemo.org/git/?p=gc-dialer;a=blobdiff_plain;f=src%2Fdc_glade.py;h=2c1563e1c2fe00667501420cc7a3fcf5f51a7a28;hp=edb2a5a3203b3507d46c9c9806788ce80c9cb257;hb=0320d6d2086ce89fe554d8f902531f5b00dbec94;hpb=773901ab6004ada2aac231635694b9ec5534e30c diff --git a/src/dc_glade.py b/src/dc_glade.py index edb2a5a..2c1563e 100755 --- a/src/dc_glade.py +++ b/src/dc_glade.py @@ -29,6 +29,7 @@ import threading import base64 import ConfigParser import itertools +import shutil import logging import gtk @@ -82,6 +83,7 @@ class Dialcentral(object): self._initDone = False self._connection = None self._osso = None + self._deviceState = None self._clipboard = gtk.clipboard_get() self._credentials = ("", "") @@ -91,11 +93,12 @@ 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 self._originalCurrentLabels = [] + self._fsContactsPath = os.path.join(constants._data_path_, "contacts") for path in self._glade_files: if os.path.isfile(path): @@ -118,7 +121,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 +151,24 @@ 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("Import Contacts") + button.connect("clicked", self._on_contact_import) + 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) @@ -193,13 +208,13 @@ class Dialcentral(object): 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 +228,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") @@ -287,8 +303,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 ), }) @@ -303,11 +319,10 @@ class Dialcentral(object): ), }) - fsContactsPath = os.path.join(constants._data_path_, "contacts") - fileBackend = file_backend.FilesystemAddressBookFactory(fsContactsPath) + fileBackend = file_backend.FilesystemAddressBookFactory(self._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 @@ -315,7 +330,7 @@ class Dialcentral(object): self._phoneBackends[self.GV_BACKEND], fileBackend, ] - mergedBook = merge_backend.MergedAddressBook(addressBooks, merge_backend.MergedAddressBook.advanced_lastname_sorter) + mergedBook = merge_backend.MergedAddressBook(addressBooks, merge_backend.MergedAddressBook.basic_firtname_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]) @@ -325,6 +340,7 @@ class Dialcentral(object): "on_refresh": self._on_menu_refresh, "on_clearcookies_clicked": self._on_clearcookies_clicked, "on_about_activate": self._on_about_activate, + "on_import": self._on_contact_import, } if hildonize.GTK_MENU_USED: self._widgetTree.signal_autoconnect(callbackMapping) @@ -416,12 +432,11 @@ class Dialcentral(object): @note Thread agnostic """ loggedIn = False - if self._credentials == ("", ""): - # Disallow logging in by cookie alone, without credentials - loggedIn = False - if not loggedIn: - loggedIn = self._phoneBackends[self._defaultBackendId].is_authed() + 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]) @@ -476,12 +491,14 @@ class Dialcentral(object): return loggedIn, serviceId - def _select_action(self, action, number, message): + def _select_action(self, action, numbers, message): self.refresh_session() if action == "dial": + assert len(numbers) == 1 + number = numbers[0] self._on_dial_clicked(number) elif action == "sms": - self._on_sms_clicked(number, message) + self._on_sms_clicked(numbers, message) else: assert False, "Unknown action: %s" % action @@ -492,13 +509,13 @@ 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() @@ -528,6 +545,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" % ( @@ -547,7 +568,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()) @@ -603,6 +624,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) @@ -614,7 +636,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()) @@ -635,7 +657,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) @@ -643,13 +665,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() @@ -720,6 +749,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() @@ -727,7 +768,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) @@ -744,7 +785,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: @@ -784,9 +825,9 @@ class Dialcentral(object): self._errorDisplay.push_exception() return False - def _on_sms_clicked(self, number, message): + def _on_sms_clicked(self, numbers, message): try: - assert number, "No number specified" + assert numbers, "No number specified" assert message, "Empty message" try: loggedIn = self._phoneBackends[self._selectedBackendId].is_authed() @@ -803,8 +844,9 @@ class Dialcentral(object): dialed = False try: - self._phoneBackends[self._selectedBackendId].send_sms(number, message) - hildonize.show_information_banner(self._window, "Sending to %s" % number) + self._phoneBackends[self._selectedBackendId].send_sms(numbers, message) + hildonize.show_information_banner(self._window, "Sending to %s" % ", ".join(numbers)) + _moduleLogger.info("Sending SMS to %r" % numbers) dialed = True except Exception, e: self._errorDisplay.push_exception() @@ -833,8 +875,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() @@ -844,6 +887,27 @@ class Dialcentral(object): except Exception, e: self._errorDisplay.push_exception() + def _on_contact_import(self, *args): + try: + csvFilter = gtk.FileFilter() + csvFilter.set_name("Contacts") + csvFilter.add_pattern("*.csv") + importFileChooser = gtk.FileChooserDialog( + title="Contacts", + parent=self._window, + ) + importFileChooser.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) + importFileChooser.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) + + importFileChooser.set_property("filter", csvFilter) + userResponse = importFileChooser.run() + importFileChooser.hide() + if userResponse == gtk.RESPONSE_OK: + filename = importFileChooser.get_filename() + shutil.copy2(filename, self._fsContactsPath) + except Exception, e: + self._errorDisplay.push_exception() + def _on_menu_refresh(self, *args): try: self._refresh_active_tab() @@ -866,7 +930,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(["", "Eric Warnke ", "Ed Page "]) + dlg.set_authors(["", "Eric Warnke ", "Ed Page "]) dlg.run() dlg.destroy() except Exception, e: