package com.streamflixreborn.streamflix.fragments.providers import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import com.streamflixreborn.streamflix.R import com.streamflixreborn.streamflix.adapters.AppAdapter import com.streamflixreborn.streamflix.databinding.FragmentProvidersTvBinding import com.streamflixreborn.streamflix.models.Provider as ModelProvider import com.streamflixreborn.streamflix.providers.Provider import com.streamflixreborn.streamflix.ui.SpacingItemDecoration import com.streamflixreborn.streamflix.utils.UserPreferences import kotlinx.coroutines.launch import java.util.Locale class ProvidersTvFragment : Fragment() { private var _binding: FragmentProvidersTvBinding? = null private val binding get() = _binding!! private val viewModel by viewModels() private val appAdapter = AppAdapter() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentProvidersTvBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initializeProviders() viewLifecycleOwner.lifecycleScope.launch { viewModel.state.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).collect { state -> when (state) { ProvidersViewModel.State.Loading -> binding.isLoading.apply { root.visibility = View.VISIBLE pbIsLoading.visibility = View.VISIBLE gIsLoadingRetry.visibility = View.GONE } is ProvidersViewModel.State.SuccessLoading -> { displayProviders(state.providers) binding.rvProviders.visibility = View.VISIBLE binding.isLoading.root.visibility = View.GONE } is ProvidersViewModel.State.FailedLoading -> { Toast.makeText( requireContext(), state.error.message ?: "", Toast.LENGTH_SHORT ).show() binding.isLoading.apply { pbIsLoading.visibility = View.GONE gIsLoadingRetry.visibility = View.VISIBLE btnIsLoadingRetry.setOnClickListener { viewModel.getProviders() } binding.rvProviders.visibility = View.GONE } } } } } } override fun onDestroyView() { super.onDestroyView() _binding = null } private fun initializeProviders() { binding.sProvidersLanguage.apply { class Language( val code: String, val name: String, ) val languages = Provider.providers.keys .distinctBy { it.language } .map { val locale = Locale.forLanguageTag(it.language) Language( code = it.language, name = locale.getDisplayLanguage(locale) .replaceFirstChar { char -> char.titlecase() }, ) } .sortedBy { it.name.lowercase() } val spinnerAdapter = ArrayAdapter( requireContext(), android.R.layout.simple_spinner_item, mutableListOf( context.getString(R.string.providers_all_languages), context.getString(R.string.providers_favorites) ).apply { addAll(languages.map { it.name }) }.toTypedArray() ).also { it.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) } setAdapter(spinnerAdapter) onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { when (position) { 0 -> { viewModel.getProviders() UserPreferences.providerLanguage = null } 1 -> { viewModel.getProviders("favorites") UserPreferences.providerLanguage = "favorites" } else -> { val langCode = languages[position - 2].code viewModel.getProviders(langCode) UserPreferences.providerLanguage = langCode } } } override fun onNothingSelected(parent: AdapterView<*>?) {} } setSelection( when (val lang = UserPreferences.providerLanguage) { null -> 0 "favorites" -> 1 else -> { val index = languages.indexOfFirst { it.code == lang } if (index != -1) index + 2 else 0 } } ) } binding.rvProviders.apply { adapter = appAdapter.apply { stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY } addItemDecoration( SpacingItemDecoration( requireContext().resources.getDimension(R.dimen.providers_spacing).toInt() ) ) } } private fun displayProviders(providers: List) { appAdapter.submitList(providers.onEach { it.itemType = AppAdapter.Type.PROVIDER_TV_ITEM }) binding.rvProviders.requestFocus() } }