Hardening against different timings in Google rolling thigns out
[gc-dialer] / src / gv_views.py
index b9c9376..7d1e8ef 100644 (file)
@@ -25,6 +25,7 @@ from __future__ import with_statement
 
 import ConfigParser
 import logging
+import itertools
 
 import gobject
 import pango
@@ -32,9 +33,13 @@ import gtk
 
 import gtk_toolbox
 import hildonize
+import gv_backend
 import null_backend
 
 
+_moduleLogger = logging.getLogger("gv_views")
+
+
 def make_ugly(prettynumber):
        """
        function to take a phone number and strip out all non-numeric
@@ -764,7 +769,7 @@ class AccountInfo(object):
                return True
 
        def clear(self):
-               self._callbackSelectButton.set_label("")
+               self._callbackSelectButton.set_label("No Callback Number")
                self.set_account_number("")
                self._isPopulated = False
 
@@ -801,18 +806,20 @@ class AccountInfo(object):
                        self._isPopulated = False
                        return
 
+               if len(callbackNumbers) == 0:
+                       callbackNumbers = {"": "No callback numbers available"}
+
                for number, description in callbackNumbers.iteritems():
-                       self._callbackList.append(make_pretty(number))
+                       self._callbackList.append((make_pretty(number), description))
 
-               if not self.get_selected_callback_number():
-                       self._set_callback_number(self._defaultCallback)
+               self._set_callback_number(self._defaultCallback)
 
        def _set_callback_number(self, number):
                try:
                        if not self._backend.is_valid_syntax(number) and 0 < len(number):
                                self._errorDisplay.push_message("%s is not a valid callback number" % number)
-                       elif number == self._backend.get_callback_number():
-                               logging.warning(
+                       elif number == self._backend.get_callback_number() and 0 < len(number):
+                               _moduleLogger.warning(
                                        "Callback number already is %s" % (
                                                self._backend.get_callback_number(),
                                        ),
@@ -822,8 +829,11 @@ class AccountInfo(object):
                                assert make_ugly(number) == make_ugly(self._backend.get_callback_number()), "Callback number should be %s but instead is %s" % (
                                        make_pretty(number), make_pretty(self._backend.get_callback_number())
                                )
-                               self._callbackSelectButton.set_label(make_pretty(number))
-                               logging.info(
+                               prettyNumber = make_pretty(number)
+                               if len(prettyNumber) == 0:
+                                       prettyNumber = "No Callback Number"
+                               self._callbackSelectButton.set_label(prettyNumber)
+                               _moduleLogger.info(
                                        "Callback number set to %s" % (
                                                self._backend.get_callback_number(),
                                        ),
@@ -845,16 +855,27 @@ class AccountInfo(object):
                try:
                        actualSelection = make_pretty(self.get_selected_callback_number())
 
+                       userOptions = dict(
+                               (number, "%s (%s)" % (number, description))
+                               for (number, description) in self._callbackList
+                       )
+                       defaultSelection = userOptions.get(actualSelection, actualSelection)
+
                        userSelection = hildonize.touch_selector_entry(
                                self._window,
                                "Callback Number",
-                               self._callbackList,
-                               actualSelection,
+                               list(userOptions.itervalues()),
+                               defaultSelection,
+                       )
+                       reversedUserOptions = dict(
+                               itertools.izip(userOptions.itervalues(), userOptions.iterkeys())
                        )
-                       number = make_ugly(userSelection)
+                       selectedNumber = reversedUserOptions.get(userSelection, userSelection)
+
+                       number = make_ugly(selectedNumber)
                        self._set_callback_number(number)
                except RuntimeError, e:
-                       logging.exception("%s" % str(e))
+                       _moduleLogger.exception("%s" % str(e))
                except Exception, e:
                        self._errorDisplay.push_exception()
 
@@ -900,7 +921,7 @@ class AccountInfo(object):
 
                        self._update_alarm_settings(recurrence)
                except RuntimeError, e:
-                       logging.exception("%s" % str(e))
+                       _moduleLogger.exception("%s" % str(e))
                except Exception, e:
                        self._errorDisplay.push_exception()
 
@@ -1062,6 +1083,11 @@ class RecentCallsView(object):
                                self._isPopulated = False
                                recentItems = []
 
+                       recentItems = (
+                               gv_backend.decorate_recent(data)
+                               for data in gv_backend.sort_messages(recentItems)
+                       )
+
                        for personName, phoneNumber, date, action in recentItems:
                                if not personName:
                                        personName = "Unknown"
@@ -1150,6 +1176,7 @@ class MessagesView(object):
        def enable(self):
                assert self._backend.is_authed(), "Attempting to enable backend while not logged in"
                self._messageview.set_model(self._messagemodel)
+               self._messageview.set_headers_visible(False)
 
                self._messageview.append_column(self._messageColumn)
                self._messageviewselection = self._messageview.get_selection()
@@ -1194,6 +1221,8 @@ class MessagesView(object):
                """
                pass
 
+       _MIN_MESSAGES_SHOWN = 4
+
        def _idly_populate_messageview(self):
                with gtk_toolbox.gtk_lock():
                        banner = hildonize.show_busy_banner_start(self._window, "Loading Messages")
@@ -1208,17 +1237,29 @@ class MessagesView(object):
                                self._isPopulated = False
                                messageItems = []
 
+                       messageItems = (
+                               gv_backend.decorate_message(message)
+                               for message in gv_backend.sort_messages(messageItems)
+                       )
+
                        for header, number, relativeDate, messages in messageItems:
                                prettyNumber = number[2:] if number.startswith("+1") else number
                                prettyNumber = make_pretty(prettyNumber)
 
                                firstMessage = "<b>%s - %s</b> <i>(%s)</i>" % (header, prettyNumber, relativeDate)
-                               newMessages = [firstMessage]
-                               newMessages.extend(messages)
+                               expandedMessages = [firstMessage]
+                               expandedMessages.extend(messages)
+                               if (self._MIN_MESSAGES_SHOWN + 1) < len(messages):
+                                       firstMessage = "<b>%s - %s</b> <i>(%s)</i>" % (header, prettyNumber, relativeDate)
+                                       secondMessage = "<i>%d Messages Hidden...</i>" % (len(messages) - self._MIN_MESSAGES_SHOWN, )
+                                       collapsedMessages = [firstMessage, secondMessage]
+                                       collapsedMessages.extend(messages[-self._MIN_MESSAGES_SHOWN-1:-1])
+                               else:
+                                       collapsedMessages = expandedMessages
 
                                number = make_ugly(number)
 
-                               row = (number, relativeDate, header, "\n".join(newMessages), newMessages)
+                               row = (number, relativeDate, header, "\n".join(collapsedMessages), expandedMessages)
                                with gtk_toolbox.gtk_lock():
                                        self._messagemodel.append(row)
                except Exception, e: