diff --git a/gajim/chat_control.py b/gajim/chat_control.py index eea631fa16788f7171495e8e5625953d589319dc..20abe3dcdec1ab1a1e81f9ab5e324b9d0af63995 100644 --- a/gajim/chat_control.py +++ b/gajim/chat_control.py @@ -225,6 +225,9 @@ class ChatControl(ChatControlBase): app.ged.register_event_handler('pep-received', ged.GUI1, self._nec_pep_received) + app.ged.register_event_handler('update-client-info', ged.GUI1, + self._on_update_client_info) + if self.TYPE_ID == message_control.TYPE_CHAT: # Dont connect this when PrivateChatControl is used app.ged.register_event_handler('update-roster-avatar', ged.GUI1, @@ -435,6 +438,17 @@ class ChatControl(ChatControlBase): else: self.update_pep(obj.pep_type) + def _on_update_client_info(self, event): + if event.account != self.account: + return + if event.jid != self.contact.jid: + return + contact = app.contacts.get_contact( + self.account, event.jid, event.resource) + if contact is None: + return + self.xml.get_object('phone_image').set_visible(contact.uses_phone) + def _update_jingle(self, jingle_type): if jingle_type not in ('audio', 'video'): return @@ -1063,6 +1077,9 @@ class ChatControl(ChatControlBase): app.ged.remove_event_handler('pep-received', ged.GUI1, self._nec_pep_received) + app.ged.remove_event_handler('update-client-info', ged.GUI1, + self._on_update_client_info) + if self.TYPE_ID == message_control.TYPE_CHAT: app.ged.remove_event_handler('update-roster-avatar', ged.GUI1, self._nec_update_avatar) diff --git a/gajim/common/caps_cache.py b/gajim/common/caps_cache.py index 6a6ea9a07ca378b0eaa89482f0de001c6a44c821..5220cbf5918e4302b92bb6fe1ce7bacca84ac1b8 100644 --- a/gajim/common/caps_cache.py +++ b/gajim/common/caps_cache.py @@ -77,6 +77,14 @@ def client_supports(client_caps, requested_feature): return requested_feature not in FEATURE_BLACKLIST return False +def get_client_identity(client_caps): + lookup_item = client_caps.get_cache_lookup_strategy() + cache_item = lookup_item(capscache) + + for identity in cache_item.identities: + if identity.get('category') == 'client': + return identity.get('type') + def create_suitable_client_caps(node, caps_hash, hash_method, fjid=None): """ Create and return a suitable ClientCaps object for the given node, diff --git a/gajim/common/contacts.py b/gajim/common/contacts.py index 63b2d3363203daab89b0e513c4d098ddc9831d8c..b574f6c0d45b78b6877d7ff330c8698ecd29c4e0 100644 --- a/gajim/common/contacts.py +++ b/gajim/common/contacts.py @@ -116,6 +116,10 @@ class CommonContact(XMPPEntity): return False return caps_cache.client_supports(self.client_caps, requested_feature) + @property + def uses_phone(self): + return caps_cache.get_client_identity(self.client_caps) == 'phone' + class Contact(CommonContact): """ diff --git a/gajim/common/modules/message.py b/gajim/common/modules/message.py index cb6e5a9d97221bc9ef7a2ba7c74c5ded75390f76..888a9d894df7a331bc9ec18b4900bd4be6d74550 100644 --- a/gajim/common/modules/message.py +++ b/gajim/common/modules/message.py @@ -207,6 +207,11 @@ class Message: 'gc_control': gc_control } + app.nec.push_incoming_event(NetworkEvent('update-client-info', + account=self._account, + jid=jid, + resource=resource)) + event = MessageReceivedEvent(None, **event_attr) app.nec.push_incoming_event(event) diff --git a/gajim/data/gui/chat_control.ui b/gajim/data/gui/chat_control.ui index 65bedc2cdd54ee57483a11dad2f645721c7a642e..47a2971ca4e4a64667294add614311905ca35022 100644 --- a/gajim/data/gui/chat_control.ui +++ b/gajim/data/gui/chat_control.ui @@ -407,12 +407,13 @@ </packing> </child> <child> - <object class="GtkBox" id="banner_vbox"> + <object class="GtkGrid"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> + <property name="valign">center</property> + <property name="margin_left">5</property> + <property name="hexpand">True</property> + <property name="row_spacing">2</property> <child> <object class="GtkLabel" id="banner_name_label"> <property name="name">ChatControl-BannerNameLabel</property> @@ -423,9 +424,9 @@ <property name="xalign">0</property> </object> <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">2</property> </packing> </child> <child> @@ -433,6 +434,7 @@ <property name="name">ChatControl-BannerLabel</property> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="hexpand">True</property> <property name="label">label</property> <property name="use_markup">True</property> <property name="selectable">True</property> @@ -440,14 +442,27 @@ <signal name="populate-popup" handler="on_banner_label_populate_popup" swapped="no"/> </object> <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkImage" id="phone_image"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="tooltip_text" translatable="yes">The last message was written on a mobile client</property> + <property name="halign">start</property> + <property name="margin_right">4</property> + <property name="icon_name">phone-apple-iphone-symbolic</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> </packing> </child> </object> <packing> - <property name="expand">True</property> + <property name="expand">False</property> <property name="fill">True</property> <property name="position">1</property> </packing>