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.FragmentProvidersMobileBinding 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 com.streamflixreborn.streamflix.utils.dp import kotlinx.coroutines.launch import java.util.Locale class ProvidersMobileFragment : Fragment() { private var _binding: FragmentProvidersMobileBinding? = 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 = FragmentProvidersMobileBinding.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.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() } } } } } } } 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( this.context, 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(32.dp(requireContext())) ) } } private fun displayProviders(providers: List) { appAdapter.submitList(providers.onEach { it.itemType = AppAdapter.Type.PROVIDER_MOBILE_ITEM }) } }