diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/HudCommand.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/HudCommand.kt index 4ef01ad2420..3c38434c012 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/HudCommand.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/HudCommand.kt @@ -16,4 +16,7 @@ sealed class HudCommand { object CloseEmojiSearch : HudCommand() data class EmojiInsert(val emoji: String?) : HudCommand() data class EmojiKeyEvent(val keyEvent: KeyEvent?) : HudCommand() + + // Request that the hosting MediaReviewFragment perform a send (same logic as the send button). + object PerformSend : HudCommand() } 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 7057ef26a2e..50934504674 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 @@ -7,6 +7,8 @@ import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.EditorInfo +import android.widget.TextView import androidx.core.widget.addTextChangedListener import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels @@ -32,6 +34,7 @@ import org.thoughtcrime.securesms.conversation.ui.mentions.MentionsPickerViewMod import org.thoughtcrime.securesms.databinding.V2MediaAddMessageDialogFragmentBinding import org.thoughtcrime.securesms.keyboard.KeyboardPage import org.thoughtcrime.securesms.keyboard.KeyboardPagerViewModel +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mediasend.v2.HudCommand import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionState import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel @@ -74,6 +77,33 @@ class AddMessageDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_a private val disposables = CompositeDisposable() + // When the user presses IME action SEND or Enter, request the MediaReviewFragment to perform send. + val sendEditorActionListener = TextView.OnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_SEND) { + viewModel.sendCommand(HudCommand.PerformSend) + dismissAllowingStateLoss() + true + } else { + false + } + } + + // When the user presses IME action SEND or Enter, request the MediaReviewFragment to perform send. + val sendKeyListener = View.OnKeyListener { _, keyCode, keyEvent -> + if (keyEvent.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) { + // Only treat Enter as send if the user enabled that preference, or Ctrl is pressed — match ConversationFragment. + if (SignalStore.settings.isEnterKeySends || keyEvent.isCtrlPressed) { + viewModel.sendCommand(HudCommand.PerformSend) + dismissAllowingStateLoss() + true + } else { + false + } + } else { + false + } + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val themeWrapper = ContextThemeWrapper(inflater.context, R.style.TextSecure_DarkTheme) val themedInflater = LayoutInflater.from(themeWrapper) @@ -96,6 +126,9 @@ class AddMessageDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_a binding.content.addAMessageInput.addTextChangedListener { viewModel.setMessage(it) } binding.content.addAMessageInput.filters += ByteLimitInputFilter(MessageUtil.MAX_TOTAL_BODY_SIZE_BYTES) + binding.content.addAMessageInput.setOnEditorActionListener(sendEditorActionListener) + binding.content.addAMessageInput.setOnKeyListener(sendKeyListener) + binding.content.emojiToggle.setOnClickListener { onEmojiToggleClicked() } if (requireArguments().getBoolean(ARG_INITIAL_EMOJI_TOGGLE) && view is KeyboardAwareLinearLayout) { view.addOnKeyboardShownListener(EmojiLaunchListener(view)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt index f278256657e..406a15aac22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt @@ -151,6 +151,16 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment), Schedul disposables += sharedViewModel.hudCommands.subscribe { when (it) { HudCommand.ResumeEntryTransition -> startPostponedEnterTransition() + HudCommand.PerformSend -> { + if (!readyToSend) { + Log.d(TAG, "Attachment send button not currently enabled. Ignoring PerformSend command.") + return@subscribe + } + + Log.d(TAG, "Performing send from PerformSend HUD command.") + readyToSend = false + performSend() + } else -> Unit } }