diff --git a/linphone-app/src/components/call/CallModel.cpp b/linphone-app/src/components/call/CallModel.cpp index 56901e8a8..cac1ed024 100644 --- a/linphone-app/src/components/call/CallModel.cpp +++ b/linphone-app/src/components/call/CallModel.cpp @@ -73,14 +73,8 @@ CallModel::CallModel (shared_ptr call){ } CoreHandlers *coreHandlers = coreManager->getHandlers().get(); - QObject::connect( - coreHandlers, &CoreHandlers::callStateChanged, - this, &CallModel::handleCallStateChanged - ); - QObject::connect( - coreHandlers, &CoreHandlers::callEncryptionChanged, - this, &CallModel::handleCallEncryptionChanged - ); + QObject::connect(coreHandlers, &CoreHandlers::callStateChanged, this, &CallModel::handleCallStateChanged ); + QObject::connect(coreHandlers, &CoreHandlers::callEncryptionChanged, this, &CallModel::handleCallEncryptionChanged ); // Update fields and make a search to know to who the call belong mMagicSearch = CoreManager::getInstance()->getCore()->createMagicSearch(); @@ -665,6 +659,25 @@ void CallModel::searchReceived(std::list } } +void CallModel::callEnded(){ + ChatRoomModel * model = getChatRoomModel(); + + if(model){ + model->callEnded(mCall); + }else{// No chat rooms have been associated for this call. Search one in current chat room list + shared_ptr core = CoreManager::getInstance()->getCore(); + std::shared_ptr params = core->createDefaultChatRoomParams(); + std::list> participants; + + auto chatRoom = core->searchChatRoom(params, mCall->getCallLog()->getLocalAddress() + , mCall->getRemoteAddress() + , participants); + std::shared_ptr chatRoomModel= CoreManager::getInstance()->getTimelineListModel()->getChatRoomModel(chatRoom, false); + if(chatRoomModel) + chatRoomModel->callEnded(mCall); + } +} + void CallModel::setRemoteDisplayName(const std::string& name){ mRemoteAddress->setDisplayName(name); emit fullPeerAddressChanged(); diff --git a/linphone-app/src/components/call/CallModel.hpp b/linphone-app/src/components/call/CallModel.hpp index 3cf628edb..064bd9521 100644 --- a/linphone-app/src/components/call/CallModel.hpp +++ b/linphone-app/src/components/call/CallModel.hpp @@ -161,6 +161,7 @@ public: public slots: // Set remote display name when a search has been done void searchReceived(std::list> results); + void callEnded(); signals: void callErrorChanged (const QString &callError); diff --git a/linphone-app/src/components/calls/CallsListModel.cpp b/linphone-app/src/components/calls/CallsListModel.cpp index 0be4d8ca4..a3bc6f0f9 100644 --- a/linphone-app/src/components/calls/CallsListModel.cpp +++ b/linphone-app/src/components/calls/CallsListModel.cpp @@ -102,6 +102,7 @@ void CallsListModel::askForTransfer (CallModel *callModel) { // ----------------------------------------------------------------------------- void CallsListModel::launchAudioCall (const QString &sipAddress, const QHash &headers) const { + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = true; shared_ptr core = CoreManager::getInstance()->getCore(); shared_ptr address = core->interpretUrl(Utils::appStringToCoreString(sipAddress)); @@ -138,6 +139,7 @@ void CallsListModel::launchAudioCall (const QString &sipAddress, const QHash &headers) const { + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = true; shared_ptr core = CoreManager::getInstance()->getCore(); shared_ptr address = core->interpretUrl(Utils::appStringToCoreString(sipAddress)); @@ -175,6 +177,7 @@ void CallsListModel::launchSecureAudioCall (const QString &sipAddress, LinphoneE } void CallsListModel::launchVideoCall (const QString &sipAddress) const { + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = true; shared_ptr core = CoreManager::getInstance()->getCore(); if (!core->videoSupported()) { qWarning() << QStringLiteral("Unable to launch video call. (Video not supported.) Launching audio call..."); @@ -194,6 +197,7 @@ void CallsListModel::launchVideoCall (const QString &sipAddress) const { } ChatRoomModel* CallsListModel::launchSecureChat (const QString &sipAddress) const { + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = true; shared_ptr core = CoreManager::getInstance()->getCore(); shared_ptr address = core->interpretUrl(Utils::appStringToCoreString(sipAddress)); if (!address) @@ -227,10 +231,11 @@ ChatRoomModel* CallsListModel::launchSecureChat (const QString &sipAddress) cons QVariantMap CallsListModel::launchChat(const QString &sipAddress, const int& securityLevel) const{ QVariantList participants; participants << sipAddress; - return createChatRoom("", securityLevel, participants); + return createChatRoom("", securityLevel, participants, true); } ChatRoomModel* CallsListModel::createChat (const QString &participantAddress) const{ + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = true; shared_ptr core = CoreManager::getInstance()->getCore(); shared_ptr address = core->interpretUrl(Utils::appStringToCoreString(participantAddress)); if (!address) @@ -262,6 +267,7 @@ ChatRoomModel* CallsListModel::createChat (const CallModel * model) const{ } bool CallsListModel::createSecureChat (const QString& subject, const QString &participantAddress) const{ + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = true; shared_ptr core = CoreManager::getInstance()->getCore(); shared_ptr address = core->interpretUrl(Utils::appStringToCoreString(participantAddress)); if (!address) @@ -283,11 +289,14 @@ bool CallsListModel::createSecureChat (const QString& subject, const QString &pa return chatRoom != nullptr; } // Created, timeline that can be used -QVariantMap CallsListModel::createChatRoom(const QString& subject, const int& securityLevel, const QVariantList& participants) const{ +QVariantMap CallsListModel::createChatRoom(const QString& subject, const int& securityLevel, const QVariantList& participants, const bool& selectAfterCreation) const{ + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = selectAfterCreation; QVariantMap result; shared_ptr core = CoreManager::getInstance()->getCore(); std::shared_ptr chatRoom; QList< std::shared_ptr> admins; + std::shared_ptr timeline; + auto timelineList = CoreManager::getInstance()->getTimelineListModel(); qWarning() << "ChatRoom creation of " << subject << " at " << securityLevel << " security and with " << participants; std::shared_ptr params = core->createDefaultChatRoomParams(); @@ -335,16 +344,21 @@ QVariantMap CallsListModel::createChatRoom(const QString& subject, const int& se chatRoom = core->createChatRoom(params, localAddress, chatRoomParticipants); if(chatRoom != nullptr && admins.size() > 0) ChatRoomInitializer::setAdminsAsync(params->getSubject(), params->getBackend(), params->groupEnabled(), admins ); + timeline = timelineList->getTimeline(chatRoom, false); }else{ if(admins.size() > 0){ ChatRoomInitializer::setAdminsSync(chatRoom, admins); } - auto timelineList = CoreManager::getInstance()->getTimelineListModel(); - auto timeline = timelineList->getTimeline(chatRoom, true); - QTimer::singleShot(200, [timeline](){// Delay process in order to let GUI time for Timeline building/linking before doing actions - timeline->setSelected(true); - }); + timeline = timelineList->getTimeline(chatRoom, true); + } + if(timeline){ + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = false; result["chatRoomModel"] = QVariant::fromValue(timeline->getChatRoomModel()); + if(selectAfterCreation) {// The timeline here will not receive the first creation event. Set Selected if needed + QTimer::singleShot(200, [timeline](){// Delay process in order to let GUI time for Timeline building/linking before doing actions + timeline->setSelected(true); + }); + } } } result["created"] = (chatRoom != nullptr); @@ -420,12 +434,11 @@ void CallsListModel::handleCallStateChanged (const shared_ptr &c break; case linphone::Call::State::End: - case linphone::Call::State::Error: - if (call->getCallLog()->getStatus() == linphone::Call::Status::Missed) - emit callMissed(&call->getData("call-model")); + case linphone::Call::State::Error:{ + CallModel * model = &call->getData("call-model"); + model->callEnded(); removeCall(call); - break; - + } break; case linphone::Call::State::StreamsRunning: { int index = findCallIndex(mList, call); emit callRunning(index, &call->getData("call-model")); diff --git a/linphone-app/src/components/calls/CallsListModel.hpp b/linphone-app/src/components/calls/CallsListModel.hpp index 8feaaf013..c4c31af17 100644 --- a/linphone-app/src/components/calls/CallsListModel.hpp +++ b/linphone-app/src/components/calls/CallsListModel.hpp @@ -54,7 +54,7 @@ public: Q_INVOKABLE ChatRoomModel* createChat (const CallModel * ) const; Q_INVOKABLE bool createSecureChat (const QString& subject, const QString &participantAddress) const; - Q_INVOKABLE QVariantMap createChatRoom(const QString& subject, const int& securityLevel, const QVariantList& participants) const; + Q_INVOKABLE QVariantMap createChatRoom(const QString& subject, const int& securityLevel, const QVariantList& participants, const bool& selectAfterCreation) const; Q_INVOKABLE int getRunningCallsNumber () const; diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.cpp b/linphone-app/src/components/chat-room/ChatRoomModel.cpp index 8483baf50..42119f397 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -54,6 +54,7 @@ #include "components/presence/Presence.hpp" #include "components/timeline/TimelineModel.hpp" #include "components/timeline/TimelineListModel.hpp" +#include "components/core/event-count-notifier/AbstractEventCountNotifier.hpp" #include "utils/QExifImageHeader.hpp" #include "utils/Utils.hpp" #include "utils/LinphoneEnums.hpp" @@ -199,8 +200,19 @@ ChatRoomModel::ChatRoomModel (std::shared_ptr chatRoom, QObj mChatRoom = chatRoom; mChatRoomModelListener = std::make_shared(this, parent); mChatRoom->addListener(mChatRoomModelListener); - - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(mChatRoom->getLastUpdateTime())); + +// Get Max updatetime from chat room and last call event + + auto callHistory = CoreManager::getInstance()->getCore()->getCallHistory(mChatRoom->getPeerAddress(), mChatRoom->getLocalAddress()); + if(callHistory.size() > 0){ + auto callDate = callHistory.front()->getStartDate(); + if( callHistory.front()->getStatus() == linphone::Call::Status::Success ) + callDate += callHistory.front()->getDuration(); + setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(max(mChatRoom->getLastUpdateTime(), callDate )*1000)); + }else + setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(mChatRoom->getLastUpdateTime()*1000)); + + setUnreadMessagesCount(mChatRoom->getUnreadMessagesCount()); setMissedCallsCount(0); @@ -518,6 +530,16 @@ void ChatRoomModel::setLastUpdateTime(const QDateTime& lastUpdateDate) { } } +void ChatRoomModel::updateLastUpdateTime(){ + QDateTime lastDateTime = QDateTime::fromMSecsSinceEpoch(mChatRoom->getLastUpdateTime()*1000); + QDateTime lastCallTime = lastDateTime; + for(auto e : mEntries){ + if(e->mType == CallEntry && e->mTimestamp > lastCallTime) + lastCallTime = e->mTimestamp; + } + setLastUpdateTime(lastCallTime); +} + void ChatRoomModel::setUnreadMessagesCount(const int& count){ if(count != mUnreadMessagesCount){ mUnreadMessagesCount = count; @@ -532,6 +554,15 @@ void ChatRoomModel::setMissedCallsCount(const int& count){ } } +void ChatRoomModel::addMissedCallsCount(std::shared_ptr call){ + insertCall(call->getCallLog()); + auto timeline = CoreManager::getInstance()->getTimelineListModel()->getTimeline(mChatRoom, false); + if(!timeline || !timeline->mSelected){ + setMissedCallsCount(mMissedCallsCount+1); + CoreManager::getInstance()->getEventCountNotifier()->handleCallMissed(&call->getData("call-model")); + } +} + void ChatRoomModel::setEphemeralEnabled(bool enabled){ if(isEphemeralEnabled() != enabled){ mChatRoom->enableEphemeral(enabled); @@ -811,12 +842,21 @@ void ChatRoomModel::loadMoreEntries(){ for(auto entry : entries) mEntries.prepend(entry); endInsertRows(); + updateLastUpdateTime(); } } //------------------------------------------------- //------------------------------------------------- +void ChatRoomModel::callEnded(std::shared_ptr call){ + if( call->getCallLog()->getStatus() == linphone::Call::Status::Missed) + addMissedCallsCount(call); + else{ + insertCall(call->getCallLog()); + } +} + // ----------------------------------------------------------------------------- void ChatRoomModel::insertCall (const std::shared_ptr &callLog) { @@ -836,6 +876,7 @@ void ChatRoomModel::insertCall (const std::shared_ptr &callLo endInsertRows(); } } + updateLastUpdateTime(); } } } @@ -928,6 +969,8 @@ void ChatRoomModel::insertNotices (const QList &call, linphone::Call::State state) { + +/* if (state == linphone::Call::State::End || state == linphone::Call::State::Error){ shared_ptr core = CoreManager::getInstance()->getCore(); std::shared_ptr params = core->createDefaultChatRoomParams(); @@ -941,9 +984,11 @@ void ChatRoomModel::handleCallStateChanged (const std::shared_ptr &call){ + } void ChatRoomModel::handlePresenceStatusReceived(std::shared_ptr contact){ @@ -988,12 +1033,12 @@ void ChatRoomModel::onIsComposingReceived(const std::shared_ptrgetLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message){ setUnreadMessagesCount(chatRoom->getUnreadMessagesCount()); - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onNewEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ @@ -1002,14 +1047,14 @@ void ChatRoomModel::onNewEvent(const std::shared_ptr & chatR }else if( eventLog->getType() == linphone::EventLog::Type::ConferenceCreated ){ emit fullPeerAddressChanged(); } - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onChatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) { auto message = eventLog->getChatMessage(); if(message){ insertMessageAtEnd(message); - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit messageReceived(message); } } @@ -1018,13 +1063,13 @@ void ChatRoomModel::onChatMessageSending(const std::shared_ptrgetChatMessage(); if(message){ insertMessageAtEnd(message); - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit messageReceived(message); } } void ChatRoomModel::onChatMessageSent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onParticipantAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ @@ -1032,7 +1077,7 @@ void ChatRoomModel::onParticipantAdded(const std::shared_ptr auto e = std::find(events.begin(), events.end(), eventLog); if( e != events.end() ) insertNotice(*e); - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit participantAdded(chatRoom, eventLog); emit fullPeerAddressChanged(); } @@ -1042,7 +1087,7 @@ void ChatRoomModel::onParticipantRemoved(const std::shared_ptrgetLastUpdateTime())); + updateLastUpdateTime(); emit participantRemoved(chatRoom, eventLog); emit fullPeerAddressChanged(); } @@ -1052,13 +1097,13 @@ void ChatRoomModel::onParticipantAdminStatusChanged(const std::shared_ptrgetLastUpdateTime())); + updateLastUpdateTime(); emit participantAdminStatusChanged(chatRoom, eventLog); emit isMeAdminChanged(); // It is not the case all the time but calling getters is not a heavy request } void ChatRoomModel::onStateChanged(const std::shared_ptr & chatRoom, linphone::ChatRoom::State newState){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit stateChanged(getState()); } @@ -1067,7 +1112,7 @@ void ChatRoomModel::onSecurityEvent(const std::shared_ptr & auto e = std::find(events.begin(), events.end(), eventLog); if( e != events.end() ) insertNotice(*e); - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit securityLevelChanged((int)chatRoom->getSecurityLevel()); } void ChatRoomModel::onSubjectChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) { @@ -1075,22 +1120,22 @@ void ChatRoomModel::onSubjectChanged(const std::shared_ptr & auto e = std::find(events.begin(), events.end(), eventLog); if( e != events.end() ) insertNotice(*e); - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit subjectChanged(getSubject()); emit usernameChanged(); } void ChatRoomModel::onUndecryptableMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onParticipantDeviceAdded(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit participantDeviceAdded(chatRoom, eventLog); } void ChatRoomModel::onParticipantDeviceRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit participantDeviceRemoved(chatRoom, eventLog); } @@ -1106,7 +1151,7 @@ void ChatRoomModel::onConferenceJoined(const std::shared_ptr insertNotice(*e); } setUnreadMessagesCount(mChatRoom->getUnreadMessagesCount()); // Update message count. In the case of joining conference, the conference id was not valid thus, the missing count was not about the chat room but a global one. - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit usernameChanged(); emit conferenceJoined(chatRoom, eventLog); emit hasBeenLeftChanged(); @@ -1124,7 +1169,7 @@ void ChatRoomModel::onConferenceLeft(const std::shared_ptr & if(e != events.end() ) insertNotice(*e); } - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit conferenceLeft(chatRoom, eventLog); emit hasBeenLeftChanged(); } @@ -1135,23 +1180,23 @@ void ChatRoomModel::onEphemeralEvent(const std::shared_ptr & auto e = std::find(events.begin(), events.end(), eventLog); if(e != events.end() ) insertNotice(*e); - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onEphemeralMessageTimerStarted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onEphemeralMessageDeleted(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onConferenceAddressGeneration(const std::shared_ptr & chatRoom){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); } void ChatRoomModel::onParticipantRegistrationSubscriptionRequested(const std::shared_ptr & chatRoom, const std::shared_ptr & participantAddress){ - setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime())); + updateLastUpdateTime(); emit participantRegistrationSubscriptionRequested(chatRoom, participantAddress); } diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.hpp b/linphone-app/src/components/chat-room/ChatRoomModel.hpp index f8ae44a40..91fad5a32 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -200,9 +200,11 @@ public: //---- Setters void setSubject(QString& subject); void setLastUpdateTime(const QDateTime& lastUpdateDate); + void updateLastUpdateTime(); - void setUnreadMessagesCount(const int& count); + void setUnreadMessagesCount(const int& count); void setMissedCallsCount(const int& count); + void addMissedCallsCount(std::shared_ptr call); void setEphemeralEnabled(bool enabled); void setEphemeralLifetime(long lifetime); @@ -217,6 +219,7 @@ public: void resetMessageCount (); Q_INVOKABLE void initEntries(); Q_INVOKABLE void loadMoreEntries(); + void callEnded(std::shared_ptr call); QDateTime mLastUpdateTime; int mUnreadMessagesCount = 0; @@ -227,6 +230,14 @@ public: int mLastEntriesStep = 50; // Retrieve a part of the history to avoid too much processing + void insertCall (const std::shared_ptr &callLog); + void insertCalls (const QList > &calls); + void insertMessageAtEnd (const std::shared_ptr &message); + void insertMessages (const QList > &messages); + void insertNotice (const std::shared_ptr &enventLog); + void insertNotices (const QList> &eventLogs); + + //-------------------- CHAT ROOM HANDLER public slots: @@ -306,12 +317,6 @@ signals: void conferenceLeft(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog); private: - void insertCall (const std::shared_ptr &callLog); - void insertCalls (const QList > &calls); - void insertMessageAtEnd (const std::shared_ptr &message); - void insertMessages (const QList > &messages); - void insertNotice (const std::shared_ptr &enventLog); - void insertNotices (const QList> &eventLogs); void handleCallStateChanged (const std::shared_ptr &call, linphone::Call::State state); void handleCallCreated(const std::shared_ptr &call);// Count an event call diff --git a/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp b/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp index 7fe350e0b..922947b12 100644 --- a/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomProxyModel.cpp @@ -29,6 +29,7 @@ #include "components/chat-events/ChatNoticeModel.hpp" #include "components/chat-events/ChatCallModel.hpp" #include "components/timeline/TimelineListModel.hpp" +#include "components/timeline/TimelineModel.hpp" // ============================================================================= @@ -301,8 +302,11 @@ static inline QWindow *getParentWindow (QObject *object) { void ChatRoomProxyModel::handleIsActiveChanged (QWindow *window) { if (mChatRoomModel && window->isActive() && getParentWindow(this) == window) { - mChatRoomModel->resetMessageCount(); - mChatRoomModel->focused(); + auto timeline = CoreManager::getInstance()->getTimelineListModel()->getTimeline(mChatRoomModel->getChatRoom(), false); + if(timeline && timeline->mSelected){ + mChatRoomModel->resetMessageCount(); + mChatRoomModel->focused(); + } } } diff --git a/linphone-app/src/components/core/CoreManager.cpp b/linphone-app/src/components/core/CoreManager.cpp index 5281924f4..5e2904dae 100644 --- a/linphone-app/src/components/core/CoreManager.cpp +++ b/linphone-app/src/components/core/CoreManager.cpp @@ -118,6 +118,11 @@ void CoreManager::initCoreManager(){ qInfo() << QStringLiteral("CoreManager initialized"); emit coreManagerInitialized(); } + +AbstractEventCountNotifier * CoreManager::getEventCountNotifier(){ + return mEventCountNotifier; +} + CoreManager *CoreManager::getInstance (){ return mInstance; } diff --git a/linphone-app/src/components/core/CoreManager.hpp b/linphone-app/src/components/core/CoreManager.hpp index 01c71c6cf..df73546ae 100644 --- a/linphone-app/src/components/core/CoreManager.hpp +++ b/linphone-app/src/components/core/CoreManager.hpp @@ -31,6 +31,7 @@ class QTimer; +class AbstractEventCountNotifier; class AccountSettingsModel; class CallsListModel; class ChatRoomModel; @@ -48,187 +49,190 @@ class TimelineListModel; class CoreManager : public QObject { - Q_OBJECT; - - Q_PROPERTY(QString version READ getVersion CONSTANT) - Q_PROPERTY(QString downloadUrl READ getDownloadUrl CONSTANT) - Q_PROPERTY(int eventCount READ getEventCount NOTIFY eventCountChanged) - + Q_OBJECT; + + Q_PROPERTY(QString version READ getVersion CONSTANT) + Q_PROPERTY(QString downloadUrl READ getDownloadUrl CONSTANT) + Q_PROPERTY(int eventCount READ getEventCount NOTIFY eventCountChanged) + public: - bool started () const { - return mStarted; - } - - std::shared_ptr getCore () { - return mCore; - } - - std::shared_ptr getHandlers () { - Q_CHECK_PTR(mHandlers); - return mHandlers; - } - - //std::shared_ptr getChatRoomModel (const QString &peerAddress, const QString &localAddress, const bool &isSecure); - //std::shared_ptr getChatRoomModel (ChatRoomModel * data);// Get the shared pointer. This can be done becuase of unicity of ChatRoomModel - //std::shared_ptr getChatRoomModel (std::shared_ptr chatRoom, const bool& create = true); - //bool chatRoomModelExists (const QString &sipAddress, const QString &localAddress, const bool &isSecure); - //bool chatRoomModelExists (std::shared_ptr chatRoom); - - HistoryModel* getHistoryModel(); - - // --------------------------------------------------------------------------- - // Video render lock. - // --------------------------------------------------------------------------- - - void lockVideoRender () { - mMutexVideoRender.lock(); - } - - void unlockVideoRender () { - mMutexVideoRender.unlock(); - } - - // --------------------------------------------------------------------------- - // Singleton models. - // --------------------------------------------------------------------------- - - CallsListModel *getCallsListModel () const { - Q_CHECK_PTR(mCallsListModel); - return mCallsListModel; - } - /* Timelines + bool started () const { + return mStarted; + } + + std::shared_ptr getCore () { + return mCore; + } + + std::shared_ptr getHandlers () { + Q_CHECK_PTR(mHandlers); + return mHandlers; + } + + //std::shared_ptr getChatRoomModel (const QString &peerAddress, const QString &localAddress, const bool &isSecure); + //std::shared_ptr getChatRoomModel (ChatRoomModel * data);// Get the shared pointer. This can be done becuase of unicity of ChatRoomModel + //std::shared_ptr getChatRoomModel (std::shared_ptr chatRoom, const bool& create = true); + //bool chatRoomModelExists (const QString &sipAddress, const QString &localAddress, const bool &isSecure); + //bool chatRoomModelExists (std::shared_ptr chatRoom); + + HistoryModel* getHistoryModel(); + + // --------------------------------------------------------------------------- + // Video render lock. + // --------------------------------------------------------------------------- + + void lockVideoRender () { + mMutexVideoRender.lock(); + } + + void unlockVideoRender () { + mMutexVideoRender.unlock(); + } + + // --------------------------------------------------------------------------- + // Singleton models. + // --------------------------------------------------------------------------- + + CallsListModel *getCallsListModel () const { + Q_CHECK_PTR(mCallsListModel); + return mCallsListModel; + } + /* Timelines ChatRoomListModel *getChatRoomListModel () const { - Q_CHECK_PTR(mChatRoomListModel); - return mChatRoomListModel; + Q_CHECK_PTR(mChatRoomListModel); + return mChatRoomListModel; }*/ - - - ContactsListModel *getContactsListModel () const { - Q_CHECK_PTR(mContactsListModel); - return mContactsListModel; - } - - ContactsImporterListModel *getContactsImporterListModel () const { - Q_CHECK_PTR(mContactsImporterListModel); - return mContactsImporterListModel; - } - - TimelineListModel *getTimelineListModel () const { - return mTimelineListModel; - } - - SipAddressesModel *getSipAddressesModel () const { - Q_CHECK_PTR(mSipAddressesModel); - return mSipAddressesModel; - } - - SettingsModel *getSettingsModel () const { - Q_CHECK_PTR(mSettingsModel); - return mSettingsModel; - } - - AccountSettingsModel *getAccountSettingsModel () const { - Q_CHECK_PTR(mAccountSettingsModel); - return mAccountSettingsModel; - } + + + ContactsListModel *getContactsListModel () const { + Q_CHECK_PTR(mContactsListModel); + return mContactsListModel; + } + + ContactsImporterListModel *getContactsImporterListModel () const { + Q_CHECK_PTR(mContactsImporterListModel); + return mContactsImporterListModel; + } + + TimelineListModel *getTimelineListModel () const { + return mTimelineListModel; + } + + SipAddressesModel *getSipAddressesModel () const { + Q_CHECK_PTR(mSipAddressesModel); + return mSipAddressesModel; + } + + SettingsModel *getSettingsModel () const { + Q_CHECK_PTR(mSettingsModel); + return mSettingsModel; + } + + AccountSettingsModel *getAccountSettingsModel () const { + Q_CHECK_PTR(mAccountSettingsModel); + return mAccountSettingsModel; + } LdapListModel *getLdapListModel() const{ return mLdapListModel; } - static CoreManager *getInstance (); - - // --------------------------------------------------------------------------- - // Initialization. - // --------------------------------------------------------------------------- - - static void init (QObject *parent, const QString &configPath); - static void uninit (); - - // --------------------------------------------------------------------------- - - // Must be used in a qml scene. - // Warning: The ownership of `VcardModel` is `QQmlEngine::JavaScriptOwnership` by default. - Q_INVOKABLE VcardModel *createDetachedVcardModel () const; - - Q_INVOKABLE void forceRefreshRegisters (); - void updateUnreadMessageCount(); - - Q_INVOKABLE void sendLogs () const; - Q_INVOKABLE void cleanLogs () const; - - int getMissedCallCount(const QString &peerAddress, const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) - int getMissedCallCountFromLocal(const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) - - static bool isInstanciated(){return mInstance!=nullptr;} - - bool isLastRemoteProvisioningGood(); - + + AbstractEventCountNotifier * getEventCountNotifier(); + + static CoreManager *getInstance (); + + // --------------------------------------------------------------------------- + // Initialization. + // --------------------------------------------------------------------------- + + static void init (QObject *parent, const QString &configPath); + static void uninit (); + + // --------------------------------------------------------------------------- + + // Must be used in a qml scene. + // Warning: The ownership of `VcardModel` is `QQmlEngine::JavaScriptOwnership` by default. + Q_INVOKABLE VcardModel *createDetachedVcardModel () const; + + Q_INVOKABLE void forceRefreshRegisters (); + void updateUnreadMessageCount(); + + Q_INVOKABLE void sendLogs () const; + Q_INVOKABLE void cleanLogs () const; + + int getMissedCallCount(const QString &peerAddress, const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) + int getMissedCallCountFromLocal(const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) + + static bool isInstanciated(){return mInstance!=nullptr;} + + bool isLastRemoteProvisioningGood(); + public slots: - void initCoreManager(); - void startIterate(); - void stopIterate(); - void setLastRemoteProvisioningState(const linphone::ConfiguringState& state); - void createLinphoneCore (const QString &configPath);// In order to delay creation - void handleChatRoomCreated(const std::shared_ptr &chatRoomModel); - + void initCoreManager(); + void startIterate(); + void stopIterate(); + void setLastRemoteProvisioningState(const linphone::ConfiguringState& state); + void createLinphoneCore (const QString &configPath);// In order to delay creation + void handleChatRoomCreated(const std::shared_ptr &chatRoomModel); + signals: - void coreManagerInitialized (); - - void chatRoomModelCreated (const std::shared_ptr &chatRoomModel); - void historyModelCreated (HistoryModel *historyModel); - - void logsUploaded (const QString &url); - - void eventCountChanged (); - + void coreManagerInitialized (); + + void chatRoomModelCreated (const std::shared_ptr &chatRoomModel); + void historyModelCreated (HistoryModel *historyModel); + + void logsUploaded (const QString &url); + + void eventCountChanged (); + private: - CoreManager (QObject *parent, const QString &configPath); - ~CoreManager (); - - void setDatabasesPaths (); - void setOtherPaths (); - void setResourcesPaths (); - - void migrate (); - - QString getVersion () const; - - int getEventCount () const; - - void iterate (); - - void handleLogsUploadStateChanged (linphone::Core::LogCollectionUploadState state, const std::string &info); - - static QString getDownloadUrl (); - - std::shared_ptr mCore; - std::shared_ptr mHandlers; - - bool mStarted = false; - linphone::ConfiguringState mLastRemoteProvisioningState; - - CallsListModel *mCallsListModel = nullptr; - ContactsListModel *mContactsListModel = nullptr; - ContactsImporterListModel *mContactsImporterListModel = nullptr; - TimelineListModel *mTimelineListModel = nullptr; - ChatRoomListModel *mChatRoomListModel = nullptr; - - SipAddressesModel *mSipAddressesModel = nullptr; - SettingsModel *mSettingsModel = nullptr; - AccountSettingsModel *mAccountSettingsModel = nullptr; - - EventCountNotifier *mEventCountNotifier = nullptr; - - //QHash >, std::weak_ptr> mChatRoomModels; - //QHash, std::weak_ptr> mChatRoomModels; - //QList, std::weak_ptr>> mChatRoomModels; - HistoryModel * mHistoryModel = nullptr; - LdapListModel *mLdapListModel = nullptr; - - QTimer *mCbsTimer = nullptr; - - QMutex mMutexVideoRender; - - static CoreManager *mInstance; + CoreManager (QObject *parent, const QString &configPath); + ~CoreManager (); + + void setDatabasesPaths (); + void setOtherPaths (); + void setResourcesPaths (); + + void migrate (); + + QString getVersion () const; + + int getEventCount () const; + + void iterate (); + + void handleLogsUploadStateChanged (linphone::Core::LogCollectionUploadState state, const std::string &info); + + static QString getDownloadUrl (); + + std::shared_ptr mCore; + std::shared_ptr mHandlers; + + bool mStarted = false; + linphone::ConfiguringState mLastRemoteProvisioningState; + + CallsListModel *mCallsListModel = nullptr; + ContactsListModel *mContactsListModel = nullptr; + ContactsImporterListModel *mContactsImporterListModel = nullptr; + TimelineListModel *mTimelineListModel = nullptr; + ChatRoomListModel *mChatRoomListModel = nullptr; + + SipAddressesModel *mSipAddressesModel = nullptr; + SettingsModel *mSettingsModel = nullptr; + AccountSettingsModel *mAccountSettingsModel = nullptr; + + EventCountNotifier *mEventCountNotifier = nullptr; + + //QHash >, std::weak_ptr> mChatRoomModels; + //QHash, std::weak_ptr> mChatRoomModels; + //QList, std::weak_ptr>> mChatRoomModels; + HistoryModel * mHistoryModel = nullptr; + LdapListModel *mLdapListModel = nullptr; + + QTimer *mCbsTimer = nullptr; + + QMutex mMutexVideoRender; + + static CoreManager *mInstance; }; #endif // CORE_MANAGER_H_ diff --git a/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.cpp b/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.cpp index 9fe2f4537..693493a5c 100644 --- a/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.cpp +++ b/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.cpp @@ -53,10 +53,11 @@ AbstractEventCountNotifier::AbstractEventCountNotifier (QObject *parent) : QObje coreManager->getSettingsModel(), &SettingsModel::chatEnabledChanged, this, &AbstractEventCountNotifier::internalnotifyEventCount ); + /* QObject::connect( coreManager->getCallsListModel(), &CallsListModel::callMissed, this, &AbstractEventCountNotifier::handleCallMissed - ); + );*/ } // ----------------------------------------------------------------------------- @@ -129,7 +130,13 @@ void AbstractEventCountNotifier::handleResetMissedCalls (ChatRoomModel *chatRoom internalnotifyEventCount(); } } + void AbstractEventCountNotifier::handleCallMissed (CallModel *callModel) { ++mMissedCalls[{ Utils::cleanSipAddress(callModel->getPeerAddress()), Utils::cleanSipAddress(callModel->getLocalAddress()) }]; internalnotifyEventCount(); } + +void AbstractEventCountNotifier::handleCallMissed (const QString& localAddress, const QString& peerAddress) { + ++mMissedCalls[{ peerAddress, localAddress }]; + internalnotifyEventCount(); +} diff --git a/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.hpp b/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.hpp index 7d0ef85c5..71a81e11c 100644 --- a/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.hpp +++ b/linphone-app/src/components/core/event-count-notifier/AbstractEventCountNotifier.hpp @@ -30,7 +30,7 @@ // ============================================================================= namespace linphone { - class ChatMessage; +class ChatMessage; } class CallModel; @@ -38,45 +38,46 @@ class ChatRoomModel; class HistoryModel; class AbstractEventCountNotifier : public QObject { - Q_OBJECT; - + Q_OBJECT + public: - AbstractEventCountNotifier (QObject *parent = Q_NULLPTR); - - void updateUnreadMessageCount (); - - int getUnreadMessageCount () const { return mUnreadMessageCount; } - int getMissedCallCount () const { - int t = 0; - for (int n : mMissedCalls) t += n; - return t; - } - - int getEventCount () const { return mUnreadMessageCount + getMissedCallCount(); } - int getMissedCallCount(const QString &peerAddress, const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) - int getMissedCallCountFromLocal(const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) - + AbstractEventCountNotifier (QObject *parent = Q_NULLPTR); + + void updateUnreadMessageCount (); + + int getUnreadMessageCount () const { return mUnreadMessageCount; } + int getMissedCallCount () const { + int t = 0; + for (int n : mMissedCalls) t += n; + return t; + } + + int getEventCount () const { return mUnreadMessageCount + getMissedCallCount(); } + int getMissedCallCount(const QString &peerAddress, const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) + int getMissedCallCountFromLocal(const QString &localAddress) const;// Get missed call count from a chat (useful for showing bubbles on Timelines) + signals: - void eventCountChanged (); - + void eventCountChanged (); + +public slots: + void handleCallMissed (const QString& localAddress, const QString& peerAddress); + void handleResetAllMissedCalls (); + void handleResetMissedCalls (ChatRoomModel *chatRoomModel); + void handleCallMissed (CallModel *callModel); + protected: - virtual void notifyEventCount (int n) = 0; - + virtual void notifyEventCount (int n) = 0; + private: - using ConferenceId = QPair; - - void internalnotifyEventCount (); - - void handleChatRoomModelCreated (const std::shared_ptr &chatRoomModel); - void handleHistoryModelCreated (HistoryModel *historyModel); - - - void handleResetAllMissedCalls (); - void handleResetMissedCalls (ChatRoomModel *chatRoomModel); - void handleCallMissed (CallModel *callModel); - - QHash mMissedCalls; - int mUnreadMessageCount = 0; + using ConferenceId = QPair; + + void internalnotifyEventCount (); + + void handleChatRoomModelCreated (const std::shared_ptr &chatRoomModel); + void handleHistoryModelCreated (HistoryModel *historyModel); + + QHash mMissedCalls; + int mUnreadMessageCount = 0; }; #endif // ABSTRACT_EVENT_COUNT_NOTIFIER_H_ diff --git a/linphone-app/src/components/timeline/TimelineListModel.cpp b/linphone-app/src/components/timeline/TimelineListModel.cpp index 23ad03a05..3e3f8d8b8 100644 --- a/linphone-app/src/components/timeline/TimelineListModel.cpp +++ b/linphone-app/src/components/timeline/TimelineListModel.cpp @@ -22,6 +22,7 @@ #include "components/core/CoreManager.hpp" #include "components/core/CoreHandlers.hpp" +#include "components/calls/CallsListModel.hpp" #include "components/settings/AccountSettingsModel.hpp" #include "components/settings/SettingsModel.hpp" #include "components/sip-addresses/SipAddressesModel.hpp" @@ -44,6 +45,9 @@ TimelineListModel::TimelineListModel (QObject *parent) : QAbstractListModel(pare connect(coreHandlers, &CoreHandlers::messageReceived, this, &TimelineListModel::update); connect(coreHandlers, &CoreHandlers::messageReceived, this, &TimelineListModel::updated); + QObject::connect(coreHandlers, &CoreHandlers::callStateChanged, this, &TimelineListModel::onCallStateChanged); + QObject::connect(coreHandlers, &CoreHandlers::callCreated, this, &TimelineListModel::onCallCreated); + connect(CoreManager::getInstance()->getSettingsModel(), &SettingsModel::hideEmptyChatRoomsChanged, this, &TimelineListModel::update); connect(CoreManager::getInstance()->getAccountSettingsModel(), &AccountSettingsModel::defaultRegistrationChanged, this, &TimelineListModel::update); updateTimelines (); @@ -323,6 +327,39 @@ void TimelineListModel::onChatRoomStateChanged(const std::shared_ptr &call, linphone::Call::State state) { +} + +void TimelineListModel::onCallCreated(const std::shared_ptr &call){ + std::shared_ptr core = CoreManager::getInstance()->getCore(); + std::shared_ptr params = core->createDefaultChatRoomParams(); + std::list> participants; + +// Find all chat rooms with local address. If not, create one. + bool isOutgoing = (call->getDir() == linphone::Call::Dir::Outgoing) ; + bool found = false; + auto callLog = call->getCallLog(); + auto callLocalAddress = callLog->getLocalAddress(); + auto chatRoom = core->searchChatRoom(params, callLocalAddress + , callLog->getRemoteAddress() + , participants); + if(chatRoom){ + for(auto timeline : mTimelines){ + if( chatRoom == timeline->mChatRoomModel->getChatRoom()){ + found = true; + if(isOutgoing)// If outgoing, we switch to this chat room + timeline->setSelected(true); + } + } + } + if(!found){// Create a default chat room + QVariantList participants; + participants << Utils::coreStringToAppString(callLog->getRemoteAddress()->asStringUriOnly()); + CoreManager::getInstance()->getCallsListModel()->createChatRoom("", 0, participants, isOutgoing); + } +} + /* void TimelineListModel::onConferenceLeft(const std::shared_ptr &chatRoom, , const std::shared_ptr & eventLog){ remove(getTimeline(chatRoom, false).get()); diff --git a/linphone-app/src/components/timeline/TimelineListModel.hpp b/linphone-app/src/components/timeline/TimelineListModel.hpp index 0069d63fe..295ec9b88 100644 --- a/linphone-app/src/components/timeline/TimelineListModel.hpp +++ b/linphone-app/src/components/timeline/TimelineListModel.hpp @@ -56,12 +56,16 @@ public: void remove(std::shared_ptr model); int mSelectedCount; + bool mAutoSelectAfterCreation = false;// Request to select the next chat room after creation + void setSelectedCount(int selectedCount); public slots: void update(); void removeChatRoomModel(std::shared_ptr model); void onSelectedHasChanged(bool selected); void onChatRoomStateChanged(const std::shared_ptr &chatRoom,linphone::ChatRoom::State state); + void onCallStateChanged (const std::shared_ptr &call, linphone::Call::State state) ; + void onCallCreated(const std::shared_ptr &call); //void onConferenceLeft(); diff --git a/linphone-app/src/components/timeline/TimelineModel.cpp b/linphone-app/src/components/timeline/TimelineModel.cpp index ac6f52d1d..c17fdc572 100644 --- a/linphone-app/src/components/timeline/TimelineModel.cpp +++ b/linphone-app/src/components/timeline/TimelineModel.cpp @@ -49,15 +49,11 @@ std::shared_ptr TimelineModel::create(std::shared_ptr chatRoom, QObject *parent) : QObject(parent) { App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it when passing by Q_INVOKABLE mChatRoomModel = ChatRoomModel::create(chatRoom); -// mChatRoomModel = CoreManager::getInstance()->getTimelineListModel()->getChatRoomModel(chatRoom); if( mChatRoomModel ){ CoreManager::getInstance()->handleChatRoomCreated(mChatRoomModel); QObject::connect(this, &TimelineModel::selectedChanged, this, &TimelineModel::updateUnreadCount); QObject::connect(CoreManager::getInstance()->getAccountSettingsModel(), &AccountSettingsModel::defaultProxyChanged, this, &TimelineModel::onDefaultProxyChanged); } - - //QObject::connect(mChatRoomModel.get(), &ChatRoomModel::conferenceLeft, this, &TimelineModel::onConferenceLeft); - //mTimestamp = QDateTime::fromMSecsSinceEpoch(mChatRoomModel->getChatRoom()->getLastUpdateTime()); mSelected = false; } @@ -133,10 +129,12 @@ void TimelineModel::onParticipantAdded(const std::shared_ptr void TimelineModel::onParticipantRemoved(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){} void TimelineModel::onParticipantAdminStatusChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){} void TimelineModel::onStateChanged(const std::shared_ptr & chatRoom, linphone::ChatRoom::State newState){ - if(newState == linphone::ChatRoom::State::Created) + if(newState == linphone::ChatRoom::State::Created && CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation) { + CoreManager::getInstance()->getTimelineListModel()->mAutoSelectAfterCreation = false; QTimer::singleShot(200, [=](){// Delay process in order to let GUI time for Timeline building/linking before doing actions setSelected(true); }); + } } void TimelineModel::onSecurityEvent(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){} void TimelineModel::onSubjectChanged(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) diff --git a/linphone-app/src/components/timeline/TimelineModel.hpp b/linphone-app/src/components/timeline/TimelineModel.hpp index 87e368cb2..eb6b4a576 100644 --- a/linphone-app/src/components/timeline/TimelineModel.hpp +++ b/linphone-app/src/components/timeline/TimelineModel.hpp @@ -61,14 +61,10 @@ public: void setSelected(const bool& selected); - - //Q_INVOKABLE std::shared_ptr getChatRoomModel() const; Q_INVOKABLE ChatRoomModel* getChatRoomModel() const; bool mSelected; - //QDateTime mTimestamp; std::shared_ptr mChatRoomModel; - //std::shared_ptr mChatRoom; 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; diff --git a/linphone-app/ui/modules/Linphone/Chat/Event.qml b/linphone-app/ui/modules/Linphone/Chat/Event.qml index 739502e56..206a5dedd 100644 --- a/linphone-app/ui/modules/Linphone/Chat/Event.qml +++ b/linphone-app/ui/modules/Linphone/Chat/Event.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import Common 1.0 import Linphone 1.0 +import LinphoneEnums 1.0 import Linphone.Styles 1.0 import Utils 1.0 @@ -9,30 +10,29 @@ import Utils 1.0 Row { property string _type: { - var status = $chatEntry.state - - if (status === ChatRoomModel.CallStatusSuccess) { + var status = $chatEntry.status + if (status == LinphoneEnums.CallStatusSuccess) { if (!$chatEntry.isStart) { return 'ended_call' } return $chatEntry.isOutgoing ? 'outgoing_call' : 'incoming_call' } - if (status === ChatRoomModel.CallStatusDeclined) { + if (status == LinphoneEnums.CallStatusDeclined) { return $chatEntry.isOutgoing ? 'declined_outgoing_call' : 'declined_incoming_call' } - if (status === ChatRoomModel.CallStatusMissed) { + if (status == LinphoneEnums.CallStatusMissed) { return $chatEntry.isOutgoing ? 'missed_outgoing_call' : 'missed_incoming_call' } - if (status === ChatRoomModel.CallStatusAborted) { + if (status == LinphoneEnums.CallStatusAborted) { return $chatEntry.isOutgoing ? 'outgoing_call' : 'incoming_call' } - if (status === ChatRoomModel.CallStatusEarlyAborted) { + if (status == LinphoneEnums.CallStatusEarlyAborted) { return $chatEntry.isOutgoing ? 'missed_outgoing_call' : 'missed_incoming_call' } - if (status === ChatRoomModel.CallStatusAcceptedElsewhere) { + if (status == LinphoneEnums.CallStatusAcceptedElsewhere) { return $chatEntry.isOutgoing ? 'outgoing_call' : 'incoming_call' } - if (status === ChatRoomModel.CallStatusDeclinedElsewhere) { + if (status == LinphoneEnums.CallStatusDeclinedElsewhere) { return $chatEntry.isOutgoing ? 'declined_outgoing_call' : 'declined_incoming_call' } diff --git a/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml b/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml index 6bf6f72ed..c93b1ec7e 100644 --- a/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml +++ b/linphone-app/ui/views/App/Main/Dialogs/NewChatRoom.qml @@ -35,7 +35,7 @@ DialogPlus { capitalization: Font.AllUppercase onClicked: { - if(CallsListModel.createChatRoom(subject.text, secureSwitch.checked, selectedParticipants.getParticipants() )) + if(CallsListModel.createChatRoom(subject.text, secureSwitch.checked, selectedParticipants.getParticipants(), true )) exit(1) } TooltipArea{ diff --git a/linphone-app/ui/views/App/Main/MainWindow.js b/linphone-app/ui/views/App/Main/MainWindow.js index 12ebb8bec..cb5eb7348 100644 --- a/linphone-app/ui/views/App/Main/MainWindow.js +++ b/linphone-app/ui/views/App/Main/MainWindow.js @@ -59,8 +59,9 @@ function unlockView () { } function setView (view, props) { - function apply (view, props) { - Linphone.App.smartShowWindow(window) + function apply (view, props, showWindow) { + if(showWindow) + Linphone.App.smartShowWindow(window) var item = mainLoader.item @@ -71,7 +72,7 @@ function setView (view, props) { var lockedInfo = window._lockedInfo if (!lockedInfo) { - apply(view, props) + apply(view, props, false) return } @@ -80,7 +81,7 @@ function setView (view, props) { }, function (status) { if (status) { unlockView() - apply(view, props) + apply(view, props, true) } else { updateSelectedEntry(window._currentView, props) } diff --git a/linphone-app/ui/views/App/Main/MainWindow.qml b/linphone-app/ui/views/App/Main/MainWindow.qml index 18f6b9743..3f82e94ee 100644 --- a/linphone-app/ui/views/App/Main/MainWindow.qml +++ b/linphone-app/ui/views/App/Main/MainWindow.qml @@ -178,7 +178,7 @@ ApplicationWindow { if (entry.contact && SettingsModel.contactsEnabled) { window.setView('ContactEdit', { sipAddress: entry.sipAddress }) } else { - CallsListModel.createChatRoom( "", false, [entry] ) + CallsListModel.createChatRoom( "", false, [entry], true ) } }