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)