feat: add support for tvOS platform

This commit is contained in:
spectrum
2026-04-14 16:34:04 +03:00
parent 8d28beacd8
commit e43973f8ad
32 changed files with 304 additions and 115 deletions
@@ -1,11 +1,5 @@
#include "connectionController.h"
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(MACOS_NE)
#include <QGuiApplication>
#else
#include <QApplication>
#endif
#include "utilities.h"
#include "core/controllers/vpnConfigurationController.h"
#include "version.h"
@@ -33,7 +27,7 @@ ConnectionController::ConnectionController(const QSharedPointer<ServersModel> &s
void ConnectionController::openConnection()
{
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(MACOS_NE)
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(Q_OS_TVOS) && !defined(MACOS_NE)
if (!Utils::processIsRunning(Utils::executable(SERVICE_NAME, false), true))
{
emit connectionErrorOccurred(ErrorCode::AmneziaServiceNotRunning);
+3 -3
View File
@@ -19,7 +19,7 @@
#ifdef Q_OS_ANDROID
#include "platforms/android/android_controller.h"
#endif
#if defined(Q_OS_IOS) || defined(MACOS_NE)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS) || defined(MACOS_NE)
#include <CoreFoundation/CoreFoundation.h>
#endif
@@ -604,14 +604,14 @@ bool ImportController::decodeQrCode(const QString &code)
}
#endif
#if defined Q_OS_ANDROID || defined Q_OS_IOS
#if defined Q_OS_ANDROID || defined Q_OS_IOS || defined(Q_OS_TVOS)
void ImportController::startDecodingQr()
{
m_qrCodeChunks.clear();
m_totalQrCodeChunksCount = 0;
m_receivedQrCodeChunksCount = 0;
#if defined(Q_OS_IOS) || defined(MACOS_NE)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS) || defined(MACOS_NE)
m_isQrCodeProcessed = true;
#endif
#if defined Q_OS_ANDROID
+3 -3
View File
@@ -38,7 +38,7 @@ public slots:
QString getConfigFileName();
QString getMaliciousWarningText();
#if defined Q_OS_ANDROID || defined Q_OS_IOS
#if defined Q_OS_ANDROID || defined Q_OS_IOS || defined(Q_OS_TVOS)
void startDecodingQr();
bool parseQrCodeChunk(const QString &code);
@@ -70,7 +70,7 @@ private:
void processAmneziaConfig(QJsonObject &config);
#if defined Q_OS_ANDROID || defined Q_OS_IOS
#if defined Q_OS_ANDROID || defined Q_OS_IOS || defined(Q_OS_TVOS)
void stopDecodingQr();
#endif
@@ -83,7 +83,7 @@ private:
ConfigTypes m_configType;
QString m_maliciousWarningText;
#if defined Q_OS_ANDROID || defined Q_OS_IOS
#if defined Q_OS_ANDROID || defined Q_OS_IOS || defined(Q_OS_TVOS)
QMap<int, QByteArray> m_qrCodeChunks;
bool m_isQrCodeProcessed;
int m_totalQrCodeChunksCount;
+4 -2
View File
@@ -2,7 +2,9 @@
#define INSTALLCONTROLLER_H
#include <QObject>
#include <QProcess>
#if !defined(Q_OS_IOS) && !defined(Q_OS_TVOS)
#include <QProcess>
#endif
#include "containers/containers_defs.h"
#include "core/defs.h"
@@ -111,7 +113,7 @@ private:
QString m_privateKeyPassphrase;
#ifndef Q_OS_IOS
#if !defined(Q_OS_IOS) && !defined(Q_OS_TVOS)
QList<QSharedPointer<QProcess>> m_sftpMountProcesses;
#endif
};
+6 -5
View File
@@ -1,11 +1,12 @@
#include "pageController.h"
#include "utils/converter.h"
#include "core/errorstrings.h"
#include <QCoreApplication>
#if defined(MACOS_NE)
#include "platforms/ios/ios_controller.h"
#endif
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(MACOS_NE)
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(Q_OS_TVOS) || defined(MACOS_NE)
#include <QGuiApplication>
#else
#include <QApplication>
@@ -14,7 +15,7 @@
#ifdef Q_OS_ANDROID
#include "platforms/android/android_controller.h"
#endif
#if defined Q_OS_MAC
#if defined(Q_OS_MACX) && !defined(Q_OS_TVOS)
#include "ui/macos_util.h"
#endif
@@ -27,7 +28,7 @@ PageController::PageController(const QSharedPointer<ServersModel> &serversModel,
AndroidController::instance()->setNavigationBarColor(initialPageNavigationBarColor);
#endif
#if defined Q_OS_MACX
#if defined(Q_OS_MACX) && !defined(Q_OS_TVOS)
connect(this, &PageController::raiseMainWindow, []() {
setDockIconVisible(true);
});
@@ -64,7 +65,7 @@ QString PageController::getPagePath(PageLoader::PageEnum page)
void PageController::closeWindow()
{
// On mobile platforms, quit app on close; on desktop, just hide window
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(Q_OS_TVOS)
qApp->quit();
#else
emit hideMainWindow();
@@ -118,7 +119,7 @@ void PageController::showOnStartup()
} else {
#if defined(Q_OS_WIN) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID))
emit hideMainWindow();
#elif defined(Q_OS_MACX)
#elif defined(Q_OS_MACX) && !defined(Q_OS_TVOS)
setDockIconVisible(false);
#endif
}
+7 -5
View File
@@ -12,7 +12,7 @@
#include "platforms/android/android_controller.h"
#endif
#if defined(Q_OS_IOS) || defined(MACOS_NE)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS) || defined(MACOS_NE)
#include <AmneziaVPN-Swift.h>
#endif
@@ -57,6 +57,8 @@ QString getPlatformName()
return "Windows";
#elif defined(Q_OS_ANDROID)
return "Android";
#elif defined(Q_OS_TVOS)
return "tvOS";
#elif defined(Q_OS_LINUX)
return "Linux";
#elif defined(Q_OS_MACX)
@@ -109,7 +111,7 @@ bool SettingsController::isLoggingEnabled()
void SettingsController::toggleLogging(bool enable)
{
m_settings->setSaveLogs(enable);
#if defined(Q_OS_IOS)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS)
AmneziaVPN::toggleLogging(enable);
#endif
if (enable == true) {
@@ -192,7 +194,7 @@ void SettingsController::restoreAppConfigFromData(const QByteArray &data)
if (ok) {
QJsonObject newConfigData = QJsonDocument::fromJson(data).object();
#if defined(Q_OS_WINDOWS) || defined(Q_OS_LINUX) || defined(Q_OS_MACX)
#if defined(Q_OS_WINDOWS) || defined(Q_OS_LINUX) || (defined(Q_OS_MACX) && !defined(Q_OS_TVOS))
bool autoStart = false;
if (newConfigData.contains("Conf/autoStart")) {
autoStart = newConfigData["Conf/autoStart"].toBool();
@@ -229,7 +231,7 @@ void SettingsController::restoreAppConfigFromData(const QByteArray &data)
m_sitesModel->setRouteMode(siteSplitTunnelingRouteMode);
m_sitesModel->toggleSplitTunneling(siteSplittunnelingEnabled);
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(Q_OS_TVOS)
m_settings->setAutoConnect(false);
m_settings->setStartMinimized(false);
m_settings->setKillSwitchEnabled(false);
@@ -268,7 +270,7 @@ void SettingsController::clearSettings()
emit changeSettingsFinished(tr("All settings have been reset to default values"));
#if defined(Q_OS_IOS) || defined(MACOS_NE)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS) || defined(MACOS_NE)
AmneziaVPN::clearSettings();
#endif
}
+4 -4
View File
@@ -14,7 +14,7 @@
#include "platforms/android/android_controller.h"
#endif
#if defined(Q_OS_IOS) || defined(MACOS_NE)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS) || defined(MACOS_NE)
#include "platforms/ios/ios_controller.h"
#include <CoreFoundation/CoreFoundation.h>
#endif
@@ -31,7 +31,7 @@ void SystemController::saveFile(const QString &fileName, const QString &data)
return;
#endif
#ifdef Q_OS_IOS
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS)
QUrl fileUrl = QDir::tempPath() + "/" + fileName;
QFile file(fileUrl.toString());
#else
@@ -43,7 +43,7 @@ void SystemController::saveFile(const QString &fileName, const QString &data)
file.write(data.toUtf8());
file.close();
#ifdef Q_OS_IOS
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS)
QStringList filesToSend;
filesToSend.append(fileUrl.toString());
// todo check if save successful
@@ -98,7 +98,7 @@ QString SystemController::getFileName(const QString &acceptLabel, const QString
return AndroidController::instance()->openFile(nameFilter);
#endif
#ifdef Q_OS_IOS
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS)
fileName = IosController::Instance()->openFile();
if (fileName.isEmpty()) {
+2 -2
View File
@@ -5,7 +5,7 @@
#include <QDebug>
#include "notificationhandler.h"
#if defined(Q_OS_IOS)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS)
# include "platforms/ios/iosnotificationhandler.h"
#else
# include "systemtray_notificationhandler.h"
@@ -14,7 +14,7 @@
// static
NotificationHandler* NotificationHandler::create(QObject* parent) {
#if defined(Q_OS_IOS)
#if defined(Q_OS_IOS) || defined(Q_OS_TVOS)
return new IOSNotificationHandler(parent);
#else
return new SystemTrayNotificationHandler(parent);
+1 -1
View File
@@ -58,7 +58,7 @@ QString Autostart::appPath() {
return QCoreApplication::applicationFilePath() + " --autostart";
}
#elif defined Q_OS_MACX
#elif defined(Q_OS_MACX) && !defined(Q_OS_TVOS)
bool Autostart::isAutostart() {
QProcess process;