From b67aba2e28e5fd716c18bef9c2826b482ef832ad Mon Sep 17 00:00:00 2001
From: Richard Maudsley <richard.maudsley@isode.com>
Date: Fri, 1 Aug 2014 10:23:34 +0100
Subject: Prevent multiple chat window alerts being shown with the same
 message.

Test-Information:

Enable message delivery receipts, check that only a single alert is displayed for repeated messages.

Change-Id: Ifb9f8bd74e592147745f95678f94c21563d301a5

diff --git a/Swift/Controllers/Chat/ChatController.cpp b/Swift/Controllers/Chat/ChatController.cpp
index 50d85a3..0b34681 100644
--- a/Swift/Controllers/Chat/ChatController.cpp
+++ b/Swift/Controllers/Chat/ChatController.cpp
@@ -247,23 +247,32 @@ void ChatController::handleSettingChanged(const std::string& settingPath) {
 }
 
 void ChatController::checkForDisplayingDisplayReceiptsAlert() {
+	boost::optional<ChatWindow::AlertID> newDeliverReceiptAlert;
 	if (userWantsReceipts_ && (contactSupportsReceipts_ == ChatWindow::No)) {
-		deliveryReceiptAlert_ = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "This chat doesn't support delivery receipts."));
+		newDeliverReceiptAlert = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "This chat doesn't support delivery receipts."));
 	} else if (userWantsReceipts_ && (contactSupportsReceipts_ == ChatWindow::Maybe)) {
-		deliveryReceiptAlert_ = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "This chat may not support delivery receipts. You might not receive delivery receipts for the messages you sent."));
+		newDeliverReceiptAlert = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "This chat may not support delivery receipts. You might not receive delivery receipts for the messages you sent."));
 	} else {
 		if (deliveryReceiptAlert_) {
 			chatWindow_->removeAlert(*deliveryReceiptAlert_);
 			deliveryReceiptAlert_.reset();
 		}
 	}
+	if (newDeliverReceiptAlert) {
+		if (deliveryReceiptAlert_) {
+			chatWindow_->removeAlert(*deliveryReceiptAlert_);
+		}
+		deliveryReceiptAlert_ = newDeliverReceiptAlert;
+	}
 }
 
 void ChatController::handleBlockingStateChanged() {
 	boost::shared_ptr<BlockList> blockList = clientBlockListManager_->getBlockList();
 	if (blockList->getState() == BlockList::Available) {
 		if (isInMUC_ ? blockList->isBlocked(toJID_) : blockList->isBlocked(toJID_.toBare())) {
-			blockedContactAlert_ = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "You've currently blocked this contact. To continue your conversation you have to unblock the contact first."));
+			if (!blockedContactAlert_) {
+				blockedContactAlert_ = chatWindow_->addAlert(QT_TRANSLATE_NOOP("", "You've currently blocked this contact. To continue your conversation you have to unblock the contact first."));
+			}
 			chatWindow_->setInputEnabled(false);
 			chatWindow_->setBlockingState(ChatWindow::IsBlocked);
 
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index 6500ba4..ed79dcc 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -271,11 +271,20 @@ void QtChatWindow::handleKeyPressEvent(QKeyEvent* event) {
 }
 
 void QtChatWindow::beginCorrection() {
+	boost::optional<AlertID> newCorrectingAlert;
 	if (correctionEnabled_ == ChatWindow::Maybe) {
-		correctingAlert_ = addAlert(Q2PSTRING(tr("This chat may not support message correction. If you send a correction anyway, it may appear as a duplicate message")));
+		newCorrectingAlert = addAlert(Q2PSTRING(tr("This chat may not support message correction. If you send a correction anyway, it may appear as a duplicate message")));
 	} else if (correctionEnabled_ == ChatWindow::No) {
-		correctingAlert_ = addAlert(Q2PSTRING(tr("This chat does not support message correction.  If you send a correction anyway, it will appear as a duplicate message")));
+		newCorrectingAlert = addAlert(Q2PSTRING(tr("This chat does not support message correction.  If you send a correction anyway, it will appear as a duplicate message")));
 	}
+
+	if (newCorrectingAlert) {
+		if (correctingAlert_) {
+			removeAlert(*correctingAlert_);
+		}
+		correctingAlert_ = newCorrectingAlert;
+	}
+
 	QTextCursor cursor = input_->textCursor();
 	cursor.select(QTextCursor::Document);
 	cursor.beginEditBlock();
-- 
cgit v0.10.2-6-g49f6