Fix scrolling animation glitches. Increase footer press area.
[conv-inbox] / src / el-home-applet.c
index 3e6c0e3..606b92e 100644 (file)
@@ -37,6 +37,8 @@
 #include <libosso-abook/osso-abook-account-manager.h>
 
 #include <telepathy-glib/interfaces.h>
+#include <telepathy-glib/dbus.h>
+#include <rtcom-telepathy-glib/extensions.h>
 
 #define EL_HOME_APPLET_GET_PRIVATE(obj) ( \
         G_TYPE_INSTANCE_GET_PRIVATE (obj, \
@@ -53,8 +55,9 @@
 
 #define HEADER_HEIGHT 48
 #define FOOTER_HEIGHT 24
-#define FOOTER_HEIGHT_PRESS 48 /* approx, used only for checking clicks, bigger than controls */
-#define FOOTER_WIDTH C_WIDTH/5
+#define FOOTER_HEIGHT_PRESS FOOTER_HEIGHT*2 /* approx, used only for checking clicks */
+#define FOOTER_WIDTH C_WIDTH/4
+#define FOOTER_WIDTH_PRESS (FOOTER_WIDTH + FOOTER_WIDTH/2) /* approx, used only for checking clicks, bigger than controls */
 
 #define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT - FOOTER_HEIGHT)
 #define MESSAGE_WIDTH (C_WIDTH - 2*HILDON_MARGIN_DEFAULT)
@@ -117,6 +120,7 @@ struct _ELHomeAppletPrivate
         gchar *contact_id;
         gchar *remote_id;
         gchar *local_id;
+        gchar *group_uid;
         OssoABookContact *contact;
 };
 
@@ -511,6 +515,10 @@ clean_state (ELHomeApplet *self)
                 g_free (priv->remote_id);
                 priv->remote_id = NULL;
         }
+        if (priv->group_uid) {
+                g_free (priv->group_uid);
+                priv->group_uid = NULL;
+        }
 
         if (priv->contact) {
                 g_object_unref (priv->contact);
@@ -722,6 +730,7 @@ show_event (ELHomeApplet *self, RTComElIter *it)
                                         priv->remote_id = NULL;
                                 }
                         }
+                        rtcom_el_iter_dup_string (it, "group-uid", &priv->group_uid);
 #if 0
                         service = rtcom_el_iter_get_service (it);
                         if (!g_strcmp0 (service, "RTCOM_EL_SERVICE_SMS"))
@@ -966,9 +975,9 @@ open_conversation (ELHomeApplet *self)
 {
         ELHomeAppletPrivate *priv = self->priv;
         McAccount *account;
-        McAccountChannelrequestData request;
+        const gchar *persistent_id = NULL;
 
-        if (!(priv->remote_id && priv->local_id))
+        if (!((priv->remote_id || priv->group_uid) && priv->local_id))
                 return;
 
         account = osso_abook_account_manager_lookup_by_name (NULL,
@@ -976,18 +985,47 @@ open_conversation (ELHomeApplet *self)
         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);
+        if (priv->group_uid &&
+            g_str_has_prefix (priv->group_uid, "group:")) {
+                persistent_id = strchr (priv->group_uid, '-');
+                if (persistent_id)
+                        persistent_id++;
+        }
+
+        if (persistent_id && persistent_id[0] != '\0') {
+                GHashTable *properties = tp_asv_new
+                        (TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING,
+                         TP_IFACE_CHANNEL_TYPE_TEXT,
+                         TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_UINT,
+                         TP_HANDLE_TYPE_NONE,
+                         RTCOM_TP_IFACE_CHANNEL_INTERFACE_PERSISTENT ".PersistentID",
+                         G_TYPE_STRING, persistent_id,
+                         NULL);
+
+                mc_account_channelrequest_ht (account,
+                                              properties,
+                                              time (NULL),
+                                              NULL,
+                                              MC_ACCOUNT_CR_FLAG_USE_EXISTING,
+                                              NULL, NULL, NULL, NULL);
+
+                g_hash_table_unref (properties);
+        }
+        else if (priv->remote_id) {
+                McAccountChannelrequestData request;
+
+                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,
+                                           MC_ACCOUNT_CR_FLAG_USE_EXISTING,
+                                           NULL, NULL, NULL, NULL);
+        }
 }
 
 static gboolean
@@ -1040,7 +1078,7 @@ scroll_anim_cb (ELHomeApplet *self)
                                     3*CONTENT_OFFSET_X,
                                     HEADER_HEIGHT + CONTENT_OFFSET_Y_TOP,
                                     MESSAGE_WIDTH,
-                                    C_HEIGHT - priv->received->allocation.height - HEADER_HEIGHT);
+                                    MESSAGE_HEIGHT);
 
         to_continue = priv->scroll_offset <= priv->hidden_message_height;
         if (!to_continue) {
@@ -1066,7 +1104,7 @@ button_press_event_cb (GtkWidget      *widget,
                                 priv->active = SELECTED_HEADER;
                 }
                 else if (event->y > (BOX_HEIGHT - CONTENT_OFFSET_Y_BOTTOM - FOOTER_HEIGHT_PRESS) &&
-                         event->x < FOOTER_WIDTH)
+                         event->x < FOOTER_WIDTH_PRESS)
                         priv->active = SELECTED_FOOTER;
                 else
                         priv->active = SELECTED_BODY;