Add inline emoji search to CFv2.

This commit is contained in:
Cody Henthorne 2023-06-27 13:53:21 -04:00 committed by Nicholas
parent 5c2b475c01
commit 2ef7fabade
6 changed files with 48 additions and 6 deletions

View file

@ -2235,7 +2235,6 @@ public class ConversationParentFragment extends Fragment
inlineQueryViewModel = new ViewModelProvider(requireActivity()).get(InlineQueryViewModel.class);
inlineQueryResultsController = new InlineQueryResultsController(
requireContext(),
inlineQueryViewModel,
inputPanel,
(ViewGroup) requireView(),

View file

@ -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())

View file

@ -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(

View file

@ -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)

View file

@ -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),

View file

@ -451,7 +451,6 @@ class StoryGroupReplyFragment :
private fun initializeMentions() {
inlineQueryResultsController = InlineQueryResultsController(
requireContext(),
inlineQueryViewModel,
composer,
(requireView() as ViewGroup),