diff --git a/core/src/main/kotlin/dev/hotwire/core/bridge/BridgeComponentFragmentLifecycle.kt b/core/src/main/kotlin/dev/hotwire/core/bridge/BridgeComponentFragmentLifecycle.kt new file mode 100644 index 0000000..420a63f --- /dev/null +++ b/core/src/main/kotlin/dev/hotwire/core/bridge/BridgeComponentFragmentLifecycle.kt @@ -0,0 +1,6 @@ +package dev.hotwire.core.bridge + +interface BridgeComponentFragmentLifecycle { + fun onViewCreated() + fun onDestroyView() +} diff --git a/core/src/main/kotlin/dev/hotwire/core/bridge/BridgeDelegate.kt b/core/src/main/kotlin/dev/hotwire/core/bridge/BridgeDelegate.kt index cf14a4c..21d3768 100644 --- a/core/src/main/kotlin/dev/hotwire/core/bridge/BridgeDelegate.kt +++ b/core/src/main/kotlin/dev/hotwire/core/bridge/BridgeDelegate.kt @@ -14,10 +14,10 @@ class BridgeDelegate( ) : DefaultLifecycleObserver { internal var bridge: Bridge? = null private var destinationIsActive: Boolean = false - private val initializedComponents = hashMapOf>() private val resolvedLocation: String get() = bridge?.webView?.url ?: location + val initializedComponents = hashMapOf>() val activeComponents: List> get() = initializedComponents.map { it.value }.takeIf { destinationIsActive }.orEmpty() @@ -101,8 +101,20 @@ class BridgeDelegate( return activeComponents.filterIsInstance().firstOrNull() } - inline fun forEachComponent(action: (C) -> Unit) { - activeComponents.filterIsInstance().forEach { action(it) } + inline fun forEachInitializedComponent(action: (C) -> Unit) { + initializedComponents.forEach { (_, component) -> + if (component is C) { + action(component) + } + } + } + + inline fun forEachActiveComponent(action: (C) -> Unit) { + activeComponents.forEach { component -> + if (component is C) { + action(component) + } + } } private fun getOrCreateComponent(name: String): BridgeComponent? { diff --git a/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebBottomSheetFragment.kt b/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebBottomSheetFragment.kt index ff7a5b5..06e1997 100644 --- a/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebBottomSheetFragment.kt +++ b/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebBottomSheetFragment.kt @@ -9,6 +9,8 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.activity.result.ActivityResultLauncher +import dev.hotwire.core.bridge.BridgeComponent +import dev.hotwire.core.bridge.BridgeComponentFragmentLifecycle import dev.hotwire.core.bridge.BridgeDelegate import dev.hotwire.core.files.util.HOTWIRE_REQUEST_CODE_FILES import dev.hotwire.core.files.util.HOTWIRE_REQUEST_CODE_GEOLOCATION_PERMISSION @@ -50,12 +52,18 @@ open class HotwireWebBottomSheetFragment : HotwireBottomSheetFragment(), Hotwire override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) webDelegate.onViewCreated() + bridgeDelegate.forEachInitializedComponent { + it.onViewCreated() + } viewLifecycleOwner.lifecycle.addObserver(bridgeDelegate) } override fun onDestroyView() { super.onDestroyView() webDelegate.onDestroyView() + bridgeDelegate.forEachInitializedComponent { + it.onDestroyView() + } viewLifecycleOwner.lifecycle.removeObserver(bridgeDelegate) } @@ -73,6 +81,14 @@ open class HotwireWebBottomSheetFragment : HotwireBottomSheetFragment(), Hotwire } } + override fun onBridgeComponentInitialized(component: BridgeComponent<*>) { + super.onBridgeComponentInitialized(component) + + if (component is BridgeComponentFragmentLifecycle) { + component.onViewCreated() + } + } + override fun onStart() { super.onStart() webDelegate.onStart() diff --git a/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebFragment.kt b/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebFragment.kt index 2f13108..df62462 100644 --- a/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebFragment.kt +++ b/navigation-fragments/src/main/java/dev/hotwire/navigation/fragments/HotwireWebFragment.kt @@ -8,6 +8,8 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.activity.result.ActivityResultLauncher +import dev.hotwire.core.bridge.BridgeComponent +import dev.hotwire.core.bridge.BridgeComponentFragmentLifecycle import dev.hotwire.core.bridge.BridgeDelegate import dev.hotwire.core.files.util.HOTWIRE_REQUEST_CODE_FILES import dev.hotwire.core.files.util.HOTWIRE_REQUEST_CODE_GEOLOCATION_PERMISSION @@ -50,12 +52,18 @@ open class HotwireWebFragment : HotwireFragment(), HotwireWebFragmentCallback { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) webDelegate.onViewCreated() + bridgeDelegate.forEachInitializedComponent { + it.onViewCreated() + } viewLifecycleOwner.lifecycle.addObserver(bridgeDelegate) } override fun onDestroyView() { super.onDestroyView() webDelegate.onDestroyView() + bridgeDelegate.forEachInitializedComponent { + it.onDestroyView() + } viewLifecycleOwner.lifecycle.removeObserver(bridgeDelegate) } @@ -110,6 +118,14 @@ open class HotwireWebFragment : HotwireFragment(), HotwireWebFragmentCallback { } } + override fun onBridgeComponentInitialized(component: BridgeComponent<*>) { + super.onBridgeComponentInitialized(component) + + if (component is BridgeComponentFragmentLifecycle) { + component.onViewCreated() + } + } + final override fun prepareNavigation(onReady: () -> Unit) { webDelegate.prepareNavigation(onReady) }