]> git.0d.be Git - empathy.git/commitdiff
Add SMS entry to empathy-individual-menu
authorDanielle Madeley <danielle.madeley@collabora.co.uk>
Wed, 6 Apr 2011 06:34:43 +0000 (16:34 +1000)
committerDanielle Madeley <danielle.madeley@collabora.co.uk>
Thu, 5 May 2011 06:30:39 +0000 (16:30 +1000)
libempathy-gtk/empathy-images.h
libempathy-gtk/empathy-individual-menu.c
libempathy-gtk/empathy-individual-menu.h
libempathy/empathy-contact.c
libempathy/empathy-contact.h

index 2c40b2ae79bac5ce46d28d9174a26d6226fc41cf..86f1db641b379c64b85c9f053c63d110785a473c 100644 (file)
@@ -40,6 +40,7 @@ G_BEGIN_DECLS
 #define EMPATHY_IMAGE_TYPING              "user-typing"
 #define EMPATHY_IMAGE_CONTACT_INFORMATION "gtk-info"
 #define EMPATHY_IMAGE_GROUP_MESSAGE       "system-users"
+#define EMPATHY_IMAGE_SMS                 "stock_cell-phone"
 #define EMPATHY_IMAGE_VOIP                "audio-input-microphone"
 #define EMPATHY_IMAGE_VIDEO_CALL          "camera-web"
 #define EMPATHY_IMAGE_LOG                 "document-open-recent"
index 3e404c39fddc8be7d1cac3d1f11ba6e583ce7220..70846c7633a2c8634aa75b2c75a2258b109465ba 100644 (file)
@@ -149,6 +149,14 @@ individual_menu_add_personas (GtkMenuShell *menu,
           gtk_widget_show (action);
         }
 
+      /* SMS */
+      if (features & EMPATHY_INDIVIDUAL_FEATURE_SMS)
+        {
+          action = empathy_individual_sms_menu_item_new (NULL, contact);
+          gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
+          gtk_widget_show (action);
+        }
+
       if (features & EMPATHY_INDIVIDUAL_FEATURE_CALL)
         {
           /* Audio Call */
@@ -238,6 +246,17 @@ constructed (GObject *object)
         }
     }
 
+  /* SMS */
+  if (features & EMPATHY_INDIVIDUAL_FEATURE_SMS)
+    {
+      item = empathy_individual_sms_menu_item_new (individual, NULL);
+      if (item != NULL)
+        {
+          gtk_menu_shell_append (shell, item);
+          gtk_widget_show (item);
+        }
+    }
+
   if (features & EMPATHY_INDIVIDUAL_FEATURE_CALL)
     {
       /* Audio Call */
@@ -536,6 +555,52 @@ empathy_individual_chat_menu_item_new (FolksIndividual *individual,
   return item;
 }
 
+static void
+empathy_individual_sms_menu_item_activated (GtkMenuItem *item,
+  EmpathyContact *contact)
+{
+  g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+
+  empathy_dispatcher_sms_contact_id (
+      empathy_contact_get_account (contact),
+      empathy_contact_get_id (contact),
+      gtk_get_current_event_time ());
+}
+
+GtkWidget *
+empathy_individual_sms_menu_item_new (FolksIndividual *individual,
+    EmpathyContact *contact)
+{
+  GtkWidget *item;
+  GtkWidget *image;
+
+  g_return_val_if_fail ((FOLKS_IS_INDIVIDUAL (individual) &&
+      empathy_folks_individual_contains_contact (individual)) ||
+      EMPATHY_IS_CONTACT (contact),
+      NULL);
+
+  item = gtk_image_menu_item_new_with_mnemonic (_("_SMS"));
+  image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_SMS,
+      GTK_ICON_SIZE_MENU);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+  gtk_widget_show (image);
+
+  if (contact != NULL)
+    {
+      menu_item_set_contact (item, contact,
+          G_CALLBACK (empathy_individual_sms_menu_item_activated),
+          EMPATHY_ACTION_SMS);
+    }
+  else
+    {
+      menu_item_set_first_contact (item, individual,
+          G_CALLBACK (empathy_individual_sms_menu_item_activated),
+          EMPATHY_ACTION_SMS);
+    }
+
+  return item;
+}
+
 static void
 empathy_individual_audio_call_menu_item_activated (GtkMenuItem *item,
   EmpathyContact *contact)
