Big cleanup and refactoring
This commit is contained in:
parent
25ee7d05af
commit
f460c25a92
24 changed files with 130 additions and 93 deletions
|
@ -4,5 +4,4 @@ import android.app.Application
|
||||||
import dagger.hilt.android.HiltAndroidApp
|
import dagger.hilt.android.HiltAndroidApp
|
||||||
|
|
||||||
@HiltAndroidApp
|
@HiltAndroidApp
|
||||||
class BaseApplication : Application() {
|
class BaseApplication : Application()
|
||||||
}
|
|
|
@ -10,8 +10,6 @@ import dev.jdtech.jellyfin.databinding.NextUpSectionBinding
|
||||||
import dev.jdtech.jellyfin.databinding.ViewItemBinding
|
import dev.jdtech.jellyfin.databinding.ViewItemBinding
|
||||||
import dev.jdtech.jellyfin.models.HomeSection
|
import dev.jdtech.jellyfin.models.HomeSection
|
||||||
import dev.jdtech.jellyfin.models.View
|
import dev.jdtech.jellyfin.models.View
|
||||||
import org.jellyfin.sdk.model.api.BaseItemDto
|
|
||||||
import java.lang.ClassCastException
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
private const val ITEM_VIEW_TYPE_NEXT_UP = 0
|
private const val ITEM_VIEW_TYPE_NEXT_UP = 0
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package dev.jdtech.jellyfin.api
|
package dev.jdtech.jellyfin.api
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.Log
|
|
||||||
import dev.jdtech.jellyfin.BuildConfig
|
import dev.jdtech.jellyfin.BuildConfig
|
||||||
import org.jellyfin.sdk.Jellyfin
|
import org.jellyfin.sdk.Jellyfin
|
||||||
import org.jellyfin.sdk.android
|
import org.jellyfin.sdk.android
|
||||||
|
|
|
@ -6,21 +6,20 @@ import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.lifecycle.ViewModelProvider
|
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import dev.jdtech.jellyfin.R
|
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentAddServerBinding
|
import dev.jdtech.jellyfin.databinding.FragmentAddServerBinding
|
||||||
import dev.jdtech.jellyfin.viewmodels.AddServerViewModel
|
import dev.jdtech.jellyfin.viewmodels.AddServerViewModel
|
||||||
|
|
||||||
class AddServerFragment : Fragment() {
|
class AddServerFragment : Fragment() {
|
||||||
|
|
||||||
|
private lateinit var binding: FragmentAddServerBinding
|
||||||
private val viewModel: AddServerViewModel by viewModels()
|
private val viewModel: AddServerViewModel by viewModels()
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
inflater: LayoutInflater, container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View {
|
): View {
|
||||||
val binding = FragmentAddServerBinding.inflate(inflater)
|
binding = FragmentAddServerBinding.inflate(inflater)
|
||||||
|
|
||||||
binding.lifecycleOwner = this
|
binding.lifecycleOwner = this
|
||||||
binding.viewModel = viewModel
|
binding.viewModel = viewModel
|
||||||
|
@ -37,8 +36,7 @@ class AddServerFragment : Fragment() {
|
||||||
|
|
||||||
viewModel.navigateToLogin.observe(viewLifecycleOwner, {
|
viewModel.navigateToLogin.observe(viewLifecycleOwner, {
|
||||||
if (it) {
|
if (it) {
|
||||||
this.findNavController().navigate(R.id.action_addServerFragment_to_loginFragment)
|
navigateToLoginFragment()
|
||||||
viewModel.onNavigateToLoginDone()
|
|
||||||
}
|
}
|
||||||
binding.progressCircular.visibility = View.GONE
|
binding.progressCircular.visibility = View.GONE
|
||||||
})
|
})
|
||||||
|
@ -49,4 +47,9 @@ class AddServerFragment : Fragment() {
|
||||||
|
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun navigateToLoginFragment() {
|
||||||
|
findNavController().navigate(AddServerFragmentDirections.actionAddServerFragmentToLoginFragment())
|
||||||
|
viewModel.onNavigateToLoginDone()
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -14,13 +14,18 @@ import dev.jdtech.jellyfin.viewmodels.EpisodeBottomSheetViewModelFactory
|
||||||
class EpisodeBottomSheetFragment : BottomSheetDialogFragment() {
|
class EpisodeBottomSheetFragment : BottomSheetDialogFragment() {
|
||||||
private val args: EpisodeBottomSheetFragmentArgs by navArgs()
|
private val args: EpisodeBottomSheetFragmentArgs by navArgs()
|
||||||
|
|
||||||
|
private lateinit var binding: EpisodeBottomSheetBinding
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View {
|
): View {
|
||||||
val binding = EpisodeBottomSheetBinding.inflate(inflater, container, false)
|
binding = EpisodeBottomSheetBinding.inflate(inflater, container, false)
|
||||||
val viewModelFactory = EpisodeBottomSheetViewModelFactory(requireNotNull(this.activity).application, args.episodeId)
|
val viewModelFactory = EpisodeBottomSheetViewModelFactory(
|
||||||
|
requireNotNull(this.activity).application,
|
||||||
|
args.episodeId
|
||||||
|
)
|
||||||
val viewModel: EpisodeBottomSheetViewModel by viewModels { viewModelFactory }
|
val viewModel: EpisodeBottomSheetViewModel by viewModels { viewModelFactory }
|
||||||
|
|
||||||
binding.lifecycleOwner = this
|
binding.lifecycleOwner = this
|
||||||
|
|
|
@ -6,7 +6,6 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.lifecycle.ViewModelProvider
|
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import dev.jdtech.jellyfin.R
|
import dev.jdtech.jellyfin.R
|
||||||
import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter
|
import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter
|
||||||
|
@ -14,9 +13,11 @@ import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
|
||||||
import dev.jdtech.jellyfin.adapters.ViewListAdapter
|
import dev.jdtech.jellyfin.adapters.ViewListAdapter
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentHomeBinding
|
import dev.jdtech.jellyfin.databinding.FragmentHomeBinding
|
||||||
import dev.jdtech.jellyfin.viewmodels.HomeViewModel
|
import dev.jdtech.jellyfin.viewmodels.HomeViewModel
|
||||||
|
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||||
|
|
||||||
class HomeFragment : Fragment() {
|
class HomeFragment : Fragment() {
|
||||||
|
|
||||||
|
private lateinit var binding: FragmentHomeBinding
|
||||||
private val viewModel: HomeViewModel by viewModels()
|
private val viewModel: HomeViewModel by viewModels()
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
|
@ -24,40 +25,21 @@ class HomeFragment : Fragment() {
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View {
|
): View {
|
||||||
val binding = FragmentHomeBinding.inflate(inflater, container, false)
|
binding = FragmentHomeBinding.inflate(inflater, container, false)
|
||||||
|
|
||||||
binding.lifecycleOwner = this
|
binding.lifecycleOwner = this
|
||||||
binding.viewModel = viewModel
|
binding.viewModel = viewModel
|
||||||
binding.viewsRecyclerView.adapter = ViewListAdapter(ViewListAdapter.OnClickListener {
|
binding.viewsRecyclerView.adapter = ViewListAdapter(ViewListAdapter.OnClickListener {
|
||||||
findNavController().navigate(
|
navigateToLibraryFragment(it)
|
||||||
HomeFragmentDirections.actionNavigationHomeToLibraryFragment(
|
|
||||||
it.id,
|
|
||||||
it.name
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}, ViewItemListAdapter.OnClickListener {
|
}, ViewItemListAdapter.OnClickListener {
|
||||||
findNavController().navigate(
|
navigateToMediaInfoFragment(it)
|
||||||
HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment(
|
}, HomeEpisodeListAdapter.OnClickListener { item ->
|
||||||
it.id,
|
when (item.type) {
|
||||||
it.name
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}, HomeEpisodeListAdapter.OnClickListener {
|
|
||||||
when (it.type) {
|
|
||||||
"Episode" -> {
|
"Episode" -> {
|
||||||
findNavController().navigate(
|
navigateToEpisodeBottomSheetFragment(item)
|
||||||
HomeFragmentDirections.actionNavigationHomeToEpisodeBottomSheetFragment(
|
|
||||||
it.id
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
"Movie" -> {
|
"Movie" -> {
|
||||||
findNavController().navigate(
|
navigateToMediaInfoFragment(item)
|
||||||
HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment(
|
|
||||||
it.id,
|
|
||||||
it.name
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,11 +50,7 @@ class HomeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
viewModel.finishedLoading.observe(viewLifecycleOwner, {
|
viewModel.finishedLoading.observe(viewLifecycleOwner, {
|
||||||
if (it) {
|
binding.loadingIndicator.visibility = if (it) View.GONE else View.VISIBLE
|
||||||
binding.loadingIndicator.visibility = View.GONE
|
|
||||||
} else {
|
|
||||||
binding.loadingIndicator.visibility = View.VISIBLE
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.error.observe(viewLifecycleOwner, {
|
viewModel.error.observe(viewLifecycleOwner, {
|
||||||
|
@ -87,4 +65,30 @@ class HomeFragment : Fragment() {
|
||||||
|
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun navigateToLibraryFragment(view: dev.jdtech.jellyfin.models.View) {
|
||||||
|
findNavController().navigate(
|
||||||
|
HomeFragmentDirections.actionNavigationHomeToLibraryFragment(
|
||||||
|
view.id,
|
||||||
|
view.name
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun navigateToMediaInfoFragment(item: BaseItemDto) {
|
||||||
|
findNavController().navigate(
|
||||||
|
HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment(
|
||||||
|
item.id,
|
||||||
|
item.name
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) {
|
||||||
|
findNavController().navigate(
|
||||||
|
HomeFragmentDirections.actionNavigationHomeToEpisodeBottomSheetFragment(
|
||||||
|
episode.id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -12,6 +12,7 @@ import dev.jdtech.jellyfin.viewmodels.LibraryViewModel
|
||||||
import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
|
import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding
|
import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding
|
||||||
import dev.jdtech.jellyfin.viewmodels.LibraryViewModelFactory
|
import dev.jdtech.jellyfin.viewmodels.LibraryViewModelFactory
|
||||||
|
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||||
|
|
||||||
class LibraryFragment : Fragment() {
|
class LibraryFragment : Fragment() {
|
||||||
|
|
||||||
|
@ -37,13 +38,17 @@ class LibraryFragment : Fragment() {
|
||||||
val viewModel: LibraryViewModel by viewModels { viewModelFactory }
|
val viewModel: LibraryViewModel by viewModels { viewModelFactory }
|
||||||
binding.viewModel = viewModel
|
binding.viewModel = viewModel
|
||||||
binding.itemsRecyclerView.adapter =
|
binding.itemsRecyclerView.adapter =
|
||||||
ViewItemListAdapter(ViewItemListAdapter.OnClickListener {
|
ViewItemListAdapter(ViewItemListAdapter.OnClickListener { item ->
|
||||||
findNavController().navigate(
|
navigateToMediaInfoFragment(item)
|
||||||
LibraryFragmentDirections.actionLibraryFragmentToMediaInfoFragment(
|
|
||||||
it.id,
|
|
||||||
it.name
|
|
||||||
)
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun navigateToMediaInfoFragment(item: BaseItemDto) {
|
||||||
|
findNavController().navigate(
|
||||||
|
LibraryFragmentDirections.actionLibraryFragmentToMediaInfoFragment(
|
||||||
|
item.id,
|
||||||
|
item.name
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,13 +1,12 @@
|
||||||
package dev.jdtech.jellyfin.fragments
|
package dev.jdtech.jellyfin.fragments
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import dev.jdtech.jellyfin.R
|
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentLoginBinding
|
import dev.jdtech.jellyfin.databinding.FragmentLoginBinding
|
||||||
import dev.jdtech.jellyfin.viewmodels.LoginViewModel
|
import dev.jdtech.jellyfin.viewmodels.LoginViewModel
|
||||||
|
|
||||||
|
@ -38,11 +37,15 @@ class LoginFragment : Fragment() {
|
||||||
|
|
||||||
viewModel.navigateToMain.observe(viewLifecycleOwner, {
|
viewModel.navigateToMain.observe(viewLifecycleOwner, {
|
||||||
if (it) {
|
if (it) {
|
||||||
findNavController().navigate(R.id.action_loginFragment_to_mainActivity)
|
navigateToMainActivity()
|
||||||
viewModel.doneNavigatingToMain()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun navigateToMainActivity() {
|
||||||
|
findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToMainActivity())
|
||||||
|
viewModel.doneNavigatingToMain()
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -6,14 +6,15 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.lifecycle.ViewModelProvider
|
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import dev.jdtech.jellyfin.adapters.CollectionListAdapter
|
import dev.jdtech.jellyfin.adapters.CollectionListAdapter
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentMediaBinding
|
import dev.jdtech.jellyfin.databinding.FragmentMediaBinding
|
||||||
import dev.jdtech.jellyfin.viewmodels.MediaViewModel
|
import dev.jdtech.jellyfin.viewmodels.MediaViewModel
|
||||||
|
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||||
|
|
||||||
class MediaFragment : Fragment() {
|
class MediaFragment : Fragment() {
|
||||||
|
|
||||||
|
private lateinit var binding: FragmentMediaBinding
|
||||||
private val viewModel: MediaViewModel by viewModels()
|
private val viewModel: MediaViewModel by viewModels()
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
|
@ -21,27 +22,30 @@ class MediaFragment : Fragment() {
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View {
|
): View {
|
||||||
val binding = FragmentMediaBinding.inflate(inflater, container, false)
|
binding = FragmentMediaBinding.inflate(inflater, container, false)
|
||||||
|
|
||||||
binding.lifecycleOwner = this
|
binding.lifecycleOwner = this
|
||||||
binding.viewModel = viewModel
|
binding.viewModel = viewModel
|
||||||
binding.viewsRecyclerView.adapter =
|
binding.viewsRecyclerView.adapter =
|
||||||
CollectionListAdapter(CollectionListAdapter.OnClickListener { library ->
|
CollectionListAdapter(CollectionListAdapter.OnClickListener { library ->
|
||||||
|
nagivateToLibraryFragment(library)
|
||||||
|
})
|
||||||
|
|
||||||
|
viewModel.finishedLoading.observe(viewLifecycleOwner, {
|
||||||
|
if (it) {
|
||||||
|
binding.loadingIndicator.visibility = View.GONE
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun nagivateToLibraryFragment(library: BaseItemDto) {
|
||||||
findNavController().navigate(
|
findNavController().navigate(
|
||||||
MediaFragmentDirections.actionNavigationMediaToLibraryFragment(
|
MediaFragmentDirections.actionNavigationMediaToLibraryFragment(
|
||||||
library.id,
|
library.id,
|
||||||
library.name
|
library.name
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
viewModel.finishedLoading.observe(viewLifecycleOwner, {
|
|
||||||
if (it) {
|
|
||||||
binding.loadingIncicator.visibility = View.GONE
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return binding.root
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -15,6 +15,7 @@ import dev.jdtech.jellyfin.adapters.ViewItemListAdapter
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentMediaInfoBinding
|
import dev.jdtech.jellyfin.databinding.FragmentMediaInfoBinding
|
||||||
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel
|
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel
|
||||||
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModelFactory
|
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModelFactory
|
||||||
|
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||||
|
|
||||||
class MediaInfoFragment : Fragment() {
|
class MediaInfoFragment : Fragment() {
|
||||||
|
|
||||||
|
@ -54,12 +55,15 @@ class MediaInfoFragment : Fragment() {
|
||||||
})
|
})
|
||||||
|
|
||||||
binding.trailerButton.setOnClickListener {
|
binding.trailerButton.setOnClickListener {
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(viewModel.item.value?.remoteTrailers?.get(0)?.url))
|
val intent = Intent(
|
||||||
|
Intent.ACTION_VIEW,
|
||||||
|
Uri.parse(viewModel.item.value?.remoteTrailers?.get(0)?.url)
|
||||||
|
)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.nextUp.setOnClickListener {
|
binding.nextUp.setOnClickListener {
|
||||||
findNavController().navigate(MediaInfoFragmentDirections.actionMediaInfoFragmentToEpisodeBottomSheetFragment(viewModel.nextUp.value!!.id))
|
navigateToEpisodeBottomSheetFragment(viewModel.nextUp.value!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.seasonsRecyclerView.adapter =
|
binding.seasonsRecyclerView.adapter =
|
||||||
|
@ -76,4 +80,11 @@ class MediaInfoFragment : Fragment() {
|
||||||
binding.peopleRecyclerView.adapter = PersonListAdapter()
|
binding.peopleRecyclerView.adapter = PersonListAdapter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) {
|
||||||
|
findNavController().navigate(
|
||||||
|
MediaInfoFragmentDirections.actionMediaInfoFragmentToEpisodeBottomSheetFragment(
|
||||||
|
episode.id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -12,6 +12,7 @@ import dev.jdtech.jellyfin.adapters.EpisodeListAdapter
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentSeasonBinding
|
import dev.jdtech.jellyfin.databinding.FragmentSeasonBinding
|
||||||
import dev.jdtech.jellyfin.viewmodels.SeasonViewModel
|
import dev.jdtech.jellyfin.viewmodels.SeasonViewModel
|
||||||
import dev.jdtech.jellyfin.viewmodels.SeasonViewModelFactory
|
import dev.jdtech.jellyfin.viewmodels.SeasonViewModelFactory
|
||||||
|
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||||
|
|
||||||
class SeasonFragment : Fragment() {
|
class SeasonFragment : Fragment() {
|
||||||
|
|
||||||
|
@ -38,12 +39,8 @@ class SeasonFragment : Fragment() {
|
||||||
val viewModel: SeasonViewModel by viewModels { viewModelFactory }
|
val viewModel: SeasonViewModel by viewModels { viewModelFactory }
|
||||||
binding.viewModel = viewModel
|
binding.viewModel = viewModel
|
||||||
binding.episodesRecyclerView.adapter =
|
binding.episodesRecyclerView.adapter =
|
||||||
EpisodeListAdapter(EpisodeListAdapter.OnClickListener {
|
EpisodeListAdapter(EpisodeListAdapter.OnClickListener { episode ->
|
||||||
findNavController().navigate(
|
navigateToEpisodeBottomSheetFragment(episode)
|
||||||
SeasonFragmentDirections.actionSeasonFragmentToEpisodeBottomSheetFragment(
|
|
||||||
it.id
|
|
||||||
)
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
binding.seriesName.text = args.seriesName
|
binding.seriesName.text = args.seriesName
|
||||||
binding.seasonName.text = args.seasonName
|
binding.seasonName.text = args.seasonName
|
||||||
|
@ -51,4 +48,11 @@ class SeasonFragment : Fragment() {
|
||||||
binding.seasonId = args.seasonId
|
binding.seasonId = args.seasonId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) {
|
||||||
|
findNavController().navigate(
|
||||||
|
SeasonFragmentDirections.actionSeasonFragmentToEpisodeBottomSheetFragment(
|
||||||
|
episode.id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -13,7 +13,6 @@ import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.jellyfin.sdk.model.api.BaseItemDto
|
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||||
import org.jellyfin.sdk.model.api.BaseItemPerson
|
import org.jellyfin.sdk.model.api.BaseItemPerson
|
||||||
import org.jellyfin.sdk.model.api.PersonLookupInfo
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewModel(application) {
|
class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewModel(application) {
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:spanCount="@integer/library_colums"
|
app:spanCount="@integer/library_columns"
|
||||||
tools:itemCount="6"
|
tools:itemCount="6"
|
||||||
tools:listitem="@layout/base_item" />
|
tools:listitem="@layout/base_item" />
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
tools:context=".fragments.MediaFragment">
|
tools:context=".fragments.MediaFragment">
|
||||||
|
|
||||||
<com.google.android.material.progressindicator.CircularProgressIndicator
|
<com.google.android.material.progressindicator.CircularProgressIndicator
|
||||||
android:id="@+id/loading_incicator"
|
android:id="@+id/loading_indicator"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:indeterminate="true"
|
android:indeterminate="true"
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:spanCount="@integer/collection_colums"
|
app:spanCount="@integer/collection_columns"
|
||||||
tools:itemCount="4"
|
tools:itemCount="4"
|
||||||
tools:listitem="@layout/collection_item" />
|
tools:listitem="@layout/collection_item" />
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,8 @@
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:ignore="ContentDescription" />
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
|
|
@ -34,14 +34,15 @@
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/item_banner"
|
android:id="@+id/item_banner"
|
||||||
itemBackdropById="@{seriesId}"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="200dp"
|
android:layout_height="200dp"
|
||||||
android:scaleType="centerCrop"
|
android:scaleType="centerCrop"
|
||||||
|
app:itemBackdropById="@{seriesId}"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
android:contentDescription="@string/series_poster"/>
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
app:layout_constraintTop_toBottomOf="@+id/image_banner"
|
app:layout_constraintTop_toBottomOf="@+id/image_banner"
|
||||||
app:layout_constraintVertical_bias="0.36"
|
app:layout_constraintVertical_bias="0.36"
|
||||||
app:servers="@{viewModel.servers}"
|
app:servers="@{viewModel.servers}"
|
||||||
app:spanCount="@integer/server_colums"
|
app:spanCount="@integer/server_columns"
|
||||||
tools:itemCount="4"
|
tools:itemCount="4"
|
||||||
tools:listitem="@layout/server_item" />
|
tools:listitem="@layout/server_item" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources>
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.Jellyfin" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
<style name="Theme.Jellyfin" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<dimen name="setup_container_width">400dp</dimen>
|
<dimen name="setup_container_width">400dp</dimen>
|
||||||
<item name="server_colums" type="integer">6</item>
|
<item name="server_columns" type="integer">6</item>
|
||||||
<item name="collection_colums" type="integer">2</item>
|
<item name="collection_columns" type="integer">2</item>
|
||||||
<item name="library_colums" type="integer">4</item>
|
<item name="library_columns" type="integer">4</item>
|
||||||
<item name="recyclerview_animation_duration" type="integer">450</item>
|
<item name="recyclerview_animation_duration" type="integer">450</item>
|
||||||
</resources>
|
</resources>
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<item name="server_colums" type="integer">8</item>
|
<item name="server_columns" type="integer">8</item>
|
||||||
<item name="collection_colums" type="integer">3</item>
|
<item name="collection_columns" type="integer">3</item>
|
||||||
<item name="library_colums" type="integer">6</item>
|
<item name="library_columns" type="integer">6</item>
|
||||||
</resources>
|
</resources>
|
|
@ -4,8 +4,8 @@
|
||||||
<item name="wrap_content" type="dimen">-2</item>
|
<item name="wrap_content" type="dimen">-2</item>
|
||||||
<dimen name="setup_container_width">@dimen/match_parent</dimen>
|
<dimen name="setup_container_width">@dimen/match_parent</dimen>
|
||||||
<dimen name="overview_media_width">150dp</dimen>
|
<dimen name="overview_media_width">150dp</dimen>
|
||||||
<item name="server_colums" type="integer">3</item>
|
<item name="server_columns" type="integer">3</item>
|
||||||
<item name="collection_colums" type="integer">1</item>
|
<item name="collection_columns" type="integer">1</item>
|
||||||
<item name="library_colums" type="integer">2</item>
|
<item name="library_columns" type="integer">2</item>
|
||||||
<item name="recyclerview_animation_duration" type="integer">250</item>
|
<item name="recyclerview_animation_duration" type="integer">250</item>
|
||||||
</resources>
|
</resources>
|
|
@ -37,4 +37,5 @@
|
||||||
<string name="next_up">Next Up</string>
|
<string name="next_up">Next Up</string>
|
||||||
<string name="continue_watching">Continue Watching</string>
|
<string name="continue_watching">Continue Watching</string>
|
||||||
<string name="latest_library">Latest %1$s</string>
|
<string name="latest_library">Latest %1$s</string>
|
||||||
|
<string name="series_poster">Series poster</string>
|
||||||
</resources>
|
</resources>
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources>
|
||||||
|
|
||||||
<style name="setup_button">
|
<style name="setup_button">
|
||||||
<item name="android:layout_height">48dp</item>
|
<item name="android:layout_height">48dp</item>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources>
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.Jellyfin" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
<style name="Theme.Jellyfin" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
|
|
Loading…
Reference in a new issue