File indexing completed on 2024-05-05 17:32:12

0001 // SPDX-FileCopyrightText: 2013 David Edmundson <davidedmundson@kde.org>
0002 //
0003 // SPDX-License-Identifier: LGPL-2.1-or-later
0004 
0005 #include "fake-contact-source.h"
0006 
0007 #include <QDebug>
0008 
0009 FakeContactSource::FakeContactSource(QObject *parent, const QVariantList &args)
0010     : BasePersonsDataSource(parent, args)
0011 {
0012 }
0013 
0014 QString FakeContactSource::sourcePluginId() const
0015 {
0016     return QStringLiteral("fakesource://");
0017 }
0018 
0019 KPeople::AllContactsMonitor *FakeContactSource::createAllContactsMonitor()
0020 {
0021     return new FakeAllContactsMonitor();
0022 }
0023 
0024 void FakeContactSource::changeProperty(const QString &key, const QVariant &value)
0025 {
0026     qobject_cast<FakeAllContactsMonitor *>(allContactsMonitor().data())->changeProperty(key, value);
0027 }
0028 
0029 void FakeContactSource::remove(const QString &uri)
0030 {
0031     qobject_cast<FakeAllContactsMonitor *>(allContactsMonitor().data())->remove(uri);
0032 }
0033 
0034 class FakeContact : public KPeople::AbstractContact
0035 {
0036 public:
0037     FakeContact(const QVariantMap &props)
0038         : _properties(props)
0039     {
0040     }
0041 
0042     QVariant customProperty(const QString &key) const override
0043     {
0044         if (key == KPeople::AbstractContact::AllPhoneNumbersProperty) {
0045             const QStringList allNumbers = _properties[KPeople::AbstractContact::AllPhoneNumbersProperty].toStringList();
0046 
0047             if (allNumbers.isEmpty()) {
0048                 return _properties[KPeople::AbstractContact::PhoneNumberProperty];
0049             }
0050 
0051             return _properties[KPeople::AbstractContact::AllPhoneNumbersProperty];
0052         }
0053 
0054         if (key.startsWith(QLatin1String("all-"))) {
0055             return QStringList(_properties[key.mid(4)].toString());
0056         } else {
0057             return _properties[key];
0058         }
0059     }
0060 
0061     QVariantMap _properties;
0062 };
0063 
0064 FakeAllContactsMonitor::FakeAllContactsMonitor()
0065 {
0066     // clang-format off
0067     _contacts.insert(
0068         QStringLiteral("fakesource://contact1"),
0069         KPeople::AbstractContact::Ptr(new FakeContact({
0070             {KPeople::AbstractContact::NameProperty, QStringLiteral("Contact 1")},
0071             {KPeople::AbstractContact::EmailProperty, QStringLiteral("contact1@example.com")}
0072         }))
0073     );
0074 
0075     _contacts.insert(
0076         QStringLiteral("fakesource://contact2"),
0077         KPeople::AbstractContact::Ptr(new FakeContact({
0078             {KPeople::AbstractContact::NameProperty, QStringLiteral("Contact 2")},
0079             {KPeople::AbstractContact::EmailProperty, QStringLiteral("contact2@example.com")},
0080             {KPeople::AbstractContact::PhoneNumberProperty, QStringLiteral("+1 234 567 890")}
0081         }))
0082     );
0083 
0084     _contacts.insert(
0085         QStringLiteral("fakesource://contact3"),
0086         KPeople::AbstractContact::Ptr(new FakeContact({{KPeople::AbstractContact::NameProperty, QStringLiteral("Contact 3")},
0087             {KPeople::AbstractContact::EmailProperty, QStringLiteral("contact3@example.com")},
0088             {KPeople::AbstractContact::PhoneNumberProperty, QStringLiteral("+46 666 777 999")}
0089         }))
0090     );
0091 
0092     _contacts.insert(
0093         QStringLiteral("fakesource://contact4"),
0094         KPeople::AbstractContact::Ptr(new FakeContact({
0095             {KPeople::AbstractContact::NameProperty, QStringLiteral("Contact 4")},
0096             {KPeople::AbstractContact::EmailProperty, QStringLiteral("contact4@example.com")},
0097             {KPeople::AbstractContact::AllPhoneNumbersProperty, QStringList{QStringLiteral("+46-111-111-111")}}
0098         }))
0099     );
0100 
0101     _contacts.insert(
0102         QStringLiteral("fakesource://contact5"),
0103         KPeople::AbstractContact::Ptr(new FakeContact({
0104             {KPeople::AbstractContact::NameProperty, QStringLiteral("Contact 5")},
0105             {KPeople::AbstractContact::AllPhoneNumbersProperty, QVariantList{QStringLiteral("+46 111 222 333"), QStringLiteral("0 333 222 111")}}
0106         }))
0107     );
0108 
0109     _contacts.insert(
0110         QStringLiteral("fakesource://contact6"),
0111         KPeople::AbstractContact::Ptr(new FakeContact({
0112             {KPeople::AbstractContact::NameProperty, QStringLiteral("Malory")},
0113             {KPeople::AbstractContact::AllPhoneNumbersProperty, QVariantList{QStringLiteral("+46 111&222x333") /* Intentionally invalid */}}
0114         }))
0115     );
0116 
0117     // clang-format on
0118 
0119     emitInitialFetchComplete(true);
0120 }
0121 
0122 void FakeAllContactsMonitor::remove(const QString &uri)
0123 {
0124     _contacts.remove(uri);
0125     Q_EMIT contactRemoved(uri);
0126 }
0127 
0128 QMap<QString, KPeople::AbstractContact::Ptr> FakeAllContactsMonitor::contacts()
0129 {
0130     return _contacts;
0131 }
0132 
0133 void FakeAllContactsMonitor::changeProperty(const QString &key, const QVariant &value)
0134 {
0135     KPeople::AbstractContact::Ptr contact1 = contacts()[QStringLiteral("fakesource://contact1")];
0136     static_cast<FakeContact *>(contact1.data())->_properties[key] = value;
0137     Q_ASSERT(contact1->customProperty(key) == value);
0138 
0139     Q_EMIT contactChanged(QStringLiteral("fakesource://contact1"), contact1);
0140 }