From 2514f81800bd3ee321ac3dc536c8276c5fe11cff Mon Sep 17 00:00:00 2001
From: Armin Felder <armin.felder@osalliance.com>
Date: Wed, 19 Dec 2018 22:30:15 +0100
Subject: [PATCH] channel avatar

---
 CustomModels/channelmodel.cpp         | 18 ++++++++++++++++++
 CustomModels/channelmodel.h           |  3 ++-
 CustomModels/messagemodel.cpp         | 11 +++++++++--
 repos/entities/rocketchatchannel.cpp  | 14 ++++++++++++++
 repos/entities/rocketchatchannel.h    |  4 ++++
 repos/entities/rocketchatmessage.h    |  2 ++
 repos/entities/rocketchatuser.h       |  4 ++++
 rocketchat.cpp                        | 15 +++++++++------
 rocketchatserver.cpp                  |  2 +-
 services/messageservice.cpp           |  4 ++--
 services/rocketchatchannelservice.cpp | 15 +++++++++++++--
 services/rocketchatchannelservice.h   |  4 +++-
 12 files changed, 81 insertions(+), 15 deletions(-)

diff --git a/CustomModels/channelmodel.cpp b/CustomModels/channelmodel.cpp
index 9eed39a..a978070 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 84e9ae1..de7caa5 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 cb48a5a..89a065f 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 &current : messagesOfCurrentChannel ) {
         if ( current->getId() == id ) {
             found = true;
diff --git a/repos/entities/rocketchatchannel.cpp b/repos/entities/rocketchatchannel.cpp
index 2538f78..817c58f 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 771df52..ace0fdc 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 acf2792..f5b06e1 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 cd0f3b8..ba73d9d 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 c8f78c7..4d928b9 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 e1d2197..93293c1 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 4ad15fd..fb68c56 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 44060be..88d5ebc 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 6c6a024..af2508d 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 );
-- 
GitLab