Add inline emoji search to CFv2.
This commit is contained in:
parent
5c2b475c01
commit
2ef7fabade
6 changed files with 48 additions and 6 deletions
|
@ -2235,7 +2235,6 @@ public class ConversationParentFragment extends Fragment
|
||||||
inlineQueryViewModel = new ViewModelProvider(requireActivity()).get(InlineQueryViewModel.class);
|
inlineQueryViewModel = new ViewModelProvider(requireActivity()).get(InlineQueryViewModel.class);
|
||||||
|
|
||||||
inlineQueryResultsController = new InlineQueryResultsController(
|
inlineQueryResultsController = new InlineQueryResultsController(
|
||||||
requireContext(),
|
|
||||||
inlineQueryViewModel,
|
inlineQueryViewModel,
|
||||||
inputPanel,
|
inputPanel,
|
||||||
(ViewGroup) requireView(),
|
(ViewGroup) requireView(),
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package org.thoughtcrime.securesms.conversation.ui.inlinequery
|
package org.thoughtcrime.securesms.conversation.ui.inlinequery
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.lifecycle.DefaultLifecycleObserver
|
import androidx.lifecycle.DefaultLifecycleObserver
|
||||||
|
@ -17,7 +16,6 @@ import org.thoughtcrime.securesms.util.doOnEachLayout
|
||||||
* Controller for inline search results.
|
* Controller for inline search results.
|
||||||
*/
|
*/
|
||||||
class InlineQueryResultsController(
|
class InlineQueryResultsController(
|
||||||
private val context: Context,
|
|
||||||
private val viewModel: InlineQueryViewModel,
|
private val viewModel: InlineQueryViewModel,
|
||||||
private val anchor: View,
|
private val anchor: View,
|
||||||
private val container: ViewGroup,
|
private val container: ViewGroup,
|
||||||
|
@ -44,6 +42,7 @@ class InlineQueryResultsController(
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
canShow = editText.hasFocus()
|
||||||
editText.addOnFocusChangeListener { _, hasFocus ->
|
editText.addOnFocusChangeListener { _, hasFocus ->
|
||||||
canShow = hasFocus
|
canShow = hasFocus
|
||||||
updateList(previousResults ?: emptyList())
|
updateList(previousResults ?: emptyList())
|
||||||
|
|
|
@ -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
|
* 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.
|
* the results.
|
||||||
*/
|
*/
|
||||||
class InlineQueryViewModel(
|
class InlineQueryViewModel(
|
||||||
|
|
|
@ -29,6 +29,7 @@ import android.view.MenuItem
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.OnFocusChangeListener
|
import android.view.View.OnFocusChangeListener
|
||||||
|
import android.view.ViewGroup
|
||||||
import android.view.ViewTreeObserver
|
import android.view.ViewTreeObserver
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.widget.ImageButton
|
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.quotes.MessageQuotesBottomSheet
|
||||||
import org.thoughtcrime.securesms.conversation.ui.edit.EditMessageHistoryDialog
|
import org.thoughtcrime.securesms.conversation.ui.edit.EditMessageHistoryDialog
|
||||||
import org.thoughtcrime.securesms.conversation.ui.error.EnableCallNotificationSettingsDialog
|
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.ConversationGroupCallViewModel
|
||||||
import org.thoughtcrime.securesms.conversation.v2.groups.ConversationGroupViewModel
|
import org.thoughtcrime.securesms.conversation.v2.groups.ConversationGroupViewModel
|
||||||
import org.thoughtcrime.securesms.conversation.v2.keyboard.AttachmentKeyboardFragment
|
import org.thoughtcrime.securesms.conversation.v2.keyboard.AttachmentKeyboardFragment
|
||||||
|
@ -371,6 +377,17 @@ class ConversationFragment :
|
||||||
StickerSuggestionsViewModel()
|
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 conversationTooltips = ConversationTooltips(this)
|
||||||
private val colorizer = Colorizer()
|
private val colorizer = Colorizer()
|
||||||
private val textDraftSaveDebouncer = Debouncer(500)
|
private val textDraftSaveDebouncer = Debouncer(500)
|
||||||
|
@ -798,10 +815,39 @@ class ConversationFragment :
|
||||||
initializeSearch()
|
initializeSearch()
|
||||||
initializeLinkPreviews()
|
initializeLinkPreviews()
|
||||||
initializeStickerSuggestions()
|
initializeStickerSuggestions()
|
||||||
|
initializeInlineSearch()
|
||||||
|
|
||||||
inputPanel.setListener(InputPanelListener())
|
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) {
|
private fun presentInputReadyState(inputReadyState: InputReadyState) {
|
||||||
presentConversationTitle(inputReadyState.conversationRecipient)
|
presentConversationTitle(inputReadyState.conversationRecipient)
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,6 @@ class AddMessageDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_a
|
||||||
mentionsViewModel = ViewModelProvider(requireActivity(), MentionsPickerViewModel.Factory()).get(MentionsPickerViewModel::class.java)
|
mentionsViewModel = ViewModelProvider(requireActivity(), MentionsPickerViewModel.Factory()).get(MentionsPickerViewModel::class.java)
|
||||||
|
|
||||||
inlineQueryResultsController = InlineQueryResultsController(
|
inlineQueryResultsController = InlineQueryResultsController(
|
||||||
requireContext(),
|
|
||||||
inlineQueryViewModel,
|
inlineQueryViewModel,
|
||||||
requireView().findViewById(R.id.background_holder),
|
requireView().findViewById(R.id.background_holder),
|
||||||
(requireView() as ViewGroup),
|
(requireView() as ViewGroup),
|
||||||
|
|
|
@ -451,7 +451,6 @@ class StoryGroupReplyFragment :
|
||||||
|
|
||||||
private fun initializeMentions() {
|
private fun initializeMentions() {
|
||||||
inlineQueryResultsController = InlineQueryResultsController(
|
inlineQueryResultsController = InlineQueryResultsController(
|
||||||
requireContext(),
|
|
||||||
inlineQueryViewModel,
|
inlineQueryViewModel,
|
||||||
composer,
|
composer,
|
||||||
(requireView() as ViewGroup),
|
(requireView() as ViewGroup),
|
||||||
|
|
Loading…
Add table
Reference in a new issue