[empathy] Add a heuristic to prefer audio- and video-capable Personas when calling



commit 415b48c96ad03fa4949268d0ce9645f02005a818
Author: Philip Withnall <philip withnall collabora co uk>
Date:   Thu Sep 2 16:02:01 2010 +0100

    Add a heuristic to prefer audio- and video-capable Personas when calling
    
    When choosing which Persona out of an Individual to start an audio or video
    call to, given a choice between two Personas of equal presence, choose the
    one which is capable of both audio and video calls over the one which is
    capable of only one of the two. This is because clients which can do both
    types of call are generally more featureful than those which can only do one
    type. Helps: bgo#628338

 libempathy/empathy-contact.c |   28 +++++++++++++++++++++++++++-
 1 files changed, 27 insertions(+), 1 deletions(-)
---
diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c
index 0bba883..ec5d83a 100644
--- a/libempathy/empathy-contact.c
+++ b/libempathy/empathy-contact.c
@@ -1750,14 +1750,40 @@ presence_sort_func (EmpathyContact *a, EmpathyContact *b)
       folks_presence_get_presence_type (presence_b));
 }
 
+/* Sort by presence as with presence_sort_func(), but if the two contacts have
+ * the same presence, prefer the one which can do both audio *and* video calls,
+ * over the one which can only do one of the two. */
+static int
+voip_sort_func (EmpathyContact *a, EmpathyContact *b)
+{
+  gboolean has_audio_video_a, has_audio_video_b;
+  gint presence_sort = presence_sort_func (a, b);
+
+  if (presence_sort != 0)
+    return presence_sort;
+
+  has_audio_video_a = empathy_contact_can_voip_audio (a) &&
+      empathy_contact_can_voip_video (a);
+  has_audio_video_b = empathy_contact_can_voip_audio (b) &&
+      empathy_contact_can_voip_video (b);
+
+  if (has_audio_video_a && !has_audio_video_b)
+    return -1;
+  else if (!has_audio_video_a && has_audio_video_b)
+    return 1;
+  else
+    return 0;
+}
+
 static GCompareFunc
 get_sort_func_for_action (EmpathyActionType action_type)
 {
   switch (action_type)
     {
-      case EMPATHY_ACTION_CHAT:
       case EMPATHY_ACTION_AUDIO_CALL:
       case EMPATHY_ACTION_VIDEO_CALL:
+        return (GCompareFunc) voip_sort_func;
+      case EMPATHY_ACTION_CHAT:
       case EMPATHY_ACTION_VIEW_LOGS:
       case EMPATHY_ACTION_SEND_FILE:
       case EMPATHY_ACTION_SHARE_MY_DESKTOP:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]