Big cleanup and refactoring

This commit is contained in:
Jarne Demeulemeester 2021-07-05 22:38:20 +02:00
parent 25ee7d05af
commit f460c25a92
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
24 changed files with 130 additions and 93 deletions

View file

@ -4,5 +4,4 @@ import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class BaseApplication : Application() {
}
class BaseApplication : Application()

View file

@ -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

View file

@ -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

View file

@ -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()
}
}

View file

@ -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

View file

@ -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
)
)
}
}

View file

@ -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
)
)
}
}

View file

@ -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()
}
}

View file

@ -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
)
)
}
}

View file

@ -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
)
)
}
}

View file

@ -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
)
)
}
}

View file

@ -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) {

View file

@ -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" />

View file

@ -17,7 +17,7 @@
tools:context=".fragments.MediaFragment">
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/loading_incicator"
android:id="@+id/loading_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
@ -40,7 +40,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:spanCount="@integer/collection_colums"
app:spanCount="@integer/collection_columns"
tools:itemCount="4"
tools:listitem="@layout/collection_item" />

View file

@ -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" />
<FrameLayout
android:layout_width="0dp"

View file

@ -34,14 +34,15 @@
<ImageView
android:id="@+id/item_banner"
itemBackdropById="@{seriesId}"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
app:itemBackdropById="@{seriesId}"
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"
android:contentDescription="@string/series_poster"/>
<FrameLayout
android:layout_width="0dp"

View file

@ -61,7 +61,7 @@
app:layout_constraintTop_toBottomOf="@+id/image_banner"
app:layout_constraintVertical_bias="0.36"
app:servers="@{viewModel.servers}"
app:spanCount="@integer/server_colums"
app:spanCount="@integer/server_columns"
tools:itemCount="4"
tools:listitem="@layout/server_item" />
</LinearLayout>

View file

@ -1,4 +1,4 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<resources>
<!-- Base application theme. -->
<style name="Theme.Jellyfin" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="setup_container_width">400dp</dimen>
<item name="server_colums" type="integer">6</item>
<item name="collection_colums" type="integer">2</item>
<item name="library_colums" type="integer">4</item>
<item name="server_columns" type="integer">6</item>
<item name="collection_columns" type="integer">2</item>
<item name="library_columns" type="integer">4</item>
<item name="recyclerview_animation_duration" type="integer">450</item>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="server_colums" type="integer">8</item>
<item name="collection_colums" type="integer">3</item>
<item name="library_colums" type="integer">6</item>
<item name="server_columns" type="integer">8</item>
<item name="collection_columns" type="integer">3</item>
<item name="library_columns" type="integer">6</item>
</resources>

View file

@ -4,8 +4,8 @@
<item name="wrap_content" type="dimen">-2</item>
<dimen name="setup_container_width">@dimen/match_parent</dimen>
<dimen name="overview_media_width">150dp</dimen>
<item name="server_colums" type="integer">3</item>
<item name="collection_colums" type="integer">1</item>
<item name="library_colums" type="integer">2</item>
<item name="server_columns" type="integer">3</item>
<item name="collection_columns" type="integer">1</item>
<item name="library_columns" type="integer">2</item>
<item name="recyclerview_animation_duration" type="integer">250</item>
</resources>

View file

@ -37,4 +37,5 @@
<string name="next_up">Next Up</string>
<string name="continue_watching">Continue Watching</string>
<string name="latest_library">Latest %1$s</string>
<string name="series_poster">Series poster</string>
</resources>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<resources>
<style name="setup_button">
<item name="android:layout_height">48dp</item>

View file

@ -1,4 +1,4 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<resources>
<!-- Base application theme. -->
<style name="Theme.Jellyfin" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->