diff --git a/CustomModels/channelmodel.cpp b/CustomModels/channelmodel.cpp index 9eed39a2a295ceda6ad6a14bf1f8e787ce176972..a978070269e97970f33e99c69d3dbff8e4e4f409 100644 --- a/CustomModels/channelmodel.cpp +++ b/CustomModels/channelmodel.cpp @@ -116,6 +116,23 @@ QVariant ChannelModel::data( const QModelIndex &index, int role ) const case ChannelRoles::ownerName: return currentChannel->getOwnerName(); + + case ChannelRoles::avatarImg: { + auto avatarImg = currentChannel->getAvatarImg(); + + if ( !avatarImg.isNull() ) { + auto path = QStringLiteral( "file://" ) + avatarImg->getFilePath(); + + if ( path.endsWith( "svg" ) ) { + return "qrc:res/user-identity.svg"; + } else { + return path; + } + } else { + return ""; + } + } + } return QVariant(); @@ -158,6 +175,7 @@ QHash<int, QByteArray> ChannelModel::roleNames() const roles[static_cast<int>( ChannelRoles::ownerName )] = QByteArrayLiteral( "ownerName" ); roles[static_cast<int>( ChannelRoles::username )] = QByteArrayLiteral( "username" ); roles[static_cast<int>( ChannelRoles::userStatus )] = QByteArrayLiteral( "userStatus" ); + roles[static_cast<int>( ChannelRoles::avatarImg )] = QByteArrayLiteral( "avatarImg" ); return roles; } diff --git a/CustomModels/channelmodel.h b/CustomModels/channelmodel.h index 84e9ae1e0a120164fbeaaa294a217236218d1295..de7caa5f6d7c9338042e81e50a672853c43c5508 100644 --- a/CustomModels/channelmodel.h +++ b/CustomModels/channelmodel.h @@ -51,7 +51,8 @@ class ChannelModel : public QAbstractListModel ownerId, ownerName, username, - userStatus + userStatus, + avatarImg }; public: ChannelModel() = default; diff --git a/CustomModels/messagemodel.cpp b/CustomModels/messagemodel.cpp index cb48a5a6881f0a58cd12c4273e799f8d2dcefa3c..89a065f9f09901e5b5e9faa9d6b97ca96cffa830 100644 --- a/CustomModels/messagemodel.cpp +++ b/CustomModels/messagemodel.cpp @@ -170,7 +170,13 @@ QVariant MessagesModel::data( const QModelIndex &index, int role ) const auto avatarImg = messageAtIndex->getAvatarImg(); if ( !avatarImg.isNull() ) { - return messageAtIndex->getAvatarImg()->getFilePath(); + auto path = QStringLiteral( "file://" ) + avatarImg->getFilePath(); + + if ( path.endsWith( "svg" ) ) { + return "qrc:res/user-identity.svg"; + } else { + return path; + } } else { return ""; } @@ -221,7 +227,7 @@ void MessagesModel::setCurrent( const QString &value ) int MessagesModel::rowCount( const QModelIndex &parent ) const { Q_UNUSED( parent ); - qDebug() << "number of messages in model" << messagesOfCurrentChannel.count(); + // qDebug() << "number of messages in model" << messagesOfCurrentChannel.count(); int count = 0; @@ -362,6 +368,7 @@ void MessagesModel::onDataChanged( const QString &id, const QString &property ) int pos = 0; bool found = false; + //TODO: could be done with less complexity for ( const auto ¤t : messagesOfCurrentChannel ) { if ( current->getId() == id ) { found = true; diff --git a/repos/entities/rocketchatchannel.cpp b/repos/entities/rocketchatchannel.cpp index 2538f7850a61d1f79fbd67c667b3376594b32e26..817c58fafea5e0c1ffabb058287bdbd230b79289 100755 --- a/repos/entities/rocketchatchannel.cpp +++ b/repos/entities/rocketchatchannel.cpp @@ -309,6 +309,20 @@ void RocketChatChannel::setChatPartnerId( const QString &chatPartnerId ) { mChatPartnerId = chatPartnerId; } + +QSharedPointer<TempFile> RocketChatChannel::getAvatarImg() const +{ + return mAvatarImg; +} + +void RocketChatChannel::setAvatarImg( const QSharedPointer<TempFile> &pAvatar ) +{ + if ( mAvatarImg != pAvatar ) { + mAvatarImg = pAvatar; + emit dataChanged( mRoomId, "avatarImg" ); + } +} + bool RocketChatChannel::getBlocked() const { return mBlocked; diff --git a/repos/entities/rocketchatchannel.h b/repos/entities/rocketchatchannel.h index 771df520635eb3c09716e7e3c6ea46366c759b23..ace0fdca1db3dff85b1e5c7fbce345d886bd9693 100755 --- a/repos/entities/rocketchatchannel.h +++ b/repos/entities/rocketchatchannel.h @@ -128,7 +128,11 @@ class RocketChatChannel : public QObject const QString &getChatPartnerId() const; void setChatPartnerId( const QString &chatPartnerId ); + QSharedPointer<TempFile> getAvatarImg() const; + void setAvatarImg( const QSharedPointer<TempFile> &pAvatar ); + private: + QSharedPointer<TempFile> mAvatarImg; QString mOwnerName; QString mOwnerId; bool mDeleted; diff --git a/repos/entities/rocketchatmessage.h b/repos/entities/rocketchatmessage.h index acf2792382502e719f94d8beacd36af246cab356..f5b06e152bedfa9e716f5281ca4167cd3e8dd4c5 100755 --- a/repos/entities/rocketchatmessage.h +++ b/repos/entities/rocketchatmessage.h @@ -29,6 +29,7 @@ #include "repos/emojirepo.h" #include "utils.h" #include "rocketchatattachment.h" +#include "rocketchatuser.h" class EmojiRepo; @@ -103,6 +104,7 @@ class RocketChatMessage: public QObject protected: QSharedPointer<TempFile> mAvatarImg; + QSharedPointer<RocketChatUser> mAuthor; bool empty = false; qint64 timestamp = 0; QJsonObject data; diff --git a/repos/entities/rocketchatuser.h b/repos/entities/rocketchatuser.h index cd0f3b8345c550c9ba505bc438a0843ec204a875..ba73d9d9121c8ef44cdb6427edfad5ea4d41ede9 100755 --- a/repos/entities/rocketchatuser.h +++ b/repos/entities/rocketchatuser.h @@ -24,6 +24,8 @@ #define ROCKETCHATUSER_H #include <QObject> +#include <QSharedPointer> +#include "tempfile.h" class RocketChatUser : public QObject { @@ -68,8 +70,10 @@ class RocketChatUser : public QObject QString mUserId; QString mName; status mStatus = status::OFFLINE; + QSharedPointer<TempFile> mAvatarImg; signals: void statusChanged(); + void avatarChanged(); public slots: }; diff --git a/rocketchat.cpp b/rocketchat.cpp index c8f78c757bc10ce11fc39f23f43716d85cb89b98..4d928b97d59c1b532b0926ff5c72f25c3e50e728 100755 --- a/rocketchat.cpp +++ b/rocketchat.cpp @@ -642,10 +642,10 @@ void RocketChat::onLogout( const QString &pServerId ) void RocketChat::onUnreadCountChanged( const QString &pServerId, uint pUnread ) { - + static int lastUnreadCount = -1; mUnreadSum[pServerId] = pUnread; - qDebug() << "onUnreadCountChanged"; + // qDebug() << "onUnreadCountChanged"; uint number = 0; if ( mServerStatus ) { @@ -653,15 +653,18 @@ void RocketChat::onUnreadCountChanged( const QString &pServerId, uint pUnread ) number += count; } - qDebug() << "set Unread Badges to:" << number; + if ( lastUnreadCount != number ) { + + qDebug() << "set Unread Badges to:" << number; #ifdef Q_OS_ANDROID - AndroidBadges::setNumber( number ); + AndroidBadges::setNumber( number ); #endif #ifdef Q_OS_IOS - emit setBadge( number ); + emit setBadge( number ); #endif - + lastUnreadCount = number; + } } } diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp index e1d21978d1fa3d9ae10d082376120aa9a13ed848..93293c13ba0620bbbc724a0cb3b5e441a561bd1f 100755 --- a/rocketchatserver.cpp +++ b/rocketchatserver.cpp @@ -143,7 +143,7 @@ void RocketChatServerData::initConnections() loadEmojis(); mMessageService = new MessageService( this, mStorage, this, mEmojiRepo, mFileService ); - mChannelService = new RocketChatChannelService( this, this, mMessageService ); + mChannelService = new RocketChatChannelService( this, this, mMessageService, mFileService ); mChannelService->setDdp( mDdpApi ); mChannelService->setChannels( mChannels ); connect( mChannelService, &RocketChatChannelService::channelsLoaded, this, &RocketChatServerData::onChannelsLoaded, Qt::UniqueConnection ); diff --git a/services/messageservice.cpp b/services/messageservice.cpp index 4ad15fdf96f4d942a9612239274953428f8d04e0..fb68c56c0e962940c29d135ccc0ebedc7be4ab99 100644 --- a/services/messageservice.cpp +++ b/services/messageservice.cpp @@ -211,11 +211,11 @@ QSharedPointer<RocketChatMessage> MessageService::parseMessage( const QJsonObjec } } + //TODO: place RocketChatUserObject inside Message instead... auto then = [ message ]( QSharedPointer<TempFile> tempfile, bool showInline ) { message->setAvatarImg( tempfile ); }; - auto baseUrl = mServer->getBaseUrl(); - auto avatarUrl = baseUrl + "/avatar/" + author + ".jpg"; + auto avatarUrl = "/avatar/" + author + ".jpg"; auto avatarRequest = QSharedPointer<FileRequest>::create( avatarUrl, "temp", then, true ); mFileService->getFileRessource( avatarRequest ); diff --git a/services/rocketchatchannelservice.cpp b/services/rocketchatchannelservice.cpp index 44060be86738b3a8aef445060f4a6059d15f184b..88d5ebcf57f475a336b09b54a19af7c54ca0d75d 100755 --- a/services/rocketchatchannelservice.cpp +++ b/services/rocketchatchannelservice.cpp @@ -26,7 +26,7 @@ -RocketChatChannelService::RocketChatChannelService( QObject *parent, RocketChatServerData *pServer, MessageService *pMessageService ): QObject( parent ) +RocketChatChannelService::RocketChatChannelService( QObject *parent, RocketChatServerData *pServer, MessageService *pMessageService, FileService *pFileService ): QObject( parent ), mFileService( pFileService ) { this->mServer = pServer; this->mMessageService = pMessageService; @@ -54,7 +54,18 @@ QSharedPointer<RocketChatChannel> RocketChatChannelService::createChannelObject( QSharedPointer<RocketChatChannel> RocketChatChannelService::createChannelObject( const QString &pRoomId, const QString &pName, const QString &pType, const QString &pUsername ) { auto ptr = QSharedPointer<RocketChatChannel>::create( mServer, mMessageService, pRoomId, pName, pType ); - ptr->setUsername( pUsername ); + + if ( pType == "d" ) { + ptr->setUsername( pUsername ); + + //TODO: place RocketChatUserObject inside Message instead... + auto then = [ ptr ]( QSharedPointer<TempFile> tempfile, bool showInline ) { + ptr->setAvatarImg( tempfile ); + }; + auto avatarUrl = "/avatar/" + pUsername + ".jpg"; + auto avatarRequest = QSharedPointer<FileRequest>::create( avatarUrl, "temp", then, true ); + mFileService->getFileRessource( avatarRequest ); + } if ( Q_LIKELY( mChannels ) ) { mChannels->add( ptr ); diff --git a/services/rocketchatchannelservice.h b/services/rocketchatchannelservice.h index 6c6a0244a0c2ac569cc95b02ec83bc11df28ce66..af2508da5734b5b16068f1d6c99080e6c2089790 100755 --- a/services/rocketchatchannelservice.h +++ b/services/rocketchatchannelservice.h @@ -40,6 +40,7 @@ #include "restRequests/restspotlightrequest.h" #include "services/messageservice.h" #include "repos/channelrepository.h" +#include "fileservice.h" #include "CustomModels/models.h" @@ -55,7 +56,7 @@ class RocketChatChannelService : public QObject { Q_OBJECT public: - RocketChatChannelService( QObject *parent, RocketChatServerData *pServer, MessageService *pMessageService ); + RocketChatChannelService( QObject *parent, RocketChatServerData *pServer, MessageService *pMessageService, FileService *pFileService ); RestApi *getRestApi() const; void setRestApi( RestApi *pValue ); @@ -102,6 +103,7 @@ class RocketChatChannelService : public QObject PersistanceLayer *mStorage = nullptr; RocketChatServerData *mServer = nullptr; ChannelRepository *mChannels = nullptr; + FileService *mFileService = nullptr; MeteorDDP *mDdp; QVector<QSharedPointer<RocketChatChannel>> processChannelData( const QJsonArray &pChannelArray, bool pJoined, bool pUpdateOnly );