diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index cb6607a51e..edb94a7ebd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -2235,7 +2235,6 @@ public class ConversationParentFragment extends Fragment inlineQueryViewModel = new ViewModelProvider(requireActivity()).get(InlineQueryViewModel.class); inlineQueryResultsController = new InlineQueryResultsController( - requireContext(), inlineQueryViewModel, inputPanel, (ViewGroup) requireView(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt index 6758e1690e..75f9cd7f6b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.conversation.ui.inlinequery -import android.content.Context import android.view.View import android.view.ViewGroup import androidx.lifecycle.DefaultLifecycleObserver @@ -17,7 +16,6 @@ import org.thoughtcrime.securesms.util.doOnEachLayout * Controller for inline search results. */ class InlineQueryResultsController( - private val context: Context, private val viewModel: InlineQueryViewModel, private val anchor: View, private val container: ViewGroup, @@ -44,6 +42,7 @@ class InlineQueryResultsController( } }) + canShow = editText.hasFocus() editText.addOnFocusChangeListener { _, hasFocus -> canShow = hasFocus updateList(previousResults ?: emptyList()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModel.kt index ca16dcb827..149725ca22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModel.kt @@ -13,7 +13,7 @@ import org.thoughtcrime.securesms.util.adapter.mapping.AnyMappingModel /** * Activity (at least) scope view model for managing inline queries. The view model needs to be larger scope so it can - * be shared between the fragment requesting the search and the instace of [InlineQueryResultsFragment] used for displaying + * be shared between the fragment requesting the search and the instance of [InlineQueryResultsFragment] used for displaying * the results. */ class InlineQueryViewModel( 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 67ff61494f..ffb92beb1e 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 @@ -29,6 +29,7 @@ import android.view.MenuItem import android.view.MotionEvent import android.view.View import android.view.View.OnFocusChangeListener +import android.view.ViewGroup import android.view.ViewTreeObserver import android.view.inputmethod.EditorInfo import android.widget.ImageButton @@ -161,6 +162,11 @@ import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectFor import org.thoughtcrime.securesms.conversation.quotes.MessageQuotesBottomSheet import org.thoughtcrime.securesms.conversation.ui.edit.EditMessageHistoryDialog import org.thoughtcrime.securesms.conversation.ui.error.EnableCallNotificationSettingsDialog +import org.thoughtcrime.securesms.conversation.ui.inlinequery.InlineQuery +import org.thoughtcrime.securesms.conversation.ui.inlinequery.InlineQueryChangedListener +import org.thoughtcrime.securesms.conversation.ui.inlinequery.InlineQueryReplacement +import org.thoughtcrime.securesms.conversation.ui.inlinequery.InlineQueryResultsController +import org.thoughtcrime.securesms.conversation.ui.inlinequery.InlineQueryViewModel import org.thoughtcrime.securesms.conversation.v2.groups.ConversationGroupCallViewModel import org.thoughtcrime.securesms.conversation.v2.groups.ConversationGroupViewModel import org.thoughtcrime.securesms.conversation.v2.keyboard.AttachmentKeyboardFragment @@ -371,6 +377,17 @@ class ConversationFragment : StickerSuggestionsViewModel() } + private val inlineQueryViewModel: InlineQueryViewModel by activityViewModels() + private val inlineQueryController: InlineQueryResultsController by lazy { + InlineQueryResultsController( + inlineQueryViewModel, + inputPanel, + (requireView() as ViewGroup), + composeText, + viewLifecycleOwner + ) + } + private val conversationTooltips = ConversationTooltips(this) private val colorizer = Colorizer() private val textDraftSaveDebouncer = Debouncer(500) @@ -798,10 +815,39 @@ class ConversationFragment : initializeSearch() initializeLinkPreviews() initializeStickerSuggestions() + initializeInlineSearch() inputPanel.setListener(InputPanelListener()) } + private fun initializeInlineSearch() { + inlineQueryController.onOrientationChange(resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) + + composeText.apply { + setInlineQueryChangedListener(object : InlineQueryChangedListener { + override fun onQueryChanged(inlineQuery: InlineQuery) { + inlineQueryViewModel.onQueryChange(inlineQuery) + } + }) + + setMentionValidator { annotations -> + val recipient = viewModel.recipientSnapshot ?: return@setMentionValidator annotations + + val validIds = recipient.participantIds + .map { MentionAnnotation.idToMentionAnnotationValue(it) } + .toSet() + + annotations.filterNot { validIds.contains(it.value) } + } + } + + inlineQueryViewModel + .selection + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { r: InlineQueryReplacement -> composeText.replaceText(r) } + .addTo(disposables) + } + private fun presentInputReadyState(inputReadyState: InputReadyState) { presentConversationTitle(inputReadyState.conversationRecipient) 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 d241cad7cd..a4dcd8cac2 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 @@ -167,7 +167,6 @@ class AddMessageDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_a mentionsViewModel = ViewModelProvider(requireActivity(), MentionsPickerViewModel.Factory()).get(MentionsPickerViewModel::class.java) inlineQueryResultsController = InlineQueryResultsController( - requireContext(), inlineQueryViewModel, requireView().findViewById(R.id.background_holder), (requireView() as ViewGroup), diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt index 4e6aac656d..bfa8a208b0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt @@ -451,7 +451,6 @@ class StoryGroupReplyFragment : private fun initializeMentions() { inlineQueryResultsController = InlineQueryResultsController( - requireContext(), inlineQueryViewModel, composer, (requireView() as ViewGroup),