diff --git a/Linphone/core/call/CallCore.cpp b/Linphone/core/call/CallCore.cpp index 8a299721d..5d5d402d4 100644 --- a/Linphone/core/call/CallCore.cpp +++ b/Linphone/core/call/CallCore.cpp @@ -124,17 +124,9 @@ CallCore::CallCore(const std::shared_ptr &call) : QObject(nullpt mRemoteName = Utils::coreStringToAppString( linphoneFriend->getVcard() ? linphoneFriend->getVcard()->getFullName() : linphoneFriend->getName()); if (mRemoteName.isEmpty()) mRemoteName = ToolModel::getDisplayName(mRemoteAddress); - mShouldFindRemoteLdapFriend = !linphoneFriend; // - if (mShouldFindRemoteLdapFriend) { - auto servers = CoreModel::getInstance()->getCore()->getRemoteContactDirectories(); - bool haveLdap = false; - for (auto s : servers) { - if (s->getType() == linphone::RemoteContactDirectory::Type::Ldap) { - haveLdap = true; - break; - } - } - mShouldFindRemoteLdapFriend = haveLdap; + mShouldFindRemoteFriend = !linphoneFriend; + if (mShouldFindRemoteFriend) { + mShouldFindRemoteFriend = CoreModel::getInstance()->getCore()->getRemoteContactDirectories().size() > 0; } mLocalAddress = Utils::coreStringToAppString(call->getCallLog()->getLocalAddress()->asStringUriOnly()); mStatus = LinphoneEnums::fromLinphone(call->getCallLog()->getStatus()); @@ -438,7 +430,7 @@ void CallCore::setSelf(QSharedPointer me) { setVideoStats(videoStats); } }); - if (mShouldFindRemoteLdapFriend) findRemoteLdapFriend(me); + if (mShouldFindRemoteFriend) findRemoteFriend(me); } DEFINE_GET_SET_API(CallCore, bool, isStarted, IsStarted) @@ -776,30 +768,39 @@ void CallCore::setVideoStats(VideoStats stats) { } } -void CallCore::findRemoteLdapFriend(QSharedPointer me) { +void CallCore::findRemoteFriend(QSharedPointer me) { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); auto linphoneSearch = CoreModel::getInstance()->getCore()->createMagicSearch(); linphoneSearch->setLimitedSearch(true); - mLdapMagicSearchModel = Utils::makeQObject_ptr(linphoneSearch); - mLdapMagicSearchModel->setSelf(mLdapMagicSearchModel); - mLdapMagicSearchModelConnection = SafeConnection::create(me, mLdapMagicSearchModel); - mLdapMagicSearchModelConnection->makeConnectToModel( + + mRemoteMagicSearchModel = Utils::makeQObject_ptr(linphoneSearch); + mRemoteMagicSearchModel->setSelf(mRemoteMagicSearchModel); + mRemoteMagicSearchModelConnection = SafeConnection::create(me, mRemoteMagicSearchModel); + mRemoteMagicSearchModelConnection->makeConnectToModel( &MagicSearchModel::searchResultsReceived, [this, remoteAdress = mRemoteAddress](const std::list> &results) { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); - auto ldapFriend = ToolModel::findFriendByAddress(remoteAdress); - if (ldapFriend) { - auto ldapName = Utils::coreStringToAppString(ldapFriend->getName()); - mLdapMagicSearchModelConnection->invokeToCore([this, ldapName]() { + QString name; + auto remoteFriend = ToolModel::findFriendByAddress(remoteAdress); // Priorize what is stored. + if (!remoteFriend && results.size() > 0) remoteFriend = results.front()->getFriend(); // Then result friend. + if (remoteFriend) name = Utils::coreStringToAppString(remoteFriend->getName()); + else if (results.size() > 0) // Then result address. + name = Utils::coreStringToAppString(results.front()->getAddress()->getDisplayName()); + if (name.isEmpty()) name = Utils::coreStringToAppString(results.front()->getAddress()->getUsername()); + if (!name.isEmpty()) + mRemoteMagicSearchModelConnection->invokeToCore([this, name]() { mustBeInMainThread(log().arg(Q_FUNC_INFO)); - if (ldapName != mRemoteName) { - mRemoteName = ldapName; + if (name != mRemoteName) { + mRemoteName = name; emit remoteNameChanged(); } }); - } }); - mLdapMagicSearchModel->search( - SettingsModel::getInstance()->getUsernameOnlyForLdapLookupsInCalls() ? mRemoteUsername : mRemoteAddress, - (int)LinphoneEnums::MagicSearchSource::LdapServers, LinphoneEnums::MagicSearchAggregation::Friend, -1); + + bool ldapSearch = SettingsModel::getInstance()->getUsernameOnlyForLdapLookupsInCalls(); + bool cardDAVSearch = SettingsModel::getInstance()->getUsernameOnlyForCardDAVLookupsInCalls(); + mRemoteMagicSearchModel->search(ldapSearch || cardDAVSearch ? mRemoteUsername : mRemoteAddress, + (ldapSearch ? (int)LinphoneEnums::MagicSearchSource::LdapServers : 0) | + (cardDAVSearch ? (int)LinphoneEnums::MagicSearchSource::RemoteCardDAV : 0), + LinphoneEnums::MagicSearchAggregation::Friend, -1); } diff --git a/Linphone/core/call/CallCore.hpp b/Linphone/core/call/CallCore.hpp index 05a6d6657..5624c6d9d 100644 --- a/Linphone/core/call/CallCore.hpp +++ b/Linphone/core/call/CallCore.hpp @@ -236,7 +236,7 @@ public: VideoStats getVideoStats() const; void setVideoStats(VideoStats stats); - void findRemoteLdapFriend(QSharedPointer me); + void findRemoteFriend(QSharedPointer me); signals: void statusChanged(LinphoneEnums::CallStatus status); @@ -345,9 +345,9 @@ private: ZrtpStats mZrtpStats; AudioStats mAudioStats; VideoStats mVideoStats; - std::shared_ptr mLdapMagicSearchModel; - bool mShouldFindRemoteLdapFriend; - QSharedPointer> mLdapMagicSearchModelConnection; + std::shared_ptr mRemoteMagicSearchModel; + bool mShouldFindRemoteFriend; + QSharedPointer> mRemoteMagicSearchModelConnection; DECLARE_ABSTRACT_OBJECT }; diff --git a/Linphone/core/friend/FriendCore.cpp b/Linphone/core/friend/FriendCore.cpp index c78d8beda..bc9a63905 100644 --- a/Linphone/core/friend/FriendCore.cpp +++ b/Linphone/core/friend/FriendCore.cpp @@ -29,14 +29,17 @@ DEFINE_ABSTRACT_OBJECT(FriendCore) const QString _addressLabel = FriendCore::tr("Adresse SIP"); const QString _phoneLabel = FriendCore::tr("Téléphone"); -QSharedPointer FriendCore::create(const std::shared_ptr &contact, bool isStored) { - auto sharedPointer = QSharedPointer(new FriendCore(contact, isStored), &QObject::deleteLater); +QSharedPointer +FriendCore::create(const std::shared_ptr &contact, bool isStored, int sourceFlags) { + auto sharedPointer = + QSharedPointer(new FriendCore(contact, isStored, sourceFlags), &QObject::deleteLater); sharedPointer->setSelf(sharedPointer); sharedPointer->moveToThread(App::getInstance()->thread()); return sharedPointer; } -FriendCore::FriendCore(const std::shared_ptr &contact, bool isStored) : QObject(nullptr) { +FriendCore::FriendCore(const std::shared_ptr &contact, bool isStored, int sourceFlags) + : QObject(nullptr) { App::getInstance()->mEngine->setObjectOwnership(this, QQmlEngine::CppOwnership); if (contact) { mustBeInLinphoneThread(getClassName()); @@ -80,17 +83,19 @@ FriendCore::FriendCore(const std::shared_ptr &contact, bool is LinphoneEnums::fromLinphone(device->getSecurityLevel()))); } updateVerifiedDevicesCount(); - mStarred = contact->getStarred(); mIsSaved = true; mIsStored = isStored; mIsLdap = ToolModel::friendIsInFriendList(ToolModel::getLdapFriendList(), contact); + mIsCardDAV = (sourceFlags & (int)linphone::MagicSearch::Source::RemoteCardDAV) != 0; } else { mIsSaved = false; mStarred = false; mIsStored = false; mIsLdap = false; + mIsCardDAV = false; } + connect(this, &FriendCore::addressChanged, &FriendCore::allAddressesChanged); connect(this, &FriendCore::phoneNumberChanged, &FriendCore::allAddressesChanged); } @@ -110,6 +115,7 @@ FriendCore::FriendCore(const FriendCore &friendCore) { mIsSaved = friendCore.mIsSaved; mIsStored = friendCore.mIsStored; mIsLdap = friendCore.mIsLdap; + mIsCardDAV = friendCore.mIsCardDAV; } FriendCore::~FriendCore() { @@ -662,7 +668,7 @@ void FriendCore::save() { // Save Values to model thisCopy->writeIntoModel(mFriendModel); thisCopy->deleteLater(); mVCardString = mFriendModel->getVCardAsString(); - auto carddavListForNewFriends = SettingsModel::getCarddavListForNewFriends(); + auto carddavListForNewFriends = SettingsModel::getCardDAVListForNewFriends(); auto listWhereToAddFriend = carddavListForNewFriends != nullptr ? carddavListForNewFriends : ToolModel::getAppFriendList(); bool created = (listWhereToAddFriend->addFriend(contact) == linphone::FriendList::Status::OK); @@ -702,9 +708,13 @@ bool FriendCore::isLdap() const { return mIsLdap; } +bool FriendCore::isCardDAV() const { + return mIsCardDAV; +} + bool FriendCore::getReadOnly() const { - return isLdap(); // TODO add conditions for friends retrieved via HTTP [misc]vcards-contacts-list= & - // CardDAV + return isLdap() || isCardDAV(); // TODO add conditions for friends retrieved via HTTP + // [misc]vcards-contacts-list= & CardDAV } std::shared_ptr FriendCore::getFriendModel() { diff --git a/Linphone/core/friend/FriendCore.hpp b/Linphone/core/friend/FriendCore.hpp index f6a31158d..a6cec35f7 100644 --- a/Linphone/core/friend/FriendCore.hpp +++ b/Linphone/core/friend/FriendCore.hpp @@ -72,11 +72,13 @@ class FriendCore : public QObject, public AbstractObject { Q_PROPERTY(bool starred READ getStarred WRITE lSetStarred NOTIFY starredChanged) Q_PROPERTY(bool readOnly READ getReadOnly CONSTANT) Q_PROPERTY(bool isLdap READ isLdap CONSTANT) + Q_PROPERTY(bool isCardDAV READ isCardDAV CONSTANT) public: // Should be call from model Thread. Will be automatically in App thread after initialization - static QSharedPointer create(const std::shared_ptr &contact, bool isStored = true); - FriendCore(const std::shared_ptr &contact, bool isStored = true); + static QSharedPointer + create(const std::shared_ptr &contact, bool isStored = true, int sourceFlags = 0); + FriendCore(const std::shared_ptr &contact, bool isStored = true, int sourceFlags = 0); FriendCore(const FriendCore &friendCore); ~FriendCore(); void setSelf(QSharedPointer me); @@ -146,6 +148,7 @@ public: void onPresenceReceived(LinphoneEnums::ConsolidatedPresence consolidatedPresence, QDateTime presenceTimestamp); bool isLdap() const; + bool isCardDAV() const; bool getReadOnly() const; std::shared_ptr getFriendModel(); @@ -204,7 +207,7 @@ protected: bool mIsSaved; bool mIsStored; QString mVCardString; - bool mIsLdap; + bool mIsLdap, mIsCardDAV; std::shared_ptr mFriendModel; QSharedPointer> mFriendModelConnection; QSharedPointer> mCoreModelConnection; diff --git a/Linphone/core/search/MagicSearchList.cpp b/Linphone/core/search/MagicSearchList.cpp index 9ee42bdc5..bf3d28d04 100644 --- a/Linphone/core/search/MagicSearchList.cpp +++ b/Linphone/core/search/MagicSearchList.cpp @@ -97,12 +97,12 @@ void MagicSearchList::setSelf(QSharedPointer me) { if (linphoneFriend) { isStored = (ldapContacts->findFriendByAddress(linphoneFriend->getAddress()) != linphoneFriend); - contact = FriendCore::create(linphoneFriend, isStored); + contact = FriendCore::create(linphoneFriend, isStored, it->getSourceFlags()); contacts->append(contact); } else if (auto address = it->getAddress()) { auto linphoneFriend = CoreModel::getInstance()->getCore()->createFriend(); linphoneFriend->setAddress(address); - contact = FriendCore::create(linphoneFriend, isStored); + contact = FriendCore::create(linphoneFriend, isStored, it->getSourceFlags()); auto displayName = Utils::coreStringToAppString(address->getDisplayName()); auto splitted = displayName.split(" "); if (!displayName.isEmpty() && splitted.size() > 0) { @@ -118,7 +118,7 @@ void MagicSearchList::setSelf(QSharedPointer me) { } else if (!it->getPhoneNumber().empty()) { linphoneFriend = CoreModel::getInstance()->getCore()->createFriend(); linphoneFriend->setAddress(address); - contact = FriendCore::create(linphoneFriend, isStored); + contact = FriendCore::create(linphoneFriend, isStored, it->getSourceFlags()); contact->setGivenName(Utils::coreStringToAppString(it->getPhoneNumber())); contact->appendPhoneNumber(tr("Phone"), Utils::coreStringToAppString(it->getPhoneNumber())); contacts->append(contact); @@ -215,7 +215,8 @@ QVariant MagicSearchList::data(const QModelIndex &index, int role) const { if (role == Qt::DisplayRole) { return QVariant::fromValue(new FriendGui(mList[row].objectCast())); } else if (role == Qt::DisplayRole + 1) { - return mList[row].objectCast()->getIsStored() || mList[row].objectCast()->isLdap(); + return mList[row].objectCast()->getIsStored() || mList[row].objectCast()->isLdap() || + mList[row].objectCast()->isCardDAV(); } return QVariant(); } diff --git a/Linphone/core/search/MagicSearchProxy.cpp b/Linphone/core/search/MagicSearchProxy.cpp index 0a3e190f8..3c93ba16b 100644 --- a/Linphone/core/search/MagicSearchProxy.cpp +++ b/Linphone/core/search/MagicSearchProxy.cpp @@ -54,7 +54,7 @@ void MagicSearchProxy::setList(QSharedPointer newList) { [this](int index, FriendGui *data) { auto sortModel = dynamic_cast(sourceModel()); sortModel->invalidate(); - if (!data->mCore->isLdap()) { + if (!data->mCore->isLdap() && !data->mCore->isCardDAV()) { auto proxyIndex = sortModel->mapFromSource(mList->index(index, 0)).row(); // auto proxyIndex = mapFromSource(sourceModel()->index(index, 0)); // OLD (keep for checking new // proxy behavior) @@ -196,6 +196,9 @@ bool MagicSearchProxy::SortFilterList::filterAcceptsRow(int sourceRow, const QMo toShow = friendCore->isLdap(); // if (!toShow) return false; } + if (!toShow && (mFilterType & (int)FilteringTypes::CardDAV) > 0) { + toShow = friendCore->isCardDAV(); + } if (!toShow && (mFilterType & (int)FilteringTypes::App) > 0) { toShow = friendCore->getIsStored() && !friendCore->isLdap(); // if (!toShow) return false; @@ -220,8 +223,8 @@ bool MagicSearchProxy::SortFilterList::lessThan(const QModelIndex &sourceLeft, c auto r = getItemAtSource(sourceRight.row()); if (l && r) { - bool lIsStored = l->getIsStored() || l->isLdap(); - bool rIsStored = r->getIsStored() || r->isLdap(); + bool lIsStored = l->getIsStored() || l->isLdap() || l->isCardDAV(); + bool rIsStored = r->getIsStored() || r->isLdap() || r->isCardDAV(); if (lIsStored && !rIsStored) return true; else if (!lIsStored && rIsStored) return false; auto lName = l->getFullName().toLower(); diff --git a/Linphone/core/search/MagicSearchProxy.hpp b/Linphone/core/search/MagicSearchProxy.hpp index 399d53bdd..8903a3bf4 100644 --- a/Linphone/core/search/MagicSearchProxy.hpp +++ b/Linphone/core/search/MagicSearchProxy.hpp @@ -41,7 +41,7 @@ class MagicSearchProxy : public LimitProxy { Q_PROPERTY(MagicSearchProxy *hideListProxy READ getHideListProxy WRITE setHideListProxy NOTIFY hideListProxyChanged) public: - enum class FilteringTypes { None = 0, Favorites = 1, App = 2, Ldap = 4, Other = 8 }; + enum class FilteringTypes { None = 0, Favorites = 1, App = 2, Ldap = 4, CardDAV = 8, Other = 16 }; Q_ENUM(FilteringTypes) DECLARE_SORTFILTER_CLASS(MagicSearchProxy *mHideListProxy = nullptr;) diff --git a/Linphone/model/address-books/carddav/CarddavModel.cpp b/Linphone/model/address-books/carddav/CarddavModel.cpp index 53a217b73..0ba091b95 100644 --- a/Linphone/model/address-books/carddav/CarddavModel.cpp +++ b/Linphone/model/address-books/carddav/CarddavModel.cpp @@ -49,7 +49,7 @@ CarddavModel::~CarddavModel() { bool CarddavModel::storeNewFriendsInIt() { if (!mCarddavFriendList) return false; - auto carddavListForNewFriends = SettingsModel::getCarddavListForNewFriends(); + auto carddavListForNewFriends = SettingsModel::getCardDAVListForNewFriends(); return carddavListForNewFriends != nullptr && mCarddavFriendList->getDisplayName() == carddavListForNewFriends->getDisplayName(); } @@ -100,7 +100,7 @@ void CarddavModel::onSyncStatusChanged(const std::shared_ptrgetUri(); setMonitor(nullptr); - if (mStoreNewFriendsInIt) SettingsModel::setCarddavListForNewFriends(friendList->getDisplayName()); + if (mStoreNewFriendsInIt) SettingsModel::setCardDAVListForNewFriends(friendList->getDisplayName()); emit saved(true); } if (status == linphone::FriendList::SyncStatus::Failure) { diff --git a/Linphone/model/search/MagicSearchModel.cpp b/Linphone/model/search/MagicSearchModel.cpp index d50987460..d8cdbe411 100644 --- a/Linphone/model/search/MagicSearchModel.cpp +++ b/Linphone/model/search/MagicSearchModel.cpp @@ -49,6 +49,8 @@ void MagicSearchModel::search(QString filter, if (((sourceFlags & (int)LinphoneEnums::MagicSearchSource::LdapServers) > 0) && !SettingsModel::getInstance()->getSyncLdapContacts()) sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::LdapServers; + if (((sourceFlags & (int)LinphoneEnums::MagicSearchSource::RemoteCardDAV) > 0)) + sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::RemoteCardDAV; // For complete search, we search only on local contacts. // sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::CallLogs; // sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::ChatRooms; @@ -88,12 +90,12 @@ void MagicSearchModel::onSearchResultsReceived(const std::shared_ptrgetDisplayName().c_str() : "NoList") << result->getSourceFlags() << " / " << (f ? f.get() : nullptr); - bool isLdap = (result->getSourceFlags() & (int)LinphoneEnums::MagicSearchSource::LdapServers) != 0; + bool isLdap = (result->getSourceFlags() & (int)linphone::MagicSearch::Source::LdapServers) != 0; // Do not add it into ldap_friends if it already exists in app_friends. if (isLdap && f && (!fList || fList->getDisplayName() != "app_friends") && !ToolModel::friendIsInFriendList(appFriends, f)) { // Double check because of SDK merging that lead to // use a ldap result as of app_friends/ldap_friends. - updateLdapFriendListWithFriend(f); + updateFriendListWithFriend(f, ToolModel::getLdapFriendList()); } auto resultIt = @@ -106,9 +108,8 @@ void MagicSearchModel::onSearchResultsReceived(const std::shared_ptr &magicSearch, - const std::shared_ptr &ldap) { - // emit ldapHaveMoreResults(ldap); +void MagicSearchModel::onMoreResultsAvailable(const std::shared_ptr &magicSearch, + linphone::MagicSearch::Source source) { } // Store LDAP friends in separate list so they can still be retrieved by core->findFriend() for display names, @@ -116,29 +117,30 @@ void MagicSearchModel::onLdapHaveMoreResults(const std::shared_ptr &linphoneFriend) { +void MagicSearchModel::updateFriendListWithFriend(const std::shared_ptr &linphoneFriend, + std::shared_ptr friendList) { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); auto core = CoreModel::getInstance()->getCore(); - auto ldapFriendList = ToolModel::getLdapFriendList(); - if (ToolModel::friendIsInFriendList(ldapFriendList, linphoneFriend)) + + if (ToolModel::friendIsInFriendList(friendList, linphoneFriend)) return; // Already exist. We don't need to manipulate list. for (auto address : linphoneFriend->getAddresses()) { - auto existingFriend = ldapFriendList->findFriendByAddress(address); + auto existingFriend = friendList->findFriendByAddress(address); if (existingFriend) { - ldapFriendList->removeFriend(existingFriend); - ldapFriendList->addFriend(linphoneFriend); + friendList->removeFriend(existingFriend); + friendList->addFriend(linphoneFriend); return; } } for (auto number : linphoneFriend->getPhoneNumbers()) { - auto existingFriend = ldapFriendList->findFriendByPhoneNumber(number); + auto existingFriend = friendList->findFriendByPhoneNumber(number); if (existingFriend) { - ldapFriendList->removeFriend(existingFriend); - ldapFriendList->addFriend(linphoneFriend); + friendList->removeFriend(existingFriend); + friendList->addFriend(linphoneFriend); return; } } qDebug() << log().arg("Adding Friend:") << linphoneFriend.get(); - ldapFriendList->addFriend(linphoneFriend); + friendList->addFriend(linphoneFriend); emit CoreModel::getInstance()->friendCreated(linphoneFriend); } diff --git a/Linphone/model/search/MagicSearchModel.hpp b/Linphone/model/search/MagicSearchModel.hpp index c0878fbba..b20942209 100644 --- a/Linphone/model/search/MagicSearchModel.hpp +++ b/Linphone/model/search/MagicSearchModel.hpp @@ -53,9 +53,10 @@ private: // LINPHONE //-------------------------------------------------------------------------------- virtual void onSearchResultsReceived(const std::shared_ptr &magicSearch) override; - virtual void onLdapHaveMoreResults(const std::shared_ptr &magicSearch, - const std::shared_ptr &ldap) override; - void updateLdapFriendListWithFriend(const std::shared_ptr &linphoneFriend); + virtual void onMoreResultsAvailable(const std::shared_ptr &magicSearch, + linphone::MagicSearch::Source source) override; + void updateFriendListWithFriend(const std::shared_ptr &linphoneFriend, + std::shared_ptr friendList); signals: void searchResultsReceived(const std::list> &results); diff --git a/Linphone/model/setting/SettingsModel.cpp b/Linphone/model/setting/SettingsModel.cpp index 437e0daf3..04342f475 100644 --- a/Linphone/model/setting/SettingsModel.cpp +++ b/Linphone/model/setting/SettingsModel.cpp @@ -575,7 +575,7 @@ void SettingsModel::setIpv6Enabled(bool status) { // Carddav storage list // ============================================================================= -const std::shared_ptr SettingsModel::getCarddavListForNewFriends() { +const std::shared_ptr SettingsModel::getCardDAVListForNewFriends() { mustBeInLinphoneThread(sLog().arg(Q_FUNC_INFO)); auto core = CoreModel::getInstance()->getCore(); if (core) { @@ -586,7 +586,7 @@ const std::shared_ptr SettingsModel::getCarddavListForNewF } else return nullptr; } -void SettingsModel::setCarddavListForNewFriends(std::string name) { +void SettingsModel::setCardDAVListForNewFriends(std::string name) { mustBeInLinphoneThread(sLog().arg(Q_FUNC_INFO)); auto core = CoreModel::getInstance()->getCore(); if (core) { @@ -687,6 +687,7 @@ void SettingsModel::notifyConfigReady(){ DEFINE_NOTIFY_CONFIG_READY(shortcutCount, ShortcutCount) DEFINE_NOTIFY_CONFIG_READY(shortcuts, Shortcuts) DEFINE_NOTIFY_CONFIG_READY(usernameOnlyForLdapLookupsInCalls, UsernameOnlyForLdapLookupsInCalls) + DEFINE_NOTIFY_CONFIG_READY(usernameOnlyForCardDAVLookupsInCalls, UsernameOnlyForCardDAVLookupsInCalls) } DEFINE_GETSET_CONFIG(SettingsModel, bool, Bool, disableChatFeature, DisableChatFeature, "disable_chat_feature", true) @@ -808,4 +809,11 @@ DEFINE_GETSET_CONFIG(SettingsModel, UsernameOnlyForLdapLookupsInCalls, "username_only_for_ldap_lookups_in_calls", false) +DEFINE_GETSET_CONFIG(SettingsModel, + bool, + Bool, + usernameOnlyForCardDAVLookupsInCalls, + UsernameOnlyForCardDAVLookupsInCalls, + "username_only_for_carddav_lookups_in_calls", + false) // clang-format on diff --git a/Linphone/model/setting/SettingsModel.hpp b/Linphone/model/setting/SettingsModel.hpp index 40b274c2c..e1da41080 100644 --- a/Linphone/model/setting/SettingsModel.hpp +++ b/Linphone/model/setting/SettingsModel.hpp @@ -138,8 +138,8 @@ public: QString getLogsEmail() const; - static const std::shared_ptr getCarddavListForNewFriends(); - static void setCarddavListForNewFriends(std::string listName); + static const std::shared_ptr getCardDAVListForNewFriends(); + static void setCardDAVListForNewFriends(std::string listName); static QString getDeviceName(const std::shared_ptr &config); @@ -171,6 +171,7 @@ public: DECLARE_GETSET(int, shortcutCount, ShortcutCount) DECLARE_GETSET(QVariantList, shortcuts, Shortcuts) DECLARE_GETSET(bool, usernameOnlyForLdapLookupsInCalls, UsernameOnlyForLdapLookupsInCalls) + DECLARE_GETSET(bool, usernameOnlyForCardDAVLookupsInCalls, UsernameOnlyForCardDAVLookupsInCalls) signals: void logsUploadUrlChanged(); diff --git a/Linphone/view/Control/Display/Contact/AllContactListView.qml b/Linphone/view/Control/Display/Contact/AllContactListView.qml index bb030a840..9e159641b 100644 --- a/Linphone/view/Control/Display/Contact/AllContactListView.qml +++ b/Linphone/view/Control/Display/Contact/AllContactListView.qml @@ -285,7 +285,8 @@ Flickable{ model:MagicSearchProxy { id: contactsProxy parentProxy: mainItem.mainModel - filterType: MagicSearchProxy.FilteringTypes.App | (mainItem.searchText != '*' && mainItem.searchText != '' || SettingsCpp.syncLdapContacts ? MagicSearchProxy.FilteringTypes.Ldap : 0) + filterType: MagicSearchProxy.FilteringTypes.App + | (mainItem.searchText != '*' && mainItem.searchText != '' || SettingsCpp.syncLdapContacts ? MagicSearchProxy.FilteringTypes.Ldap | MagicSearchProxy.FilteringTypes.CardDAV: 0) initialDisplayItems: Math.max(20, 2 * mainItem.height / (63 * DefaultStyle.dp)) displayItemsStep: 3 * initialDisplayItems / 2 onLocalFriendCreated: (index) => { diff --git a/Linphone/view/Control/Display/Contact/ContactListItem.qml b/Linphone/view/Control/Display/Contact/ContactListItem.qml index 4426f6e2a..49a59e376 100644 --- a/Linphone/view/Control/Display/Contact/ContactListItem.qml +++ b/Linphone/view/Control/Display/Contact/ContactListItem.qml @@ -165,7 +165,7 @@ FocusScope { popup.contentItem: ColumnLayout { IconLabelButton { - visible: searchResultItem.core.isStored + visible: searchResultItem.core.isStored && !searchResultItem.core.readOnly text: searchResultItem.core.starred ? qsTr("Enlever des favoris") : qsTr("Mettre en favori") icon.source: searchResultItem.core.starred ? AppIcons.heartFill : AppIcons.heart spacing: 10 * DefaultStyle.dp diff --git a/Linphone/view/Page/Main/Call/CallPage.qml b/Linphone/view/Page/Main/Call/CallPage.qml index 6eb092de2..70dd24db5 100644 --- a/Linphone/view/Page/Main/Call/CallPage.qml +++ b/Linphone/view/Page/Main/Call/CallPage.qml @@ -703,11 +703,13 @@ AbstractMainPage { anchors.fill: parent IconLabelButton { Layout.fillWidth: true + property bool isLdap: contactDetail.contact?.core?.isLdap + property bool isCardDAV: contactDetail.contact?.core?.isCardDAV text: contactDetail.contact ? qsTr("Voir le contact") : qsTr("Ajouter aux contacts") icon.source: AppIcons.plusCircle icon.width: 32 * DefaultStyle.dp icon.height: 32 * DefaultStyle.dp - visible: SettingsCpp.syncLdapContacts || !contactDetail.contact?.core?.isLdap + visible: !isLdap && !isCardDAV onClicked: { detailOptions.close() if (contactDetail.contact) mainWindow.displayContactPage(contactDetail.contactAddress)