Giving access to all of a contacts numbers from recent and messages tabs; Increased...
authorepage <eopage@byu.net>
Sat, 10 Oct 2009 13:37:11 +0000 (13:37 +0000)
committerepage <eopage@byu.net>
Sat, 10 Oct 2009 13:37:11 +0000 (13:37 +0000)
git-svn-id: file:///svnroot/gc-dialer/trunk@514 c39d3808-3fe2-4d86-a59f-b7f623ee9f21

src/dialcentral.glade
src/gv_backend.py
src/gv_views.py
src/hildonize.py
support/builddeb.py

index c437659..db7bb56 100644 (file)
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="c" signal="clicked"/>
-                        <accelerator key="b" signal="clicked"/>
-                        <accelerator key="a" signal="clicked"/>
                         <accelerator key="2" signal="clicked"/>
+                        <accelerator key="a" signal="clicked"/>
+                        <accelerator key="b" signal="clicked"/>
+                        <accelerator key="c" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label10">
                             <property name="visible">True</property>
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="f" signal="clicked"/>
-                        <accelerator key="e" signal="clicked"/>
-                        <accelerator key="d" signal="clicked"/>
                         <accelerator key="3" signal="clicked"/>
+                        <accelerator key="d" signal="clicked"/>
+                        <accelerator key="e" signal="clicked"/>
+                        <accelerator key="f" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label11">
                             <property name="visible">True</property>
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="i" signal="clicked"/>
-                        <accelerator key="h" signal="clicked"/>
-                        <accelerator key="g" signal="clicked"/>
                         <accelerator key="4" signal="clicked"/>
+                        <accelerator key="g" signal="clicked"/>
+                        <accelerator key="h" signal="clicked"/>
+                        <accelerator key="i" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label13">
                             <property name="visible">True</property>
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="l" signal="clicked"/>
-                        <accelerator key="k" signal="clicked"/>
-                        <accelerator key="j" signal="clicked"/>
                         <accelerator key="5" signal="clicked"/>
+                        <accelerator key="j" signal="clicked"/>
+                        <accelerator key="k" signal="clicked"/>
+                        <accelerator key="l" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label14">
                             <property name="visible">True</property>
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="o" signal="clicked"/>
-                        <accelerator key="n" signal="clicked"/>
-                        <accelerator key="m" signal="clicked"/>
                         <accelerator key="6" signal="clicked"/>
+                        <accelerator key="m" signal="clicked"/>
+                        <accelerator key="n" signal="clicked"/>
+                        <accelerator key="o" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label15">
                             <property name="visible">True</property>
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="s" signal="clicked"/>
-                        <accelerator key="r" signal="clicked"/>
-                        <accelerator key="q" signal="clicked"/>
-                        <accelerator key="p" signal="clicked"/>
                         <accelerator key="7" signal="clicked"/>
+                        <accelerator key="p" signal="clicked"/>
+                        <accelerator key="q" signal="clicked"/>
+                        <accelerator key="r" signal="clicked"/>
+                        <accelerator key="s" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label16">
                             <property name="visible">True</property>
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="v" signal="clicked"/>
-                        <accelerator key="u" signal="clicked"/>
-                        <accelerator key="t" signal="clicked"/>
                         <accelerator key="8" signal="clicked"/>
+                        <accelerator key="t" signal="clicked"/>
+                        <accelerator key="u" signal="clicked"/>
+                        <accelerator key="v" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label17">
                             <property name="visible">True</property>
                         <property name="receives_default">False</property>
                         <property name="focus_on_click">False</property>
                         <signal name="clicked" handler="on_digit_clicked"/>
-                        <accelerator key="z" signal="clicked"/>
-                        <accelerator key="y" signal="clicked"/>
-                        <accelerator key="x" signal="clicked"/>
-                        <accelerator key="w" signal="clicked"/>
                         <accelerator key="9" signal="clicked"/>
+                        <accelerator key="w" signal="clicked"/>
+                        <accelerator key="x" signal="clicked"/>
+                        <accelerator key="y" signal="clicked"/>
+                        <accelerator key="z" signal="clicked"/>
                         <child>
                           <widget class="GtkLabel" id="label18">
                             <property name="visible">True</property>
             </child>
           </widget>
           <packing>
