From f460c25a929001b0576b6d0da2b9f2a3e4934f0f Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Mon, 5 Jul 2021 22:38:20 +0200 Subject: [PATCH] Big cleanup and refactoring --- .../dev/jdtech/jellyfin/BaseApplication.kt | 3 +- .../jellyfin/adapters/ViewListAdapter.kt | 2 - .../dev/jdtech/jellyfin/api/JellyfinApi.kt | 1 - .../jellyfin/fragments/AddServerFragment.kt | 13 ++-- .../fragments/EpisodeBottomSheetFragment.kt | 9 ++- .../jdtech/jellyfin/fragments/HomeFragment.kt | 68 ++++++++++--------- .../jellyfin/fragments/LibraryFragment.kt | 19 ++++-- .../jellyfin/fragments/LoginFragment.kt | 11 +-- .../jellyfin/fragments/MediaFragment.kt | 24 ++++--- .../jellyfin/fragments/MediaInfoFragment.kt | 15 +++- .../jellyfin/fragments/SeasonFragment.kt | 16 +++-- .../jellyfin/viewmodels/MediaInfoViewModel.kt | 1 - app/src/main/res/layout/fragment_library.xml | 2 +- app/src/main/res/layout/fragment_media.xml | 4 +- .../main/res/layout/fragment_media_info.xml | 3 +- app/src/main/res/layout/fragment_season.xml | 5 +- .../res/layout/fragment_server_select.xml | 2 +- app/src/main/res/values-night/themes.xml | 2 +- app/src/main/res/values-sw600dp/dimens.xml | 6 +- app/src/main/res/values-sw720dp/dimens.xml | 6 +- app/src/main/res/values/dimens.xml | 6 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 2 +- app/src/main/res/values/themes.xml | 2 +- 24 files changed, 130 insertions(+), 93 deletions(-) diff --git a/app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt b/app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt index 8eaf1312..fd427166 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt @@ -4,5 +4,4 @@ import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp -class BaseApplication : Application() { -} \ No newline at end of file +class BaseApplication : Application() \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt b/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt index cb21f4ce..2cd14a15 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt @@ -10,8 +10,6 @@ import dev.jdtech.jellyfin.databinding.NextUpSectionBinding import dev.jdtech.jellyfin.databinding.ViewItemBinding import dev.jdtech.jellyfin.models.HomeSection import dev.jdtech.jellyfin.models.View -import org.jellyfin.sdk.model.api.BaseItemDto -import java.lang.ClassCastException import java.util.* private const val ITEM_VIEW_TYPE_NEXT_UP = 0 diff --git a/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt b/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt index 201530eb..441b58bf 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt @@ -1,7 +1,6 @@ package dev.jdtech.jellyfin.api import android.content.Context -import android.util.Log import dev.jdtech.jellyfin.BuildConfig import org.jellyfin.sdk.Jellyfin import org.jellyfin.sdk.android diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt index 5389a18d..bf1a150f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt @@ -6,21 +6,20 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController -import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.databinding.FragmentAddServerBinding import dev.jdtech.jellyfin.viewmodels.AddServerViewModel class AddServerFragment : Fragment() { + private lateinit var binding: FragmentAddServerBinding private val viewModel: AddServerViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val binding = FragmentAddServerBinding.inflate(inflater) + binding = FragmentAddServerBinding.inflate(inflater) binding.lifecycleOwner = this binding.viewModel = viewModel @@ -37,8 +36,7 @@ class AddServerFragment : Fragment() { viewModel.navigateToLogin.observe(viewLifecycleOwner, { if (it) { - this.findNavController().navigate(R.id.action_addServerFragment_to_loginFragment) - viewModel.onNavigateToLoginDone() + navigateToLoginFragment() } binding.progressCircular.visibility = View.GONE }) @@ -49,4 +47,9 @@ class AddServerFragment : Fragment() { return binding.root } + + private fun navigateToLoginFragment() { + findNavController().navigate(AddServerFragmentDirections.actionAddServerFragmentToLoginFragment()) + viewModel.onNavigateToLoginDone() + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt index 83823522..53e3f7e6 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -14,13 +14,18 @@ import dev.jdtech.jellyfin.viewmodels.EpisodeBottomSheetViewModelFactory class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { private val args: EpisodeBottomSheetFragmentArgs by navArgs() + private lateinit var binding: EpisodeBottomSheetBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val binding = EpisodeBottomSheetBinding.inflate(inflater, container, false) - val viewModelFactory = EpisodeBottomSheetViewModelFactory(requireNotNull(this.activity).application, args.episodeId) + binding = EpisodeBottomSheetBinding.inflate(inflater, container, false) + val viewModelFactory = EpisodeBottomSheetViewModelFactory( + requireNotNull(this.activity).application, + args.episodeId + ) val viewModel: EpisodeBottomSheetViewModel by viewModels { viewModelFactory } binding.lifecycleOwner = this diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt index ab5af83c..55b41b6c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt @@ -6,7 +6,6 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import dev.jdtech.jellyfin.R 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.databinding.FragmentHomeBinding import dev.jdtech.jellyfin.viewmodels.HomeViewModel +import org.jellyfin.sdk.model.api.BaseItemDto class HomeFragment : Fragment() { + private lateinit var binding: FragmentHomeBinding private val viewModel: HomeViewModel by viewModels() override fun onCreateView( @@ -24,40 +25,21 @@ class HomeFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - val binding = FragmentHomeBinding.inflate(inflater, container, false) + binding = FragmentHomeBinding.inflate(inflater, container, false) binding.lifecycleOwner = this binding.viewModel = viewModel binding.viewsRecyclerView.adapter = ViewListAdapter(ViewListAdapter.OnClickListener { - findNavController().navigate( - HomeFragmentDirections.actionNavigationHomeToLibraryFragment( - it.id, - it.name - ) - ) + navigateToLibraryFragment(it) }, ViewItemListAdapter.OnClickListener { - findNavController().navigate( - HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment( - it.id, - it.name - ) - ) - }, HomeEpisodeListAdapter.OnClickListener { - when (it.type) { + navigateToMediaInfoFragment(it) + }, HomeEpisodeListAdapter.OnClickListener { item -> + when (item.type) { "Episode" -> { - findNavController().navigate( - HomeFragmentDirections.actionNavigationHomeToEpisodeBottomSheetFragment( - it.id - ) - ) + navigateToEpisodeBottomSheetFragment(item) } "Movie" -> { - findNavController().navigate( - HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment( - it.id, - it.name - ) - ) + navigateToMediaInfoFragment(item) } } @@ -68,11 +50,7 @@ class HomeFragment : Fragment() { } viewModel.finishedLoading.observe(viewLifecycleOwner, { - if (it) { - binding.loadingIndicator.visibility = View.GONE - } else { - binding.loadingIndicator.visibility = View.VISIBLE - } + binding.loadingIndicator.visibility = if (it) View.GONE else View.VISIBLE }) viewModel.error.observe(viewLifecycleOwner, { @@ -87,4 +65,30 @@ class HomeFragment : Fragment() { 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 + ) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt index b5b78c56..b31add2b 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt @@ -12,6 +12,7 @@ import dev.jdtech.jellyfin.viewmodels.LibraryViewModel import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding import dev.jdtech.jellyfin.viewmodels.LibraryViewModelFactory +import org.jellyfin.sdk.model.api.BaseItemDto class LibraryFragment : Fragment() { @@ -37,13 +38,17 @@ class LibraryFragment : Fragment() { val viewModel: LibraryViewModel by viewModels { viewModelFactory } binding.viewModel = viewModel binding.itemsRecyclerView.adapter = - ViewItemListAdapter(ViewItemListAdapter.OnClickListener { - findNavController().navigate( - LibraryFragmentDirections.actionLibraryFragmentToMediaInfoFragment( - it.id, - it.name - ) - ) + ViewItemListAdapter(ViewItemListAdapter.OnClickListener { item -> + navigateToMediaInfoFragment(item) }) } + + private fun navigateToMediaInfoFragment(item: BaseItemDto) { + findNavController().navigate( + LibraryFragmentDirections.actionLibraryFragmentToMediaInfoFragment( + item.id, + item.name + ) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt index 9db19b3f..5ef6ac28 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt @@ -1,13 +1,12 @@ package dev.jdtech.jellyfin.fragments import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController -import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.databinding.FragmentLoginBinding import dev.jdtech.jellyfin.viewmodels.LoginViewModel @@ -38,11 +37,15 @@ class LoginFragment : Fragment() { viewModel.navigateToMain.observe(viewLifecycleOwner, { if (it) { - findNavController().navigate(R.id.action_loginFragment_to_mainActivity) - viewModel.doneNavigatingToMain() + navigateToMainActivity() } }) return binding.root } + + private fun navigateToMainActivity() { + findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToMainActivity()) + viewModel.doneNavigatingToMain() + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt index d81e471f..75014455 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt @@ -6,14 +6,15 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import dev.jdtech.jellyfin.adapters.CollectionListAdapter import dev.jdtech.jellyfin.databinding.FragmentMediaBinding import dev.jdtech.jellyfin.viewmodels.MediaViewModel +import org.jellyfin.sdk.model.api.BaseItemDto class MediaFragment : Fragment() { + private lateinit var binding: FragmentMediaBinding private val viewModel: MediaViewModel by viewModels() override fun onCreateView( @@ -21,27 +22,30 @@ class MediaFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - val binding = FragmentMediaBinding.inflate(inflater, container, false) + binding = FragmentMediaBinding.inflate(inflater, container, false) binding.lifecycleOwner = this binding.viewModel = viewModel binding.viewsRecyclerView.adapter = CollectionListAdapter(CollectionListAdapter.OnClickListener { library -> - findNavController().navigate( - MediaFragmentDirections.actionNavigationMediaToLibraryFragment( - library.id, - library.name - ) - ) - + nagivateToLibraryFragment(library) }) viewModel.finishedLoading.observe(viewLifecycleOwner, { if (it) { - binding.loadingIncicator.visibility = View.GONE + binding.loadingIndicator.visibility = View.GONE } }) return binding.root } + + private fun nagivateToLibraryFragment(library: BaseItemDto) { + findNavController().navigate( + MediaFragmentDirections.actionNavigationMediaToLibraryFragment( + library.id, + library.name + ) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt index 173f0c8e..9bc7b896 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -15,6 +15,7 @@ import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.databinding.FragmentMediaInfoBinding import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModelFactory +import org.jellyfin.sdk.model.api.BaseItemDto class MediaInfoFragment : Fragment() { @@ -54,12 +55,15 @@ class MediaInfoFragment : Fragment() { }) 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) } binding.nextUp.setOnClickListener { - findNavController().navigate(MediaInfoFragmentDirections.actionMediaInfoFragmentToEpisodeBottomSheetFragment(viewModel.nextUp.value!!.id)) + navigateToEpisodeBottomSheetFragment(viewModel.nextUp.value!!) } binding.seasonsRecyclerView.adapter = @@ -76,4 +80,11 @@ class MediaInfoFragment : Fragment() { binding.peopleRecyclerView.adapter = PersonListAdapter() } + private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) { + findNavController().navigate( + MediaInfoFragmentDirections.actionMediaInfoFragmentToEpisodeBottomSheetFragment( + episode.id + ) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt index 671126ff..1f77784b 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt @@ -12,6 +12,7 @@ import dev.jdtech.jellyfin.adapters.EpisodeListAdapter import dev.jdtech.jellyfin.databinding.FragmentSeasonBinding import dev.jdtech.jellyfin.viewmodels.SeasonViewModel import dev.jdtech.jellyfin.viewmodels.SeasonViewModelFactory +import org.jellyfin.sdk.model.api.BaseItemDto class SeasonFragment : Fragment() { @@ -38,12 +39,8 @@ class SeasonFragment : Fragment() { val viewModel: SeasonViewModel by viewModels { viewModelFactory } binding.viewModel = viewModel binding.episodesRecyclerView.adapter = - EpisodeListAdapter(EpisodeListAdapter.OnClickListener { - findNavController().navigate( - SeasonFragmentDirections.actionSeasonFragmentToEpisodeBottomSheetFragment( - it.id - ) - ) + EpisodeListAdapter(EpisodeListAdapter.OnClickListener { episode -> + navigateToEpisodeBottomSheetFragment(episode) }) binding.seriesName.text = args.seriesName binding.seasonName.text = args.seasonName @@ -51,4 +48,11 @@ class SeasonFragment : Fragment() { binding.seasonId = args.seasonId } + private fun navigateToEpisodeBottomSheetFragment(episode: BaseItemDto) { + findNavController().navigate( + SeasonFragmentDirections.actionSeasonFragmentToEpisodeBottomSheetFragment( + episode.id + ) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt index ecfcebd4..3081a924 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -13,7 +13,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemPerson -import org.jellyfin.sdk.model.api.PersonLookupInfo import java.util.* class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewModel(application) { diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 02fcd406..5396719e 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -26,7 +26,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:spanCount="@integer/library_colums" + app:spanCount="@integer/library_columns" tools:itemCount="6" tools:listitem="@layout/base_item" /> diff --git a/app/src/main/res/layout/fragment_media.xml b/app/src/main/res/layout/fragment_media.xml index 9e802c9a..7db4be56 100644 --- a/app/src/main/res/layout/fragment_media.xml +++ b/app/src/main/res/layout/fragment_media.xml @@ -17,7 +17,7 @@ tools:context=".fragments.MediaFragment"> diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index 747b70e7..eab58a34 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -36,7 +36,8 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:ignore="ContentDescription" /> + app:layout_constraintTop_toTopOf="parent" + android:contentDescription="@string/series_poster"/> diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 1774d697..e0f2e01d 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,4 +1,4 @@ - +