Open conversation on message click
[conv-inbox] / src / el-home-applet.c
index 3a2088d..4f7858e 100644 (file)
 #include <libosso-abook/osso-abook-temporary-contact-dialog.h>
 #include <libosso-abook/osso-abook-account-manager.h>
 
+#include <telepathy-glib/interfaces.h>
+
 #define EL_HOME_APPLET_GET_PRIVATE(obj) ( \
         G_TYPE_INSTANCE_GET_PRIVATE (obj, \
                 EL_TYPE_HOME_APPLET, ELHomeAppletPrivate))
 
 #define BOX_WIDTH 352
-#define BOX_HEIGHT 266
+#define BOX_HEIGHT 276
 
-#define C_WIDTH (BOX_WIDTH - 2*HILDON_MARGIN_HALF)
-#define C_HEIGHT (BOX_HEIGHT - 2*HILDON_MARGIN_HALF)
-#define C_X HILDON_MARGIN_HALF
-#define C_Y 4*HILDON_MARGIN_HALF
+#define CONTENT_OFFSET_X HILDON_MARGIN_HALF
+#define CONTENT_OFFSET_Y_TOP 4*HILDON_MARGIN_HALF
+#define CONTENT_OFFSET_Y_BOTTOM HILDON_MARGIN_HALF
+#define C_WIDTH (BOX_WIDTH - 2*CONTENT_OFFSET_X)
+#define C_HEIGHT (BOX_HEIGHT - (CONTENT_OFFSET_Y_TOP + CONTENT_OFFSET_Y_BOTTOM))
 
 #define HEADER_HEIGHT 48
 #define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT)
 
 #define SCROLL_PERIOD 100 /* ms */
 #define SCROLL_STEP 1 /* pixel */
+#define TEXT_Y_OFFSET (HEADER_HEIGHT + HILDON_MARGIN_HALF)
+
+#define NOTIFICATION_UI_DBUS_NAME     "org.freedesktop.Telepathy.Client.NotificationUI"
+#define NOTIFICATION_UI_DBUS_PATH     "/org/freedesktop/Telepathy/Client/NotificationUI"
+#define NOTIFICATION_UI_DBUS_IFACE    "com.nokia.RtcomNotificationUi"
 
 struct _ELHomeAppletPrivate
 {
@@ -296,10 +304,10 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
         cairo_set_line_width (cr, 3.0f);
 
         rounded_rectangle (cr,
-                           C_X,
-                           C_Y,
-                           BOX_WIDTH - 2*C_X,
-                           BOX_HEIGHT - 2*C_Y,
+                           CONTENT_OFFSET_X,
+                           CONTENT_OFFSET_Y_TOP,
+                           BOX_WIDTH - 2*CONTENT_OFFSET_X,
+                           BOX_HEIGHT - (CONTENT_OFFSET_Y_TOP + CONTENT_OFFSET_Y_BOTTOM),
                            BOX_RADIOUS);
 
         cairo_close_path (cr);
@@ -308,7 +316,7 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
         /* draw header */
         cairo_set_line_width (cr, 1.0f);
 
-        cairo_translate (cr, C_X, C_Y);
+        cairo_translate (cr, CONTENT_OFFSET_X, CONTENT_OFFSET_Y_TOP);
         cairo_move_to (cr, 0, HEADER_HEIGHT);
         cairo_line_to (cr, 0, BOX_RADIOUS);
         cairo_curve_to (cr, 0, 0, 0, 0, BOX_RADIOUS, 0);
@@ -377,11 +385,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
         cairo_fill (cr);
 
         /* cairo_set_source_rgba (cr, red, green, blue, 1.0f); */
-        /* cairo_translate (cr, -C_X, -C_Y); */
+        /* cairo_translate (cr, -CONTENT_OFFSET_X, -C_Y); */
         /* rounded_rectangle (cr, */
-        /*                    C_X, */
+        /*                    CONTENT_OFFSET_X, */
         /*                    C_Y, */
-        /*                    BOX_WIDTH - 2*C_X, */
+        /*                    BOX_WIDTH - 2*CONTENT_OFFSET_X, */
         /*                    BOX_HEIGHT - 2*C_Y, */
         /*                    BOX_RADIOUS); */
         /* cairo_close_path (cr); */
@@ -404,16 +412,16 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
         }
 
         cairo_rectangle (cr,
-                         2*C_X,
-                         HEADER_HEIGHT,
+                         2*CONTENT_OFFSET_X,
+                         TEXT_Y_OFFSET,
                          MESSAGE_WIDTH,
                          message_height);
         cairo_clip (cr);
 
         cairo_set_source_surface (cr,
                                   priv->message_surface,
-                                  2*C_X,
-                                  HEADER_HEIGHT - priv->scroll_offset);
+                                  2*CONTENT_OFFSET_X,
+                                  TEXT_Y_OFFSET - priv->scroll_offset);
         cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
         cairo_paint (cr);
 
