From 49d4cdc5e0ef0839504583bbc6e585a2f61f4498 Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <darken@darken.eu>
Date: Fri, 18 Sep 2020 21:46:37 +0200
Subject: [PATCH] We need to hook into `viewLifecycleOwner` not
 `lifeCycleOwner` otherwise the DataBinding is not correctly recreated whe
 fragments are reattached. (#1182)

Co-authored-by: Matthias Urhahn <matthias.urhahn@sap.com>
---
 .../util/ui/ViewBindingExtensions.kt          | 30 +++++++++++--------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt
index 045951181..9af1ba946 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/ViewBindingExtensions.kt
@@ -13,22 +13,27 @@ import kotlin.properties.ReadOnlyProperty
 import kotlin.reflect.KProperty
 
 inline fun <FragmentT : Fragment, reified BindingT : ViewBinding> FragmentT.viewBindingLazy() =
-    viewBindingLazy {
-        val bindingMethod = BindingT::class.java.getMethod("bind", View::class.java)
-        val binding = bindingMethod(null, requireView()) as BindingT
-        if (binding is ViewDataBinding) {
-            binding.lifecycleOwner = this
-        }
-        binding
-    }
+    this.viewBindingLazy(
+        bindingProvider = {
+            val bindingMethod = BindingT::class.java.getMethod("bind", View::class.java)
+            val binding = bindingMethod(null, requireView()) as BindingT
+            if (binding is ViewDataBinding) {
+                binding.lifecycleOwner = this.viewLifecycleOwner
+            }
+            binding
+        },
+        lifecycleOwnerProvider = { viewLifecycleOwner }
+    )
 
 @Suppress("unused")
 fun <FragmentT : Fragment, BindingT : ViewBinding> FragmentT.viewBindingLazy(
-    bindingProvider: FragmentT.() -> BindingT
-) = ViewBindingProperty(bindingProvider)
+    bindingProvider: FragmentT.() -> BindingT,
+    lifecycleOwnerProvider: FragmentT.() -> LifecycleOwner
+) = ViewBindingProperty(bindingProvider, lifecycleOwnerProvider)
 
 class ViewBindingProperty<ComponentT : LifecycleOwner, BindingT : ViewBinding>(
-    private val bindingProvider: (ComponentT) -> BindingT
+    private val bindingProvider: (ComponentT) -> BindingT,
+    private val lifecycleOwnerProvider: ComponentT.() -> LifecycleOwner
 ) : ReadOnlyProperty<ComponentT, BindingT> {
 
     private val uiHandler = Handler(Looper.getMainLooper())
@@ -55,7 +60,8 @@ class ViewBindingProperty<ComponentT : LifecycleOwner, BindingT : ViewBinding>(
         }
 
         localRef = thisRef
-        thisRef.lifecycle.addObserver(onDestroyObserver)
+
+        lifecycleOwnerProvider(thisRef).lifecycle.addObserver(onDestroyObserver)
 
         return bindingProvider(thisRef).also { viewBinding = it }
     }
-- 
GitLab