popupmenu: fix menu for banned accounts

Currently the popup menu stays the same even if the account is banned
which may be very confusing for the user (place call or block contact
options are everything but meaningful in this case !).

In this patch we implement a specific menu for banned accounts.

In addition to that, we also force a chat view refresh when
the filter is updated.

This patch requires LRC side changes in order to work properly.

Change-Id: Iea545fe5cf54520e7aba92c7a87a736bc6d71d27
Reviewed-by: Sebastien Blin <sebastien.blin@savoirfairelinux.com>
diff --git a/src/conversationpopupmenu.cpp b/src/conversationpopupmenu.cpp
index 5434748..c0240dc 100644
--- a/src/conversationpopupmenu.cpp
+++ b/src/conversationpopupmenu.cpp
@@ -23,12 +23,18 @@
 #include <glib/gi18n.h>
 
 // Lrc
+#include <accountmodel.h>
+#include <bannedcontactmodel.h>
+#include <contactmethod.h>
 #include <api/conversationmodel.h>
 #include <api/contactmodel.h>
 #include <api/contact.h>
 
 #include "accountinfopointer.h"
 
+// Qt
+#include <QItemSelectionModel>
+
 struct _ConversationPopupMenu
 {
     GtkMenu parent;
@@ -103,6 +109,29 @@
 }
 
 static void
+unblock_conversation(G_GNUC_UNUSED GtkWidget *menu, ConversationPopupMenuPrivate* priv)
+{
+    try
+    {
+        auto conversation = (*priv->accountInfo_)->conversationModel->filteredConversation(priv->row_);
+        auto uri = conversation.participants[0];
+
+        auto contactInfo = (*priv->accountInfo_)->contactModel->getContact(uri);
+
+        if (!contactInfo.isBanned) {
+            g_debug("unblock_conversation: trying to unban a contact which isn't banned !");
+            return;
+        }
+
+        (*priv->accountInfo_)->contactModel->addContact(contactInfo);
+    }
+    catch (...)
+    {
+        g_warning("Can't get conversation at row %i", priv->row_);
+    }
+}
+
+static void
 block_conversation(G_GNUC_UNUSED GtkWidget *menu, ConversationPopupMenuPrivate* priv)
 {
     try
@@ -179,13 +208,17 @@
         // we always build a menu, however in some cases some or all of the conversations will be deactivated
         // we prefer this to having an empty menu because GTK+ behaves weird in the empty menu case
         auto callId = conversation.confId.empty() ? conversation.callId : conversation.confId;
+
         // Not in call
-        auto place_video_call_conversation = gtk_menu_item_new_with_mnemonic(_("Place _video call"));
-        gtk_menu_shell_append(GTK_MENU_SHELL(self), place_video_call_conversation);
-        g_signal_connect(place_video_call_conversation, "activate", G_CALLBACK(place_video_call), priv);
-        auto place_audio_call_conversation = gtk_menu_item_new_with_mnemonic(_("Place _audio call"));
-        gtk_menu_shell_append(GTK_MENU_SHELL(self), place_audio_call_conversation);
-        g_signal_connect(place_audio_call_conversation, "activate", G_CALLBACK(place_audio_call), priv);
+        if (!contactInfo.isBanned) {
+            auto place_video_call_conversation = gtk_menu_item_new_with_mnemonic(_("Place _video call"));
+            gtk_menu_shell_append(GTK_MENU_SHELL(self), place_video_call_conversation);
+            g_signal_connect(place_video_call_conversation, "activate", G_CALLBACK(place_video_call), priv);
+            auto place_audio_call_conversation = gtk_menu_item_new_with_mnemonic(_("Place _audio call"));
+            gtk_menu_shell_append(GTK_MENU_SHELL(self), place_audio_call_conversation);
+            g_signal_connect(place_audio_call_conversation, "activate", G_CALLBACK(place_audio_call), priv);
+        }
+
         if (contactInfo.profileInfo.type == lrc::api::profile::Type::TEMPORARY ||
             contactInfo.profileInfo.type == lrc::api::profile::Type::PENDING) {
             // If we can add this conversation
@@ -207,9 +240,16 @@
             auto rm_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Remove conversation"));
             gtk_menu_shell_append(GTK_MENU_SHELL(self), rm_conversation_item);
             g_signal_connect(rm_conversation_item, "activate", G_CALLBACK(remove_conversation), priv);
-            auto block_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Block contact"));
-            gtk_menu_shell_append(GTK_MENU_SHELL(self), block_conversation_item);
-            g_signal_connect(block_conversation_item, "activate", G_CALLBACK(block_conversation), priv);
+
+            if (!contactInfo.isBanned) {
+                auto block_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Block contact"));
+                gtk_menu_shell_append(GTK_MENU_SHELL(self), block_conversation_item);
+                g_signal_connect(block_conversation_item, "activate", G_CALLBACK(block_conversation), priv);
+            } else {
+                auto block_conversation_item = gtk_menu_item_new_with_mnemonic(_("_Unblock contact"));
+                gtk_menu_shell_append(GTK_MENU_SHELL(self), block_conversation_item);
+                g_signal_connect(block_conversation_item, "activate", G_CALLBACK(unblock_conversation), priv);
+            }
         }
 
         auto copy_name = gtk_menu_item_new_with_mnemonic(_("_Copy name"));