diff --git a/imports/NeoChat/Component/Login/Sso.qml b/imports/NeoChat/Component/Login/Sso.qml index 7bd9c4e04..82dfe293d 100644 --- a/imports/NeoChat/Component/Login/Sso.qml +++ b/imports/NeoChat/Component/Login/Sso.qml @@ -20,7 +20,7 @@ LoginStep { Connections { target: LoginHelper function onSsoUrlChanged() { - Qt.openUrlExternally(LoginHelper.ssoUrl) + UrlHelper.openUrl(LoginHelper.ssoUrl) } function onConnected() { processed("qrc:/imports/NeoChat/Component/Login/Loading.qml") diff --git a/imports/NeoChat/Component/Timeline/FileDelegate.qml b/imports/NeoChat/Component/Timeline/FileDelegate.qml index c6e79fc62..9aa82eb9b 100644 --- a/imports/NeoChat/Component/Timeline/FileDelegate.qml +++ b/imports/NeoChat/Component/Timeline/FileDelegate.qml @@ -30,8 +30,8 @@ TimelineContainer { } function openSavedFile() { - if (Qt.openUrlExternally(progressInfo.localPath)) return; - if (Qt.openUrlExternally(progressInfo.localDir)) return; + if (UrlHelper.openUrl(progressInfo.localPath)) return; + if (UrlHelper.openUrl(progressInfo.localDir)) return; } innerObject: RowLayout { diff --git a/imports/NeoChat/Component/Timeline/ImageDelegate.qml b/imports/NeoChat/Component/Timeline/ImageDelegate.qml index 5e4b1f85b..c69400777 100644 --- a/imports/NeoChat/Component/Timeline/ImageDelegate.qml +++ b/imports/NeoChat/Component/Timeline/ImageDelegate.qml @@ -115,8 +115,8 @@ TimelineContainer { } function openSavedFile() { - if (Qt.openUrlExternally(progressInfo.localPath)) return; - if (Qt.openUrlExternally(progressInfo.localDir)) return; + if (UrlHelper.openUrl(progressInfo.localPath)) return; + if (UrlHelper.openUrl(progressInfo.localDir)) return; } } } diff --git a/imports/NeoChat/Menu/GlobalMenu.qml b/imports/NeoChat/Menu/GlobalMenu.qml index 752e42b9e..79cfaa18b 100644 --- a/imports/NeoChat/Menu/GlobalMenu.qml +++ b/imports/NeoChat/Menu/GlobalMenu.qml @@ -92,7 +92,7 @@ Labs.MenuBar { Labs.MenuItem { text: i18nc("menu", "Matrix FAQ") - onTriggered: Qt.openUrlExternally("https://matrix.org/faq/") + onTriggered: UrlHelper.openUrl("https://matrix.org/faq/") } } } diff --git a/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml b/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml index 61f6b14db..63b9ac0fe 100644 --- a/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml +++ b/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml @@ -24,13 +24,13 @@ MessageDelegateContextMenu { icon.name: "document-open" onTriggered: { if (file.downloaded) { - if (!Qt.openUrlExternally(progressInfo.localPath)) { - Qt.openUrlExternally(progressInfo.localDir); + if (!UrlHelper.openUrl(progressInfo.localPath)) { + UrlHelper.openUrl(progressInfo.localDir); } } else { file.onDownloadedChanged.connect(function() { - if (!Qt.openUrlExternally(progressInfo.localPath)) { - Qt.openUrlExternally(progressInfo.localDir); + if (!UrlHelper.openUrl(progressInfo.localPath)) { + UrlHelper.openUrl(progressInfo.localDir); } }); currentRoom.downloadFile(eventId, StandardPaths.writableLocation(StandardPaths.CacheLocation) + "/" + eventId.replace(":", "_").replace("/", "_").replace("+", "_") + currentRoom.fileNameToDownload(eventId)) diff --git a/imports/NeoChat/Panel/RoomDrawer.qml b/imports/NeoChat/Panel/RoomDrawer.qml index bbd46e84f..6a4821f9f 100644 --- a/imports/NeoChat/Panel/RoomDrawer.qml +++ b/imports/NeoChat/Panel/RoomDrawer.qml @@ -179,7 +179,7 @@ Kirigami.OverlayDrawer { wrapMode: Text.WordWrap selectByMouse: true color: Kirigami.Theme.textColor - onLinkActivated: Qt.openUrlExternally(link) + onLinkActivated: UrlHelper.openUrl(link) readOnly: true MouseArea { anchors.fill: parent diff --git a/qml/main.qml b/qml/main.qml index bf133536a..1e615b026 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -407,7 +407,7 @@ Kirigami.ApplicationWindow { } footer: QQC2.Button { text: i18n("Open") - onClicked: Qt.openUrlExternally(consentSheet.url) + onClicked: UrlHelper.openUrl(consentSheet.url) } } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1a100ce12..13c85e673 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(neochat blurhashimageprovider.cpp joinrulesevent.cpp collapsestateproxymodel.cpp + urlhelper.cpp ../res.qrc ) diff --git a/src/main.cpp b/src/main.cpp index 3ce07e135..3ad28a5af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -69,6 +69,7 @@ #include "roomlistmodel.h" #include "roommanager.h" #include "sortfilterroomlistmodel.h" +#include "urlhelper.h" #include "userdirectorylistmodel.h" #include "userlistmodel.h" #include "webshortcutmodel.h" @@ -175,6 +176,7 @@ int main(int argc, char *argv[]) Login *login = new Login(); ChatBoxHelper chatBoxHelper; + UrlHelper urlHelper; #ifdef HAVE_COLORSCHEME ColorSchemer colorScheme; @@ -191,6 +193,7 @@ int main(int argc, char *argv[]) qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "FileType", &fileTypeSingleton); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "LoginHelper", login); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "ChatBoxHelper", &chatBoxHelper); + qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "UrlHelper", &urlHelper); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "EmojiModel", new EmojiModel(&app)); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "CommandModel", new CommandModel(&app)); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "AccountRegistry", &Quotient::AccountRegistry::instance()); diff --git a/src/roommanager.cpp b/src/roommanager.cpp index 925a2f85c..aa7ad1ecc 100644 --- a/src/roommanager.cpp +++ b/src/roommanager.cpp @@ -13,6 +13,10 @@ #include #include +#ifndef Q_OS_ANDROID +#include +#endif + RoomManager::RoomManager(QObject *parent) : QObject(parent) , m_currentRoom(nullptr) @@ -191,9 +195,19 @@ void RoomManager::joinRoom(Quotient::Connection *account, const QString &roomAli bool RoomManager::visitNonMatrix(const QUrl &url) { +#ifdef Q_OS_ANDROID if (!QDesktopServices::openUrl(url)) { Q_EMIT warning(i18n("No application for the link"), i18n("Your operating system could not find an application for the link.")); } +#else + auto *job = new KIO::OpenUrlJob(url); + connect(job, &KJob::finished, this, [this](KJob *job) { + if (job->error()) { + Q_EMIT warning(i18n("Could not open URL"), job->errorString()); + } + }); + job->start(); +#endif return true; } diff --git a/src/urlhelper.cpp b/src/urlhelper.cpp new file mode 100644 index 000000000..1f0168bd0 --- /dev/null +++ b/src/urlhelper.cpp @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2022 Nicolas Fella +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "urlhelper.h" + +#include + +#ifdef Q_OS_ANDROID +#include +#else +#include +#endif + +// QDesktopServices::openUrl doesn't support XDG activation yet, OpenUrlJob does +// On Android XDG activation is not relevant, so use QDesktopServices::openUrl to avoid the heavy KIO dependency +void UrlHelper::openUrl(const QUrl &url) +{ +#ifdef Q_OS_ANDROID + QDesktopServices::openUrl(url); +#else + auto *job = new KIO::OpenUrlJob(url); + job->start(); +#endif +} diff --git a/src/urlhelper.h b/src/urlhelper.h new file mode 100644 index 000000000..226e6d308 --- /dev/null +++ b/src/urlhelper.h @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2022 Nicolas Fella +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +class UrlHelper : public QObject +{ + Q_OBJECT +public: + Q_INVOKABLE void openUrl(const QUrl &url); +};