From 5c6db4b7a4dfec02b1b506cfae375febdb7906bc Mon Sep 17 00:00:00 2001 From: NickVs2015 Date: Tue, 10 Feb 2026 06:15:31 +0300 Subject: [PATCH] fix OpenGl error (#2185) --- .../src/org/amnezia/vpn/AmneziaActivity.kt | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index 6a44eaa52..322dbccd9 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -90,6 +90,10 @@ class AmneziaActivity : QtActivity() { private val actionResultHandlers = mutableMapOf() private val permissionRequestHandlers = mutableMapOf() + + private var isActivityResumed = false + private var hasWindowFocus = false + private val resumeHandler = Handler(Looper.getMainLooper()) private val vpnServiceEventHandler: Handler by lazy(NONE) { object : Handler(Looper.getMainLooper()) { @@ -262,6 +266,10 @@ class AmneziaActivity : QtActivity() { } override fun onStop() { + isActivityResumed = false + hasWindowFocus = false + // Cancel all pending operations when activity stops + resumeHandler.removeCallbacksAndMessages(null) Log.d(TAG, "Stop Amnezia activity") doUnbindService() mainScope.launch { @@ -273,7 +281,13 @@ class AmneziaActivity : QtActivity() { override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) + hasWindowFocus = hasFocus Log.d(TAG, "Window focus changed: hasFocus=$hasFocus") + + // Cancel pending operations if window loses focus + if (!hasFocus) { + resumeHandler.removeCallbacksAndMessages(null) + } } override fun dispatchKeyEvent(event: KeyEvent): Boolean { @@ -316,30 +330,42 @@ class AmneziaActivity : QtActivity() { override fun onPause() { super.onPause() + isActivityResumed = false + // Cancel all pending operations when activity pauses + resumeHandler.removeCallbacksAndMessages(null) Log.d(TAG, "Pause Amnezia activity") } override fun onResume() { super.onResume() - /* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + isActivityResumed = true + Log.d(TAG, "Resume Amnezia activity") + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { window.decorView.apply { invalidate() - postDelayed({ - sendTouch(1f, 1f) + resumeHandler.postDelayed({ + // Check if activity is still resumed and has focus before executing + if (isActivityResumed && hasWindowFocus && !isFinishing && !isDestroyed) { + sendTouch(1f, 1f) + } }, 100) - postDelayed({ - sendTouch(2f, 2f) + resumeHandler.postDelayed({ + if (isActivityResumed && hasWindowFocus && !isFinishing && !isDestroyed) { + sendTouch(2f, 2f) + } }, 200) - postDelayed({ - requestLayout() - invalidate() + resumeHandler.postDelayed({ + if (isActivityResumed && hasWindowFocus && !isFinishing && !isDestroyed) { + requestLayout() + invalidate() + } }, 250) } - } */ - Log.d(TAG, "Resume Amnezia activity") + } } private fun configureWindowForEdgeToEdge() { @@ -402,6 +428,10 @@ class AmneziaActivity : QtActivity() { } override fun onDestroy() { + isActivityResumed = false + hasWindowFocus = false + // Cancel all pending operations when activity is destroyed + resumeHandler.removeCallbacksAndMessages(null) Log.d(TAG, "Destroy Amnezia activity") unregisterBroadcastReceiver(notificationStateReceiver) notificationStateReceiver = null