Signal-Android/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchFragment.kt

93 wiersze
3.2 KiB
Kotlin

package org.thoughtcrime.securesms.keyboard.emoji.search
import android.content.Context
import android.os.Bundle
import android.view.View
import android.widget.FrameLayout
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout
import org.thoughtcrime.securesms.components.emoji.EmojiEventListener
import org.thoughtcrime.securesms.components.emoji.EmojiPageView
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
import org.thoughtcrime.securesms.keyboard.findListener
import org.thoughtcrime.securesms.util.ViewUtil
class EmojiSearchFragment : Fragment(R.layout.emoji_search_fragment), EmojiPageViewGridAdapter.VariationSelectorListener {
private lateinit var viewModel: EmojiSearchViewModel
private lateinit var callback: Callback
override fun onAttach(context: Context) {
super.onAttach(context)
callback = context as Callback
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val repository = EmojiSearchRepository(requireContext())
val factory = EmojiSearchViewModel.Factory(repository)
viewModel = ViewModelProvider(this, factory)[EmojiSearchViewModel::class.java]
val keyboardAwareLinearLayout: KeyboardAwareLinearLayout = view.findViewById(R.id.kb_aware_layout)
val eventListener: EmojiEventListener = requireNotNull(findListener())
val searchBar: KeyboardPageSearchView = view.findViewById(R.id.emoji_search_view)
val resultsContainer: FrameLayout = view.findViewById(R.id.emoji_search_results_container)
val noResults: TextView = view.findViewById(R.id.emoji_search_empty)
val emojiPageView = EmojiPageView(
requireContext(),
eventListener,
this,
true,
LinearLayoutManager(requireContext(), RecyclerView.HORIZONTAL, false),
R.layout.emoji_display_item_list,
R.layout.emoji_text_display_item_list
)
resultsContainer.addView(emojiPageView)
searchBar.presentForEmojiSearch()
searchBar.callbacks = SearchCallbacks()
viewModel.emojiList.observe(viewLifecycleOwner) { results ->
emojiPageView.setList(results.emojiList, null)
if (results.emojiList.isNotEmpty() || results.isRecents) {
emojiPageView.visibility = View.VISIBLE
noResults.visibility = View.GONE
} else {
emojiPageView.visibility = View.INVISIBLE
noResults.visibility = View.VISIBLE
}
}
view.post {
keyboardAwareLinearLayout.addOnKeyboardHiddenListener {
callback.closeEmojiSearch()
}
}
}
private inner class SearchCallbacks : KeyboardPageSearchView.Callbacks {
override fun onNavigationClicked() {
ViewUtil.hideKeyboard(requireContext(), requireView())
}
override fun onQueryChanged(query: String) {
viewModel.onQueryChanged(query)
}
}
interface Callback {
fun closeEmojiSearch()
}
override fun onVariationSelectorStateChanged(open: Boolean) = Unit
}