From 1f5be6cb0ff20c90f14caca72867ff39a27aa6a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20H=C3=B6rist?= Date: Tue, 12 Feb 2019 21:40:43 +0100 Subject: [PATCH] Add mobile phone indicator Shows a mobile phone icon if the last message was received by a client which identifies as phone --- gajim/chat_control.py | 12 +++++++++++ gajim/common/caps_cache.py | 8 +++++++ gajim/common/contacts.py | 4 ++++ gajim/common/modules/message.py | 5 +++++ gajim/data/gui/chat_control.ui | 37 +++++++++++++++++++++++---------- 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/gajim/chat_control.py b/gajim/chat_control.py index 7f5e81c5a..c9cfabff5 100644 --- a/gajim/chat_control.py +++ b/gajim/chat_control.py @@ -235,6 +235,8 @@ class ChatControl(ChatControlBase): self._on_tune_received) app.ged.register_event_handler('location-received', ged.GUI1, self._on_location_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, @@ -476,6 +478,14 @@ class ChatControl(ChatControlBase): self.parent_win.redraw_tab(self) self.parent_win.show_title() + @ensure_proper_control + def _on_update_client_info(self, event): + 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 @@ -1093,6 +1103,8 @@ class ChatControl(ChatControlBase): self._on_tune_received) app.ged.remove_event_handler('location-received', ged.GUI1, self._on_location_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 db2d9b4ba..1b027c7ed 100644 --- a/gajim/common/caps_cache.py +++ b/gajim/common/caps_cache.py @@ -78,6 +78,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 b8f711151..45420850c 100644 --- a/gajim/common/contacts.py +++ b/gajim/common/contacts.py @@ -127,6 +127,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 9dac01525..b5e9c8c6f 100644 --- a/gajim/common/modules/message.py +++ b/gajim/common/modules/message.py @@ -172,6 +172,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 65bedc2cd..47a2971ca 100644 --- a/gajim/data/gui/chat_control.ui +++ b/gajim/data/gui/chat_control.ui @@ -407,12 +407,13 @@ - - True + False True 1