* Starting a messages view
authorepage <eopage@byu.net>
Mon, 18 May 2009 23:44:28 +0000 (23:44 +0000)
committerepage <eopage@byu.net>
Mon, 18 May 2009 23:44:28 +0000 (23:44 +0000)
* Encouraging more views to use phone type selectors
* Made phone type selectors more useful with a message and direct dialing

git-svn-id: file:///svnroot/gc-dialer/trunk@286 c39d3808-3fe2-4d86-a59f-b7f623ee9f21

src/dc_glade.py
src/dialcentral.glade
src/gc_backend.py
src/gc_views.py
src/gv_backend.py
src/null_backend.py
src/null_views.py

index b5e4f2a..e9e8d29 100755 (executable)
@@ -64,8 +64,9 @@ class Dialcentral(object):
 
        KEYPAD_TAB = 0
        RECENT_TAB = 1
-       CONTACTS_TAB = 2
-       ACCOUNT_TAB = 3
+       MESSAGES_TAB = 2
+       CONTACTS_TAB = 3
+       ACCOUNT_TAB = 4
 
        NULL_BACKEND = 0
        GC_BACKEND = 1
@@ -85,6 +86,7 @@ class Dialcentral(object):
                self._phoneBackends = None
                self._dialpads = None
                self._accountViews = None
+               self._messagesViews = None
                self._recentViews = None
                self._contactsViews = None
 
@@ -159,11 +161,13 @@ class Dialcentral(object):
                        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._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._messagesViews[self._selectedBackendId].enable()
                        self._contactsViews[self._selectedBackendId].enable()
 
                # Setup maemo specifics
@@ -237,6 +241,12 @@ class Dialcentral(object):
                                        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._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
@@ -342,11 +352,13 @@ class Dialcentral(object):
                self._dialpads[oldStatus].disable()
                self._accountViews[oldStatus].disable()
                self._recentViews[oldStatus].disable()
+               self._messagesViews[oldStatus].disable()
                self._contactsViews[oldStatus].disable()
 
                self._dialpads[newStatus].enable()
                self._accountViews[newStatus].enable()
                self._recentViews[newStatus].enable()
+               self._messagesViews[newStatus].enable()
                self._contactsViews[newStatus].enable()
 
                if self._phoneBackends[self._selectedBackendId].get_callback_number() is None:
@@ -420,6 +432,7 @@ class Dialcentral(object):
                self._phoneBackends[self._selectedBackendId].logout()
                self._accountViews[self._selectedBackendId].clear()
                self._recentViews[self._selectedBackendId].clear()
+               self._messagesViews[self._selectedBackendId].clear()
                self._contactsViews[self._selectedBackendId].clear()
                self._change_loggedin_status(self.NULL_BACKEND)
 
@@ -432,6 +445,8 @@ class Dialcentral(object):
                        self._contactsViews[self._selectedBackendId].update()
                elif page_num == self.RECENT_TAB:
                        self._recentViews[self._selectedBackendId].update()
+               elif page_num == self.MESSAGES_TAB:
+                       self._messagesViews[self._selectedBackendId].update()
 
                tabTitle = self._notebook.get_tab_label(self._notebook.get_nth_page(page_num)).get_text()
                if hildon is not None:
index 5c1d412..860d698 100644 (file)
               </packing>
             </child>
             <child>
+              <widget class="GtkTreeView" id="messages_view">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="messages">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Messages</property>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+                <property name="tab_fill">False</property>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+            <child>
               <widget class="GtkTable" id="contacts_table">
                 <property name="visible">True</property>
                 <property name="n_rows">2</property>
                 </child>
               </widget>
               <packing>
-                <property name="position">2</property>
+                <property name="position">3</property>
                 <property name="tab_expand">True</property>
                 <property name="tab_fill">False</property>
               </packing>
                 <property name="label" translatable="yes">Contacts</property>
               </widget>
               <packing>
-                <property name="position">2</property>
+                <property name="position">3</property>
                 <property name="tab_expand">True</property>
                 <property name="tab_fill">False</property>
                 <property name="type">tab</property>
@@ -717,7 +737,7 @@ Number:</property>
                 </child>
               </widget>
               <packing>
-                <property name="position">3</property>
+                <property name="position">4</property>
                 <property name="tab_expand">True</property>
                 <property name="tab_fill">False</property>
               </packing>
@@ -729,7 +749,7 @@ Number:</property>
                 <property name="label" translatable="yes">Account</property>
               </widget>
               <packing>
