diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 5827bb6471..06b6f9bfc3 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -20,6 +20,7 @@ import android.text.TextWatcher import android.util.Log import android.util.TypedValue import android.view.Gravity +import android.view.KeyEvent import android.view.LayoutInflater import android.view.MenuItem import android.view.MotionEvent @@ -113,6 +114,8 @@ class MessageInputFragment : Fragment() { @Inject lateinit var dateUtils: DateUtils + private enum class KeyboardSendTarget { NONE, EDIT, THREAD, SEND } + private val messageInputViewModel: MessageInputViewModel by activityViewModels() lateinit var binding: FragmentMessageInputBinding private lateinit var conversationInternalId: String @@ -511,6 +514,33 @@ class MessageInputFragment : Fragment() { submitMessage(false) } + binding.fragmentMessageInputView.inputEditText.setOnKeyListener { _, keyCode, event -> + val target = resolveKeyboardSendTarget( + keyCode = keyCode, + action = event.action, + isCtrlPressed = event.isCtrlPressed, + isEditButtonVisible = binding.fragmentEditView.editMessageView.isVisible, + isThreadButtonVisible = binding.fragmentMessageInputView.submitThreadButton.isVisible, + isThreadButtonEnabled = binding.fragmentMessageInputView.submitThreadButton.isEnabled, + isSendButtonVisible = binding.fragmentMessageInputView.messageSendButton.isVisible + ) + when (target) { + KeyboardSendTarget.EDIT -> { + binding.fragmentMessageInputView.editMessageButton.performClick() + true + } + KeyboardSendTarget.THREAD -> { + binding.fragmentMessageInputView.submitThreadButton.performClick() + true + } + KeyboardSendTarget.SEND -> { + binding.fragmentMessageInputView.button.performClick() + true + } + KeyboardSendTarget.NONE -> false + } + } + binding.fragmentMessageInputView.editMessageButton.setOnClickListener { val editable = binding.fragmentMessageInputView.inputEditText!!.editableText replaceMentionChipSpans(editable) @@ -1267,6 +1297,31 @@ class MessageInputFragment : Fragment() { return isChannel && permissions?.hasChatPermission() == false && permissions.hasReactPermission() == true } + private fun resolveKeyboardSendTarget( + keyCode: Int, + action: Int, + isCtrlPressed: Boolean, + isEditButtonVisible: Boolean, + isThreadButtonVisible: Boolean, + isThreadButtonEnabled: Boolean, + isSendButtonVisible: Boolean + ): KeyboardSendTarget { + val isSendChord = action == KeyEvent.ACTION_DOWN && + isCtrlPressed && + (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER) + + if (!isSendChord) { + return KeyboardSendTarget.NONE + } + + return when { + isEditButtonVisible -> KeyboardSendTarget.EDIT + isThreadButtonVisible && isThreadButtonEnabled -> KeyboardSendTarget.THREAD + isSendButtonVisible -> KeyboardSendTarget.SEND + else -> KeyboardSendTarget.NONE + } + } + companion object { fun newInstance() = MessageInputFragment() private val TAG: String = MessageInputFragment::class.java.simpleName