eion/purple-hangouts

Mark conversations as focused to prevent duplicate notifications on other devices
--- a/hangouts_connection.h Wed Aug 31 20:37:40 2016 +0000
+++ b/hangouts_connection.h Mon Sep 19 18:50:17 2016 +1200
@@ -87,6 +87,7 @@
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(add_user, AddUser, "conversations/adduser");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(remove_user, RemoveUser, "conversations/removeuser");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(update_watermark, UpdateWatermark, "conversations/updatewatermark");
+HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(set_focus, SetFocus, "conversations/setfocus");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(set_active_client, SetActiveClient, "clients/setactiveclient");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(get_entity_by_id, GetEntityById, "contacts/getentitybyid");
HANGOUTS_DEFINE_PBLITE_REQUEST_FUNC(get_group_conversation_url, GetGroupConversationUrl, "conversations/getgroupconversationurl");
--- a/hangouts_conversation.c Wed Aug 31 20:37:40 2016 +0000
+++ b/hangouts_conversation.c Mon Sep 19 18:50:17 2016 +1200
@@ -1732,6 +1732,68 @@
#define PURPLE_CONVERSATION_IS_VALID(conv) (g_list_find(purple_conversations_get_all(), conv) != NULL)
gboolean
+hangouts_mark_conversation_focused_timeout(gpointer convpointer)
+{
+ PurpleConversation *conv = convpointer;
+ PurpleConnection *pc;
+ PurpleAccount *account;
+ HangoutsAccount *ha;
+ SetFocusRequest request;
+ ConversationId conversation_id;
+ const gchar *conv_id = NULL;
+ gboolean is_focused;
+
+ if (!PURPLE_CONVERSATION_IS_VALID(conv))
+ return FALSE;
+
+ account = purple_conversation_get_account(conv);
+ if (account == NULL || !purple_account_is_connected(account))
+ return FALSE;
+
+ pc = purple_account_get_connection(account);
+ if (!PURPLE_CONNECTION_IS_CONNECTED(pc))
+ return FALSE;
+
+ ha = purple_connection_get_protocol_data(pc);
+
+ is_focused = purple_conversation_has_focus(conv);
+ if (is_focused && ha->last_conversation_focused == conv)
+ return FALSE;
+
+ set_focus_request__init(&request);
+ request.request_header = hangouts_get_request_header(ha);
+
+ conv_id = purple_conversation_get_data(conv, "conv_id");
+ if (conv_id == NULL) {
+ if (PURPLE_IS_IM_CONVERSATION(conv)) {
+ conv_id = g_hash_table_lookup(ha->one_to_ones_rev, purple_conversation_get_name(conv));
+ } else {
+ conv_id = purple_conversation_get_name(conv);
+ }
+ }
+ conversation_id__init(&conversation_id);
+ conversation_id.id = (gchar *) conv_id;
+ request.conversation_id = &conversation_id;
+
+ if (is_focused) {
+ request.type = FOCUS_TYPE__FOCUS_TYPE_FOCUSED;
+ ha->last_conversation_focused = conv;
+ } else {
+ request.type = FOCUS_TYPE__FOCUS_TYPE_UNFOCUSED;
+ if (ha->last_conversation_focused == conv) {
+ ha->last_conversation_focused = NULL;
+ }
+ }
+ request.has_type = TRUE;
+
+ hangouts_pblite_set_focus(ha, &request, (HangoutsPbliteSetFocusResponseFunc)hangouts_default_response_dump, NULL);
+
+ hangouts_request_header_free(request.request_header);
+
+ return FALSE;
+}
+
+gboolean
hangouts_mark_conversation_seen_timeout(gpointer convpointer)
{
PurpleConversation *conv = convpointer;
@@ -1746,6 +1808,8 @@
if (!PURPLE_CONVERSATION_IS_VALID(conv))
return FALSE;
+ if (!purple_conversation_has_focus(conv))
+ return FALSE;
account = purple_conversation_get_account(conv);
if (account == NULL || !purple_account_is_connected(account))
return FALSE;
@@ -1815,9 +1879,6 @@
if (type != PURPLE_CONVERSATION_UPDATE_UNSEEN)
return;
- if (!purple_conversation_has_focus(conv))
- return;
-
pc = purple_conversation_get_connection(conv);
if (!PURPLE_CONNECTION_IS_CONNECTED(pc))
return;
@@ -1835,6 +1896,8 @@
purple_conversation_set_data(conv, "mark_seen_timeout", GINT_TO_POINTER(mark_seen_timeout));
+ purple_timeout_add_seconds(1, hangouts_mark_conversation_focused_timeout, conv);
+
hangouts_set_active_client(pc);
}
--- a/libhangouts.h Wed Aug 31 20:37:40 2016 +0000
+++ b/libhangouts.h Mon Sep 19 18:50:17 2016 +1200
@@ -82,6 +82,7 @@
gchar *self_phone;
ActiveClientState active_client_state;
gint64 last_event_timestamp;
+ PurpleConversation *last_conversation_focused;
GByteArray *channel_buffer;
guint channel_watchdog;