-                <property name="position">3</property>
+                <property name="position">4</property>
                 <property name="tab_fill">False</property>
                 <property name="type">tab</property>
               </packing>
@@ -881,6 +901,16 @@ Number:</property>
         <property name="visible">True</property>
         <property name="spacing">2</property>
         <child>
+          <widget class="GtkLabel" id="phoneSelectionMessage">
+            <property name="visible">True</property>
+            <property name="use_markup">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
           <widget class="GtkTreeView" id="phonetypes">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
@@ -888,7 +918,7 @@ Number:</property>
             <signal name="row_activated" handler="on_phonetype_select"/>
           </widget>
           <packing>
-            <property name="position">1</property>
+            <property name="position">2</property>
           </packing>
         </child>
         <child internal-child="action_area">
index 53e6aa9..b388aff 100644 (file)
@@ -317,6 +317,9 @@ class GCDialer(object):
                        phoneNumber = detail_match.group(2)
                        yield (phoneType, phoneNumber)
 
+       def get_messages(self):
+               return ()
+
        def _grab_token(self, data):
                "Pull the magic cookie from the datastream"
                atGroup = self._accessTokenRe.search(data)
index ba0a01f..7f68285 100644 (file)
@@ -331,6 +331,7 @@ class PhoneTypeSelector(object):
                self._typemodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
                self._typeviewselection = None
 
+               self._message = self._widgetTree.get_widget("phoneSelectionMessage")
                typeview = self._widgetTree.get_widget("phonetypes")
                typeview.connect("row-activated", self._on_phonetype_select)
                typeview.set_model(self._typemodel)
@@ -345,12 +346,18 @@ class PhoneTypeSelector(object):
                self._typeviewselection = typeview.get_selection()
                self._typeviewselection.set_mode(gtk.SELECTION_SINGLE)
 
-       def run(self, contactDetails):
+       def run(self, contactDetails, message = ""):
                self._typemodel.clear()
 
                for phoneType, phoneNumber in contactDetails:
                        self._typemodel.append((phoneNumber, "%s - %s" % (make_pretty(phoneNumber), phoneType)))
 
+               if message:
+                       self._message.show()
+                       self._message.set_text(message)
+               else:
+                       self._message.hide()
+
                userResponse = self._dialog.run()
 
                if userResponse == gtk.RESPONSE_OK:
@@ -549,6 +556,8 @@ class RecentCallsView(object):
                self._recentviewColumn.add_attribute(textrenderer, "text", 1)
                self._recentviewColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
 
+               self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend)
+
        def enable(self):
                assert self._backend.is_authed()
                self._recentview.set_model(self._recentmodel)
@@ -605,10 +614,105 @@ class RecentCallsView(object):
                if not itr:
                        return
 
-               self.number_selected(self._recentmodel.get_value(itr, 0))
+               contactPhoneNumbers = [("Phone", self._recentmodel.get_value(itr, 0))]
+               description = self._recentmodel.get_value(itr, 1)
+               print repr(contactPhoneNumbers), repr(description)
+
+               phoneNumber = self._phoneTypeSelector.run(contactPhoneNumbers, message = description)
+               if 0 == len(phoneNumber):
+                       return
+
+               self.number_selected(phoneNumber)
                self._recentviewselection.unselect_all()
 
 