+            <property name="expand">False</property>
             <property name="position">3</property>
           </packing>
         </child>
index dc1d865..1561b60 100644 (file)
@@ -615,6 +615,7 @@ def decorate_recent(recentCallData):
        """
        @returns (personsName, phoneNumber, date, action)
        """
+       contactId = recentCallData["contactId"]
        if recentCallData["name"]:
                header = recentCallData["name"]
        elif recentCallData["prettyNumber"]:
@@ -627,10 +628,11 @@ def decorate_recent(recentCallData):
        number = recentCallData["number"]
        relTime = recentCallData["relTime"]
        action = recentCallData["action"]
-       return header, number, relTime, action
+       return contactId, header, number, relTime, action
 
 
 def decorate_message(messageData):
+       contactId = messageData["contactId"]
        exactTime = messageData["time"]
        if messageData["name"]:
                header = messageData["name"]
@@ -652,7 +654,7 @@ def decorate_message(messageData):
                        for messagePart in messageParts
                ]
 
-       decoratedResults = header, number, relativeTime, messages
+       decoratedResults = contactId, header, number, relativeTime, messages
        return decoratedResults
 
 
index a4fec0e..bf12585 100644 (file)
@@ -302,7 +302,7 @@ class SmsEntryDialog(object):
                self._numberIndex = -1
                self._contactDetails = []
 
-       def run(self, contactDetails, messages = (), parent = None):
+       def run(self, contactDetails, messages = (), parent = None, defaultIndex = -1):
                entryConnectId = self._smsEntry.get_buffer().connect("changed", self._on_entry_changed)
                phoneConnectId = self._phoneButton.connect("clicked", self._on_phone)
                keyConnectId = self._keyPressEventId = self._dialog.connect("key-press-event", self._on_key_press)
@@ -314,8 +314,8 @@ class SmsEntryDialog(object):
                                row = (phoneNumber, display)
                                self._contactDetails.append(row)
                        if 0 < len(self._contactDetails):
-                               self._numberIndex = 0
-                               self._phoneButton.set_label(self._contactDetails[0][1])
+                               self._numberIndex = defaultIndex if defaultIndex != -1 else 0
+                               self._phoneButton.set_label(self._contactDetails[self._numberIndex][1])
                        else:
                                self._numberIndex = -1
                                self._phoneButton.set_label("Error: No Number Available")
@@ -352,6 +352,8 @@ class SmsEntryDialog(object):
 
                        if parent is not None:
                                self._dialog.set_transient_for(parent)
+                               parentSize = parent.get_size()
+                               self._dialog.resize(parentSize[0], max(parentSize[1]-50, 100))
 
                        # Run
                        try:
@@ -361,7 +363,8 @@ class SmsEntryDialog(object):
                                self._smsEntry.grab_focus()
 
                                if 1 < len(self._contactDetails):
-                                       self._request_number()
+                                       if defaultIndex == -1:
+                                               self._request_number()
                                        self._phoneButton.set_sensitive(True)
                                else:
                                        self._phoneButton.set_sensitive(False)
@@ -891,6 +894,7 @@ class RecentCallsView(object):
        DATE_IDX = 1
        ACTION_IDX = 2
        FROM_IDX = 3
+       FROM_ID_IDX = 4
 
        def __init__(self, widgetTree, backend, errorDisplay):
                self._errorDisplay = errorDisplay
@@ -902,6 +906,7 @@ class RecentCallsView(object):
                        gobject.TYPE_STRING, # date
                        gobject.TYPE_STRING, # action
                        gobject.TYPE_STRING, # from
+                       gobject.TYPE_STRING, # from id
                )
                self._recentview = widgetTree.get_widget("recentview")
                self._recentviewselection = None
@@ -955,7 +960,7 @@ class RecentCallsView(object):
                self._recentview.append_column(self._numberColumn)
                self._recentview.append_column(self._nameColumn)
                self._recentviewselection = self._recentview.get_selection()
-               self._recentviewselection.set_mode(gtk.SELECTION_NONE)
+               self._recentviewselection.set_mode(gtk.SELECTION_SINGLE)
 
                self._onRecentviewRowActivatedId = self._recentview.connect("row-activated", self._on_recentview_row_activated)
 
