From 2003ff568b0e8ea150040738fd11619c032cca4e Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Tue, 22 Jul 2025 13:42:23 +0200 Subject: [PATCH] fragment health check --- .../api/GeckoBrowserApiImpl.kt | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoBrowserApiImpl.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoBrowserApiImpl.kt index b2834e81..bb54f560 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoBrowserApiImpl.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoBrowserApiImpl.kt @@ -181,34 +181,47 @@ class GeckoBrowserApiImpl : GeckoBrowserApi { val fragmentActivity = activity as? FragmentActivity ?: return false - // Check if activity is in valid state if (fragmentActivity.isFinishing || fragmentActivity.isDestroyed) { return false } - val container = fragmentActivity.findViewById(FRAGMENT_CONTAINER_ID) ?: return false + fragmentActivity.findViewById(FRAGMENT_CONTAINER_ID) ?: return false val fm = fragmentActivity.supportFragmentManager - // Ensure FragmentManager is in valid state if (fm.isStateSaved) { return false } val existingFragment = fm.findFragmentById(FRAGMENT_CONTAINER_ID) if (existingFragment is BrowserFragment) { - // Fragment already replaced, no need to do it again - return true + // Check if fragment needs engine refresh instead of full replacement + if (!isFragmentCorrupted(existingFragment)) { + return true + } } val nativeFragment = BrowserFragment.create() fm.beginTransaction() .replace(FRAGMENT_CONTAINER_ID, nativeFragment) - .commit() + .commitNow() return true } + private fun isFragmentCorrupted(fragment: BrowserFragment): Boolean { + if (!fragment.isAdded || fragment.isDetached || fragment.isRemoving) { + return true + } + + val view = fragment.view ?: return true + if (view.visibility != View.VISIBLE || view.width == 0 || view.height == 0) { + return true + } + + return false + } + override fun onTrimMemory(level: Long) { requireNotNull(GlobalComponents.components) { "Components not initialized" }