package dev.jdtech.jellyfin.fragments import android.os.Bundle import android.view.* import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.adapters.ViewListAdapter import dev.jdtech.jellyfin.databinding.FragmentHomeBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.viewmodels.HomeViewModel import org.jellyfin.sdk.model.api.BaseItemDto @AndroidEntryPoint class HomeFragment : Fragment() { private lateinit var binding: FragmentHomeBinding private val viewModel: HomeViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) findNavController().graph.startDestination = R.id.homeFragment } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.home_menu, menu) } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_settings -> { navigateToSettingsFragment() true } else -> super.onOptionsItemSelected(item) } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentHomeBinding.inflate(inflater, container, false) binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel binding.viewsRecyclerView.adapter = ViewListAdapter(ViewListAdapter.OnClickListener { navigateToLibraryFragment(it) }, ViewItemListAdapter.OnClickListener { navigateToMediaInfoFragment(it) }, HomeEpisodeListAdapter.OnClickListener { item -> when (item.type) { "Episode" -> { navigateToEpisodeBottomSheetFragment(item) } "Movie" -> { navigateToMediaInfoFragment(item) } } }) viewModel.finishedLoading.observe(viewLifecycleOwner, { binding.loadingIndicator.visibility = if (it) View.GONE else View.VISIBLE }) viewModel.error.observe(viewLifecycleOwner, { error -> if (error != null) { checkIfLoginRequired(error) binding.errorLayout.errorPanel.visibility = View.VISIBLE binding.viewsRecyclerView.visibility = View.GONE } else { binding.errorLayout.errorPanel.visibility = View.GONE binding.viewsRecyclerView.visibility = View.VISIBLE } }) binding.errorLayout.errorRetryButton.setOnClickListener { viewModel.loadData() } binding.errorLayout.errorDetailsButton.setOnClickListener { ErrorDialogFragment(viewModel.error.value ?: getString(R.string.unknown_error)).show( parentFragmentManager, "errordialog" ) } return binding.root } private fun navigateToLibraryFragment(view: dev.jdtech.jellyfin.models.View) { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToLibraryFragment( view.id, view.name, view.type ) ) } private fun navigateToMediaInfoFragment(item: BaseItemDto) { if (item.type == "Episode") { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment( item.seriesId!!, item.seriesName, "Series" ) ) } else { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment( item.id, item.name, item.type ?: "Unknown" ) ) } } private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToEpisodeBottomSheetFragment( episode.id ) ) } private fun navigateToSettingsFragment() { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToNavigationSettings() ) } }