You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-@todo Figure out how to integrate with the Maemo contacts app
-@todo Look into an actor system
-@bug Session timeouts are bad, possible solutions:
- @li For every X minutes, if logged in, attempt login
- @li Restructure so code handling login/dial/sms is beneath everything else and login attempts are made if those fail
-@todo Can't text from dialpad (so can't do any arbitrary number texts)
-@todo Add logging support to make debugging issues for people a lot easier
"""
import gtk
import gtk.glade
-try:
- import hildon
-except ImportError:
- hildon = None
-
import constants
+import hildonize
import gtk_toolbox
ACCOUNT_TAB = 4
NULL_BACKEND = 0
- GC_BACKEND = 1
GV_BACKEND = 2
- BACKENDS = (NULL_BACKEND, GC_BACKEND, GV_BACKEND)
+ BACKENDS = (NULL_BACKEND, GV_BACKEND)
def __init__(self):
self._initDone = False
self._credentials = ("", "")
self._selectedBackendId = self.NULL_BACKEND
- self._defaultBackendId = self.GC_BACKEND
+ self._defaultBackendId = self.GV_BACKEND
self._phoneBackends = None
self._dialpads = None
self._accountViews = None
self._errorDisplay = gtk_toolbox.ErrorDisplay(self._widgetTree)
self._credentialsDialog = gtk_toolbox.LoginWindow(self._widgetTree)
- self._app = None
self._isFullScreen = False
- if hildon is not None:
- self._app = hildon.Program()
- oldWindow = self._window
- self._window = hildon.Window()
- oldWindow.get_child().reparent(self._window)
- self._app.add_window(self._window)
+ self._app = hildonize.get_app_class()()
+ self._window = hildonize.hildonize_window(self._app, self._window)
+ hildonize.hildonize_text_entry(self._widgetTree.get_widget("usernameentry"))
+ hildonize.hildonize_password_entry(self._widgetTree.get_widget("passwordentry"))
+ hildonize.hildonize_combo_entry(self._widgetTree.get_widget("callbackcombo").get_child())
+
+ for scrollingWidget in (
+ 'recent_scrolledwindow',
+ 'message_scrolledwindow',
+ 'contacts_scrolledwindow',
+ "phoneSelectionMessage_scrolledwindow",
+ "phonetypes_scrolledwindow",
+ "smsMessage_scrolledwindow",
+ "smsMessage_scrolledEntry",
+ ):
+ hildonize.set_thumb_scrollbar(self._widgetTree.get_widget(scrollingWidget))
- try:
- self._widgetTree.get_widget("usernameentry").set_property('hildon-input-mode', 7)
- self._widgetTree.get_widget("passwordentry").set_property('hildon-input-mode', 7|(1 << 29))
- self._widgetTree.get_widget("callbackcombo").get_child().set_property('hildon-input-mode', (1 << 4))
- except TypeError, e:
- warnings.warn(e.message)
- hildon.hildon_helper_set_thumb_scrollbar(self._widgetTree.get_widget('recent_scrolledwindow'), True)
- hildon.hildon_helper_set_thumb_scrollbar(self._widgetTree.get_widget('message_scrolledwindow'), True)
- hildon.hildon_helper_set_thumb_scrollbar(self._widgetTree.get_widget('contacts_scrolledwindow'), True)
-
- gtkMenu = self._widgetTree.get_widget("dialpad_menubar")
- menu = gtk.Menu()
- for child in gtkMenu.get_children():
- child.reparent(menu)
- self._window.set_menu(menu)
- gtkMenu.destroy()
+ hildonize.hildonize_menu(self._window, self._widgetTree.get_widget("dialpad_menubar"))
+ if hildonize.IS_HILDON:
self._window.connect("key-press-event", self._on_key_press)
self._window.connect("window-state-event", self._on_window_state_change)
else:
pass # warnings.warn("No Hildon", UserWarning, 2)
- # If under hildon, rely on the application name being shown
- if hildon is None:
- self._window.set_title("%s" % constants.__pretty_app_name__)
+ hildonize.set_application_title(self._window, "%s" % constants.__pretty_app_name__)
callbackMapping = {
"on_dialpad_quit": self._on_close,
with gtk_toolbox.gtk_lock():
self._errorDisplay.push_exception()
alarm_handler = None
- if hildon is not None:
+ if hildonize.IS_HILDON:
import led_handler
self._ledHandler = led_handler.LedHandler()
# Setup costly backends
import gv_backend
- import gc_backend
import file_backend
- import evo_backend
- import gc_views
+ import gv_views
try:
os.makedirs(constants._data_path_)
except OSError, e:
if e.errno != 17:
raise
- gcCookiePath = os.path.join(constants._data_path_, "gc_cookies.txt")
gvCookiePath = os.path.join(constants._data_path_, "gv_cookies.txt")
- self._defaultBackendId = self._guess_preferred_backend((
- (self.GC_BACKEND, gcCookiePath),
- (self.GV_BACKEND, gvCookiePath),
- ))
self._phoneBackends.update({
- self.GC_BACKEND: gc_backend.GCDialer(gcCookiePath),
self.GV_BACKEND: gv_backend.GVDialer(gvCookiePath),
})
with gtk_toolbox.gtk_lock():
- unifiedDialpad = gc_views.Dialpad(self._widgetTree, self._errorDisplay)
- unifiedDialpad.set_number("")
+ unifiedDialpad = gv_views.Dialpad(self._widgetTree, self._errorDisplay)
self._dialpads.update({
- self.GC_BACKEND: unifiedDialpad,
self.GV_BACKEND: unifiedDialpad,
})
self._accountViews.update({
- self.GC_BACKEND: gc_views.AccountInfo(
- self._widgetTree, self._phoneBackends[self.GC_BACKEND], None, self._errorDisplay
- ),
- self.GV_BACKEND: gc_views.AccountInfo(
+ self.GV_BACKEND: gv_views.AccountInfo(
self._widgetTree, self._phoneBackends[self.GV_BACKEND], self._alarmHandler, self._errorDisplay
),
})
- self._accountViews[self.GC_BACKEND].save_everything = lambda *args: None
self._accountViews[self.GV_BACKEND].save_everything = self._save_settings
self._recentViews.update({
- self.GC_BACKEND: gc_views.RecentCallsView(
- self._widgetTree, self._phoneBackends[self.GC_BACKEND], self._errorDisplay
- ),
- self.GV_BACKEND: gc_views.RecentCallsView(
+ self.GV_BACKEND: gv_views.RecentCallsView(
self._widgetTree, self._phoneBackends[self.GV_BACKEND], self._errorDisplay
),
})
self._messagesViews.update({
- self.GC_BACKEND: null_views.MessagesView(self._widgetTree),
- self.GV_BACKEND: gc_views.MessagesView(
+ self.GV_BACKEND: gv_views.MessagesView(
self._widgetTree, self._phoneBackends[self.GV_BACKEND], self._errorDisplay
),
})
self._contactsViews.update({
- self.GC_BACKEND: gc_views.ContactsView(
- self._widgetTree, self._phoneBackends[self.GC_BACKEND], self._errorDisplay
- ),
- self.GV_BACKEND: gc_views.ContactsView(
+ self.GV_BACKEND: gv_views.ContactsView(
self._widgetTree, self._phoneBackends[self.GV_BACKEND], self._errorDisplay
),
})
- evoBackend = evo_backend.EvolutionAddressBook()
fsContactsPath = os.path.join(constants._data_path_, "contacts")
fileBackend = file_backend.FilesystemAddressBookFactory(fsContactsPath)
- for backendId in (self.GV_BACKEND, self.GC_BACKEND):
- self._dialpads[backendId].number_selected = self._select_action
- self._recentViews[backendId].number_selected = self._select_action
- self._messagesViews[backendId].number_selected = self._select_action
- self._contactsViews[backendId].number_selected = self._select_action
-
- addressBooks = [
- self._phoneBackends[backendId],
- evoBackend,
- fileBackend,
- ]
- mergedBook = gc_views.MergedAddressBook(addressBooks, gc_views.MergedAddressBook.advanced_lastname_sorter)
- self._contactsViews[backendId].append(mergedBook)
- self._contactsViews[backendId].extend(addressBooks)
- self._contactsViews[backendId].open_addressbook(*self._contactsViews[backendId].get_addressbooks().next()[0][0:2])
+
+ self._dialpads[self.GV_BACKEND].number_selected = self._select_action
+ self._recentViews[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
+
+ addressBooks = [
+ self._phoneBackends[self.GV_BACKEND],
+ fileBackend,
+ ]
+ mergedBook = gv_views.MergedAddressBook(addressBooks, gv_views.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])
callbackMapping = {
"on_paste": self._on_paste,
for attemptCount in xrange(numOfAttempts):
if loggedIn:
break
- availableServices = (
- (self.GV_BACKEND, "Google Voice"),
- (self.GC_BACKEND, "Grand Central"),
- )
with gtk_toolbox.gtk_lock():
- credentials = self._credentialsDialog.request_credentials_from(
- availableServices, defaultCredentials = self._credentials
+ credentials = self._credentialsDialog.request_credentials(
+ defaultCredentials = self._credentials
)
tmpServiceId, username, password = credentials
loggedIn = self._phoneBackends[tmpServiceId].login(username, password)
config.add_section(sectionName)
view.save_settings(config, sectionName)
- def _guess_preferred_backend(self, backendAndCookiePaths):
- modTimeAndPath = [
- (getmtime_nothrow(path), backendId, path)
- for backendId, path in backendAndCookiePaths
- ]
- modTimeAndPath.sort()
- return modTimeAndPath[-1][1]
-
def _save_settings(self):
"""
@note Thread Agnostic
except ValueError, e:
self._errorDisplay.push_exception()
+ if dialed:
+ self._dialpads[self._selectedBackendId].clear()
+
def _on_dial_clicked(self, number):
assert number, "No number to call"
try:
#with gtk_toolbox.flock(_lock_file, 0):
gtk.gdk.threads_init()
- if hildon is not None:
+ if hildonize.IS_HILDON:
gtk.set_application_name(constants.__pretty_app_name__)
handle = Dialcentral()
gtk.main()