From ecd6e2abf7d0ca5969d083db350c99c1586ae462 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Mon, 19 Sep 2022 16:09:56 +0200 Subject: [PATCH] Fix clearing chat while being in call (when switching chats in timeline) --- .../components/chat-room/ChatRoomModel.cpp | 13 +++++++ .../components/chat-room/ChatRoomModel.hpp | 6 ++- .../chat-room/ChatRoomProxyModel.cpp | 37 +++++++++++++++++-- .../chat-room/ChatRoomProxyModel.hpp | 7 ++++ .../ui/views/App/Calls/CallsWindow.qml | 1 + 5 files changed, 59 insertions(+), 5 deletions(-) diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.cpp b/linphone-app/src/components/chat-room/ChatRoomModel.cpp index 45007ba4f..415a75aad 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -859,6 +859,19 @@ bool ChatRoomModel::isTerminated(const std::shared_ptr& chat return chatRoom->getState() == linphone::ChatRoom::State::Terminated || chatRoom->getState() == linphone::ChatRoom::State::Deleted; } +void ChatRoomModel::addBindingCall(){ // If a call is binding to this chat room, we avoid cleaning data (Add=+1, remove=-1) + ++mBindingCalls; +} + +void ChatRoomModel::removeBindingCall(){ + --mBindingCalls; +} + +void ChatRoomModel::resetData(){ + if( mBindingCalls == 0) + ProxyListModel::resetData(); +} + void ChatRoomModel::initEntries(){ if( mList.size() > mLastEntriesStep) resetData(); diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.hpp b/linphone-app/src/components/chat-room/ChatRoomModel.hpp index 50d9bbda3..6ea58f155 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -176,6 +176,10 @@ public: Q_INVOKABLE int loadTillMessage(ChatMessageModel * message);// Load all entries till message and return its index. -1 if not found. static bool isTerminated(const std::shared_ptr& chatRoom); + void addBindingCall(); // If a call is binding to this chat room, we avoid cleaning data (Add=+1, remove=-1) + void removeBindingCall(); + virtual void resetData() override; + QDateTime mLastUpdateTime; int mUnreadMessagesCount = 0; int mMissedCallsCount = 0; @@ -195,7 +199,6 @@ public: void insertNotice (const std::shared_ptr &enventLog); void insertNotices (const QList> &eventLogs); - //-------------------- CHAT ROOM HANDLER public slots: @@ -299,6 +302,7 @@ private: QSharedPointer mParticipantListModel; QSharedPointer mReplyModel; QSharedPointer mUnreadMessageNotice; + int mBindingCalls = 0; QWeakPointer mSelf; }; diff --git a/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp b/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp index f9ee464f0..4b7ea4488 100644 --- a/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp @@ -56,6 +56,10 @@ ChatRoomProxyModel::ChatRoomProxyModel (QObject *parent) : QSortFilterProxyModel sort(0); } +ChatRoomProxyModel::~ChatRoomProxyModel(){ + setChatRoomModel(nullptr); // Do remove process like setting haveCall if is Call. +} + // ----------------------------------------------------------------------------- #define GET_CHAT_MODEL() \ @@ -242,6 +246,19 @@ QString ChatRoomProxyModel::getCachedText() const{ return gCachedText; } +void ChatRoomProxyModel::setIsCall(const bool& isCall){ + if(mIsCall != isCall) { + if(mChatRoomModel){ + if(isCall){ + mChatRoomModel->addBindingCall(); + }else + mChatRoomModel->removeBindingCall(); + } + mIsCall = isCall; + emit isCallChanged(); + } +} + // ----------------------------------------------------------------------------- void ChatRoomProxyModel::reload (ChatRoomModel *chatRoomModel) { @@ -252,8 +269,14 @@ void ChatRoomProxyModel::reload (ChatRoomModel *chatRoomModel) { QObject::disconnect(ChatRoomModel, &ChatRoomModel::messageReceived, this, &ChatRoomProxyModel::handleMessageReceived); QObject::disconnect(ChatRoomModel, &ChatRoomModel::messageSent, this, &ChatRoomProxyModel::handleMessageSent); QObject::disconnect(ChatRoomModel, &ChatRoomModel::markAsReadEnabledChanged, this, &ChatRoomProxyModel::markAsReadEnabledChanged); - QObject::disconnect(ChatRoomModel, &ChatRoomModel::moreEntriesLoaded, this, &ChatRoomProxyModel::onMoreEntriesLoaded); + QObject::disconnect(ChatRoomModel, &ChatRoomModel::moreEntriesLoaded, this, &ChatRoomProxyModel::onMoreEntriesLoaded); + if(mIsCall) + mChatRoomModel->removeBindingCall(); } + if( mIsCall && chatRoomModel){ + chatRoomModel->addBindingCall(); + } + mChatRoomModel = CoreManager::getInstance()->getTimelineListModel()->getChatRoomModel(chatRoomModel); setSourceModel(mChatRoomModel.get()); if (mChatRoomModel) { @@ -303,9 +326,15 @@ ChatRoomModel *ChatRoomProxyModel::getChatRoomModel () const{ } void ChatRoomProxyModel::setChatRoomModel (ChatRoomModel *chatRoomModel){ - reload(chatRoomModel); - emit chatRoomModelChanged(); - emit isRemoteComposingChanged(); + if(chatRoomModel){ + reload(chatRoomModel); + emit chatRoomModelChanged(); + emit isRemoteComposingChanged(); + }else{ + if(mIsCall && mChatRoomModel) + mChatRoomModel->removeBindingCall(); + mChatRoomModel = nullptr; + } } // ----------------------------------------------------------------------------- diff --git a/linphone-app/src/components/chat-room/ChatRoomProxyModel.hpp b/linphone-app/src/components/chat-room/ChatRoomProxyModel.hpp index 895cde139..7b3111cbd 100644 --- a/linphone-app/src/components/chat-room/ChatRoomProxyModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomProxyModel.hpp @@ -45,8 +45,11 @@ class ChatRoomProxyModel : public QSortFilterProxyModel { Q_PROPERTY(QString filterText MEMBER mFilterText WRITE setFilterText NOTIFY filterTextChanged) Q_PROPERTY(bool markAsReadEnabled READ markAsReadEnabled WRITE enableMarkAsRead NOTIFY markAsReadEnabledChanged)// Focus is at end of the list. Used to reset message count if not at end + Q_PROPERTY(bool isCall MEMBER mIsCall WRITE setIsCall NOTIFY isCallChanged) + public: ChatRoomProxyModel (QObject *parent = Q_NULLPTR); + ~ChatRoomProxyModel(); int getEntryTypeFilter (); Q_INVOKABLE void setEntryTypeFilter (int type); @@ -55,6 +58,8 @@ public: Q_INVOKABLE QString getDisplayNameComposers()const; Q_INVOKABLE QVariant getAt(int row); + void setIsCall(const bool& isCall); + Q_INVOKABLE void loadMoreEntriesAsync (); Q_INVOKABLE void loadMoreEntries (); @@ -88,6 +93,7 @@ signals: void entryTypeFilterChanged (int type); void filterTextChanged(); + void isCallChanged(); protected: bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const override; @@ -133,6 +139,7 @@ private: QString mFullLocalAddress; static QString gCachedText; bool mMarkAsReadEnabled; + bool mIsCall = false; QString mFilterText; diff --git a/linphone-app/ui/views/App/Calls/CallsWindow.qml b/linphone-app/ui/views/App/Calls/CallsWindow.qml index f17dbad02..4039f7991 100644 --- a/linphone-app/ui/views/App/Calls/CallsWindow.qml +++ b/linphone-app/ui/views/App/Calls/CallsWindow.qml @@ -218,6 +218,7 @@ Window { fullPeerAddress: window.call.fullPeerAddress fullLocalAddress: window.call.fullLocalAddress localAddress: window.call.localAddress + isCall: true // Used for cleaning data if there are no call associated to this chat room. } Connections {