+class MessagesView(object):
+
+       def __init__(self, widgetTree, backend, errorDisplay):
+               self._errorDisplay = errorDisplay
+               self._backend = backend
+
+               self._messagetime = 0.0
+               self._messagemodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
+               self._messageview = widgetTree.get_widget("messages_view")
+               self._messageviewselection = None
+               self._onRcentviewRowActivatedId = 0
+
+               textrenderer = gtk.CellRendererText()
+               self._messageviewColumn = gtk.TreeViewColumn("Messages")
+               self._messageviewColumn.pack_start(textrenderer, expand=True)
+               self._messageviewColumn.add_attribute(textrenderer, "text", 1)
+               self._messageviewColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+
+               self._phoneTypeSelector = PhoneTypeSelector(widgetTree, self._backend)
+
+       def enable(self):
+               assert self._backend.is_authed()
+               self._messageview.set_model(self._messagemodel)
+
+               self._messageview.append_column(self._messageviewColumn)
+               self._messageviewselection = self._messageview.get_selection()
+               self._messageviewselection.set_mode(gtk.SELECTION_SINGLE)
+
+               self._onMessageviewRowActivatedId = self._messageview.connect("row-activated", self._on_messageview_row_activated)
+
+       def disable(self):
+               self._messageview.disconnect(self._onMessageviewRowActivatedId)
+               self._messageview.remove_column(self._messageviewColumn)
+               self._messageview.set_model(None)
+
+       def number_selected(self, number):
+               """
+               @note Actual dial function is patched in later
+               """
+               raise NotImplementedError
+
+       def update(self):
+               if (time.time() - self._messagetime) < 300:
+                       return
+               backgroundPopulate = threading.Thread(target=self._idly_populate_messageview)
+               backgroundPopulate.setDaemon(True)
+               backgroundPopulate.start()
+
+       def clear(self):
+               self._messagetime = 0.0
+               self._messagemodel.clear()
+
+       def _idly_populate_messageview(self):
+               self._messagetime = time.time()
+               self._messagemodel.clear()
+
+               try:
+                       messageItems = self._backend.get_messages()
+               except RuntimeError, e:
+                       self._errorDisplay.push_exception_with_lock(e)
+                       self._messagetime = 0.0
+                       messageItems = []
+
+               for phoneNumber, date in messageItems:
+                       item = (phoneNumber, data)
+                       with gtk_toolbox.gtk_lock():
+                               self._messagemodel.append(item)
+
+               return False
+
+       def _on_messageview_row_activated(self, treeview, path, view_column):
+               model, itr = self._messageviewselection.get_selected()
+               if not itr:
+                       return
+
+               contactPhoneNumbers = [("Phone", self._messagemodel.get_value(itr, 0))]
+               description = self._messagemodel.get_value(itr, 1)
+               print repr(contactPhoneNumbers), repr(description)
+
+               phoneNumber = self._phoneTypeSelector.run(contactPhoneNumbers, message = description)
+               if 0 == len(phoneNumber):
+                       return
+
+               self.number_selected(phoneNumber)
+               self._messageviewselection.unselect_all()
+
+
 class ContactsView(object):
 
        def __init__(self, widgetTree, backend, errorDisplay):
@@ -766,20 +870,22 @@ class ContactsView(object):
                        return
 
                contactId = self._contactsmodel.get_value(itr, 3)
+               contactName = self._contactsmodel.get_value(itr, 1)
                try:
                        contactDetails = self._addressBook.get_contact_details(contactId)
                except RuntimeError, e:
                        contactDetails = []
                        self._contactstime = 0.0
                        self._errorDisplay.push_exception(e)
-               contactDetails = [phoneNumber for phoneNumber in contactDetails]
+               contactPhoneNumbers = [phoneNumber for phoneNumber in contactDetails]
 
-               if len(contactDetails) == 0:
+               if len(contactPhoneNumbers) == 0:
                        phoneNumber = ""
-               elif len(contactDetails) == 1:
-                       phoneNumber = self._phoneTypeSelector.run(contactDetails)
+               elif len(contactPhoneNumbers) == 1:
+                       phoneNumber = self._phoneTypeSelector.run(contactPhoneNumbers, message = contactName)
 
-               if 0 < len(phoneNumber):
-                       self.number_selected(phoneNumber)
+               if 0 == len(phoneNumber):
+                       return
 
+               self.number_selected(phoneNumber)
                self._contactsviewselection.unselect_all()
index 1508bfc..f2467e2 100644 (file)
@@ -386,12 +386,19 @@ class GVDialer(object):
                voicemailHtml = self._grab_html(voicemailPage)
                smsHtml = self._grab_html(smsPage)
 
+               print "="*60
+               print voicemailHtml
+               print "-"*60
+               print smsHtml
+               print "="*60
+
                voicemailTree = ElementTree.fromstring(voicemailHtml)
                smsTree = ElementTree.fromstring(smsHtml)
 
                import xml.dom.minidom as minidom
                print minidom.parseString(voicemailTree).toprettyxml()
                print minidom.parseString(smsTree).toprettyxml()
+               return ()
 
        def _grab_json(self, flatXml):
                xmlTree = ElementTree.fromstring(flatXml)
index b20d2df..2121878 100644 (file)
@@ -86,3 +86,6 @@ class NullDialer(object):
 
        def get_contact_details(self, contactId):
                return ()
+
+       def get_messages(self):
+               return ()
index 8713ba3..35f5c6b 100644 (file)
@@ -82,6 +82,25 @@ class RecentCallsView(object):
                pass
 
 
+class MessagesView(object):
+
+       def __init__(self, widgetTree):
+               pass
+
+       def enable(self):
+               pass
+
+       def disable(self):
+               pass
+
+       def update(self):
+               pass
+
+       @staticmethod
+       def clear():
+               pass
+
+
 class ContactsView(object):
 
        def __init__(self, widgetTree):