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 import dagger.hilt.android.HiltAndroidApp
@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.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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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