@@ -1018,13 +1023,13 @@ class RecentCallsView(object):
                                for data in gv_backend.sort_messages(recentItems)
                        )
 
-                       for personName, phoneNumber, date, action in recentItems:
+                       for contactId, personName, phoneNumber, date, action in recentItems:
                                if not personName:
                                        personName = "Unknown"
                                date = abbrev_relative_date(date)
                                prettyNumber = phoneNumber[2:] if phoneNumber.startswith("+1") else phoneNumber
                                prettyNumber = make_pretty(prettyNumber)
-                               item = (prettyNumber, date, action.capitalize(), personName)
+                               item = (prettyNumber, date, action.capitalize(), personName, contactId)
                                with gtk_toolbox.gtk_lock():
                                        self._recentmodel.append(item)
                except Exception, e:
@@ -1043,13 +1048,33 @@ class RecentCallsView(object):
 
                        number = self._recentmodel.get_value(itr, self.NUMBER_IDX)
                        number = make_ugly(number)
-                       contactPhoneNumbers = [("Phone", number)]
                        description = self._recentmodel.get_value(itr, self.FROM_IDX)
+                       contactId = self._recentmodel.get_value(itr, self.FROM_ID_IDX)
+                       if contactId:
+                               contactPhoneNumbers = list(self._backend.get_contact_details(contactId))
+                               defaultMatches = [
+                                       (number == make_ugly(contactNumber) or number[1:] == make_ugly(contactNumber))
+                                       for (numberDescription, contactNumber) in contactPhoneNumbers
+                               ]
+                               try:
+                                       defaultIndex = defaultMatches.index(True)
+                               except ValueError:
+                                       contactPhoneNumbers.append(("Other", number))
+                                       defaultIndex = len(contactPhoneNumbers)-1
+                                       _moduleLogger.warn(
+                                               "Could not find contact %r's number %s among %r" % (
+                                                       contactId, number, contactPhoneNumbers
+                                               )
+                                       )
+                       else:
+                               contactPhoneNumbers = [("Phone", number)]
+                               defaultIndex = -1
 
                        action, phoneNumber, message = self._phoneTypeSelector.run(
                                contactPhoneNumbers,
                                messages = (description, ),
                                parent = self._window,
+                               defaultIndex = defaultIndex,
                        )
                        if action == SmsEntryDialog.ACTION_CANCEL:
                                return
@@ -1068,6 +1093,7 @@ class MessagesView(object):
        HEADER_IDX = 2
        MESSAGE_IDX = 3
        MESSAGES_IDX = 4
+       FROM_ID_IDX = 5
 
        def __init__(self, widgetTree, backend, errorDisplay):
                self._errorDisplay = errorDisplay
@@ -1080,6 +1106,7 @@ class MessagesView(object):
                        gobject.TYPE_STRING, # header
                        gobject.TYPE_STRING, # message
                        object, # messages
+                       gobject.TYPE_STRING, # from id
                )
                self._messageview = widgetTree.get_widget("messages_view")
                self._messageviewselection = None
@@ -1111,7 +1138,7 @@ class MessagesView(object):
 
                self._messageview.append_column(self._messageColumn)
                self._messageviewselection = self._messageview.get_selection()
-               self._messageviewselection.set_mode(gtk.SELECTION_NONE)
+               self._messageviewselection.set_mode(gtk.SELECTION_SINGLE)
 
                self._onMessageviewRowActivatedId = self._messageview.connect("row-activated", self._on_messageview_row_activated)
 
@@ -1173,7 +1200,7 @@ class MessagesView(object):
                                for message in gv_backend.sort_messages(messageItems)
                        )
 
-                       for header, number, relativeDate, messages in messageItems:
+                       for contactId, header, number, relativeDate, messages in messageItems:
                                prettyNumber = number[2:] if number.startswith("+1") else number
                                prettyNumber = make_pretty(prettyNumber)
 
@@ -1190,7 +1217,7 @@ class MessagesView(object):
 
                                number = make_ugly(number)
 
