* Display downloaded episodes by series * Add offline playback to readme * Remove accidentally commited changes * Remove duplicate movie section in downloadviewmodel * Fix issues with merging upstream * Notify on download completion * Fix trash icon color * Update DownloadSeriesFragment to use new UiState system * Clean up unused code Co-authored-by: Jarne Demeulemeester <jarnedemeulemeester@gmail.com>
117 lines
No EOL
4.2 KiB
Kotlin
117 lines
No EOL
4.2 KiB
Kotlin
package dev.jdtech.jellyfin.fragments
|
|
|
|
import android.os.Bundle
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import androidx.core.view.isVisible
|
|
import androidx.fragment.app.Fragment
|
|
import androidx.fragment.app.viewModels
|
|
import androidx.lifecycle.Lifecycle
|
|
import androidx.lifecycle.lifecycleScope
|
|
import androidx.lifecycle.repeatOnLifecycle
|
|
import androidx.navigation.fragment.findNavController
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
import dev.jdtech.jellyfin.adapters.*
|
|
import dev.jdtech.jellyfin.databinding.FragmentDownloadBinding
|
|
import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment
|
|
import dev.jdtech.jellyfin.models.DownloadSeriesMetadata
|
|
import dev.jdtech.jellyfin.models.PlayerItem
|
|
import dev.jdtech.jellyfin.utils.checkIfLoginRequired
|
|
import dev.jdtech.jellyfin.viewmodels.DownloadViewModel
|
|
import kotlinx.coroutines.launch
|
|
import timber.log.Timber
|
|
import java.util.*
|
|
|
|
@AndroidEntryPoint
|
|
class DownloadFragment : Fragment() {
|
|
|
|
private lateinit var binding: FragmentDownloadBinding
|
|
private val viewModel: DownloadViewModel by viewModels()
|
|
|
|
private lateinit var errorDialog: ErrorDialogFragment
|
|
|
|
override fun onCreateView(
|
|
inflater: LayoutInflater, container: ViewGroup?,
|
|
savedInstanceState: Bundle?
|
|
): View {
|
|
binding = FragmentDownloadBinding.inflate(inflater, container, false)
|
|
|
|
binding.downloadsRecyclerView.adapter = DownloadsListAdapter(
|
|
DownloadViewItemListAdapter.OnClickListener { item ->
|
|
navigateToMediaInfoFragment(item)
|
|
}, DownloadSeriesListAdapter.OnClickListener { item ->
|
|
navigateToDownloadSeriesFragment(item)
|
|
}
|
|
)
|
|
|
|
viewLifecycleOwner.lifecycleScope.launch {
|
|
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
|
|
viewModel.onUiState(viewLifecycleOwner.lifecycleScope) { uiState ->
|
|
Timber.d("$uiState")
|
|
when (uiState) {
|
|
is DownloadViewModel.UiState.Normal -> bindUiStateNormal(uiState)
|
|
is DownloadViewModel.UiState.Loading -> bindUiStateLoading()
|
|
is DownloadViewModel.UiState.Error -> bindUiStateError(uiState)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
binding.errorLayout.errorRetryButton.setOnClickListener {
|
|
viewModel.loadData()
|
|
}
|
|
|
|
binding.errorLayout.errorDetailsButton.setOnClickListener {
|
|
errorDialog.show(parentFragmentManager, "errordialog")
|
|
}
|
|
|
|
return binding.root
|
|
}
|
|
|
|
private fun bindUiStateNormal(uiState: DownloadViewModel.UiState.Normal) {
|
|
uiState.apply {
|
|
binding.noDownloadsText.isVisible = downloadSections.isEmpty()
|
|
|
|
val adapter = binding.downloadsRecyclerView.adapter as DownloadsListAdapter
|
|
adapter.submitList(downloadSections)
|
|
}
|
|
binding.loadingIndicator.isVisible = false
|
|
binding.downloadsRecyclerView.isVisible = true
|
|
binding.errorLayout.errorPanel.isVisible = false
|
|
}
|
|
|
|
private fun bindUiStateLoading() {
|
|
binding.loadingIndicator.isVisible = true
|
|
binding.errorLayout.errorPanel.isVisible = false
|
|
}
|
|
|
|
private fun bindUiStateError(uiState: DownloadViewModel.UiState.Error) {
|
|
errorDialog = ErrorDialogFragment(uiState.error)
|
|
binding.loadingIndicator.isVisible = false
|
|
binding.downloadsRecyclerView.isVisible = false
|
|
binding.errorLayout.errorPanel.isVisible = true
|
|
checkIfLoginRequired(uiState.error.message)
|
|
}
|
|
|
|
private fun navigateToMediaInfoFragment(item: PlayerItem) {
|
|
findNavController().navigate(
|
|
DownloadFragmentDirections.actionDownloadFragmentToMediaInfoFragment(
|
|
UUID.randomUUID(),
|
|
item.name,
|
|
item.item?.type?.type ?: "Unkown",
|
|
item,
|
|
isOffline = true
|
|
)
|
|
)
|
|
}
|
|
|
|
private fun navigateToDownloadSeriesFragment(series: DownloadSeriesMetadata) {
|
|
findNavController().navigate(
|
|
DownloadFragmentDirections.actionDownloadFragmentToDownloadSeriesFragment(
|
|
seriesMetadata = series,
|
|
seriesName = series.name
|
|
)
|
|
)
|
|
}
|
|
} |