package ani.dantotsu.media import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import androidx.core.math.MathUtils.clamp import androidx.core.view.updateLayoutParams import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import ani.dantotsu.BottomSheetDialogFragment import ani.dantotsu.databinding.BottomSheetSourceSearchBinding import ani.dantotsu.media.anime.AnimeSourceAdapter import ani.dantotsu.media.manga.MangaSourceAdapter import ani.dantotsu.navBarHeight import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.HAnimeSources import ani.dantotsu.parsers.HMangaSources import ani.dantotsu.parsers.MangaSources import ani.dantotsu.px import ani.dantotsu.tryWithSuspend import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class SourceSearchDialogFragment : BottomSheetDialogFragment() { private var _binding: BottomSheetSourceSearchBinding? = null private val binding get() = _binding!! val model: MediaDetailsViewModel by activityViewModels() private var searched = false var anime = true var i: Int? = null var id: Int? = null var media: Media? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = BottomSheetSourceSearchBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.mediaListContainer.updateLayoutParams { bottomMargin += navBarHeight } val scope = requireActivity().lifecycleScope val imm = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager model.getMedia().observe(viewLifecycleOwner) { media = it if (media != null) { binding.mediaListProgressBar.visibility = View.GONE binding.mediaListLayout.visibility = View.VISIBLE binding.searchRecyclerView.visibility = View.GONE binding.searchProgress.visibility = View.VISIBLE i = media!!.selected!!.sourceIndex val source = if (media!!.anime != null) { (if (media!!.isAdult) HAnimeSources else AnimeSources)[i!!] } else { anime = false (if (media!!.isAdult) HMangaSources else MangaSources)[i!!] } fun search() { binding.searchBarText.clearFocus() imm.hideSoftInputFromWindow(binding.searchBarText.windowToken, 0) scope.launch { model.responses.postValue( withContext(Dispatchers.IO) { tryWithSuspend { source.search(binding.searchBarText.text.toString()) } } ) } } binding.searchSourceTitle.text = source.name binding.searchBarText.setText(media!!.mangaName()) binding.searchBarText.setOnEditorActionListener { _, actionId, _ -> return@setOnEditorActionListener when (actionId) { EditorInfo.IME_ACTION_SEARCH -> { search() true } else -> false } } binding.searchBar.setEndIconOnClickListener { search() } if (!searched) search() searched = true model.responses.observe(viewLifecycleOwner) { j -> if (j != null) { binding.searchRecyclerView.visibility = View.VISIBLE binding.searchProgress.visibility = View.GONE binding.searchRecyclerView.adapter = if (anime) AnimeSourceAdapter(j, model, i!!, media!!.id, this, scope) else MangaSourceAdapter(j, model, i!!, media!!.id, this, scope) binding.searchRecyclerView.layoutManager = GridLayoutManager( requireActivity(), clamp( requireActivity().resources.displayMetrics.widthPixels / 124f.px, 1, 4 ) ) } } } } } override fun onDestroyView() { super.onDestroyView() _binding = null } override fun dismiss() { model.responses.value = null super.dismiss() } }