From 9498a3429396410aa238d8a04e494fefb90e4a5e Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 28 Sep 2022 14:45:27 -0300 Subject: [PATCH] Add onWillBeDestroyed callback to ViewBinderDelegate --- .../securesms/components/ViewBinderDelegate.kt | 15 ++++++++++++++- .../v2/review/AddMessageDialogFragment.kt | 9 +++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ViewBinderDelegate.kt b/app/src/main/java/org/thoughtcrime/securesms/components/ViewBinderDelegate.kt index 3112abf18b..aa59e96d80 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ViewBinderDelegate.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ViewBinderDelegate.kt @@ -11,11 +11,19 @@ import kotlin.reflect.KProperty * ViewBinderDelegate which enforces the "best practices" for maintaining a reference to a view binding given by * Android official documentation. */ -class ViewBinderDelegate(private val bindingFactory: (View) -> T) : DefaultLifecycleObserver { +open class ViewBinderDelegate( + private val bindingFactory: (View) -> T, + private val onBindingWillBeDestroyed: (T) -> Unit = {} +) : DefaultLifecycleObserver { private var binding: T? = null + private var isBindingDestroyed = false operator fun getValue(thisRef: Fragment, property: KProperty<*>): T { + if (isBindingDestroyed) { + error("Binding has been destroyed.") + } + if (binding == null) { thisRef.viewLifecycleOwner.lifecycle.addObserver(this@ViewBinderDelegate) binding = bindingFactory(thisRef.requireView()) @@ -25,6 +33,11 @@ class ViewBinderDelegate(private val bindingFactory: (View) -> } override fun onDestroy(owner: LifecycleOwner) { + if (binding != null) { + onBindingWillBeDestroyed(binding!!) + } + binding = null + isBindingDestroyed = true } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/AddMessageDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/AddMessageDialogFragment.kt index 8bfba993ec..5db574f09a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/AddMessageDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/AddMessageDialogFragment.kt @@ -58,7 +58,11 @@ class AddMessageDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_a ownerProducer = { requireActivity() } ) - private val binding by ViewBinderDelegate(V2MediaAddMessageDialogFragmentBinding::bind) + private val binding by ViewBinderDelegate(V2MediaAddMessageDialogFragmentBinding::bind, onBindingWillBeDestroyed = { binding -> + binding.content.addAMessageInput.setInlineQueryChangedListener(null) + binding.content.addAMessageInput.setMentionValidator(null) + }) + private lateinit var emojiDrawerStub: Stub private lateinit var inlineQueryResultsController: InlineQueryResultsController @@ -153,9 +157,6 @@ class AddMessageDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_a override fun onDestroyView() { super.onDestroyView() disposables.dispose() - - binding.content.addAMessageInput.setInlineQueryChangedListener(null) - binding.content.addAMessageInput.setMentionValidator(null) } private fun initializeMentions() {