@@ -642,30 +650,39 @@ show_event (ELHomeApplet *self, RTComElIter *it)
         g_warning (G_STRFUNC);
         gchar *remote = NULL;
         gchar *received = NULL;
-        const gchar *icon_name = NULL;
+        /* const gchar *icon_name = NULL; */
 
         if (it && rtcom_el_iter_first (it)) {
                 rtcom_el_iter_dup_string (it, "free-text", &priv->message);
                 if (priv->message) {
-                        const gchar *service;
+                        /* const gchar *service; */
                         time_t received_t;
 
                         rtcom_el_iter_get_int (it, "id", &priv->event_id);
                         if (rtcom_el_iter_get_int (it, "start-time", (gint*)&received_t))
                                 received = format_time (received_t);
 
-                        rtcom_el_iter_dup_string (it, "remote-uid", &priv->remote_id);
-                        if (!rtcom_el_iter_dup_string (it, "remote-name", &remote))
-                                remote = g_strdup (priv->remote_id);
-
-                        rtcom_el_iter_dup_string (it, "remote-ebook-uid", &priv->contact_id);
-                        rtcom_el_iter_dup_string (it, "local-uid", &priv->local_id);
-                        g_warning ("abook uid %s", priv->contact_id);
+                        if (rtcom_el_iter_dup_string (it, "remote-uid", &priv->remote_id)) {
+                                if (priv->remote_id && priv->remote_id[0])  {
+                                        if (!rtcom_el_iter_dup_string (it, "remote-name", &remote))
+                                                remote = g_strdup (priv->remote_id);
+
+                                        rtcom_el_iter_dup_string (it, "remote-ebook-uid", &priv->contact_id);
+                                        rtcom_el_iter_dup_string (it, "local-uid", &priv->local_id);
+                                        g_warning ("abook uid %s", priv->contact_id);
+                                }
+                                else if (priv->remote_id) {
+                                        g_free (priv->remote_id);
+                                        priv->remote_id = NULL;
+                                }
+                        }
+#if 0
                         service = rtcom_el_iter_get_service (it);
                         if (!g_strcmp0 (service, "RTCOM_EL_SERVICE_SMS"))
                                 icon_name = "chat_unread_sms";
                         else if (!g_strcmp0 (service, "RTCOM_EL_SERVICE_CHAT"))
                                 icon_name = "chat_unread_chat";
+#endif
                 }
         }
         else {
@@ -681,11 +698,6 @@ show_event (ELHomeApplet *self, RTComElIter *it)
 
         if (priv->message) {
                 gtk_widget_hide (priv->empty);
-                /* TODO: don's show avatar at all, fix layout */
-                gtk_widget_show (priv->avatar);
-                gtk_image_set_from_icon_name (GTK_IMAGE (priv->avatar),
-                                              "general_default_avatar",
-                                              HILDON_ICON_SIZE_THUMB);
         }
         else {
                 gtk_widget_show (priv->empty);
@@ -827,6 +839,72 @@ read_event (ELHomeApplet *self)
 }
 
 static void
+remove_notification (ELHomeApplet *self)
+{
+        ELHomeAppletPrivate *priv = self->priv;
+
+        DBusGConnection* conn;
+        GError *error;
+        DBusGProxy *proxy;
+        GPtrArray *conv_structs;
+        GType conv_structs_type;
+        GValueArray *account_info;
+        GValue value = {0, };
+        DBusGProxyCall *call;
+
+        if (!(priv->remote_id && priv->local_id))
+                return;
+
+        conn = hd_home_plugin_item_get_dbus_g_connection (HD_HOME_PLUGIN_ITEM (self),
+                                                          DBUS_BUS_SESSION,
+                                                          &error);
+        if (!conn) {
+                g_error ("Failed get dbus g connection %s", error->message);
+                g_error_free (error);
+                return;
+        }
+
+        proxy = dbus_g_proxy_new_for_name (conn,
+                                           NOTIFICATION_UI_DBUS_NAME,
+                                           NOTIFICATION_UI_DBUS_PATH,
+                                           NOTIFICATION_UI_DBUS_IFACE);
+
+        conv_structs = g_ptr_array_sized_new (1);
+        account_info = g_value_array_new (2);
+
+        g_value_init (&value, G_TYPE_STRING);
+        g_value_set_string (&value, priv->local_id);
+        g_value_array_append (account_info, &value);
+        g_value_unset (&value);
+
+        g_value_init (&value, G_TYPE_STRING);
+        g_value_set_string (&value, priv->remote_id);
+        g_value_array_append (account_info, &value);
+        g_value_unset (&value);
+
+        g_ptr_array_add (conv_structs, account_info);
+
+        conv_structs_type = dbus_g_type_get_collection
+                ("GPtrArray",
+                 dbus_g_type_get_struct ("GValueArray",
+                                         G_TYPE_STRING,
+                                         G_TYPE_STRING,
+                                         G_TYPE_INVALID));
+
+        call = dbus_g_proxy_begin_call (proxy,
+                                        "ClearConversationNotifications",
+                                        NULL, NULL, NULL,
+                                        conv_structs_type,
+                                        conv_structs,
+                                        G_TYPE_INVALID);
+
+        g_value_array_free (account_info);
+        g_ptr_array_free (conv_structs, TRUE);
+
+        g_object_unref (proxy);
+}
+
+static void
 mark_as_read (ELHomeApplet *self)
 {
         ELHomeAppletPrivate *priv = self->priv;
@@ -836,9 +914,39 @@ mark_as_read (ELHomeApplet *self)
                                          priv->event_id,
                                          TRUE,
                                          NULL);
+                remove_notification (self);
         }
 }
 
