From 1f5be6cb0ff20c90f14caca72867ff39a27aa6a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Philipp=20H=C3=B6rist?= <philipp@hoerist.com>
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 7f5e81c5a5..c9cfabff56 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 db2d9b4ba0..1b027c7eda 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 b8f7111514..45420850cd 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 9dac01525e..b5e9c8c6f3 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 65bedc2cdd..47a2971ca4 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>
-- 
GitLab