Drop the loading screen if consensus can't be achieved

This commit is contained in:
Konstantinos Sideris 2017-10-08 21:35:37 +03:00
parent 6e1285bb0e
commit ebe36b5713
3 changed files with 30 additions and 14 deletions

View File

@ -34,6 +34,10 @@
#include "TypingDisplay.h"
#include "UserInfoWidget.h"
constexpr int CONSENSUS_TIMEOUT = 1000;
constexpr int SHOW_CONTENT_TIMEOUT = 3000;
constexpr int SYNC_INTERVAL = 2000;
class ChatPage : public QWidget
{
Q_OBJECT
@ -96,9 +100,10 @@ private:
TextInputWidget *text_input_;
TypingDisplay *typingDisplay_;
// Safety net if consensus is not possible or too slow.
QTimer *showContentTimer_;
QTimer *consensusTimer_;
QTimer *sync_timer_;
int sync_interval_;
QTimer *syncTimer_;
QString current_room_;
QMap<QString, QPixmap> room_avatars_;

View File

@ -33,7 +33,6 @@ namespace events = matrix::events;
ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
: QWidget(parent)
, sync_interval_(2000)
, client_(client)
{
setStyleSheet("background-color: #fff;");
@ -109,9 +108,9 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
user_info_widget_ = new UserInfoWidget(sideBarTopWidget_);
sideBarTopWidgetLayout_->addWidget(user_info_widget_);
sync_timer_ = new QTimer(this);
sync_timer_->setSingleShot(true);
connect(sync_timer_, SIGNAL(timeout()), this, SLOT(startSync()));
syncTimer_ = new QTimer(this);
syncTimer_->setSingleShot(true);
connect(syncTimer_, SIGNAL(timeout()), this, SLOT(startSync()));
connect(user_info_widget_, SIGNAL(logout()), client_.data(), SLOT(logout()));
connect(client_.data(), SIGNAL(loggedOut()), this, SLOT(logout()));
@ -213,11 +212,19 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
this,
SLOT(removeRoom(const QString &)));
showContentTimer_ = new QTimer(this);
showContentTimer_->setSingleShot(true);
connect(showContentTimer_, &QTimer::timeout, this, [=]() {
consensusTimer_->stop();
emit contentLoaded();
});
consensusTimer_ = new QTimer(this);
connect(consensusTimer_, &QTimer::timeout, this, [=]() {
if (view_manager_->hasLoaded()) {
// Remove the spinner overlay.
emit contentLoaded();
showContentTimer_->stop();
consensusTimer_->stop();
}
});
@ -228,7 +235,7 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
void
ChatPage::logout()
{
sync_timer_->stop();
syncTimer_->stop();
// Delete all config parameters.
QSettings settings;
@ -307,7 +314,7 @@ ChatPage::syncFailed(const QString &msg)
return;
qWarning() << "Sync error:" << msg;
sync_timer_->start(sync_interval_);
syncTimer_->start(SYNC_INTERVAL);
}
// TODO: Should be moved in another class that manages this global list.
@ -404,7 +411,7 @@ ChatPage::syncCompleted(const SyncResponse &response)
room_list_->sync(state_manager_);
view_manager_->sync(response.rooms());
sync_timer_->start(sync_interval_);
syncTimer_->start(SYNC_INTERVAL);
}
void
@ -457,7 +464,7 @@ ChatPage::initialSyncCompleted(const SyncResponse &response)
// Initialize room list.
room_list_->setInitialRooms(settingsManager_, state_manager_);
sync_timer_->start(sync_interval_);
syncTimer_->start(SYNC_INTERVAL);
emit contentLoaded();
}
@ -564,9 +571,13 @@ ChatPage::loadStateFromCache()
room_list_->setInitialRooms(settingsManager_, state_manager_);
// Check periodically if the timelines have been loaded.
consensusTimer_->start(500);
consensusTimer_->start(CONSENSUS_TIMEOUT);
sync_timer_->start(sync_interval_);
// Show the content if consensus can't be achieved.
showContentTimer_->start(SHOW_CONTENT_TIMEOUT);
// Start receiving events.
syncTimer_->start(SYNC_INTERVAL);
}
void
@ -665,5 +676,5 @@ ChatPage::updateTypingUsers(const QString &roomid, const QList<QString> &user_id
ChatPage::~ChatPage()
{
sync_timer_->stop();
syncTimer_->stop();
}

View File

@ -627,7 +627,7 @@ MatrixClient::sync() noexcept
QUrlQuery query;
query.addQueryItem("set_presence", "online");
query.addQueryItem("filter", QJsonDocument(filter).toJson(QJsonDocument::Compact));
query.addQueryItem("timeout", "30000");
query.addQueryItem("timeout", "15000");
query.addQueryItem("access_token", token_);
if (next_batch_.isEmpty()) {