summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Chat/ChatStateNotifier.cpp')
-rw-r--r--Swiften/Chat/ChatStateNotifier.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/Swiften/Chat/ChatStateNotifier.cpp b/Swiften/Chat/ChatStateNotifier.cpp
new file mode 100644
index 0000000..7c6560f
--- /dev/null
+++ b/Swiften/Chat/ChatStateNotifier.cpp
@@ -0,0 +1,45 @@
+#include "Swiften/Chat/ChatStateNotifier.h"
+
+namespace Swift {
+
+ChatStateNotifier::ChatStateNotifier() {
+ contactHas85Caps_ = false;
+ isInConversation_ = false;
+ contactHasSentActive_ = false;
+ userIsTyping_ = false;
+}
+
+void ChatStateNotifier::setContactHas85Caps(bool hasCaps) {
+ contactHas85Caps_ = hasCaps;
+}
+
+void ChatStateNotifier::setUserIsTyping() {
+ if (contactShouldReceiveStates() && !userIsTyping_) {
+ userIsTyping_ = true;
+ onChatStateChanged(ChatState::Composing);
+ }
+}
+
+void ChatStateNotifier::userSentMessage() {
+ userIsTyping_ = false;
+}
+
+void ChatStateNotifier::userCancelledNewMessage() {
+ if (userIsTyping_) {
+ userIsTyping_ = false;
+ onChatStateChanged(ChatState::Active);
+ }
+}
+
+void ChatStateNotifier::receivedMessageFromContact(bool hasActiveElement) {
+ isInConversation_ = true;
+ contactHasSentActive_ = hasActiveElement;
+}
+
+bool ChatStateNotifier::contactShouldReceiveStates() {
+ /* So, yes, the XEP says to look at caps, but it also says that once you've
+ heard from the contact, the active state overrides this.*/
+ return contactHasSentActive_ || (contactHas85Caps_ && !isInConversation_);;
+}
+
+}