-                               row = (number, relativeDate, header, "\n".join(collapsedMessages), expandedMessages)
+                               row = number, relativeDate, header, "\n".join(collapsedMessages), expandedMessages, contactId
                                with gtk_toolbox.gtk_lock():
                                        self._messagemodel.append(row)
                except Exception, e:
@@ -1207,13 +1234,35 @@ class MessagesView(object):
                        if not itr:
                                return
 
-                       contactPhoneNumbers = [("Phone", self._messagemodel.get_value(itr, self.NUMBER_IDX))]
+                       number = make_ugly(self._messagemodel.get_value(itr, self.NUMBER_IDX))
                        description = self._messagemodel.get_value(itr, self.MESSAGES_IDX)
 
+                       contactId = self._messagemodel.get_value(itr, self.FROM_ID_IDX)
+                       if contactId:
+                               contactPhoneNumbers = list(self._backend.get_contact_details(contactId))
+                               defaultMatches = [
+                                       (number == make_ugly(contactNumber) or number[1:] == make_ugly(contactNumber))
+                                       for (numberDescription, contactNumber) in contactPhoneNumbers
+                               ]
+                               try:
+                                       defaultIndex = defaultMatches.index(True)
+                               except ValueError:
+                                       contactPhoneNumbers.append(("Other", number))
+                                       defaultIndex = len(contactPhoneNumbers)-1
+                                       _moduleLogger.warn(
+                                               "Could not find contact %r's number %s among %r" % (
+                                                       contactId, number, contactPhoneNumbers
+                                               )
+                                       )
+                       else:
+                               contactPhoneNumbers = [("Phone", number)]
+                               defaultIndex = -1
+
                        action, phoneNumber, message = self._phoneTypeSelector.run(
                                contactPhoneNumbers,
                                messages = description,
                                parent = self._window,
+                               defaultIndex = defaultIndex,
                        )
                        if action == SmsEntryDialog.ACTION_CANCEL:
                                return
@@ -1279,7 +1328,7 @@ class ContactsView(object):
                self._contactsview.set_fixed_height_mode(True)
                self._contactsview.append_column(self._contactColumn)
                self._contactsviewselection = self._contactsview.get_selection()
-               self._contactsviewselection.set_mode(gtk.SELECTION_NONE)
+               self._contactsviewselection.set_mode(gtk.SELECTION_SINGLE)
 
                del self._booksList[:]
                for (factoryId, bookId), (factoryName, bookName) in self.get_addressbooks():
index 74cdb41..bef2d3a 100644 (file)
@@ -508,7 +508,7 @@ def _null_touch_selector(parent, title, items, defaultIndex = -1):
        treeView.set_model(model)
        treeView.append_column(column)
        selection = treeView.get_selection()
-       selection.set_mode(gtk.SELECTION_NONE)
+       selection.set_mode(gtk.SELECTION_SINGLE)
        if 0 < defaultIndex:
                selection.select_path((defaultIndex, ))
 
@@ -622,7 +622,7 @@ def _null_touch_selector_entry(parent, title, items, defaultItem):
        treeView.set_model(model)
        treeView.append_column(column)
        selection = treeView.get_selection()
-       selection.set_mode(gtk.SELECTION_NONE)
+       selection.set_mode(gtk.SELECTION_SINGLE)
 
        scrolledWin = gtk.ScrolledWindow()
        scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
index f7c260b..b614792 100755 (executable)
@@ -26,11 +26,12 @@ __changelog__ = """
 * Sped up various login cases
 * Added descriptions to the callback numbers
 * Collapsed conversations in the messages tab
+* Give access to all of a contacts numbers when launching dialog from Recent or Messages tabs
 * UI Tweak: Added more login status notifications
 * UI Tweak: When no characters are entered, you can't send a text
-* UI Tweak: Switched to TreeView's using no selection to match Fremantle
 * UI Tweak: Trying to consolidate dialogs by combining phone selection and SMS entry
 * UI Tweak: Removed "Select" button from SMS Dialog
+* UI Tweak: Increased the size of the SMS dialog
 * Bug Fix: Expanded the types of the Enter key that are supported for going to full screen
 * Bug Fix: Random people were reporting login issues
 * Bug Fix: Hardened against issues with grabbing possible callback numbers