From 3a1c571c58f01ab5c46ae894fea0f8c698388f63 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Wed, 4 Aug 2021 15:49:32 +0200 Subject: [PATCH] Mac crash on empty models, avoid deleting chat room right after creation (SDK bug), timeline switching, Chat Send button, contact edit redirection to chat --- .../src/components/calls/CallsListModel.cpp | 1 + .../chat-events/ChatMessageModel.cpp | 2 +- .../chat-events/ChatMessageModel.hpp | 2 +- .../components/chat-room/ChatRoomModel.cpp | 127 +++++++++++++++++- .../components/chat-room/ChatRoomModel.hpp | 123 +++++++++++++---- .../ParticipantImdnStateProxyModel.cpp | 4 + .../ParticipantImdnStateProxyModel.hpp | 4 +- .../search/SearchSipAddressesModel.cpp | 2 +- .../components/timeline/TimelineListModel.cpp | 5 +- .../src/components/timeline/TimelineModel.cpp | 2 +- .../ui/modules/Common/Form/ActionButton.qml | 6 + .../modules/Common/Form/DroppableTextArea.qml | 4 +- .../ui/modules/Linphone/Timeline/Timeline.qml | 4 +- .../ui/views/App/Main/ContactEdit.qml | 8 +- linphone-app/ui/views/App/Main/MainWindow.qml | 9 -- 15 files changed, 243 insertions(+), 60 deletions(-) diff --git a/linphone-app/src/components/calls/CallsListModel.cpp b/linphone-app/src/components/calls/CallsListModel.cpp index 3c45a4ef8..a7c0416f5 100644 --- a/linphone-app/src/components/calls/CallsListModel.cpp +++ b/linphone-app/src/components/calls/CallsListModel.cpp @@ -360,6 +360,7 @@ QVariantMap CallsListModel::createChatRoom(const QString& subject, const int& se } } result["created"] = (chatRoom != nullptr); + return result; } diff --git a/linphone-app/src/components/chat-events/ChatMessageModel.cpp b/linphone-app/src/components/chat-events/ChatMessageModel.cpp index da0b6953d..ebeebdfcd 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.cpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.cpp @@ -318,7 +318,7 @@ QString ChatMessageModel::AppDataManager::toString(){ ChatMessageModel::ChatMessageModel ( std::shared_ptr chatMessage, QObject * parent) : QObject(parent), ChatEvent(ChatRoomModel::EntryType::MessageEntry) { App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it mParticipantImdnStateListModel = std::make_shared(chatMessage); - mChatMessageListener = std::make_shared(this, parent); + mChatMessageListener = std::make_shared(this, parent); mChatMessage = chatMessage; mWasDownloaded = false; mChatMessage->addListener(mChatMessageListener); diff --git a/linphone-app/src/components/chat-events/ChatMessageModel.hpp b/linphone-app/src/components/chat-events/ChatMessageModel.hpp index e7ef4b930..9a5677523 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.hpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.hpp @@ -97,7 +97,7 @@ class ChatMessageListener : public QObject, public linphone::ChatMessageListener Q_OBJECT public: ChatMessageListener(ChatMessageModel * model, QObject * parent = nullptr); - virtual ~ChatMessageListener(){}; + virtual ~ChatMessageListener(){} virtual void onFileTransferRecv(const std::shared_ptr & message, const std::shared_ptr & content, const std::shared_ptr & buffer) override; virtual void onFileTransferSendChunk(const std::shared_ptr & message, const std::shared_ptr & content, size_t offset, size_t size, const std::shared_ptr & buffer) override; diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.cpp b/linphone-app/src/components/chat-room/ChatRoomModel.cpp index b309742fa..908c1e320 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -74,23 +74,131 @@ constexpr qint64 FileSizeLimit = 524288000; // ----------------------------------------------------------------------------- + +ChatRoomModelListener::ChatRoomModelListener(ChatRoomModel * model, QObject* parent) : QObject(parent){ + connect(this, &ChatRoomModelListener::isComposingReceived, model, &ChatRoomModel::onIsComposingReceived); + connect(this, &ChatRoomModelListener::messageReceived, model, &ChatRoomModel::onMessageReceived); + connect(this, &ChatRoomModelListener::newEvent, model, &ChatRoomModel::onNewEvent); + connect(this, &ChatRoomModelListener::chatMessageReceived, model, &ChatRoomModel::onChatMessageReceived); + connect(this, &ChatRoomModelListener::chatMessageSending, model, &ChatRoomModel::onChatMessageSending); + connect(this, &ChatRoomModelListener::chatMessageSent, model, &ChatRoomModel::onChatMessageSent); + connect(this, &ChatRoomModelListener::participantAdded, model, &ChatRoomModel::onParticipantAdded); + connect(this, &ChatRoomModelListener::participantRemoved, model, &ChatRoomModel::onParticipantRemoved); + connect(this, &ChatRoomModelListener::participantAdminStatusChanged, model, &ChatRoomModel::onParticipantAdminStatusChanged); + connect(this, &ChatRoomModelListener::stateChanged, model, &ChatRoomModel::onStateChanged); + connect(this, &ChatRoomModelListener::securityEvent, model, &ChatRoomModel::onSecurityEvent); + connect(this, &ChatRoomModelListener::subjectChanged, model, &ChatRoomModel::onSubjectChanged); + connect(this, &ChatRoomModelListener::undecryptableMessageReceived, model, &ChatRoomModel::onUndecryptableMessageReceived); + connect(this, &ChatRoomModelListener::participantDeviceAdded, model, &ChatRoomModel::onParticipantDeviceAdded); + connect(this, &ChatRoomModelListener::participantDeviceRemoved, model, &ChatRoomModel::onParticipantDeviceRemoved); + connect(this, &ChatRoomModelListener::conferenceJoined, model, &ChatRoomModel::onConferenceJoined); + connect(this, &ChatRoomModelListener::conferenceLeft, model, &ChatRoomModel::onConferenceLeft); + connect(this, &ChatRoomModelListener::ephemeralEvent, model, &ChatRoomModel::onEphemeralEvent); + connect(this, &ChatRoomModelListener::ephemeralMessageTimerStarted, model, &ChatRoomModel::onEphemeralMessageTimerStarted); + connect(this, &ChatRoomModelListener::ephemeralMessageDeleted, model, &ChatRoomModel::onEphemeralMessageDeleted); + connect(this, &ChatRoomModelListener::conferenceAddressGeneration, model, &ChatRoomModel::onConferenceAddressGeneration); + connect(this, &ChatRoomModelListener::participantRegistrationSubscriptionRequested, model, &ChatRoomModel::onParticipantRegistrationSubscriptionRequested); + connect(this, &ChatRoomModelListener::participantRegistrationUnsubscriptionRequested, model, &ChatRoomModel::onParticipantRegistrationUnsubscriptionRequested); + connect(this, &ChatRoomModelListener::chatMessageShouldBeStored, model, &ChatRoomModel::onChatMessageShouldBeStored); + connect(this, &ChatRoomModelListener::chatMessageParticipantImdnStateChanged, model, &ChatRoomModel::onChatMessageParticipantImdnStateChanged); +} + +void ChatRoomModelListener::onIsComposingReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & remoteAddress, bool isComposing){ + emit isComposingReceived(chatRoom, remoteAddress, isComposing); +} +void ChatRoomModelListener::onMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message){ + emit messageReceived(chatRoom, message); +} +void ChatRoomModelListener::onNewEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit newEvent(chatRoom, eventLog); +} +void ChatRoomModelListener::onChatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit chatMessageReceived(chatRoom, eventLog); +} +void ChatRoomModelListener::onChatMessageSending(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit chatMessageSending(chatRoom, eventLog); +} +void ChatRoomModelListener::onChatMessageSent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit chatMessageSent(chatRoom, eventLog); +} +void ChatRoomModelListener::onParticipantAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit participantAdded(chatRoom, eventLog); +} +void ChatRoomModelListener::onParticipantRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit participantRemoved(chatRoom, eventLog); +} +void ChatRoomModelListener::onParticipantAdminStatusChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit participantAdminStatusChanged(chatRoom, eventLog); +} +void ChatRoomModelListener::onStateChanged(const std::shared_ptr & chatRoom, linphone::ChatRoom::State newState){ + emit stateChanged(chatRoom, newState); +} +void ChatRoomModelListener::onSecurityEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit securityEvent(chatRoom, eventLog); +} +void ChatRoomModelListener::onSubjectChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit subjectChanged(chatRoom, eventLog); +} +void ChatRoomModelListener::onUndecryptableMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message){ + emit undecryptableMessageReceived(chatRoom, message); +} +void ChatRoomModelListener::onParticipantDeviceAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit participantDeviceAdded(chatRoom, eventLog); +} +void ChatRoomModelListener::onParticipantDeviceRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit participantDeviceRemoved(chatRoom, eventLog); +} +void ChatRoomModelListener::onConferenceJoined(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit conferenceJoined(chatRoom, eventLog); +} +void ChatRoomModelListener::onConferenceLeft(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit conferenceLeft(chatRoom, eventLog); +} +void ChatRoomModelListener::onEphemeralEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit ephemeralEvent(chatRoom, eventLog); +} +void ChatRoomModelListener::onEphemeralMessageTimerStarted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit ephemeralMessageTimerStarted(chatRoom, eventLog); +} +void ChatRoomModelListener::onEphemeralMessageDeleted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ + emit ephemeralMessageDeleted(chatRoom, eventLog); +} +void ChatRoomModelListener::onConferenceAddressGeneration(const std::shared_ptr & chatRoom){ + emit conferenceAddressGeneration(chatRoom); +} +void ChatRoomModelListener::onParticipantRegistrationSubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress){ + emit participantRegistrationSubscriptionRequested(chatRoom, participantAddress); +} +void ChatRoomModelListener::onParticipantRegistrationUnsubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress){ + emit participantRegistrationUnsubscriptionRequested(chatRoom, participantAddress); +} +void ChatRoomModelListener::onChatMessageShouldBeStored(const std::shared_ptr & chatRoom, const std::shared_ptr & message){ + emit chatMessageShouldBeStored(chatRoom, message); +} +void ChatRoomModelListener::onChatMessageParticipantImdnStateChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & message, const std::shared_ptr & state){ + emit chatMessageParticipantImdnStateChanged(chatRoom, message, state); +} + // ----------------------------------------------------------------------------- std::shared_ptr ChatRoomModel::create(std::shared_ptr chatRoom){ std::shared_ptr model = std::make_shared(chatRoom); if(model){ model->mSelf = model; - chatRoom->addListener(model); + //chatRoom->addListener(model); return model; }else return nullptr; } -ChatRoomModel::ChatRoomModel (std::shared_ptr chatRoom){ +ChatRoomModel::ChatRoomModel (std::shared_ptr chatRoom, QObject * parent) : QAbstractListModel(parent){ App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it when passing by Q_INVOKABLE CoreManager *coreManager = CoreManager::getInstance(); + mCoreHandlers = coreManager->getHandlers(); mChatRoom = chatRoom; + mChatRoomModelListener = std::make_shared(this, parent); + mChatRoom->addListener(mChatRoomModelListener); setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(mChatRoom->getLastUpdateTime())); setUnreadMessagesCount(mChatRoom->getUnreadMessagesCount()); @@ -127,8 +235,19 @@ ChatRoomModel::ChatRoomModel (std::shared_ptr chatRoom){ ChatRoomModel::~ChatRoomModel () { mParticipantListModel = nullptr; - if(mChatRoom && mDeleteChatRoom) - CoreManager::getInstance()->getCore()->deleteChatRoom(mChatRoom); + if(mChatRoom){ + mChatRoom->removeListener(mChatRoomModelListener); + if(mDeleteChatRoom){ + mDeleteChatRoom = false; + auto participants = mChatRoom->getParticipants(); + std::list> participantsAddress; + for(auto p : participants) + participantsAddress.push_back(p->getAddress()->clone()); + auto internalChatRoom = CoreManager::getInstance()->getCore()->searchChatRoom(mChatRoom->getCurrentParams(), mChatRoom->getLocalAddress(), mChatRoom->getPeerAddress(), participantsAddress); + if( internalChatRoom) + CoreManager::getInstance()->getCore()->deleteChatRoom(internalChatRoom); + } + } mChatRoom = nullptr; } diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.hpp b/linphone-app/src/components/chat-room/ChatRoomModel.hpp index 1de4218be..2d334ccb7 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -34,8 +34,71 @@ class ParticipantModel; class ParticipantListModel; class ChatEvent; class ContactModel; +class ChatRoomModel; -class ChatRoomModel : public QAbstractListModel, public linphone::ChatRoomListener { +class ChatRoomModelListener : public QObject, public linphone::ChatRoomListener { +Q_OBJECT +public: + ChatRoomModelListener(ChatRoomModel * model, QObject * parent = nullptr); + virtual ~ChatRoomModelListener(){} + + virtual void onIsComposingReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & remoteAddress, bool isComposing) override; + virtual void onMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message) override; + virtual void onNewEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onChatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onChatMessageSending(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onChatMessageSent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onParticipantAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onParticipantRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onParticipantAdminStatusChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onStateChanged(const std::shared_ptr & chatRoom, linphone::ChatRoom::State newState) override; + virtual void onSecurityEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onSubjectChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onUndecryptableMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message) override; + virtual void onParticipantDeviceAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onParticipantDeviceRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onConferenceJoined(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onConferenceLeft(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onEphemeralEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onEphemeralMessageTimerStarted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onEphemeralMessageDeleted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; + virtual void onConferenceAddressGeneration(const std::shared_ptr & chatRoom) override; + virtual void onParticipantRegistrationSubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress) override; + virtual void onParticipantRegistrationUnsubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress) override; + virtual void onChatMessageShouldBeStored(const std::shared_ptr & chatRoom, const std::shared_ptr & message) override; + virtual void onChatMessageParticipantImdnStateChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & message, const std::shared_ptr & state) override; + +signals: + void isComposingReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & remoteAddress, bool isComposing); + void messageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message); + void newEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void chatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void chatMessageSending(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void chatMessageSent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void participantAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void participantRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void participantAdminStatusChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void stateChanged(const std::shared_ptr & chatRoom, linphone::ChatRoom::State newState); + void securityEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void subjectChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void undecryptableMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message); + void participantDeviceAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void participantDeviceRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void conferenceJoined(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void conferenceLeft(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void ephemeralEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void ephemeralMessageTimerStarted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void ephemeralMessageDeleted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + void conferenceAddressGeneration(const std::shared_ptr & chatRoom); + void participantRegistrationSubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress); + void participantRegistrationUnsubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress); + void chatMessageShouldBeStored(const std::shared_ptr & chatRoom, const std::shared_ptr & message); + void chatMessageParticipantImdnStateChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & message, const std::shared_ptr & state); + + +}; + +class ChatRoomModel : public QAbstractListModel { class MessageHandlers; Q_OBJECT @@ -89,7 +152,7 @@ public: //ChatRoomModel (const QString &peerAddress, const QString &localAddress, const bool& isSecure); static std::shared_ptr create(std::shared_ptr chatRoom); - ChatRoomModel (std::shared_ptr chatRoom); + ChatRoomModel (std::shared_ptr chatRoom, QObject * parent = nullptr); ~ChatRoomModel (); int rowCount (const QModelIndex &index = QModelIndex()) const override; @@ -160,34 +223,34 @@ public: //-------------------- CHAT ROOM HANDLER - - virtual void onIsComposingReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & remoteAddress, bool isComposing) override; - virtual void onMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message) override; - virtual void onNewEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onChatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onChatMessageSending(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onChatMessageSent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onParticipantAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onParticipantRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onParticipantAdminStatusChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onStateChanged(const std::shared_ptr & chatRoom, linphone::ChatRoom::State newState) override; - virtual void onSecurityEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onSubjectChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onUndecryptableMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message) override; - virtual void onParticipantDeviceAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onParticipantDeviceRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onConferenceJoined(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onConferenceLeft(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onEphemeralEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onEphemeralMessageTimerStarted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onEphemeralMessageDeleted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) override; - virtual void onConferenceAddressGeneration(const std::shared_ptr & chatRoom) override; - virtual void onParticipantRegistrationSubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress) override; - virtual void onParticipantRegistrationUnsubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress) override; - virtual void onChatMessageShouldBeStored(const std::shared_ptr & chatRoom, const std::shared_ptr & message) override; - virtual void onChatMessageParticipantImdnStateChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & message, const std::shared_ptr & state) override; - public slots: + virtual void onIsComposingReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & remoteAddress, bool isComposing); + virtual void onMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message); + virtual void onNewEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onChatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onChatMessageSending(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onChatMessageSent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onParticipantAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onParticipantRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onParticipantAdminStatusChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onStateChanged(const std::shared_ptr & chatRoom, linphone::ChatRoom::State newState); + virtual void onSecurityEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onSubjectChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onUndecryptableMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message); + virtual void onParticipantDeviceAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onParticipantDeviceRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onConferenceJoined(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onConferenceLeft(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onEphemeralEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onEphemeralMessageTimerStarted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onEphemeralMessageDeleted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); + virtual void onConferenceAddressGeneration(const std::shared_ptr & chatRoom); + virtual void onParticipantRegistrationSubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress); + virtual void onParticipantRegistrationUnsubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress); + virtual void onChatMessageShouldBeStored(const std::shared_ptr & chatRoom, const std::shared_ptr & message); + virtual void onChatMessageParticipantImdnStateChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & message, const std::shared_ptr & state) ; + + void removeEntry(ChatEvent* entry); signals: @@ -255,6 +318,8 @@ private: std::shared_ptr mMessageHandlers; QMap, QString> mComposers; // Store all addresses that are composing with its username std::shared_ptr mChatRoom; + std::shared_ptr mChatRoomModelListener; + std::weak_ptr mSelf; }; diff --git a/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.cpp b/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.cpp index c1c966b24..302a1354f 100644 --- a/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.cpp +++ b/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.cpp @@ -56,6 +56,10 @@ int ParticipantImdnStateProxyModel::getCount(){ return rowCount(); } +ChatMessageModel * ParticipantImdnStateProxyModel::getChatMessageModel(){ + return nullptr; +} + void ParticipantImdnStateProxyModel::setChatMessageModel(ChatMessageModel * message){ ParticipantImdnStateListModel *model = static_cast(sourceModel()); ParticipantImdnStateListModel *messageModel = message->getParticipantImdnStates().get(); diff --git a/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.hpp b/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.hpp index 90d8d02d1..c06820965 100644 --- a/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.hpp +++ b/linphone-app/src/components/participant-imdn/ParticipantImdnStateProxyModel.hpp @@ -36,11 +36,13 @@ class ParticipantImdnStateProxyModel : public QSortFilterProxyModel { Q_OBJECT public: - Q_PROPERTY(ChatMessageModel * chatMessageModel WRITE setChatMessageModel NOTIFY chatMessageModelChanged) + Q_PROPERTY(ChatMessageModel * chatMessageModel READ getChatMessageModel WRITE setChatMessageModel NOTIFY chatMessageModelChanged) Q_PROPERTY(int count READ getCount NOTIFY countChanged) ParticipantImdnStateProxyModel (QObject *parent = nullptr); + ChatMessageModel * getChatMessageModel(); void setChatMessageModel(ChatMessageModel* message); + int getCount(); signals: diff --git a/linphone-app/src/components/search/SearchSipAddressesModel.cpp b/linphone-app/src/components/search/SearchSipAddressesModel.cpp index ab15353d1..d580c9f6b 100644 --- a/linphone-app/src/components/search/SearchSipAddressesModel.cpp +++ b/linphone-app/src/components/search/SearchSipAddressesModel.cpp @@ -62,7 +62,7 @@ SearchSipAddressesModel::~SearchSipAddressesModel(){ // ----------------------------------------------------------------------------- int SearchSipAddressesModel::rowCount (const QModelIndex &) const { - return mAddresses.count()-1; + return std::max(mAddresses.count()-1,0); } QHash SearchSipAddressesModel::roleNames () const { diff --git a/linphone-app/src/components/timeline/TimelineListModel.cpp b/linphone-app/src/components/timeline/TimelineListModel.cpp index 421ce8314..be4366522 100644 --- a/linphone-app/src/components/timeline/TimelineListModel.cpp +++ b/linphone-app/src/components/timeline/TimelineListModel.cpp @@ -292,11 +292,12 @@ void TimelineListModel::remove(std::shared_ptr model){ } } void TimelineListModel::removeChatRoomModel(std::shared_ptr model){ - if(model->getChatRoom()->isEmpty() && (model->hasBeenLeft() || !model->isGroupEnabled())){ + if(!model || (model->getChatRoom()->isEmpty() && (model->hasBeenLeft() || !model->isGroupEnabled()))){ auto itTimeline = mTimelines.begin(); while(itTimeline != mTimelines.end()) { if((*itTimeline)->mChatRoomModel == model){ - model->deleteChatRoom(); + if(model) + model->deleteChatRoom(); remove(*itTimeline); return; }else diff --git a/linphone-app/src/components/timeline/TimelineModel.cpp b/linphone-app/src/components/timeline/TimelineModel.cpp index 3cdf7b3d3..7d35b2892 100644 --- a/linphone-app/src/components/timeline/TimelineModel.cpp +++ b/linphone-app/src/components/timeline/TimelineModel.cpp @@ -62,7 +62,7 @@ TimelineModel::TimelineModel (std::shared_ptr chatRoom, QObj } TimelineModel::~TimelineModel(){ - mChatRoomModel->getChatRoom()->removeListener(mChatRoomModel); + //mChatRoomModel->getChatRoom()->removeListener(mChatRoomModel); } QString TimelineModel::getFullPeerAddress() const{ diff --git a/linphone-app/ui/modules/Common/Form/ActionButton.qml b/linphone-app/ui/modules/Common/Form/ActionButton.qml index fdc3390bb..31ae9e515 100644 --- a/linphone-app/ui/modules/Common/Form/ActionButton.qml +++ b/linphone-app/ui/modules/Common/Form/ActionButton.qml @@ -80,6 +80,12 @@ Item { iconSize: wrappedButton.iconSize || ( parent.width > parent.height ? parent.height : parent.width ) + MouseArea{ + anchors.fill:parent + hoverEnabled: true + acceptedButtons: Qt.NoButton + cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor + } /* diff --git a/linphone-app/ui/modules/Common/Form/DroppableTextArea.qml b/linphone-app/ui/modules/Common/Form/DroppableTextArea.qml index 01a5c0d3e..843cac43c 100644 --- a/linphone-app/ui/modules/Common/Form/DroppableTextArea.qml +++ b/linphone-app/ui/modules/Common/Form/DroppableTextArea.qml @@ -200,11 +200,11 @@ Item { DroppableTextAreaStyle.fileChooserButton.margins verticalCenter: parent.verticalCenter }*/ - enabled: droppableTextArea.dropEnabled + //enabled: droppableTextArea.dropEnabled icon: 'send' iconSize: DroppableTextAreaStyle.fileChooserButton.size useStates:false - onClicked: handleValidation() + onClicked: textArea.handleValidation() Icon{ visible:droppableTextArea.isEphemeral icon:'timer' diff --git a/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml b/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml index 60cf7e031..359c40a99 100644 --- a/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml +++ b/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml @@ -76,8 +76,6 @@ Rectangle { id:showHistory anchors.fill:parent onClicked: { - //view.currentIndex = -1 - //timeline.entrySelected('',false) filterView.visible = !filterView.visible } } @@ -280,6 +278,8 @@ Rectangle { anchors.fill: parent onClicked: { //timeline.model.unselectAll() + if(modelData.selected) + timeline.entrySelected(modelData) modelData.selected = true view.currentIndex = index; } diff --git a/linphone-app/ui/views/App/Main/ContactEdit.qml b/linphone-app/ui/views/App/Main/ContactEdit.qml index 3ed50ce28..1384bdafe 100644 --- a/linphone-app/ui/views/App/Main/ContactEdit.qml +++ b/linphone-app/ui/views/App/Main/ContactEdit.qml @@ -169,13 +169,7 @@ ColumnLayout { sipAddresses: _contact ? _contact.vcard.sipAddresses : [ contactEdit.sipAddress ] - onSipAddressClicked: window.setView('Conversation', { - - peerAddress: sipAddress, - localAddress: AccountSettingsModel.sipAddress, - fullPeerAddress: sipAddress, - fullLocalAddress: AccountSettingsModel.fullSipAddress - }) + onSipAddressClicked: CallsListModel.launchChat( sipAddress,0 ) } // --------------------------------------------------------------------------- diff --git a/linphone-app/ui/views/App/Main/MainWindow.qml b/linphone-app/ui/views/App/Main/MainWindow.qml index 8cb5749f7..57737b939 100644 --- a/linphone-app/ui/views/App/Main/MainWindow.qml +++ b/linphone-app/ui/views/App/Main/MainWindow.qml @@ -179,15 +179,6 @@ ApplicationWindow { window.setView('ContactEdit', { sipAddress: entry.sipAddress }) } else { CallsListModel.createChatRoom( "", false, sipAddress ) - /* - window.setView('Conversation', { - isSecure: entry.isSecure, - peerAddress: entry.sipAddress, - fullPeerAddress: entry.fullSipAddress, - fullLocalAddress: AccountSettingsModel.fullSipAddress, - localAddress: AccountSettingsModel.sipAddress - - })*/ } }