+static void
+open_conversation (ELHomeApplet *self)
+{
+        ELHomeAppletPrivate *priv = self->priv;
+        McAccount *account;
+        McAccountChannelrequestData request;
+
+        if (!(priv->remote_id && priv->local_id))
+                return;
+
+        account = osso_abook_account_manager_lookup_by_name (NULL,
+                                                             priv->local_id);
+        if (!account)
+                return;
+
+        MC_ACCOUNT_CRD_INIT (&request);
+        MC_ACCOUNT_CRD_SET (&request, channel_type, TP_IFACE_QUARK_CHANNEL_TYPE_TEXT);
+        MC_ACCOUNT_CRD_SET (&request, target_handle_type, TP_HANDLE_TYPE_CONTACT);
+        MC_ACCOUNT_CRD_SET (&request, target_id, priv->remote_id);
+
+        mc_account_channelrequest (
+                account,
+                &request,
+                time (NULL),
+                NULL, /* handler */
+                MC_ACCOUNT_CR_FLAG_USE_EXISTING,
+                NULL, NULL, NULL, NULL);
+}
+
 static gboolean
 read_new_event (ELHomeApplet *self)
 {
@@ -886,8 +994,8 @@ scroll_anim_cb (ELHomeApplet *self)
 
         priv->scroll_offset += SCROLL_STEP;
         gtk_widget_queue_draw_area (GTK_WIDGET (self),
-                                    3*C_X,
-                                    HEADER_HEIGHT + C_Y,
+                                    3*CONTENT_OFFSET_X,
+                                    HEADER_HEIGHT + CONTENT_OFFSET_Y_TOP,
                                     MESSAGE_WIDTH,
                                     C_HEIGHT - priv->received->allocation.height - HEADER_HEIGHT);
 
@@ -909,7 +1017,7 @@ button_press_event_cb (GtkWidget      *widget,
         ELHomeAppletPrivate *priv = self->priv;
 
         if (priv->event_id > 0) {
-                if (event->y < C_Y + HEADER_HEIGHT) {
+                if (event->y < CONTENT_OFFSET_Y_TOP + HEADER_HEIGHT) {
                         if (priv->aggregator &&
                             osso_abook_waitable_is_ready
                             (OSSO_ABOOK_WAITABLE (priv->aggregator), NULL))
@@ -993,7 +1101,8 @@ button_release_event_cb (GtkWidget      *widget,
                 }
                 else {
 #ifndef DEBUG_LAYOUT
-                        mark_as_read (self);
+                        /* mark_as_read (self); */
+                        open_conversation (self);
 #endif
                 }
 
@@ -1082,11 +1191,14 @@ el_home_applet_init (ELHomeApplet *self)
         priv->sender = gtk_label_new ("asdf asdf asdf asdf asdf");
         gtk_misc_set_alignment (GTK_MISC (priv->sender),
                                 0.5f,
-                                0.5f);
+                                0.55f);
         gtk_label_set_ellipsize (GTK_LABEL (priv->sender),
                                  PANGO_ELLIPSIZE_END);
         gtk_widget_set_name (priv->sender, "hildon-shadow-label");
         hildon_helper_set_logical_font (priv->sender, "SystemFont");
+        gtk_widget_set_size_request (priv->sender,
+                                     -1,
+                                     HILDON_ICON_PIXEL_SIZE_THUMB);
 
         priv->message = g_strdup ("One two three four five six seven eight nine ten");
 
@@ -1112,10 +1224,9 @@ el_home_applet_init (ELHomeApplet *self)
         GTK_WIDGET_SET_FLAGS (priv->cut_message, GTK_NO_SHOW_ALL);
 
         hbox = gtk_hbox_new (FALSE, 0);
-        /* gtk_box_pack_start (GTK_BOX (hbox), priv->unread, FALSE, FALSE, 0); */
         /* gtk_box_pack_start (GTK_BOX (hbox), priv->icon, FALSE, FALSE, 0); */
-        gtk_box_pack_start (GTK_BOX (hbox), priv->avatar, FALSE, FALSE, 0);
         gtk_box_pack_start (GTK_BOX (hbox), priv->sender, TRUE, TRUE, 0);
+        gtk_box_pack_start (GTK_BOX (hbox), priv->avatar, FALSE, FALSE, 0);
 
         footer = gtk_hbox_new (FALSE, 0);
         gtk_box_pack_start (GTK_BOX (footer), priv->unread, FALSE, FALSE, 0);