Fix crash when keyboard animation ends after view destroyed.

This commit is contained in:
Alex Hart
2025-12-10 09:34:53 -04:00
committed by Michelle Tang
parent 673cff8eed
commit 067a22ff90
2 changed files with 17 additions and 6 deletions

View File

@@ -37,7 +37,7 @@ class InputAwareConstraintLayout @JvmOverloads constructor(
listeners.add(listener) listeners.add(listener)
} }
fun remoteInputListener(listener: Listener) { fun removeInputListener(listener: Listener) {
listeners.remove(listener) listeners.remove(listener)
} }
@@ -57,13 +57,13 @@ class InputAwareConstraintLayout @JvmOverloads constructor(
val listener = object : Listener, KeyboardStateListener { val listener = object : Listener, KeyboardStateListener {
override fun onInputHidden() { override fun onInputHidden() {
onHidden() onHidden()
remoteInputListener(this) removeInputListener(this)
removeKeyboardStateListener(this) removeKeyboardStateListener(this)
} }
override fun onKeyboardHidden() { override fun onKeyboardHidden() {
onHidden() onHidden()
remoteInputListener(this) removeInputListener(this)
removeKeyboardStateListener(this) removeKeyboardStateListener(this)
} }

View File

@@ -569,6 +569,7 @@ class ConversationFragment :
private var dataObserver: DataObserver? = null private var dataObserver: DataObserver? = null
private var menuProvider: ConversationOptionsMenu.Provider? = null private var menuProvider: ConversationOptionsMenu.Provider? = null
private var scrollListener: ScrollListener? = null private var scrollListener: ScrollListener? = null
private var keyboardEvents: KeyboardEvents? = null
private var progressDialog: ProgressCardDialogFragment? = null private var progressDialog: ProgressCardDialogFragment? = null
private val jumpAndPulseScrollStrategy = object : ScrollToPositionDelegate.ScrollStrategy { private val jumpAndPulseScrollStrategy = object : ScrollToPositionDelegate.ScrollStrategy {
@@ -770,6 +771,12 @@ class ConversationFragment :
} }
override fun onDestroyView() { override fun onDestroyView() {
keyboardEvents?.let {
container.removeInputListener(it)
container.removeKeyboardStateListener(it)
}
keyboardEvents = null
super.onDestroyView() super.onDestroyView()
if (pinnedShortcutReceiver != null) { if (pinnedShortcutReceiver != null) {
requireActivity().unregisterReceiver(pinnedShortcutReceiver) requireActivity().unregisterReceiver(pinnedShortcutReceiver)
@@ -1154,9 +1161,10 @@ class ConversationFragment :
dataObserver = DataObserver() dataObserver = DataObserver()
adapter.registerAdapterDataObserver(dataObserver!!) adapter.registerAdapterDataObserver(dataObserver!!)
val keyboardEvents = KeyboardEvents() keyboardEvents = KeyboardEvents().also {
container.addInputListener(keyboardEvents) container.addInputListener(it)
container.addKeyboardStateListener(keyboardEvents) container.addKeyboardStateListener(it)
}
childFragmentManager.setFragmentResultListener(AttachmentKeyboardFragment.RESULT_KEY, viewLifecycleOwner, AttachmentKeyboardFragmentListener()) childFragmentManager.setFragmentResultListener(AttachmentKeyboardFragment.RESULT_KEY, viewLifecycleOwner, AttachmentKeyboardFragmentListener())
motionEventRelay.setDrain(MotionEventRelayDrain(this)) motionEventRelay.setDrain(MotionEventRelayDrain(this))
@@ -4745,6 +4753,9 @@ class ConversationFragment :
} }
override fun onKeyboardAnimationEnded() { override fun onKeyboardAnimationEnded() {
if (view == null) {
return
}
if (!container.isKeyboardShowing) { if (!container.isKeyboardShowing) {
closeEmojiSearch() closeEmojiSearch()
} }