From 490d3549e2af60c1b6a0bb3baa0077c799cea442 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 18 Dec 2023 10:10:16 -0500 Subject: [PATCH] Attempt to fix message replies bottom sheet overlap. --- .../components/InputAwareConstraintLayout.kt | 41 +++++++++++++++++-- .../conversation/v2/ConversationFragment.kt | 18 ++++---- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/InputAwareConstraintLayout.kt b/app/src/main/java/org/thoughtcrime/securesms/components/InputAwareConstraintLayout.kt index b1c81148a0..c9df126b89 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/InputAwareConstraintLayout.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/InputAwareConstraintLayout.kt @@ -26,12 +26,20 @@ class InputAwareConstraintLayout @JvmOverloads constructor( private var inputId: Int? = null private var input: Fragment? = null private var wasKeyboardVisibleBeforeToggle: Boolean = false + private val listeners: MutableSet = mutableSetOf() val isInputShowing: Boolean get() = input != null lateinit var fragmentManager: FragmentManager - var listener: Listener? = null + + fun addInputListener(listener: Listener) { + listeners.add(listener) + } + + fun remoteInputListener(listener: Listener) { + listeners.remove(listener) + } fun showSoftkey(editText: EditText) { ViewUtil.focusAndShowKeyboard(editText) @@ -44,6 +52,33 @@ class InputAwareConstraintLayout @JvmOverloads constructor( hideInput(resetKeyboardGuideline = true) } + fun runAfterAllHidden(imeTarget: EditText, onHidden: () -> Unit) { + if (isInputShowing || isKeyboardShowing) { + val listener = object : Listener, KeyboardStateListener { + override fun onInputHidden() { + onHidden() + remoteInputListener(this) + removeKeyboardStateListener(this) + } + + override fun onKeyboardHidden() { + onHidden() + remoteInputListener(this) + removeKeyboardStateListener(this) + } + + override fun onInputShown() = Unit + override fun onKeyboardShown() = Unit + } + + addInputListener(listener) + addKeyboardStateListener(listener) + hideAll(imeTarget) + } else { + onHidden() + } + } + fun toggleInput(fragmentCreator: FragmentCreator, imeTarget: EditText, showSoftKeyOnHide: Boolean = wasKeyboardVisibleBeforeToggle) { if (fragmentCreator.id == inputId) { if (showSoftKeyOnHide) { @@ -85,7 +120,7 @@ class InputAwareConstraintLayout @JvmOverloads constructor( overrideKeyboardGuidelineWithPreviousHeight() ViewUtil.hideKeyboard(context, imeTarget) - listener?.onInputShown() + listeners.forEach { it.onInputShown() } } private fun hideInput(resetKeyboardGuideline: Boolean) { @@ -107,7 +142,7 @@ class InputAwareConstraintLayout @JvmOverloads constructor( } if (inputHidden) { - listener?.onInputHidden() + listeners.forEach { it.onInputHidden() } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 01c2272cef..ff9859ab78 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -953,7 +953,7 @@ class ConversationFragment : adapter.registerAdapterDataObserver(dataObserver!!) val keyboardEvents = KeyboardEvents() - container.listener = keyboardEvents + container.addInputListener(keyboardEvents) container.addKeyboardStateListener(keyboardEvents) requireActivity() .onBackPressedDispatcher @@ -1470,7 +1470,9 @@ class ConversationFragment : findViewById(R.id.scheduled_messages_show_all) .setOnClickListener { val recipient = viewModel.recipientSnapshot ?: return@setOnClickListener - ScheduledMessagesBottomSheet.show(childFragmentManager, args.threadId, recipient.id) + container.runAfterAllHidden(composeText) { + ScheduledMessagesBottomSheet.show(childFragmentManager, args.threadId, recipient.id) + } } findViewById(R.id.scheduled_messages_text).text = resources.getQuantityString(R.plurals.conversation_scheduled_messages_bar__number_of_messages, count, count) @@ -2505,11 +2507,13 @@ class ConversationFragment : activity ?: return val recipientId = viewModel.recipientSnapshot?.id ?: return - MessageQuotesBottomSheet.show( - childFragmentManager, - MessageId(messageRecord.id), - recipientId - ) + container.runAfterAllHidden(composeText) { + MessageQuotesBottomSheet.show( + childFragmentManager, + MessageId(messageRecord.id), + recipientId + ) + } } override fun onMoreTextClicked(conversationRecipientId: RecipientId, messageId: Long, isMms: Boolean) {