index 5b3d220df00c22d865a6e2c3a39aaae64aa224d2..c2841ad6de7075045453cd7dc5312496a0a283e6 100644 (file)
@@ -36,7 +36,8 @@ typedef enum {
        EMPATHY_INDIVIDUAL_FEATURE_INFO = 1 << 4,
        EMPATHY_INDIVIDUAL_FEATURE_FAVOURITE = 1 << 5,
        EMPATHY_INDIVIDUAL_FEATURE_LINK = 1 << 6,
-       EMPATHY_INDIVIDUAL_FEATURE_ALL = (1 << 7) - 1,
+       EMPATHY_INDIVIDUAL_FEATURE_SMS = 1 << 7,
+       EMPATHY_INDIVIDUAL_FEATURE_ALL = (1 << 8) - 1,
 } EmpathyIndividualFeatureFlags;
 
 #define EMPATHY_TYPE_INDIVIDUAL_MENU (empathy_individual_menu_get_type ())
@@ -69,6 +70,8 @@ GtkWidget * empathy_individual_menu_new (FolksIndividual *individual,
     EmpathyIndividualFeatureFlags features);
 GtkWidget * empathy_individual_chat_menu_item_new (FolksIndividual *individual,
     EmpathyContact *contact);
+GtkWidget * empathy_individual_sms_menu_item_new (FolksIndividual *individual,
+    EmpathyContact *contact);
 GtkWidget * empathy_individual_audio_call_menu_item_new (
     FolksIndividual *individual,
     EmpathyContact *contact);
index 680094a547d19e3869c17d934601b1b1b5eaa6e0..620c479e2724a05a65ab304b824a40c80a52f2f6 100644 (file)
@@ -1097,6 +1097,18 @@ empathy_contact_get_status (EmpathyContact *contact)
       empathy_contact_get_presence (contact));
 }
 
+gboolean
+empathy_contact_can_sms (EmpathyContact *contact)
+{
+  EmpathyContactPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
+
+  priv = GET_PRIV (contact);
+
+  return priv->capabilities & EMPATHY_CAPABILITIES_SMS;
+}
+
 gboolean
 empathy_contact_can_voip (EmpathyContact *contact)
 {
@@ -1189,6 +1201,9 @@ empathy_contact_can_do_action (EmpathyContact *self,
       case EMPATHY_ACTION_CHAT:
         sensitivity = TRUE;
         break;
+      case EMPATHY_ACTION_SMS:
+        sensitivity = empathy_contact_can_sms (self);
+        break;
       case EMPATHY_ACTION_AUDIO_CALL:
         sensitivity = empathy_contact_can_voip_audio (self);
         break;
@@ -1729,6 +1744,12 @@ tp_caps_to_capabilities (TpCapabilities *caps)
                     TP_PROP_CHANNEL_TYPE_STREAMED_MEDIA_INITIAL_VIDEO, NULL))
             capabilities |= EMPATHY_CAPABILITIES_VIDEO;
         }
+      else if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_TEXT))
+        {
+          if (tp_asv_get_boolean (fixed_prop,
+                TP_PROP_CHANNEL_INTERFACE_SMS_SMS_CHANNEL, NULL))
+            capabilities |= EMPATHY_CAPABILITIES_SMS;
+        }
     }
 
   return capabilities;
index f9217c108c4780379dcfafc26a82ce3f71a35bb5..16b50e500c4907472cb114b5dcde189e26413129 100644 (file)
@@ -67,6 +67,7 @@ typedef enum {
   EMPATHY_CAPABILITIES_VIDEO = 1 << 1,
   EMPATHY_CAPABILITIES_FT = 1 << 2,
   EMPATHY_CAPABILITIES_RFB_STREAM_TUBE = 1 << 3,
+  EMPATHY_CAPABILITIES_SMS = 1 << 4,
   EMPATHY_CAPABILITIES_UNKNOWN = 1 << 7
 } EmpathyCapabilities;
 
@@ -94,6 +95,7 @@ void empathy_contact_set_is_user (EmpathyContact *contact,
     gboolean is_user);
 gboolean empathy_contact_is_online (EmpathyContact *contact);
 const gchar * empathy_contact_get_status (EmpathyContact *contact);
+gboolean empathy_contact_can_sms (EmpathyContact *contact);
 gboolean empathy_contact_can_voip (EmpathyContact *contact);
 gboolean empathy_contact_can_voip_audio (EmpathyContact *contact);
 gboolean empathy_contact_can_voip_video (EmpathyContact *contact);
@@ -102,6 +104,7 @@ gboolean empathy_contact_can_use_rfb_stream_tube (EmpathyContact *contact);
 
 typedef enum {
   EMPATHY_ACTION_CHAT,
+  EMPATHY_ACTION_SMS,
   EMPATHY_ACTION_AUDIO_CALL,
   EMPATHY_ACTION_VIDEO_CALL,
   EMPATHY_ACTION_VIEW_LOGS,