File indexing completed on 2024-05-05 05:28:46

0001 // SPDX-FileCopyrightText: 2020 Jonah Brüchert <jbb@kaidan.im>
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #include <KAboutData>
0006 #include <KDBusService>
0007 #include <KLocalizedContext>
0008 #include <KLocalizedString>
0009 #include <KWindowSystem>
0010 
0011 #include <QApplication>
0012 #include <QCommandLineParser>
0013 #include <QQmlApplicationEngine>
0014 #include <QQuickStyle>
0015 #include <QQuickWindow>
0016 #include <QUrl>
0017 #include <QtQml>
0018 
0019 // Models
0020 #include "chatlistmodel.h"
0021 #include "messagemodel.h"
0022 
0023 #include "about.h"
0024 #include "avatarimageprovider.h"
0025 #include "channelhandler.h"
0026 #include "global.h"
0027 #include "settingsmanager.h"
0028 #include "utils.h"
0029 #include "version.h"
0030 #include <contactphonenumbermapper.h>
0031 
0032 #include <coroutine>
0033 #include <phonenumberlist.h>
0034 
0035 constexpr auto APPLICATION_ID = "org.kde.spacebar";
0036 
0037 Q_DECL_EXPORT int main(int argc, char *argv[])
0038 {
0039     QCommandLineParser parser;
0040     QApplication app(argc, argv);
0041 
0042     if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE") && QQuickStyle::name().isEmpty()) {
0043         QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
0044     }
0045 
0046     QCoreApplication::setOrganizationName(SL("KDE"));
0047     QCoreApplication::setOrganizationDomain(SL("kde.org"));
0048     QCoreApplication::setApplicationName(SL("spacebar"));
0049     QCoreApplication::setApplicationVersion(QStringLiteral(SPACEBAR_VERSION_STRING));
0050     QGuiApplication::setApplicationDisplayName(SL("Spacebar"));
0051 
0052     KLocalizedString::setApplicationDomain("spacebar");
0053 
0054     KAboutData about(SL("spacebar"),
0055                      SL("Spacebar"),
0056                      QStringLiteral(SPACEBAR_VERSION_STRING),
0057                      i18n("SMS/MMS messaging client"),
0058                      KAboutLicense::GPL,
0059                      i18n("© 2020-2021 KDE Community"));
0060     about.addAuthor(i18n("Bhushan Shah"), QString(), QStringLiteral("bhush94@gmail.com"));
0061     about.addAuthor(i18n("Jonah Brüchert"), QString(), QStringLiteral("jbb@kaidan.im"));
0062     about.addAuthor(i18n("Martin Klapetek"), QString(), QStringLiteral("mklapetek@kde.org"));
0063     about.addAuthor(i18n("Michael Lang"), QString(), QStringLiteral("criticaltemp@protonmail.com"));
0064     about.addAuthor(i18n("Nicolas Fella"), QString(), QStringLiteral("nicolas.fella@gmx.de"));
0065     about.addAuthor(i18n("Smitty van Bodegom"), QString(), QStringLiteral("me@smitop.com"));
0066     KAboutData::setApplicationData(about);
0067     QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.spacebar")));
0068 
0069     parser.addVersionOption();
0070     parser.addHelpOption();
0071     parser.setApplicationDescription(i18n("Spacebar SMS/MMS client"));
0072     parser.addPositionalArgument(QStringLiteral("number"), i18n("Open a chat with the given phone number"));
0073     parser.process(app);
0074 
0075     KDBusService service(KDBusService::Unique);
0076 
0077     QQmlApplicationEngine engine;
0078 
0079     // Use using the instance getter
0080     new Utils(&engine);
0081 
0082     ChannelHandler handler;
0083     ChatListModel chatListModel(handler);
0084 
0085     // Register types
0086     qmlRegisterSingletonInstance("org.kde.spacebar", 1, 0, "AboutType", &AboutType::instance());
0087     qmlRegisterSingletonInstance<ChatListModel>(APPLICATION_ID, 1, 0, "ChatListModel", &chatListModel);
0088     qmlRegisterUncreatableType<MessageModel>(APPLICATION_ID, 1, 0, "MessageModel", SL("Created by ChatListModel whenever a new chat was opened"));
0089     qRegisterMetaType<KPeople::PersonData *>("PersonData*");
0090     qmlRegisterAnonymousType<QAbstractItemModel>(APPLICATION_ID, 1);
0091     qmlRegisterSingletonInstance<Utils>(APPLICATION_ID, 1, 0, "Utils", Utils::instance());
0092     qmlRegisterSingletonInstance("org.kde.spacebar", 1, 0, "SettingsManager", SettingsManager::self());
0093     qRegisterMetaType<PhoneNumber>();
0094     qRegisterMetaType<PhoneNumberList>();
0095     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0096     engine.addImageProvider(SL("avatar"), new AvatarImageProvider());
0097     engine.load(QUrl(SL("qrc:///main.qml")));
0098 
0099     if (engine.rootObjects().isEmpty()) {
0100         return -1;
0101     }
0102 
0103     auto handleArgs = [&parser, &chatListModel] {
0104         if (!parser.positionalArguments().isEmpty()) {
0105             QString numberArg = parser.positionalArguments().constFirst();
0106             if (numberArg.startsWith(QStringLiteral("sms:"))) {
0107                 numberArg = numberArg.mid(4);
0108             }
0109             if (Utils::instance()->isPhoneNumber(numberArg)) {
0110                 chatListModel.startChat(PhoneNumberList(numberArg));
0111             } else {
0112                 qWarning() << "invalid phone number on command line, ignoring";
0113             }
0114         }
0115     };
0116 
0117     QObject::connect(&service, &KDBusService::activateRequested, &service, [&parser, &handleArgs, &engine](const QStringList &args) {
0118         parser.parse(args);
0119         handleArgs();
0120 
0121         // Move window to the front
0122         auto *window = qobject_cast<QWindow *>(engine.rootObjects().constFirst());
0123         if (window) {
0124             window->hide(); // Hack - remove once works correctly without
0125             KWindowSystem::updateStartupId(window);
0126             KWindowSystem::activateWindow(window);
0127             window->show(); // Hack - remove once works correctly without
0128         }
0129     });
0130 
0131     handleArgs();
0132 
0133     return app.exec();
0134 }