From d8c461d93e31ba2d24da0f6535dc2d7cdd62cd6a Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Wed, 8 Jun 2022 18:02:51 +0200 Subject: [PATCH] Upgrade waiting room design and use it in place of outgoing calls and end calls. Fix video requests in merged conference. Add a way to retrieve ConferenceInfoModel from a call. Remove obsolete (double) function to create secure chat room. Add logs on chat deletion and delete chat room if all entries are removed. Display conference subject in call history. Fix text in conferences filter. Update SDK. --- linphone-app/assets/languages/da.ts | 9 +- linphone-app/assets/languages/de.ts | 9 +- linphone-app/assets/languages/en.ts | 9 +- linphone-app/assets/languages/es.ts | 9 +- linphone-app/assets/languages/fr_FR.ts | 9 +- linphone-app/assets/languages/hu.ts | 9 +- linphone-app/assets/languages/it.ts | 9 +- linphone-app/assets/languages/ja.ts | 9 +- linphone-app/assets/languages/lt.ts | 9 +- linphone-app/assets/languages/pt_BR.ts | 9 +- linphone-app/assets/languages/ru.ts | 9 +- linphone-app/assets/languages/sv.ts | 9 +- linphone-app/assets/languages/tr.ts | 9 +- linphone-app/assets/languages/uk.ts | 9 +- linphone-app/assets/languages/zh_CN.ts | 9 +- linphone-app/resources.qrc | 2 - .../src/components/call/CallModel.cpp | 26 +++- .../src/components/call/CallModel.hpp | 6 + .../src/components/calls/CallsListModel.cpp | 45 ++---- .../src/components/calls/CallsListModel.hpp | 3 +- .../components/chat-room/ChatRoomModel.cpp | 6 +- .../src/components/history/HistoryModel.cpp | 11 +- .../ui/modules/Linphone/History/Event.qml | 4 +- .../NotificationReceivedMessage.qml | 6 +- .../ui/modules/Linphone/Timeline/Timeline.qml | 8 +- .../ui/views/App/Calls/CallsWindow.js | 12 +- .../ui/views/App/Calls/CallsWindow.qml | 17 +-- linphone-app/ui/views/App/Calls/EndedCall.qml | 95 ------------ .../ui/views/App/Calls/OutgoingCall.qml | 57 ------- .../ui/views/App/Calls/WaitingRoom.qml | 144 ++++++++++++++---- .../ui/views/App/Main/Conferences.qml | 2 +- .../App/Styles/Calls/WaitingRoomStyle.qml | 15 ++ linphone-sdk | 2 +- 33 files changed, 290 insertions(+), 306 deletions(-) delete mode 100644 linphone-app/ui/views/App/Calls/EndedCall.qml delete mode 100644 linphone-app/ui/views/App/Calls/OutgoingCall.qml diff --git a/linphone-app/assets/languages/da.ts b/linphone-app/assets/languages/da.ts index 24f862d75..19805b50b 100644 --- a/linphone-app/assets/languages/da.ts +++ b/linphone-app/assets/languages/da.ts @@ -755,9 +755,7 @@ Server url ikke konfigureret. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -770,6 +768,11 @@ Server url ikke konfigureret. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/de.ts b/linphone-app/assets/languages/de.ts index d2a4d5bca..9064c5c58 100644 --- a/linphone-app/assets/languages/de.ts +++ b/linphone-app/assets/languages/de.ts @@ -755,9 +755,7 @@ Server URL ist nicht konfiguriert. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -770,6 +768,11 @@ Server URL ist nicht konfiguriert. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/en.ts b/linphone-app/assets/languages/en.ts index 3afa2c519..1281ce601 100644 --- a/linphone-app/assets/languages/en.ts +++ b/linphone-app/assets/languages/en.ts @@ -755,9 +755,7 @@ Server URL not configured. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. Finished @@ -770,6 +768,11 @@ Server URL not configured. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. Conference URL has been copied + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + Invitations + ConfirmDialog diff --git a/linphone-app/assets/languages/es.ts b/linphone-app/assets/languages/es.ts index 36eacb4bc..b2c4614fa 100644 --- a/linphone-app/assets/languages/es.ts +++ b/linphone-app/assets/languages/es.ts @@ -755,9 +755,7 @@ URL del servidor no configurada. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -770,6 +768,11 @@ URL del servidor no configurada. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/fr_FR.ts b/linphone-app/assets/languages/fr_FR.ts index d45566785..0af034d24 100644 --- a/linphone-app/assets/languages/fr_FR.ts +++ b/linphone-app/assets/languages/fr_FR.ts @@ -755,9 +755,7 @@ URL du serveur non configurée. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -770,6 +768,11 @@ URL du serveur non configurée. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/hu.ts b/linphone-app/assets/languages/hu.ts index b1aa482b9..9ce762ce8 100644 --- a/linphone-app/assets/languages/hu.ts +++ b/linphone-app/assets/languages/hu.ts @@ -750,9 +750,7 @@ A kiszolgáló URL-je nincs konfigurálva. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -765,6 +763,11 @@ A kiszolgáló URL-je nincs konfigurálva. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/it.ts b/linphone-app/assets/languages/it.ts index 30edd166c..7de3b163f 100644 --- a/linphone-app/assets/languages/it.ts +++ b/linphone-app/assets/languages/it.ts @@ -755,9 +755,7 @@ URL del server non configurato. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -770,6 +768,11 @@ URL del server non configurato. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/ja.ts b/linphone-app/assets/languages/ja.ts index 1952237f5..4171ddc1a 100644 --- a/linphone-app/assets/languages/ja.ts +++ b/linphone-app/assets/languages/ja.ts @@ -750,9 +750,7 @@ conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -765,6 +763,11 @@ 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/lt.ts b/linphone-app/assets/languages/lt.ts index ad48a0662..ab1df5071 100644 --- a/linphone-app/assets/languages/lt.ts +++ b/linphone-app/assets/languages/lt.ts @@ -760,9 +760,7 @@ Nesukonfigūruotas serverio url. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -775,6 +773,11 @@ Nesukonfigūruotas serverio url. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/pt_BR.ts b/linphone-app/assets/languages/pt_BR.ts index e85601850..0617d6277 100644 --- a/linphone-app/assets/languages/pt_BR.ts +++ b/linphone-app/assets/languages/pt_BR.ts @@ -755,9 +755,7 @@ URL do servidor não configurado. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -770,6 +768,11 @@ URL do servidor não configurado. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/ru.ts b/linphone-app/assets/languages/ru.ts index d8484a60a..0c44b0c37 100644 --- a/linphone-app/assets/languages/ru.ts +++ b/linphone-app/assets/languages/ru.ts @@ -760,9 +760,7 @@ conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -775,6 +773,11 @@ 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/sv.ts b/linphone-app/assets/languages/sv.ts index c1fb0b68b..c281aed7f 100644 --- a/linphone-app/assets/languages/sv.ts +++ b/linphone-app/assets/languages/sv.ts @@ -755,9 +755,7 @@ Serverwebbadressen är inte konfigurerad. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -770,6 +768,11 @@ Serverwebbadressen är inte konfigurerad. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/tr.ts b/linphone-app/assets/languages/tr.ts index c9d51efed..7fe259420 100644 --- a/linphone-app/assets/languages/tr.ts +++ b/linphone-app/assets/languages/tr.ts @@ -750,9 +750,7 @@ Sunucu url'si yapılandırılmadı. conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -765,6 +763,11 @@ Sunucu url'si yapılandırılmadı. 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/uk.ts b/linphone-app/assets/languages/uk.ts index 63e92d83d..e9058bde5 100644 --- a/linphone-app/assets/languages/uk.ts +++ b/linphone-app/assets/languages/uk.ts @@ -760,9 +760,7 @@ conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -775,6 +773,11 @@ 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/assets/languages/zh_CN.ts b/linphone-app/assets/languages/zh_CN.ts index e95d42b1f..243d59503 100644 --- a/linphone-app/assets/languages/zh_CN.ts +++ b/linphone-app/assets/languages/zh_CN.ts @@ -750,9 +750,7 @@ conferencesEndedFilter - 'Finished' : Filter conferences on end status. ----------- -'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + 'Finished' : Filter conferences on end status. @@ -765,6 +763,11 @@ 'Conference URL has been copied' : Message text in a banner to warn the user that the µURL have been copied to the clipboard. + + conferencesInvitedFilter + 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). + + ConfirmDialog diff --git a/linphone-app/resources.qrc b/linphone-app/resources.qrc index bf9010a19..81654483b 100644 --- a/linphone-app/resources.qrc +++ b/linphone-app/resources.qrc @@ -417,12 +417,10 @@ ui/views/App/Calls/Dialogs/CallSipAddress.qml ui/views/App/Calls/Dialogs/CallTransfer.qml ui/views/App/Calls/Dialogs/ConferenceManager.qml - ui/views/App/Calls/EndedCall.qml ui/views/App/Calls/IncallFullscreenWindow.qml ui/views/App/Calls/Incall.js ui/views/App/Calls/Incall.qml ui/views/App/Calls/IncomingCall.qml - ui/views/App/Calls/OutgoingCall.qml ui/views/App/Calls/WaitingRoom.qml ui/views/App/Calls/ZrtpTokenAuthentication.qml ui/views/App/Dialog/NewConference.qml diff --git a/linphone-app/src/components/call/CallModel.cpp b/linphone-app/src/components/call/CallModel.cpp index 06117db28..f8df585a8 100644 --- a/linphone-app/src/components/call/CallModel.cpp +++ b/linphone-app/src/components/call/CallModel.cpp @@ -28,6 +28,7 @@ #include "components/calls/CallsListModel.hpp" #include "components/chat-room/ChatRoomModel.hpp" #include "components/conference/ConferenceModel.hpp" +#include "components/conferenceInfo/ConferenceInfoModel.hpp" #include "components/contact/ContactModel.hpp" #include "components/contacts/ContactsListModel.hpp" #include "components/core/CoreHandlers.hpp" @@ -87,7 +88,11 @@ CallModel::CallModel (shared_ptr call){ if(mCall) { mRemoteAddress = mCall->getRemoteAddress()->clone(); if(mCall->getConference()) - mConferenceModel = ConferenceModel::create(mCall->getConference()); + mConferenceModel = ConferenceModel::create(mCall->getConference()); + auto conferenceInfo = CoreManager::getInstance()->getCore()->findConferenceInformationFromUri(getConferenceAddress()); + if( conferenceInfo ){ + mConferenceInfoModel = ConferenceInfoModel::create(conferenceInfo); + } } mMagicSearch->getContactListFromFilterAsync(mRemoteAddress->getUsername(),mRemoteAddress->getDomain()); } @@ -115,6 +120,20 @@ QString CallModel::getFullPeerAddress () const { QString CallModel::getFullLocalAddress () const { return mCall ? Utils::coreStringToAppString(mCall->getCallLog()->getLocalAddress()->asString()) : ""; } + +std::shared_ptr CallModel::getConferenceAddress () const{ + std::shared_ptr conferenceAddress; + if(mCall){ + auto remoteContact = mCall->getRemoteContact(); + + if (mCall->getDir() == linphone::Call::Dir::Incoming){ + if( remoteContact != "" ) + conferenceAddress = CoreManager::getInstance()->getCore()->interpretUrl(remoteContact); + }else + conferenceAddress = mCall->getRemoteAddress()->clone(); + } + return conferenceAddress; +} // ----------------------------------------------------------------------------- ContactModel *CallModel::getContactModel() const{ @@ -165,6 +184,10 @@ ConferenceModel * CallModel::getConferenceModel(){ return mConferenceModel.get(); } +ConferenceInfoModel * CallModel::getConferenceInfoModel(){ + return mConferenceInfoModel.get(); +} + QSharedPointer CallModel::getConferenceSharedModel(){ if(mCall->getConference() && !mConferenceModel){ mConferenceModel = ConferenceModel::create(mCall->getConference()); @@ -682,6 +705,7 @@ void CallModel::setCameraEnabled (bool status){ shared_ptr params = core->createCallParams(mCall); params->setVideoDirection(status ? linphone::MediaDirection::SendRecv : linphone::MediaDirection::RecvOnly); + params->enableVideo(true); mCall->update(params); } } diff --git a/linphone-app/src/components/call/CallModel.hpp b/linphone-app/src/components/call/CallModel.hpp index c2b810ddf..129597c57 100644 --- a/linphone-app/src/components/call/CallModel.hpp +++ b/linphone-app/src/components/call/CallModel.hpp @@ -29,6 +29,7 @@ #include "utils/LinphoneEnums.hpp" // ============================================================================= +class ConferenceInfoModel; class ConferenceModel; class ContactModel; class ChatRoomModel; @@ -44,6 +45,7 @@ class CallModel : public QObject { Q_PROPERTY(ContactModel *contactModel READ getContactModel CONSTANT ) Q_PROPERTY(ChatRoomModel * chatRoomModel READ getChatRoomModel NOTIFY chatRoomModelChanged) Q_PROPERTY(ConferenceModel * conferenceModel READ getConferenceModel NOTIFY conferenceModelChanged) + Q_PROPERTY(ConferenceInfoModel * conferenceInfoModel READ getConferenceInfoModel NOTIFY conferenceModelInfoChanged) Q_PROPERTY(CallStatus status READ getStatus NOTIFY statusChanged) Q_PROPERTY(QString callError READ getCallError NOTIFY callErrorChanged) @@ -119,10 +121,12 @@ public: QString getLocalAddress () const; QString getFullPeerAddress () const; QString getFullLocalAddress () const; + std::shared_ptr getConferenceAddress () const; ContactModel *getContactModel() const; ChatRoomModel * getChatRoomModel() const; ConferenceModel* getConferenceModel(); + ConferenceInfoModel* getConferenceInfoModel(); QSharedPointer getConferenceSharedModel(); bool isInConference () const { @@ -191,6 +195,7 @@ signals: void callIdChanged(); void isInConferenceChanged (bool status); void conferenceModelChanged(); + void conferenceModelInfoChanged(); void chatRoomModelChanged(); void speakerMutedChanged (bool status); void microMutedChanged (bool status); @@ -304,6 +309,7 @@ private: std::shared_ptr mSearch; QString mTransferAddress; QSharedPointer mConferenceModel; + QSharedPointer mConferenceInfoModel; }; #endif // CALL_MODEL_H_ diff --git a/linphone-app/src/components/calls/CallsListModel.cpp b/linphone-app/src/components/calls/CallsListModel.cpp index ef6a64e25..8d02478e0 100644 --- a/linphone-app/src/components/calls/CallsListModel.cpp +++ b/linphone-app/src/components/calls/CallsListModel.cpp @@ -202,36 +202,6 @@ void CallsListModel::launchVideoCall (const QString &sipAddress, const QString& CallModel::prepareTransfert(call, prepareTransfertAddress); } -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) - return nullptr; - - std::shared_ptr params = core->createDefaultChatRoomParams(); - std::list > participants; - std::shared_ptr localAddress; - participants.push_back(address); - params->enableEncryption(true); - - params->setSubject("Dummy Subject"); - params->enableEncryption(true); - - std::shared_ptr chatRoom = core->createChatRoom(params, localAddress, participants); - if( chatRoom != nullptr){ - auto timelineList = CoreManager::getInstance()->getTimelineListModel(); - timelineList->update(); - auto timeline = timelineList->getTimeline(chatRoom, false); - if(!timeline){ - timeline = timelineList->getTimeline(chatRoom, true); - timelineList->add(timeline); - } - return timeline->getChatRoomModel(); - } - return nullptr; -} - QVariantMap CallsListModel::launchChat(const QString &sipAddress, const int& securityLevel) const{ QVariantList participants; participants << sipAddress; @@ -252,6 +222,7 @@ ChatRoomModel* CallsListModel::createChat (const QString &participantAddress) co params->setBackend(linphone::ChatRoomBackend::Basic); + qInfo() << "Create ChatRoom with " < chatRoom = core->createChatRoom(params, localAddress, participants); if( chatRoom != nullptr){ @@ -287,7 +258,19 @@ bool CallsListModel::createSecureChat (const QString& subject, const QString &pa params->enableEncryption(true); params->enableGroup(true); + qInfo() << "Create secure ChatRoom: " << subject << ", from " << QString::fromStdString(localAddress->asString()) << " and with " < chatRoom = core->createChatRoom(params, localAddress, participants); +// Still needed? +// if( chatRoom != nullptr){ +// auto timelineList = CoreManager::getInstance()->getTimelineListModel(); +// timelineList->update(); +// auto timeline = timelineList->getTimeline(chatRoom, false); +// if(!timeline){ +// timeline = timelineList->getTimeline(chatRoom, true); +// timelineList->add(timeline); +// } +// return timeline->getChatRoomModel(); +// } return chatRoom != nullptr; } @@ -305,7 +288,7 @@ QVariantMap CallsListModel::createChatRoom(const QString& subject, const int& se QSharedPointer timeline; auto timelineList = CoreManager::getInstance()->getTimelineListModel(); QString localAddressStr = (localAddress ? Utils::coreStringToAppString(localAddress->asStringUriOnly()) : "local"); - qInfo() << "ChatRoom creation of " << subject << " at " << securityLevel << " security, from " << localAddressStr << " and with " << participants; + qInfo() << "Create ChatRoom: " << subject << " at " << securityLevel << " security, from " << localAddressStr << " and with " << participants; std::shared_ptr params = core->createDefaultChatRoomParams(); std::list > chatRoomParticipants; diff --git a/linphone-app/src/components/calls/CallsListModel.hpp b/linphone-app/src/components/calls/CallsListModel.hpp index 6635c8674..29bc6911e 100644 --- a/linphone-app/src/components/calls/CallsListModel.hpp +++ b/linphone-app/src/components/calls/CallsListModel.hpp @@ -47,7 +47,6 @@ public: Q_INVOKABLE void launchAudioCall (const QString &sipAddress, const QString& prepareTransfertAddress = "", const QHash &headers = {}) const; Q_INVOKABLE void launchSecureAudioCall (const QString &sipAddress, LinphoneEnums::MediaEncryption encryption, const QHash &headers = {}, const QString& prepareTransfertAddress = "") const; Q_INVOKABLE void launchVideoCall (const QString &sipAddress, const QString& prepareTransfertAddress = "", const bool& autoSelectAfterCreation = true, QVariantMap options = QVariantMap()) const; - Q_INVOKABLE ChatRoomModel* launchSecureChat (const QString &sipAddress) const; Q_INVOKABLE QVariantMap launchChat(const QString &sipAddress, const int& securityLevel) const; Q_INVOKABLE ChatRoomModel* createChat (const QString &participantAddress) const; Q_INVOKABLE ChatRoomModel* createChat (const CallModel * ) const; @@ -63,7 +62,7 @@ public: Q_INVOKABLE void terminateAllCalls () const; Q_INVOKABLE void terminateCall (const QString& sipAddress) const; - static std::list> getCallHistory(const QString& peerAddress, const QString& localAddress); + static std::list> getCallHistory(const QString& peerAddress, const QString& localAddress); signals: void callRunning (int index, CallModel *callModel); diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.cpp b/linphone-app/src/components/chat-room/ChatRoomModel.cpp index 3e52db2ef..9b9df4473 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -187,8 +187,10 @@ ChatRoomModel::~ChatRoomModel () { 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) + if( internalChatRoom) { + qInfo() << "Deleting ChatRoom : " << getSubject() << ", address=" << getFullPeerAddress(); CoreManager::getInstance()->getCore()->deleteChatRoom(internalChatRoom); + } } } } @@ -258,6 +260,7 @@ void ChatRoomModel::removeAllEntries () { if(haveLogs) emit CoreManager::getInstance()->callLogsCountChanged(); } + deleteChatRoom(); endResetModel(); emit allEntriesRemoved(mSelf.lock()); emit focused();// Removing all entries is like having focus. Don't wait asynchronous events. @@ -593,6 +596,7 @@ void ChatRoomModel::markAsToDelete(){ } void ChatRoomModel::deleteChatRoom(){ + qInfo() << "Deleting ChatRoom : " << getSubject() << ", address=" << getFullPeerAddress(); CoreManager::getInstance()->getCore()->deleteChatRoom(mChatRoom); } diff --git a/linphone-app/src/components/history/HistoryModel.cpp b/linphone-app/src/components/history/HistoryModel.cpp index ed5c32248..6b750b0a1 100644 --- a/linphone-app/src/components/history/HistoryModel.cpp +++ b/linphone-app/src/components/history/HistoryModel.cpp @@ -53,7 +53,10 @@ static inline void fillCallStartEntry (QVariantMap &dest, const shared_ptrgetDir() == linphone::Call::Dir::Outgoing; dest["status"] = static_cast(callLog->getStatus()); dest["isStart"] = true; - dest["sipAddress"] = Utils::coreStringToAppString(callLog->getRemoteAddress()->asString()); + if(callLog->wasConference()) { + dest["title"] = QString::fromStdString(callLog->getConferenceInfo()->getSubject()); + }else + dest["sipAddress"] = Utils::coreStringToAppString(callLog->getRemoteAddress()->asString()); } static inline void fillCallEndEntry (QVariantMap &dest, const shared_ptr &callLog) { @@ -62,7 +65,11 @@ static inline void fillCallEndEntry (QVariantMap &dest, const shared_ptrgetDir() == linphone::Call::Dir::Outgoing; dest["status"] = static_cast(callLog->getStatus()); dest["isStart"] = false; - dest["sipAddress"] = Utils::coreStringToAppString(callLog->getRemoteAddress()->asString()); + if(callLog->wasConference()) { + dest["title"] = QString::fromStdString(callLog->getConferenceInfo()->getSubject()); + }else + dest["sipAddress"] = Utils::coreStringToAppString(callLog->getRemoteAddress()->asString()); + } // ----------------------------------------------------------------------------- diff --git a/linphone-app/ui/modules/Linphone/History/Event.qml b/linphone-app/ui/modules/Linphone/History/Event.qml index ff61042fb..1f3d1734d 100644 --- a/linphone-app/ui/modules/Linphone/History/Event.qml +++ b/linphone-app/ui/modules/Linphone/History/Event.qml @@ -13,7 +13,7 @@ Row { id: mainItem signal entryClicked(var entry) - property var _sipAddressObserver: SipAddressesModel.getSipAddressObserver($historyEntry.sipAddress, '') + property var _sipAddressObserver: $historyEntry.sipAddress ? SipAddressesModel.getSipAddressObserver($historyEntry.sipAddress, '') : $historyEntry.title property QtObject iconData property string translation Component.onDestruction: _sipAddressObserver=null// Need to set it to null because of not calling destructor if not. @@ -135,7 +135,7 @@ Row { pointSize: HistoryStyle.entry.event.text.pointSize } height: parent.height - text: _sipAddressObserver ? UtilsCpp.getDisplayName(_sipAddressObserver.peerAddress) : '' + text: _sipAddressObserver ? ( $historyEntry.sipAddress ? UtilsCpp.getDisplayName(_sipAddressObserver.peerAddress) : _sipAddressObserver) : '' verticalAlignment: Text.AlignVCenter MouseArea{ anchors.fill:parent diff --git a/linphone-app/ui/modules/Linphone/Notifications/NotificationReceivedMessage.qml b/linphone-app/ui/modules/Linphone/Notifications/NotificationReceivedMessage.qml index 2f14f40cf..5dfd1ba63 100644 --- a/linphone-app/ui/modules/Linphone/Notifications/NotificationReceivedMessage.qml +++ b/linphone-app/ui/modules/Linphone/Notifications/NotificationReceivedMessage.qml @@ -41,14 +41,14 @@ Notification { //entry: notification.fullPeerAddress? SipAddressesModel.getSipAddressObserver(notification.fullPeerAddress, notification.fullLocalAddress): notification.timelineModel.getChatRoomModel() property var sipObserver: SipAddressesModel.getSipAddressObserver(notification.fullPeerAddress, notification.fullLocalAddress) showAuxData: !chatRoomModel.isOneToOne - entry: ({ - sipAddress: sipObserver ? sipObserver.peerAddress : '', + entry: sipObserver ? ({ + sipAddress: sipObserver.peerAddress, contactModel: sipObserver.contact, isOneToOne: chatRoomModel.isOneToOne, haveEncryption: chatRoomModel.haveEncryption, securityLevel: chatRoomModel.securityLevel, auxDataToShow: '- ' + chatRoomModel.subject+' -' - }) + }): undefined Component.onDestruction: sipObserver=null// Need to set it to null because of not calling destructor if not. } diff --git a/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml b/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml index 541a1c56f..fc3b76659 100644 --- a/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml +++ b/linphone-app/ui/modules/Linphone/Timeline/Timeline.qml @@ -410,11 +410,9 @@ Rectangle { onClicked: { if(mouse.button == Qt.LeftButton){ timeline.entryClicked($modelData) - if(view){ - if(view.updateSelectionModels) - $modelData.selected = true - view.currentIndex = index; - } + if(view.updateSelectionModels) + $modelData.selected = true + view.currentIndex = index; }else{ contactTooltip.show() } diff --git a/linphone-app/ui/views/App/Calls/CallsWindow.js b/linphone-app/ui/views/App/Calls/CallsWindow.js index 969b4576d..ab9572662 100644 --- a/linphone-app/ui/views/App/Calls/CallsWindow.js +++ b/linphone-app/ui/views/App/Calls/CallsWindow.js @@ -61,7 +61,6 @@ function openWaitingRoom(model){ if(window.conferenceInfoModel) window.conferenceInfoModel = null; window.conferenceInfoModel = model - console.log('set : '+window.conferenceInfoModel) } // ----------------------------------------------------------------------------- @@ -78,18 +77,13 @@ function getContent (call, conferenceInfoModel) { if (status == null) { return calls.conferenceModel.count > 0 ? conference : null } - var CallModel = Linphone.CallModel if (status === CallModel.CallStatusIncoming) { return incomingCall } - - if (status === CallModel.CallStatusOutgoing) { - return outgoingCall - } - - if (status === CallModel.CallStatusEnded) { - return endedCall + window.conferenceInfoModel = call.conferenceInfoModel; + if (status === CallModel.CallStatusOutgoing || status === CallModel.CallStatusEnded) { + return waitingRoom } if(call.isConference) diff --git a/linphone-app/ui/views/App/Calls/CallsWindow.qml b/linphone-app/ui/views/App/Calls/CallsWindow.qml index 20b3ff05f..71226b985 100644 --- a/linphone-app/ui/views/App/Calls/CallsWindow.qml +++ b/linphone-app/ui/views/App/Calls/CallsWindow.qml @@ -191,14 +191,6 @@ Window { } } - Component { - id: outgoingCall - - OutgoingCall { - call: window.call - } - } - Component { id: incall @@ -207,14 +199,6 @@ Window { } } - Component { - id: endedCall - - EndedCall { - call: window.call - } - } - Component { id: chat @@ -256,6 +240,7 @@ Window { conferenceInfoModel: window.conferenceInfoModel onCancel: endOfProcess(0) enabled: window.visible + callModel: window.call } } Component { diff --git a/linphone-app/ui/views/App/Calls/EndedCall.qml b/linphone-app/ui/views/App/Calls/EndedCall.qml deleted file mode 100644 index 7a557ae04..000000000 --- a/linphone-app/ui/views/App/Calls/EndedCall.qml +++ /dev/null @@ -1,95 +0,0 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.3 - -import Linphone 1.0 -import Utils 1.0 -import UtilsCpp 1.0 - -import App.Styles 1.0 - -import 'Incall.js' as Logic -import 'qrc:/ui/scripts/Utils/utils.js' as Utils - -// ============================================================================= - -Rectangle { - id: endedCall - - property var call - - property var _sipAddressObserver: SipAddressesModel.getSipAddressObserver(call ? call.fullPeerAddress : '', call ? call.fullLocalAddress : '') - - - Component.onDestruction: _sipAddressObserver=null// Need to set it to null because of not calling destructor if not. - // --------------------------------------------------------------------------- - - color: CallStyle.backgroundColor - - ColumnLayout { - anchors { - fill: parent - topMargin: CallStyle.header.topMargin - } - - spacing: 0 - - ContactDescription { - id: contactDescription - - Layout.fillWidth: true - Layout.preferredHeight: CallStyle.header.contactDescription.height - - horizontalTextAlignment: Text.AlignHCenter - sipAddress: _sipAddressObserver && _sipAddressObserver.peerAddress - username: _sipAddressObserver ? UtilsCpp.getDisplayName(_sipAddressObserver.peerAddress) : '' - } - - Text { - Layout.fillWidth: true - - color: CallStyle.header.elapsedTime.color - font.pointSize: CallStyle.header.elapsedTime.pointSize - horizontalAlignment: Text.AlignHCenter - - text: { - var call = endedCall.call - return call ? Utils.formatElapsedTime(call.duration) : 0 - } - } - - Item { - id: container - - Layout.fillWidth: true - Layout.fillHeight: true - Layout.margins: CallStyle.container.margins - - Avatar { - anchors.centerIn: parent - backgroundColor: CallStyle.container.avatar.backgroundColor - image: _sipAddressObserver && _sipAddressObserver.contact && _sipAddressObserver.contact.vcard.avatar - username: contactDescription.username - - height: Utils.computeAvatarSize(container, CallStyle.container.avatar.maxSize) - width: height - } - } - - Item { - Layout.fillWidth: true - Layout.preferredHeight: CallStyle.actionArea.height - - Text { - color: CallStyle.actionArea.callError.color - font.pointSize: CallStyle.actionArea.callError.pointSize - horizontalAlignment: Text.AlignHCenter - width: parent.width - - text: { - var call = endedCall.call - return call ? call.callError : '' - } - } - } - } -} diff --git a/linphone-app/ui/views/App/Calls/OutgoingCall.qml b/linphone-app/ui/views/App/Calls/OutgoingCall.qml deleted file mode 100644 index d250efb9a..000000000 --- a/linphone-app/ui/views/App/Calls/OutgoingCall.qml +++ /dev/null @@ -1,57 +0,0 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.3 - -import Common 1.0 -import Common.Styles 1.0 - -import App.Styles 1.0 - -// ============================================================================= - -AbstractStartingCall { - showKeypad:true - GridLayout { - columns: parent.width < CallStyle.actionArea.lowWidth && call.videoEnabled ? 1 : 2 - rowSpacing: ActionBarStyle.spacing - - anchors { - left: parent.left - leftMargin: CallStyle.actionArea.leftButtonsGroupMargin - verticalCenter: parent.verticalCenter - } - - ActionSwitch { - isCustom: true - backgroundRadius: 90 - colorSet: enabled ? CallStyle.buttons.microOn : CallStyle.buttons.microOff - enabled: !call.microMuted - - onClicked: call.microMuted = enabled - } - } - - Item { - anchors.centerIn: parent - height: CallStyle.actionArea.userVideo.height - width: CallStyle.actionArea.userVideo.width - - visible: call.videoEnabled - } - - ActionBar { - anchors { - right: parent.right - rightMargin: CallStyle.actionArea.rightButtonsGroupMargin - verticalCenter: parent.verticalCenter - } - iconSize: CallStyle.actionArea.iconSize - - ActionButton { - isCustom: true - backgroundRadius: 90 - colorSet: CallStyle.buttons.hangup - - onClicked: call.terminate() - } - } -} diff --git a/linphone-app/ui/views/App/Calls/WaitingRoom.qml b/linphone-app/ui/views/App/Calls/WaitingRoom.qml index a84311344..2c8b83036 100644 --- a/linphone-app/ui/views/App/Calls/WaitingRoom.qml +++ b/linphone-app/ui/views/App/Calls/WaitingRoom.qml @@ -5,35 +5,73 @@ import QtGraphicalEffects 1.12 import Common 1.0 import Linphone 1.0 import LinphoneEnums 1.0 +import UtilsCpp 1.0 import Common.Styles 1.0 import App.Styles 1.0 + + + // ============================================================================= Rectangle { id: mainItem color: WaitingRoomStyle.backgroundColor property ConferenceInfoModel conferenceInfoModel - + property CallModel callModel // Store the call for processing calling. + property bool previewLoaderEnabled: true + property var _sipAddressObserver: callModel ? SipAddressesModel.getSipAddressObserver(callModel.fullPeerAddress, callModel.fullLocalAddress) : undefined + signal cancel() function close(){ - previewLoader.enabled = false + mainItem.previewLoaderEnabled = false// Need it to close camera. } function open(){ + mainItem.previewLoaderEnabled = true } + //onCallModelChanged: callModel ? contentsStack.replace(callingComponent) : contentsStack.replace(cameraComponent) + onCallModelChanged: contentsStack.flipped = !!callModel + + Component.onDestruction: {mainItem.previewLoaderEnabled = false;_sipAddressObserver=null}// Need to set it to null because of not calling destructor if not. + ColumnLayout { anchors.fill: parent - Text{ - Layout.alignment: Qt.AlignCenter + RowLayout{ Layout.preferredHeight: 60 + Layout.alignment: Qt.AlignCenter Layout.topMargin: 15 - text: conferenceInfoModel.subject - color: WaitingRoomStyle.title.color - font.pointSize: WaitingRoomStyle.title.pointSize - horizontalAlignment: Qt.AlignCenter + spacing: 20 + Text{ + Layout.preferredHeight: 60 + Layout.alignment: Qt.AlignCenter + text: mainItem.conferenceInfoModel ? mainItem.conferenceInfoModel.subject + : (mainItem._sipAddressObserver ? UtilsCpp.getDisplayName(mainItem._sipAddressObserver.peerAddress) : '') + color: WaitingRoomStyle.title.color + font.pointSize: WaitingRoomStyle.title.pointSize + horizontalAlignment: Qt.AlignHCenter + verticalAlignment: Qt.AlignVCenter + } + BusyIndicator { + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight: WaitingRoomStyle.header.busyIndicator.height + Layout.preferredWidth: WaitingRoomStyle.header.busyIndicator.width + color: WaitingRoomStyle.header.busyIndicator.color + visible: mainItem.callModel && mainItem.callModel.isOutgoing + } + } + Text { + Layout.fillWidth: true + horizontalAlignment: Qt.AlignHCenter + verticalAlignment: Qt.AlignVCenter + + color: WaitingRoomStyle.callError.color + font.pointSize: WaitingRoomStyle.callError.pointSize + width: parent.width + visible: mainItem.callModel && mainItem.callModel.callError + text: mainItem.callModel && mainItem.callModel.callError ? mainItem.callModel.callError : '' } RowLayout{ id: loader @@ -42,22 +80,58 @@ Rectangle { Item{ Layout.fillHeight: true Layout.fillWidth: true - CameraView{ - id: previewLoader - showCloseButton: false + + Flipable{ + id: contentsStack anchors.centerIn: parent - height: Math.min( parent.height, parent.width) + height: Math.min( loader.height, loader.width) width : height - ActionButton{ - anchors.top: parent.top - anchors.right: parent.right - anchors.topMargin: 10 - anchors.rightMargin: 10 - isCustom: true - backgroundRadius: width/2 - colorSet: WaitingRoomStyle.buttons.options - toggled: mediaMenu.visible - onClicked: mediaMenu.visible = !mediaMenu.visible + property bool flipped: false + + transform: Rotation { + id: rotation + origin.x: contentsStack.width/2 + origin.y: contentsStack.height/2 + axis.x: 0; axis.y: 1; axis.z: 0 // set axis.y to 1 to rotate around y-axis + angle: 0 // the default angle + } + + states: State { + name: "back" + PropertyChanges { target: rotation; angle: 180 } + when: contentsStack.flipped + } + + transitions: Transition { + NumberAnimation { target: rotation; property: "angle"; duration: 500 } + } + + front: CameraView{ + id: previewLoader + showCloseButton: false + enabled: mainItem.previewLoaderEnabled + height: Math.min( loader.height, loader.width) + width : height + ActionButton{ + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 10 + anchors.rightMargin: 10 + isCustom: true + backgroundRadius: width/2 + colorSet: WaitingRoomStyle.buttons.options + toggled: mediaMenu.visible + onClicked: mediaMenu.visible = !mediaMenu.visible + } + } + back: Avatar { + id: avatar + height: Math.min( loader.height, loader.width) + width : height + backgroundColor: WaitingRoomStyle.avatar.backgroundColor + image: mainItem._sipAddressObserver && _sipAddressObserver.contact && mainItem._sipAddressObserver.contact.vcard.avatar + username: mainItem.conferenceInfoModel ? mainItem.conferenceInfoModel.subject + : (mainItem._sipAddressObserver ? UtilsCpp.getDisplayName(mainItem._sipAddressObserver.peerAddress) : '') } } } @@ -85,6 +159,7 @@ Rectangle { Layout.bottomMargin: 25 Layout.leftMargin: 25 Layout.rightMargin: 25 + enabled: !mainItem.callModel Item{ Layout.fillWidth: true } @@ -128,7 +203,7 @@ Rectangle { isCustom: true backgroundRadius: width/2 colorSet: selectedMode == 0 ? WaitingRoomStyle.buttons.gridLayout : - selectedMode == 1 ? WaitingRoomStyle.buttons.activeSpeakerLayout : WaitingRoomStyle.buttons.audioOnly + selectedMode == 1 ? WaitingRoomStyle.buttons.activeSpeakerLayout : WaitingRoomStyle.buttons.audioOnly onClicked: selectedMode = (selectedMode + 1) % 3 } } @@ -146,21 +221,24 @@ Rectangle { capitalization: Font.AllUppercase onClicked: { - mainItem.close() - mainItem.cancel() - } + mainItem.close() + if(mainItem.callModel) + callModel.terminate() + mainItem.cancel() + } } TextButtonB { //: 'Start' : Button label for starting the conference. text: qsTr('startButton') capitalization: Font.AllUppercase - - onClicked: {mainItem.close(); CallsListModel.launchVideoCall(conferenceInfoModel.uri, '', 0, - { video: modeChoice.selectedMode != 2 - , camera: camera.cameraEnabled - , micro: !micro.microMuted - , audio: !speaker.speakerMuted - , layout: (modeChoice.selectedMode % 2)}) } + enabled: !mainItem.callModel + + onClicked: {CallsListModel.launchVideoCall(conferenceInfoModel.uri, '', 0, + { video: modeChoice.selectedMode != 2 + , camera: camera.cameraEnabled + , micro: !micro.microMuted + , audio: !speaker.speakerMuted + , layout: (modeChoice.selectedMode % 2)}) } } } diff --git a/linphone-app/ui/views/App/Main/Conferences.qml b/linphone-app/ui/views/App/Main/Conferences.qml index e2149fe04..5112cb2f5 100644 --- a/linphone-app/ui/views/App/Main/Conferences.qml +++ b/linphone-app/ui/views/App/Main/Conferences.qml @@ -65,7 +65,7 @@ Item{ qsTr('conferencesScheduledFilter'), //: 'Invitations' : Filter conferences on invited conferences (where we are not the organizer). - qsTr('conferencesEndedFilter'), + qsTr('conferencesInvitedFilter'), ] capitalization: Font.AllUppercase selectedButton: mainItem.filterType diff --git a/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml b/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml index e1b88ca9a..e9a2efdea 100644 --- a/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml +++ b/linphone-app/ui/views/App/Styles/Calls/WaitingRoomStyle.qml @@ -125,6 +125,21 @@ QtObject { } } */ + property QtObject callError: QtObject { + property color color: ColorsList.add(sectionName+'_action_error', 'i').color + property int pointSize: Units.dp * 12 + } + property QtObject header: QtObject { + property QtObject busyIndicator: QtObject { + property color color: ColorsList.add(sectionName+'_header_busy', 'i').color + property int height: 30 + property int width: 30 + } + } + property QtObject avatar: QtObject { + property color backgroundColor: ColorsList.add(sectionName+'_container_avatar_bg', 'n').color + property int maxSize: 300 + } // Button colors property QtObject buttons: QtObject { property QtObject microOn: QtObject { diff --git a/linphone-sdk b/linphone-sdk index be381f199..9542d335e 160000 --- a/linphone-sdk +++ b/linphone-sdk @@ -1 +1 @@ -Subproject commit be381f199d2c55dcfca959f65cbe589329b4bee7 +Subproject commit 9542d335ea525de66d7b5519bac4e1ba808caa3a