#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 284
-#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 FOOTER_HEIGHT 24
+#define FOOTER_HEIGHT_PRESS 48 /* approx, used only for checking clicks, bigger than controls */
+#define FOOTER_WIDTH C_WIDTH/4
+
+#define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT - FOOTER_HEIGHT)
#define MESSAGE_WIDTH (C_WIDTH - 2*HILDON_MARGIN_DEFAULT)
#define BOX_RADIOUS 10
#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"
+
+typedef enum {
+ SELECTED_NONE,
+ SELECTED_HEADER,
+ SELECTED_BODY,
+ SELECTED_FOOTER
+} WidgetActiveSelection;
struct _ELHomeAppletPrivate
{
gchar *message;
gint event_id;
- gboolean active_body;
- gboolean active_header;
+ WidgetActiveSelection active;
guint unread_count;
gchar *contact_id;
gchar *remote_id;
gchar *local_id;
+ OssoABookContact *contact;
};
HD_DEFINE_PLUGIN_MODULE (ELHomeApplet, el_home_applet, HD_TYPE_HOME_PLUGIN_ITEM);
{
ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv;
cairo_t *cr;
- int message_height;
-
- message_height = C_HEIGHT - priv->received->allocation.height - HEADER_HEIGHT;
+ cairo_pattern_t *grad;
cr = gdk_cairo_create (self->window);
gdk_cairo_region (cr, event->region);
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);
/* 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);
cairo_close_path (cr);
- if (priv->active_header)
+ switch (priv->active) {
+ case SELECTED_HEADER:
cairo_set_source_rgba (cr,
priv->active_color.red,
priv->active_color.green,
priv->active_color.blue,
0.8f);
- else
+ break;
+ default:
cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f);
+ }
+
cairo_fill (cr);
cairo_move_to (cr, 0, HEADER_HEIGHT);
cairo_stroke (cr);
/* draw body */
- cairo_move_to (cr, 0, HEADER_HEIGHT);
- cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS);
- cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT);
- cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT);
- cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS);
- cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT);
- cairo_line_to (cr, 0, HEADER_HEIGHT);
- cairo_close_path (cr);
+ if (!priv->message) {
+ cairo_move_to (cr, 0, HEADER_HEIGHT);
+ cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS);
+ cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT);
+ cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT);
+ cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS);
+ cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT);
+ cairo_line_to (cr, 0, HEADER_HEIGHT);
+ cairo_close_path (cr);
+ }
+ else
+ cairo_rectangle (cr, 0, HEADER_HEIGHT,
+ C_WIDTH, MESSAGE_HEIGHT);
/* draw body filling depending on (in)active state */
- cairo_pattern_t *grad;
grad = cairo_pattern_create_linear (0, HEADER_HEIGHT,
- 0, C_HEIGHT);
+ 0, C_HEIGHT - FOOTER_HEIGHT);
- if (priv->active_body) {
+ switch (priv->active) {
+ case SELECTED_BODY:
cairo_pattern_add_color_stop_rgba (grad,
0.5f,
priv->active_color.red,
priv->active_color.green/2,
priv->active_color.blue/2,
0.8f);
- }
- else {
+ break;
+ default:
cairo_pattern_add_color_stop_rgba (grad, 0.5f,
0.4f, 0.4f, 0.4f, 0.8f);
cairo_pattern_add_color_stop_rgba (grad, 1.0f,
0.2f, 0.2f, 0.2f, 0.8f);
}
+
cairo_set_source (cr, grad);
cairo_fill (cr);
- /* cairo_set_source_rgba (cr, red, green, blue, 1.0f); */
- /* cairo_translate (cr, -C_X, -C_Y); */
- /* rounded_rectangle (cr, */
- /* C_X, */
- /* C_Y, */
- /* BOX_WIDTH - 2*C_X, */
- /* BOX_HEIGHT - 2*C_Y, */
- /* BOX_RADIOUS); */
- /* cairo_close_path (cr); */
- /* cairo_stroke (cr); */
-
- /* draw message */
- if (!priv->message_surface) {
- gint height;
-
- priv->message_surface = draw_text (cr,
- priv->font_desc,
- priv->message,
- MESSAGE_WIDTH,
- &height);
-
- priv->hidden_message_height = height - message_height;
- priv->scroll_on_click = priv->hidden_message_height > 0;
- if (priv->scroll_on_click)
- gtk_widget_show (priv->cut_message);
- }
+ cairo_pattern_destroy (grad);
- cairo_rectangle (cr,
- 2*C_X,
- HEADER_HEIGHT,
- MESSAGE_WIDTH,
- message_height);
- cairo_clip (cr);
+ if (priv->message) {
+ /* draw footer unread part bg */
+ cairo_move_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT);
+ cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS);
+ cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT);
+ cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT);
+ cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT);
+ cairo_line_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT);
+ cairo_close_path (cr);
+
+ /* draw body filling depending on (in)active state */
+ switch (priv->active) {
+ case SELECTED_FOOTER:
+ cairo_set_source_rgba (cr,
+ priv->active_color.red,
+ priv->active_color.green,
+ priv->active_color.blue,
+ 0.8f);
+ break;
+ default:
+ cairo_set_source_rgba (cr, 0.1f, 0.1f, 0.1f, 0.9f);
+ }
+ cairo_fill (cr);
- cairo_set_source_surface (cr,
- priv->message_surface,
- 2*C_X,
- HEADER_HEIGHT - priv->scroll_offset);
- cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- cairo_paint (cr);
+ /* draw footer received part bg */
+ cairo_move_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT);
+ cairo_rel_line_to (cr, 0, FOOTER_HEIGHT);
+ cairo_rel_line_to (cr, C_WIDTH - FOOTER_WIDTH - BOX_RADIOUS, 0);
+ cairo_rel_curve_to (cr, BOX_RADIOUS, 0, BOX_RADIOUS, 0, BOX_RADIOUS, -BOX_RADIOUS);
+ cairo_rel_line_to (cr, 0, -(FOOTER_HEIGHT - BOX_RADIOUS));
+ cairo_rel_line_to (cr, -(C_WIDTH - FOOTER_WIDTH), 0);
+ cairo_close_path (cr);
+
+ cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f);
+ cairo_fill (cr);
+
+ /* draw message */
+ if (!priv->message_surface) {
+ gint height;
+
+ priv->message_surface = draw_text (cr,
+ priv->font_desc,
+ priv->message,
+ MESSAGE_WIDTH,
+ &height);
+
+ priv->hidden_message_height = height - MESSAGE_HEIGHT;
+ priv->scroll_on_click = priv->hidden_message_height > 0;
+ if (priv->scroll_on_click)
+ gtk_widget_show (priv->cut_message);
+ }
+
+ cairo_rectangle (cr,
+ 2*CONTENT_OFFSET_X,
+ TEXT_Y_OFFSET,
+ MESSAGE_WIDTH,
+ MESSAGE_HEIGHT);
+ cairo_clip (cr);
+
+ cairo_set_source_surface (cr,
+ priv->message_surface,
+ 2*CONTENT_OFFSET_X,
+ TEXT_Y_OFFSET - priv->scroll_offset);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+ cairo_paint (cr);
+ }
- cairo_pattern_destroy (grad);
cairo_destroy (cr);
return GTK_WIDGET_CLASS (el_home_applet_parent_class)->expose_event (self, event);
}
+
static void
-destroy_aggregator (ELHomeApplet *self)
+clean_state (ELHomeApplet *self)
{
- ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv;
+ ELHomeAppletPrivate *priv = self->priv;
+
+ if (priv->message) {
+ g_free (priv->message);
+ priv->message = NULL;
+ }
+
+ if (priv->contact_id) {
+ g_free (priv->contact_id);
+ priv->contact_id = NULL;
+ }
+ if (priv->local_id) {
+ g_free (priv->local_id);
+ priv->local_id = NULL;
+ }
+ if (priv->remote_id) {
+ g_free (priv->remote_id);
+ priv->remote_id = NULL;
+ }
+ if (priv->contact) {
+ g_object_unref (priv->contact);
+ priv->contact = NULL;
+ }
if (priv->aggregator) {
if (priv->aggregator_ready_closure){
osso_abook_waitable_cancel (OSSO_ABOOK_WAITABLE (priv->aggregator),
priv->aggregator_ready_closure);
priv->aggregator_ready_closure = NULL;
}
-
+ osso_abook_roster_stop (priv->aggregator);
g_object_unref (priv->aggregator);
priv->aggregator = NULL;
}
g_object_unref (priv->eventlogger);
priv->eventlogger = NULL;
}
-
- if (priv->message) {
- g_free (priv->message);
- priv->message = NULL;
- }
- if (priv->contact_id) {
- g_free (priv->contact_id);
- priv->contact_id = NULL;
- }
- if (priv->remote_id) {
- g_free (priv->remote_id);
- priv->remote_id = NULL;
- }
- if (priv->local_id) {
- g_free (priv->local_id);
- priv->local_id = NULL;
- }
-
if (priv->font_desc) {
pango_font_description_free (priv->font_desc);
priv->font_desc = NULL;
}
- destroy_aggregator (EL_HOME_APPLET (self));
+
+ clean_state (EL_HOME_APPLET (self));
G_OBJECT_CLASS (el_home_applet_parent_class)->dispose (self);
}
const GError *error,
gpointer userdata)
{
- g_warning (G_STRFUNC);
ELHomeApplet *self = EL_HOME_APPLET(userdata);
ELHomeAppletPrivate *priv = self->priv;
- GList *contacts;
+ GList *contacts = NULL;
priv->aggregator_ready_closure = NULL;
return;
}
- contacts = osso_abook_aggregator_list_master_contacts
- (OSSO_ABOOK_AGGREGATOR (priv->aggregator));
+ if (priv->contact_id) {
+ contacts = osso_abook_aggregator_lookup
+ (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+ priv->contact_id);
+ }
+ else if (priv->local_id && priv->remote_id) {
+ if (g_strcmp0 (priv->local_id, "ring/tel/ring" == 0)) {
+ contacts = osso_abook_aggregator_find_contacts_for_phone_number
+ (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+ priv->remote_id,
+ TRUE);
+ }
+ else {
+ McAccount *account;
+ account = osso_abook_account_manager_lookup_by_name
+ (NULL,
+ priv->local_id);
+ if (account) {
+ contacts = osso_abook_aggregator_find_contacts_for_im_contact
+ (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+ priv->remote_id,
+ account);
+ }
+ }
+ }
+
if (contacts && contacts->data) {
- OssoABookContact *contact = OSSO_ABOOK_CONTACT (contacts->data);
+ GdkPixbuf *avatar_image;
+
+ priv->contact = g_object_ref (OSSO_ABOOK_CONTACT (contacts->data));
gtk_label_set_text (GTK_LABEL (priv->sender),
- osso_abook_contact_get_display_name (contact));
- GdkPixbuf *avatar_image = osso_abook_avatar_get_image_rounded
- (OSSO_ABOOK_AVATAR (contact),
+ osso_abook_contact_get_display_name (priv->contact));
+
+ avatar_image = osso_abook_avatar_get_image_rounded
+ (OSSO_ABOOK_AVATAR (priv->contact),
HILDON_ICON_PIXEL_SIZE_THUMB,
HILDON_ICON_PIXEL_SIZE_THUMB,
TRUE,
-1,
priv->border_color);
- g_warning ("%s av_img %p", G_STRFUNC, avatar_image);
+
if (avatar_image) {
- g_warning ("SHOE AVATAR");
gtk_image_set_from_pixbuf (GTK_IMAGE (priv->avatar),
avatar_image);
gtk_widget_show (priv->avatar);
EBookQuery *query = NULL;
GError *error = NULL;
- g_warning ("%s %s", G_STRFUNC, priv->contact_id);
-
- destroy_aggregator (self);
-
- if (priv->contact_id) {
- query = e_book_query_vcard_field_test (EVC_UID,
- E_BOOK_QUERY_IS,
- priv->contact_id);
- }
- else if (priv->local_id && priv->remote_id) {
+ if (priv->local_id && priv->remote_id) {
const gchar *vcard = osso_abook_account_manager_get_vcard_field
(NULL, priv->local_id);
if (vcard)
}
if (priv->aggregator) {
- OssoABookRosterManager *manager;
-
priv->aggregator_ready_closure = osso_abook_waitable_call_when_ready
(OSSO_ABOOK_WAITABLE (priv->aggregator),
aggregator_ready_cb,
self, NULL);
- manager = osso_abook_aggregator_get_roster_manager
- (OSSO_ABOOK_AGGREGATOR (priv->aggregator));
- osso_abook_roster_manager_start (manager);
osso_abook_roster_start (priv->aggregator);
}
}
time_t now;
struct tm now_tm, t_tm;
- const gchar *format = "%Y.%m.%d %T";
+ const gchar *format = "%x %X";
gchar *result = g_malloc0 (RESULT_SIZE);
now = time (NULL);
if ((now_tm.tm_year == t_tm.tm_year) &&
(now_tm.tm_mon == t_tm.tm_mon) &&
(now_tm.tm_mday == t_tm.tm_mday))
- format = "%T";
+ format = "%X";
strftime (result, RESULT_SIZE, format, &t_tm);
show_event (ELHomeApplet *self, RTComElIter *it)
{
ELHomeAppletPrivate *priv = self->priv;
-
gchar *remote = NULL;
gchar *received = NULL;
- const gchar *icon_name = NULL;
-
- if (priv->message) {
- g_free (priv->message);
- priv->message = NULL;
- }
-
- if (priv->contact_id) {
- g_free (priv->contact_id);
- priv->contact_id = NULL;
- }
- if (priv->local_id) {
- g_free (priv->local_id);
- priv->local_id = NULL;
- }
- if (priv->remote_id) {
- g_free (priv->remote_id);
- priv->remote_id = 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);
+ }
+ 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 {
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);
if (remote)
gtk_label_set_text (GTK_LABEL (priv->sender), remote);
- else if (priv->remote_id)
+ else
gtk_label_set_text (GTK_LABEL (priv->sender), priv->remote_id);
-
g_free (remote);
stop_scroll_anim (priv);
update_unread_label (ELHomeApplet *self)
{
ELHomeAppletPrivate *priv = self->priv;
- gchar *text;
if (priv->unread_count > 0) {
- text = g_strdup_printf ("%d", priv->unread_count);
- gtk_label_set_text (GTK_LABEL (priv->unread), text);
+ gchar *text;
+ text = g_strdup_printf
+ ("%d<span foreground=\"red\" rise=\"5000\">*</span>",
+ priv->unread_count);
+
+ gtk_label_set_markup (GTK_LABEL (priv->unread), text);
g_free (text);
}
else
ELHomeAppletPrivate *priv = self->priv;
RTComElIter *it = NULL;
+ clean_state (self);
+
it = make_query (priv->eventlogger, -1);
show_event (self, it);
resolve_contact (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;
priv->event_id,
TRUE,
NULL);
- read_event (self);
- priv->unread_count--;
- update_unread_label (self);
+ 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)
{
const gchar *service,
ELHomeApplet *self)
{
+ /* TODO: avoid updating if not related */
add_new_idle (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);
ELHomeAppletPrivate *priv = self->priv;
if (priv->event_id > 0) {
- if (event->y < C_Y + HEADER_HEIGHT) {
+ stop_scroll_anim (priv);
+
+ if (event->y < CONTENT_OFFSET_Y_TOP + HEADER_HEIGHT) {
if (priv->aggregator &&
- osso_abook_aggregator_get_master_contact_count
- (OSSO_ABOOK_AGGREGATOR (priv->aggregator)) > 0)
- priv->active_header = TRUE;
+ osso_abook_waitable_is_ready
+ (OSSO_ABOOK_WAITABLE (priv->aggregator), NULL))
+ priv->active = SELECTED_HEADER;
}
+ else if (event->y > (BOX_HEIGHT - CONTENT_OFFSET_Y_BOTTOM - FOOTER_HEIGHT_PRESS) &&
+ event->x < FOOTER_WIDTH)
+ priv->active = SELECTED_FOOTER;
else
- priv->active_body = TRUE;
+ priv->active = SELECTED_BODY;
+
gtk_widget_queue_draw (widget);
}
{
ELHomeAppletPrivate *priv = self->priv;
- if (priv->active_body) {
- priv->active_body = FALSE;
- stop_scroll_anim (priv);
+ switch (priv->active) {
+ case SELECTED_BODY:
if (priv->scroll_on_click) {
priv->scroll_on_click = FALSE;
priv->scroll_anim_id = g_timeout_add (SCROLL_PERIOD,
}
else {
#ifndef DEBUG_LAYOUT
- mark_as_read (self);
+ open_conversation (self);
#endif
}
-
gtk_widget_queue_draw (widget);
- }
- if (priv->active_header) {
+
+ break;
+ case SELECTED_HEADER: {
GtkWidget *dialog = NULL;
- priv->active_header = FALSE;
- dialog = create_contact_starter_dialog (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
- priv->contact_id);
+
+ if (priv->aggregator && priv->contact_id)
+ dialog = create_contact_starter_dialog
+ (OSSO_ABOOK_AGGREGATOR (priv->aggregator),
+ priv->contact_id);
if (!dialog &&
priv->remote_id &&
priv->local_id)
gtk_widget_queue_draw (widget);
}
+ break;
+ case SELECTED_FOOTER:
+ mark_as_read (self);
+ break;
+ default:;
+ }
+ priv->active = SELECTED_NONE;
return TRUE;
}
{
ELHomeAppletPrivate *priv = self->priv;
- if (priv->active_body) {
- priv->active_body = FALSE;
- priv->active_header = FALSE;
+ switch (priv->active) {
+ case SELECTED_BODY:
stop_scroll_anim (priv);
gtk_widget_queue_draw (widget);
- }
- if (priv->active_header) {
- priv->active_header = FALSE;
+ break;
+ case SELECTED_HEADER:
+ case SELECTED_FOOTER:
gtk_widget_queue_draw (widget);
+ break;
+ default:;
}
+ priv->active = SELECTED_NONE;
return FALSE;
}
gtk_widget_set_app_paintable (GTK_WIDGET (self), TRUE);
priv->unread = gtk_label_new ("12");
- hildon_helper_set_logical_color (priv->unread,
- GTK_RC_FG,
- GTK_STATE_NORMAL,
- "ActiveTextColor");
gtk_misc_set_alignment (GTK_MISC (priv->unread),
- 1.0f,
- 1.0f);
+ 0.0f,
+ 0.5f);
hildon_helper_set_logical_font (priv->unread, "SmallSystemFont");
/* gtk_widget_set_size_request (priv->unread, */
/* -1, */
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");
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);
+ footer = gtk_hbox_new (FALSE, HILDON_MARGIN_DEFAULT);
gtk_box_pack_start (GTK_BOX (footer), priv->unread, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (footer), priv->cut_message, TRUE, TRUE, 0);
gtk_box_pack_end (GTK_BOX (footer), priv->received, FALSE, FALSE, 0);