Commit 6bbfd876 authored by Hugo Lefeuvre's avatar Hugo Lefeuvre Committed by Sébastien Blin

chatview: clearly display banned contacts as such

Whenever the chat view has to display a banned contact, it should:
- Make place call, add to contacts and place audio call buttons
  unclickable
- Hide the send message bar
- Display the banned contact as such in the smart list results (grey bg,
  bold "Banned contact", etc.)

This patch implements this behavior in the GNU/Linux GNOME client.

For the moment the conversation popup is still mentioning invalid
options such as «block contact» or «place call», but since fixing it
requires LRC side changes we will address this issue in a separate
commit.

Change-Id: Ibc8da7d755319acae59a807cc248e3a87bd9d6da
Reviewed-by: Sébastien Blin's avatarSebastien Blin <sebastien.blin@savoirfairelinux.com>
parent a74167e1
......@@ -396,6 +396,34 @@ print_text_recording(ChatView *self)
QObject::disconnect(priv->new_interaction_connection);
}
static void
update_if_banned(ChatView *self)
{
ChatViewPrivate *priv = CHAT_VIEW_GET_PRIVATE(self);
if (!priv->conversation_) return;
auto participant = priv->conversation_->participants[0];
try {
auto contactInfo = (*priv->accountInfo_)->contactModel->getContact(participant);
if (contactInfo.isBanned) {
gtk_widget_set_sensitive (priv->button_placecall, FALSE);
gtk_widget_set_tooltip_text(priv->button_placecall, _("Can't place call with banned contact"));
gtk_widget_set_sensitive (priv->button_add_to_conversations, FALSE);
gtk_widget_set_tooltip_text(priv->button_add_to_conversations, _("Can't start conversation with banned contact"));
gtk_widget_set_sensitive (priv->button_place_audio_call, FALSE);
gtk_widget_set_tooltip_text(priv->button_place_audio_call, _("Can't place audio call with banned contact"));
webkit_chat_hide_message_bar(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container), true);
} else {
gtk_widget_set_sensitive (priv->button_placecall, TRUE);
gtk_widget_set_sensitive (priv->button_add_to_conversations, TRUE);
gtk_widget_set_sensitive (priv->button_place_audio_call, TRUE);
webkit_chat_hide_message_bar(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container), false);
}
} catch (const std::out_of_range&) {
// ContactModel::getContact() exception
}
}
static void
update_add_to_conversations(ChatView *self)
{
......@@ -520,6 +548,7 @@ build_chat_view(ChatView* self)
update_name(self);
update_add_to_conversations(self);
update_contact_methods(self);
update_if_banned(self);
priv->webkit_ready = g_signal_connect_swapped(
priv->webkit_chat_container,
......@@ -537,7 +566,6 @@ build_chat_view(ChatView* self)
webkit_chat_container_ready(self);
gtk_widget_set_visible(priv->hbox_chat_info, TRUE);
}
GtkWidget *
......
......@@ -102,6 +102,13 @@ render_contact_photo(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
// so that the other renderers are shifted to the right
g_object_set(G_OBJECT(cell), "width", 50, NULL);
g_object_set(G_OBJECT(cell), "pixbuf", image.get(), NULL);
// Banned contacts should be displayed with grey bg
if (contactInfo.isBanned) {
g_object_set(G_OBJECT(cell), "cell-background", "#BDBDBD", NULL);
} else {
g_object_set(G_OBJECT(cell), "cell-background", NULL, NULL);
}
}
catch (const std::exception&)
{
......@@ -114,7 +121,7 @@ render_name_and_last_interaction(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *model,
GtkTreeIter *iter,
G_GNUC_UNUSED GtkTreeView *treeview)
GtkTreeView *treeview)
{
gchar *alias;
gchar *registeredName;
......@@ -123,6 +130,18 @@ render_name_and_last_interaction(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
gchar *uid;
gchar *uri;
// Get active conversation
auto path = gtk_tree_model_get_path(model, iter);
auto row = std::atoi(gtk_tree_path_to_string(path));
if (row == -1) return;
auto priv = CONVERSATIONS_VIEW_GET_PRIVATE(treeview);
if (!priv) return;
auto conversation = (*priv->accountInfo_)->conversationModel->filteredConversation(row);
auto contactUri = conversation.participants.front();
auto contactInfo = (*priv->accountInfo_)->contactModel->getContact(contactUri);
gtk_tree_model_get (model, iter,
0 /* col# */, &uid /* data */,
1 /* col# */, &alias /* data */,
......@@ -132,7 +151,13 @@ render_name_and_last_interaction(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
-1);
auto bestId = std::string(registeredName).empty() ? uri: registeredName;
if (std::string(alias).empty()) {
if (contactInfo.isBanned) {
// Contact is banned, display it clearly
text = g_markup_printf_escaped(
"<span font_weight=\"bold\">%s</span>\n<span size=\"smaller\" font_weight=\"bold\">Banned contact</span>",
bestId
);
} else if (std::string(alias).empty()) {
// For conversations with contacts with no alias
text = g_markup_printf_escaped(
"<span font_weight=\"bold\">%s</span>\n<span size=\"smaller\" color=\"#666\">%s</span>",
......@@ -157,6 +182,13 @@ render_name_and_last_interaction(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
);
}
// Banned contacts should be displayed with grey bg
if (contactInfo.isBanned) {
g_object_set(G_OBJECT(cell), "cell-background", "#BDBDBD", NULL);
} else {
g_object_set(G_OBJECT(cell), "cell-background", NULL, NULL);
}
g_object_set(G_OBJECT(cell), "markup", text, NULL);
g_free(uid);
g_free(uri);
......@@ -185,6 +217,16 @@ render_time(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
try
{
auto conversation = (*priv->accountInfo_)->conversationModel->filteredConversation(row);
auto contactUri = conversation.participants.front();
auto contactInfo = (*priv->accountInfo_)->contactModel->getContact(contactUri);
// Banned contacts should be displayed with grey bg
if (contactInfo.isBanned) {
g_object_set(G_OBJECT(cell), "cell-background", "#BDBDBD", NULL);
} else {
g_object_set(G_OBJECT(cell), "cell-background", NULL, NULL);
}
auto callId = conversation.confId.empty() ? conversation.callId : conversation.confId;
if (!callId.empty()) {
auto call = (*priv->accountInfo_)->callModel->getCall(callId);
......@@ -203,7 +245,6 @@ render_time(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
std::strftime(interactionDay, sizeof(interactionDay), "%D", std::localtime(&lastInteractionTimestamp));
std::strftime(nowDay, sizeof(nowDay), "%D", std::localtime(&now));
if (std::string(interactionDay) == std::string(nowDay)) {
char interactionTime[100];
std::strftime(interactionTime, sizeof(interactionTime), "%R", std::localtime(&lastInteractionTimestamp));
......
......@@ -566,6 +566,20 @@ webkit_chat_disable_send_interaction(WebKitChatContainer *view, bool isDisabled)
);
}
void
webkit_chat_hide_message_bar(WebKitChatContainer *view, bool isHidden)
{
auto priv = WEBKIT_CHAT_CONTAINER_GET_PRIVATE(view);
gchar* function_call = g_strdup_printf("ring.chatview.hideMessageBar(%s);", isHidden ? "true" : "false");
webkit_web_view_run_javascript(
WEBKIT_WEB_VIEW(priv->webview_chat),
function_call,
NULL,
NULL,
NULL
);
}
void
webkit_chat_container_clear_sender_images(WebKitChatContainer *view)
......
......@@ -53,6 +53,7 @@ void webkit_chat_container_set_sender_image (WebKitChatContainer *view
gboolean webkit_chat_container_is_ready (WebKitChatContainer *view);
void webkit_chat_container_set_display_links (WebKitChatContainer *view, bool display);
void webkit_chat_disable_send_interaction (WebKitChatContainer *view, bool isDisabled);
void webkit_chat_hide_message_bar (WebKitChatContainer *view, bool isHidden);
void webkit_chat_container_set_temporary (WebKitChatContainer *view, bool temporary);
void webkit_chat_container_set_invitation (WebKitChatContainer *view, bool show, const std::string& contactUri);
......
......@@ -151,6 +151,18 @@ ring.chatview = (function(){
input.disabled = isDisabled;
}
/**
* Change the value of the progress bar
*/
function hideMessageBar(isHidden) {
const messageBar = document.querySelector('#sendMessage');
if (isHidden) {
messageBar.style.visibility = 'hidden';
} else {
messageBar.style.visibility = 'visible';
}
}
/**
* Accept an invite
*/
......@@ -1018,6 +1030,7 @@ ring.chatview = (function(){
blockConversation: blockConversation,
showInvitation: showInvitation,
hideInvitation: hideInvitation,
hideMessageBar: hideMessageBar,
disableSendMessage: disableSendMessage,
updateTimestamps: updateTimestamps,
sendFile: sendFile,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment