summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThanos Doukoudakis <thanos.doukoudakis@isode.com>2017-03-24 14:15:52 (GMT)
committerThanos Doukoudakis <thanos.doukoudakis@isode.com>2017-04-06 14:27:45 (GMT)
commit7d2e5e200d8449a4492c6fafa4811197e6fbe40b (patch)
treea4cc9d8d6eb6d98d60dee9e2b928a9e96392ebe9 /Swiften/Chat/ChatStateNotifier.cpp
parent20c50e3960ee68d26fc93738f03d27a6833b28bb (diff)
downloadswift-7d2e5e200d8449a4492c6fafa4811197e6fbe40b.zip
swift-7d2e5e200d8449a4492c6fafa4811197e6fbe40b.tar.bz2
Reset the chat state to active after a few seconds
Fix for swift-217 When a user sends a composing Chat State Notification a timer will start. If the user doesn't send or cancel the message before the timer expires, an active CSN will be sent. Test Info: Build on Windows and unit test pass. Tested the new functionality with Windows and Linux Client. Added some test cases to cover the scenario that user goes idle while a CSN composing state has been sent. Updated ChatStateNotifierTest to use gtest. Updated ChatsManagerTest to use a valid TimerFactory object instead of nullptr. Change-Id: I35201947e4f042805a6d9df1340a0335effcd657
Diffstat (limited to 'Swiften/Chat/ChatStateNotifier.cpp')
-rw-r--r--Swiften/Chat/ChatStateNotifier.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/Swiften/Chat/ChatStateNotifier.cpp b/Swiften/Chat/ChatStateNotifier.cpp
index cbb9b0b..48a65ab 100644
--- a/Swiften/Chat/ChatStateNotifier.cpp
+++ b/Swiften/Chat/ChatStateNotifier.cpp
@@ -6,6 +6,7 @@
#include <Swiften/Chat/ChatStateNotifier.h>
+#include <cassert>
#include <memory>
#include <boost/bind.hpp>
@@ -14,16 +15,26 @@
#include <Swiften/Disco/EntityCapsProvider.h>
#include <Swiften/Elements/ChatState.h>
#include <Swiften/Elements/Message.h>
+#include <Swiften/Network/Timer.h>
+#include <Swiften/Network/TimerFactory.h>
+
namespace Swift {
-ChatStateNotifier::ChatStateNotifier(StanzaChannel* stanzaChannel, const JID& contact, EntityCapsProvider* entityCapsManager) : stanzaChannel_(stanzaChannel), entityCapsManager_(entityCapsManager), contact_(contact) {
+
+ChatStateNotifier::ChatStateNotifier(StanzaChannel* stanzaChannel, const JID& contact, EntityCapsProvider* entityCapsManager, TimerFactory* timerFactory, int idleTimeInMilliSecs) : stanzaChannel_(stanzaChannel), entityCapsManager_(entityCapsManager), contact_(contact) {
setContact(contact);
entityCapsManager_->onCapsChanged.connect(boost::bind(&ChatStateNotifier::handleCapsChanged, this, _1));
+ assert(timerFactory);
+ idleTimer_ = timerFactory->createTimer(idleTimeInMilliSecs);
+ assert(!!idleTimer_);
+ idleTimer_->onTick.connect(boost::bind(&ChatStateNotifier::userBecameIdleWhileTyping, this));
}
ChatStateNotifier::~ChatStateNotifier() {
entityCapsManager_->onCapsChanged.disconnect(boost::bind(&ChatStateNotifier::handleCapsChanged, this, _1));
+ idleTimer_->stop();
+ idleTimer_->onTick.disconnect(boost::bind(&ChatStateNotifier::userBecameIdleWhileTyping, this));
}
void ChatStateNotifier::setContact(const JID& contact) {
@@ -39,24 +50,36 @@ void ChatStateNotifier::setContactIsOnline(bool online) {
}
void ChatStateNotifier::setUserIsTyping() {
+ idleTimer_->stop();
bool should = contactShouldReceiveStates();
if (should && !userIsTyping_) {
userIsTyping_ = true;
changeState(ChatState::Composing);
}
+ if (should) {
+ idleTimer_->start();
+ }
}
void ChatStateNotifier::userSentMessage() {
+ idleTimer_->stop();
userIsTyping_ = false;
}
void ChatStateNotifier::userCancelledNewMessage() {
+ idleTimer_->stop();
if (userIsTyping_) {
userIsTyping_ = false;
changeState(ChatState::Active);
}
}
+void ChatStateNotifier::userBecameIdleWhileTyping() {
+ // For now we are returning to active state. When support for the Paused, Inactive and Gone states
+ // is implemeted, this function should Implement the Pause/Inactive functionality.
+ userCancelledNewMessage();
+}
+
void ChatStateNotifier::receivedMessageFromContact(bool hasActiveElement) {
contactHasSentActive_ = hasActiveElement;
}