From 1ec50cf6ad3a55e31816c56c311866d64c299c6e Mon Sep 17 00:00:00 2001 From: Mazay B Date: Tue, 27 Jun 2023 00:23:34 +0100 Subject: [PATCH] Workaround for bug https://bugreports.qt.io/browse/QTBUG-113461 --- CMakeLists.txt | 2 +- client/CMakeLists.txt | 1 - client/amnezia_application.cpp | 19 ++++++++++-- client/android/build.gradle | 2 +- .../src/org/amnezia/vpn/qt/AmneziaApp.kt | 4 +-- .../src/org/amnezia/vpn/qt/VPNActivity.kt | 29 ------------------- .../org/amnezia/vpn/qt/VPNApplication.java | 24 --------------- client/main.cpp | 3 -- .../platforms/android/android_controller.cpp | 5 ---- client/platforms/android/android_controller.h | 1 - .../platforms/android/androidvpnactivity.cpp | 8 ----- client/platforms/android/androidvpnactivity.h | 1 - client/ui/uilogic.cpp | 4 --- 13 files changed, 21 insertions(+), 82 deletions(-) delete mode 100644 client/android/src/org/amnezia/vpn/qt/VPNApplication.java diff --git a/CMakeLists.txt b/CMakeLists.txt index 53319b00..c8b27351 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 3.0.7.4 +project(${PROJECT} VERSION 3.0.7.5 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 1d6b3e0d..a7241eef 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -494,7 +494,6 @@ if(ANDROID) ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/AmneziaApp.kt ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/PackageManagerHelper.java ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/VPNActivity.kt - ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/VPNApplication.java ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/VPNClientBinder.kt ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/VPNPermissionHelper.kt ${CMAKE_CURRENT_BINARY_DIR} diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 5d5ba547..857d61fe 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -1,7 +1,10 @@ #include "amnezia_application.h" +#include #include +#include #include +#include #include #include @@ -51,7 +54,7 @@ setQuitOnLastWindowClosed(false); // Fix config file permissions -#ifdef Q_OS_LINUX +#ifdef Q_OS_LINUX && !defined(Q_OS_ANDROID) { QSettings s(ORGANIZATION_NAME, APPLICATION_NAME); s.setValue("permFixed", true); @@ -64,7 +67,6 @@ QString configLoc2 = QStandardPaths::standardLocations(QStandardPaths::ConfigLocation).first() + "/" + ORGANIZATION_NAME + "/" + APPLICATION_NAME + "/" + APPLICATION_NAME + ".conf"; QFile::setPermissions(configLoc2, QFileDevice::ReadOwner | QFileDevice::WriteOwner); - #endif m_settings = std::shared_ptr(new Settings); @@ -135,6 +137,19 @@ void AmneziaApplication::init() } #endif +// Android TextField clipboard workaround +// https://bugreports.qt.io/browse/QTBUG-113461 +#ifdef Q_OS_ANDROID + QObject::connect(qApp, &QApplication::applicationStateChanged, [](Qt::ApplicationState state) { + if (state == Qt::ApplicationActive) { + if (qApp->clipboard()->mimeData()->formats().contains("text/html")) { + QTextDocument doc; + doc.setHtml(qApp->clipboard()->mimeData()->html()); + qApp->clipboard()->setText(doc.toPlainText()); + } + } + }); +#endif } void AmneziaApplication::registerTypes() diff --git a/client/android/build.gradle b/client/android/build.gradle index 88bcb9b0..26d8ee83 100644 --- a/client/android/build.gradle +++ b/client/android/build.gradle @@ -137,7 +137,7 @@ android { resConfig "en" minSdkVersion = 24 targetSdkVersion = 34 - versionCode 21 // Change to a higher number + versionCode 22 // Change to a higher number versionName "3.0.7" // Change to a higher number javaCompileOptions.annotationProcessorOptions.arguments = [ diff --git a/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt b/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt index 24c33ffc..77332efa 100644 --- a/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt +++ b/client/android/src/org/amnezia/vpn/qt/AmneziaApp.kt @@ -7,7 +7,7 @@ import org.qtproject.qt.android.bindings.QtActivity import org.qtproject.qt.android.bindings.QtApplication import android.app.Application -class AmneziaApp: Application() { +class AmneziaApp: org.qtproject.qt.android.bindings.QtApplication() { override fun onCreate() { super.onCreate() @@ -19,4 +19,4 @@ class AmneziaApp: Application() { super.onConfigurationChanged(newConfig) Core.updateNotificationChannels() } -} \ No newline at end of file +} diff --git a/client/android/src/org/amnezia/vpn/qt/VPNActivity.kt b/client/android/src/org/amnezia/vpn/qt/VPNActivity.kt index dab60b3a..a8aa73d6 100644 --- a/client/android/src/org/amnezia/vpn/qt/VPNActivity.kt +++ b/client/android/src/org/amnezia/vpn/qt/VPNActivity.kt @@ -5,8 +5,6 @@ package org.amnezia.vpn.qt; import android.Manifest -import android.content.ClipData -import android.content.ClipboardManager import android.content.ComponentName import android.content.ContentResolver import android.content.Context @@ -73,10 +71,6 @@ class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { @JvmStatic fun saveFileAs(fileContent: String, suggestedName: String) { VPNActivity.getInstance().saveFile(fileContent, suggestedName) } - - @JvmStatic fun putTextToClipboard(text: String) { - VPNActivity.getInstance().putToClipboard(text) - } } override fun onCreate(savedInstanceState: Bundle?) { @@ -109,18 +103,6 @@ class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { startActivityForResult(intent, CREATE_FILE_ACTION_CODE) } - override fun getSystemService(name: String): Any? { - return if (Build.VERSION.SDK_INT >= 29 && name == "clipboard") { - // QT will always attempt to read the clipboard if content is there. - // since we have no use of the clipboard in android 10+ - // we _can_ return null - // And we definitely should since android 12 displays clipboard access. - null - } else { - super.getSystemService(name) - } - } - external fun handleBackButton(): Boolean external fun onServiceMessage(actionCode: Int, body: String?) @@ -317,15 +299,4 @@ class VPNActivity : org.qtproject.qt.android.bindings.QtActivity() { tmpFileContentToSave = "" } - - private fun putToClipboard(text: String) { - this.runOnUiThread { - val clipboard = applicationContext.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager? - - if (clipboard != null) { - val clip: ClipData = ClipData.newPlainText("", text) - clipboard.setPrimaryClip(clip) - } - } - } } diff --git a/client/android/src/org/amnezia/vpn/qt/VPNApplication.java b/client/android/src/org/amnezia/vpn/qt/VPNApplication.java deleted file mode 100644 index 639b5a1e..00000000 --- a/client/android/src/org/amnezia/vpn/qt/VPNApplication.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.amnezia.vpn.qt; - -import android.content.res.Configuration; -import androidx.annotation.NonNull; -import org.amnezia.vpn.shadowsocks.core.Core; -import org.amnezia.vpn.shadowsocks.core.VpnManager; - -public class VPNApplication extends org.qtproject.qt.android.bindings.QtApplication { - private static VPNApplication instance; - - @Override - public void onCreate() { - super.onCreate(); - VPNApplication.instance = this; -// Core.INSTANCE.init(this, VPNActivity.class); -// VpnManager.Companion.getInstance().init(this); - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); -// Core.INSTANCE.updateNotificationChannels(); - } -} diff --git a/client/main.cpp b/client/main.cpp index 2c94bc33..8f1a8f75 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -1,6 +1,4 @@ -#include #include -#include #include "amnezia_application.h" #include "version.h" @@ -20,7 +18,6 @@ int main(int argc, char *argv[]) Migrations migrationsManager; migrationsManager.doMigrations(); - QLoggingCategory::setFilterRules(QStringLiteral("qtc.ssh=false")); QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true); #ifdef Q_OS_WIN diff --git a/client/platforms/android/android_controller.cpp b/client/platforms/android/android_controller.cpp index 91d1317d..81b04b8a 100644 --- a/client/platforms/android/android_controller.cpp +++ b/client/platforms/android/android_controller.cpp @@ -267,11 +267,6 @@ void AndroidController::startQrReaderActivity() AndroidVPNActivity::instance()->startQrCodeReader(); } -void AndroidController::copyTextToClipboard(QString text) -{ - AndroidVPNActivity::instance()->copyTextToClipboard(text); -} - void AndroidController::scheduleStatusCheckSlot() { QTimer::singleShot(1000, [this]() { diff --git a/client/platforms/android/android_controller.h b/client/platforms/android/android_controller.h index 00b37225..7e5b52c8 100644 --- a/client/platforms/android/android_controller.h +++ b/client/platforms/android/android_controller.h @@ -43,7 +43,6 @@ public: void setVpnConfig(const QJsonObject &newVpnConfig); void startQrReaderActivity(); - void copyTextToClipboard(QString text); signals: void connectionStateChanged(VpnProtocol::VpnConnectionState state); diff --git a/client/platforms/android/androidvpnactivity.cpp b/client/platforms/android/androidvpnactivity.cpp index 9431597b..2076280d 100644 --- a/client/platforms/android/androidvpnactivity.cpp +++ b/client/platforms/android/androidvpnactivity.cpp @@ -65,14 +65,6 @@ void AndroidVPNActivity::saveFileAs(QString fileContent, QString suggestedFilena QJniObject::fromString(suggestedFilename).object()); } -void AndroidVPNActivity::copyTextToClipboard(QString text) -{ - QJniObject::callStaticMethod( - CLASSNAME, - "putTextToClipboard", "(Ljava/lang/String;)V", - QJniObject::fromString(text).object()); -} - // static AndroidVPNActivity* AndroidVPNActivity::instance() { if (s_instance == nullptr) { diff --git a/client/platforms/android/androidvpnactivity.h b/client/platforms/android/androidvpnactivity.h index 5844ff6d..db128b1b 100644 --- a/client/platforms/android/androidvpnactivity.h +++ b/client/platforms/android/androidvpnactivity.h @@ -76,7 +76,6 @@ public: static void connectService(); static void startQrCodeReader(); static void saveFileAs(QString fileContent, QString suggestedFilename); - static void copyTextToClipboard(QString text); signals: void serviceConnected(); diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index 0919b3a8..e41589a4 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -476,11 +476,7 @@ void UiLogic::saveBinaryFile(const QString &desc, QString ext, const QString &da void UiLogic::copyToClipboard(const QString &text) { -#ifdef Q_OS_ANDROID - AndroidController::instance()->copyTextToClipboard(text); -#else qApp->clipboard()->setText(text); -#endif } void UiLogic::shareTempFile(const QString &suggestedName, QString ext, const QString& data) {