Merge branch 'main' into material3
This commit is contained in:
commit
939a14abfe
35 changed files with 367 additions and 195 deletions
|
@ -9,17 +9,15 @@ plugins {
|
|||
}
|
||||
|
||||
android {
|
||||
compileSdk = 31
|
||||
compileSdk = 32
|
||||
buildToolsVersion = "32.0.0"
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "dev.jdtech.jellyfin"
|
||||
minSdk = 24
|
||||
targetSdk = 31
|
||||
minSdk = 26
|
||||
targetSdk = 32
|
||||
versionCode = 8
|
||||
versionName = "0.3.2"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
|
@ -47,7 +45,6 @@ android {
|
|||
}
|
||||
|
||||
compileOptions {
|
||||
isCoreLibraryDesugaringEnabled = true
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
@ -92,7 +89,7 @@ dependencies {
|
|||
implementation("androidx.recyclerview:recyclerview-selection:1.1.0")
|
||||
|
||||
// Room
|
||||
val roomVersion = "2.4.1"
|
||||
val roomVersion = "2.4.2"
|
||||
implementation("androidx.room:room-runtime:$roomVersion")
|
||||
kapt("androidx.room:room-compiler:$roomVersion")
|
||||
implementation("androidx.room:room-ktx:$roomVersion")
|
||||
|
@ -106,12 +103,12 @@ dependencies {
|
|||
implementation("org.jellyfin.sdk:jellyfin-core:$jellyfinVersion")
|
||||
|
||||
// Glide
|
||||
val glideVersion = "4.13.0"
|
||||
val glideVersion = "4.13.1"
|
||||
implementation("com.github.bumptech.glide:glide:$glideVersion")
|
||||
kapt("com.github.bumptech.glide:compiler:$glideVersion")
|
||||
|
||||
// Hilt
|
||||
val hiltVersion = "2.40.5"
|
||||
val hiltVersion = "2.41"
|
||||
implementation("com.google.dagger:hilt-android:$hiltVersion")
|
||||
kapt("com.google.dagger:hilt-compiler:$hiltVersion")
|
||||
|
||||
|
@ -128,14 +125,7 @@ dependencies {
|
|||
val timberVersion = "5.0.1"
|
||||
implementation("com.jakewharton.timber:timber:$timberVersion")
|
||||
|
||||
val aboutLibrariesVersion = "8.9.4"
|
||||
val aboutLibrariesVersion = "10.0.0"
|
||||
implementation("com.mikepenz:aboutlibraries-core:$aboutLibrariesVersion")
|
||||
implementation("com.mikepenz:aboutlibraries:$aboutLibrariesVersion")
|
||||
|
||||
// Testing
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
|
||||
|
||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
|
||||
}
|
|
@ -54,7 +54,7 @@ class MainActivity : AppCompatActivity() {
|
|||
|
||||
navController.addOnDestinationChangedListener { _, destination, _ ->
|
||||
binding.navView.visibility = when (destination.id) {
|
||||
R.id.settingsFragment, R.id.serverSelectFragment, R.id.addServerFragment, R.id.loginFragment, R.id.about_libraries_dest -> View.GONE
|
||||
R.id.twoPaneSettingsFragment, R.id.serverSelectFragment, R.id.addServerFragment, R.id.loginFragment, R.id.about_libraries_dest -> View.GONE
|
||||
else -> View.VISIBLE
|
||||
}
|
||||
if (destination.id == R.id.about_libraries_dest) binding.mainToolbar.title = getString(R.string.app_info)
|
||||
|
|
|
@ -135,6 +135,8 @@ class PlayerActivity : BasePlayerActivity() {
|
|||
this, resources.getString(R.string.select_subtile_track),
|
||||
viewModel.trackSelector, subtitleRenderer
|
||||
)
|
||||
trackSelectionDialogBuilder.setShowDisableOption(true)
|
||||
|
||||
val trackSelectionDialog = trackSelectionDialogBuilder.build()
|
||||
trackSelectionDialog.show()
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.content.res.ColorStateList
|
||||
import android.os.Bundle
|
||||
import android.util.TypedValue
|
||||
import android.view.LayoutInflater
|
||||
|
@ -108,9 +109,12 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() {
|
|||
binding.downloadButton.setOnClickListener {
|
||||
binding.downloadButton.isEnabled = false
|
||||
viewModel.loadDownloadRequestItem(episodeId)
|
||||
binding.downloadButton.setImageResource(R.drawable.ic_download_filled)
|
||||
//binding.downloadButton.setImageResource(android.R.color.transparent)
|
||||
//binding.progressDownload.isVisible = true
|
||||
binding.downloadButton.imageTintList = ColorStateList.valueOf(
|
||||
resources.getColor(
|
||||
R.color.red,
|
||||
requireActivity().theme
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
viewModel.loadEpisode(episodeId)
|
||||
|
@ -174,12 +178,12 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() {
|
|||
binding.downloadButtonWrapper.isVisible = true
|
||||
binding.downloadButton.isEnabled = !downloaded
|
||||
|
||||
// Download icon
|
||||
val downloadDrawable = when (downloaded) {
|
||||
true -> R.drawable.ic_download_filled
|
||||
false -> R.drawable.ic_download
|
||||
}
|
||||
binding.downloadButton.setImageResource(downloadDrawable)
|
||||
if (downloaded) binding.downloadButton.imageTintList = ColorStateList.valueOf(
|
||||
resources.getColor(
|
||||
R.color.red,
|
||||
requireActivity().theme
|
||||
)
|
||||
)
|
||||
}
|
||||
false -> {
|
||||
binding.downloadButtonWrapper.isVisible = false
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.content.Intent
|
||||
import android.content.res.ColorStateList
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
|
@ -75,7 +76,7 @@ class MediaInfoFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
|
||||
if(args.itemType != "Movie") {
|
||||
if (args.itemType != "Movie") {
|
||||
binding.downloadButton.visibility = View.GONE
|
||||
}
|
||||
|
||||
|
@ -112,7 +113,11 @@ class MediaInfoFragment : Fragment() {
|
|||
if (uuid != null) {
|
||||
navigateToPersonDetail(uuid)
|
||||
} else {
|
||||
Toast.makeText(requireContext(), R.string.error_getting_person_id, Toast.LENGTH_SHORT).show()
|
||||
Toast.makeText(
|
||||
requireContext(),
|
||||
R.string.error_getting_person_id,
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -167,7 +172,12 @@ class MediaInfoFragment : Fragment() {
|
|||
binding.downloadButton.setOnClickListener {
|
||||
binding.downloadButton.isEnabled = false
|
||||
viewModel.loadDownloadRequestItem(args.itemId)
|
||||
binding.downloadButton.setImageResource(R.drawable.ic_download_filled)
|
||||
binding.downloadButton.imageTintList = ColorStateList.valueOf(
|
||||
resources.getColor(
|
||||
R.color.red,
|
||||
requireActivity().theme
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -216,12 +226,12 @@ class MediaInfoFragment : Fragment() {
|
|||
binding.downloadButton.isVisible = true
|
||||
binding.downloadButton.isEnabled = !downloaded
|
||||
|
||||
// Download icon
|
||||
val downloadDrawable = when (downloaded) {
|
||||
true -> R.drawable.ic_download_filled
|
||||
false -> R.drawable.ic_download
|
||||
}
|
||||
binding.downloadButton.setImageResource(downloadDrawable)
|
||||
if (downloaded) binding.downloadButton.imageTintList = ColorStateList.valueOf(
|
||||
resources.getColor(
|
||||
R.color.red,
|
||||
requireActivity().theme
|
||||
)
|
||||
)
|
||||
}
|
||||
false -> {
|
||||
binding.downloadButton.isVisible = false
|
||||
|
@ -251,7 +261,12 @@ class MediaInfoFragment : Fragment() {
|
|||
binding.writers.text = writersString
|
||||
binding.description.text = item.overview
|
||||
binding.nextUpLayout.isVisible = nextUp != null
|
||||
binding.nextUpName.text = String.format(getString(R.string.episode_name_extended), nextUp?.parentIndexNumber, nextUp?.indexNumber, nextUp?.name)
|
||||
binding.nextUpName.text = String.format(
|
||||
getString(R.string.episode_name_extended),
|
||||
nextUp?.parentIndexNumber,
|
||||
nextUp?.indexNumber,
|
||||
nextUp?.name
|
||||
)
|
||||
binding.seasonsLayout.isVisible = seasons.isNotEmpty()
|
||||
val seasonsAdapter = binding.seasonsRecyclerView.adapter as ViewItemListAdapter
|
||||
seasonsAdapter.submitList(seasons)
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.preference.ListPreference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import dev.jdtech.jellyfin.R
|
||||
|
||||
@Suppress("unused")
|
||||
class SettingsAppearanceFragment : PreferenceFragmentCompat() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.fragment_settings_appearance, rootKey)
|
||||
|
||||
findPreference<ListPreference>("theme")?.setOnPreferenceChangeListener { _, newValue ->
|
||||
when (newValue) {
|
||||
"system" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
|
||||
"light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
||||
"dark" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import android.text.InputType
|
||||
import androidx.preference.EditTextPreference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import dev.jdtech.jellyfin.R
|
||||
|
||||
@Suppress("unused")
|
||||
class SettingsCacheFragment : PreferenceFragmentCompat() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.fragment_settings_cache, rootKey)
|
||||
|
||||
findPreference<EditTextPreference>("image_cache_size")?.setOnBindEditTextListener { editText ->
|
||||
editText.inputType = InputType.TYPE_CLASS_NUMBER
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.preference.EditTextPreference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import dev.jdtech.jellyfin.R
|
||||
import dev.jdtech.jellyfin.viewmodels.SettingsDeviceViewModel
|
||||
|
||||
@AndroidEntryPoint
|
||||
@Suppress("unused")
|
||||
class SettingsDeviceFragment : PreferenceFragmentCompat() {
|
||||
|
||||
private val viewModel: SettingsDeviceViewModel by viewModels()
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.fragment_settings_device, rootKey)
|
||||
|
||||
findPreference<EditTextPreference>("deviceName")?.setOnPreferenceChangeListener { _, name ->
|
||||
viewModel.updateDeviceName(name.toString())
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import dev.jdtech.jellyfin.R
|
||||
|
||||
@Suppress("unused")
|
||||
class SettingsDownloadsFragment : PreferenceFragmentCompat() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.fragment_settings_downloads, rootKey)
|
||||
}
|
||||
}
|
|
@ -3,40 +3,17 @@ package dev.jdtech.jellyfin.fragments
|
|||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.text.InputType
|
||||
import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
|
||||
import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
|
||||
import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
|
||||
import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.preference.EditTextPreference
|
||||
import androidx.preference.ListPreference
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import dev.jdtech.jellyfin.R
|
||||
import dev.jdtech.jellyfin.viewmodels.SettingsViewModel
|
||||
|
||||
@AndroidEntryPoint
|
||||
class SettingsFragment: PreferenceFragmentCompat() {
|
||||
|
||||
private val viewModel: SettingsViewModel by viewModels()
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.fragment_settings, rootKey)
|
||||
|
||||
findPreference<Preference>("switchServer")?.setOnPreferenceClickListener {
|
||||
findNavController().navigate(SettingsFragmentDirections.actionNavigationSettingsToServerSelectFragment2())
|
||||
true
|
||||
}
|
||||
|
||||
findPreference<ListPreference>("theme")?.setOnPreferenceChangeListener { _, newValue ->
|
||||
when (newValue) {
|
||||
"system" -> setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM)
|
||||
"light" -> setDefaultNightMode(MODE_NIGHT_NO)
|
||||
"dark" -> setDefaultNightMode(MODE_NIGHT_YES)
|
||||
}
|
||||
findNavController().navigate(TwoPaneSettingsFragmentDirections.actionNavigationSettingsToServerSelectFragment())
|
||||
true
|
||||
}
|
||||
|
||||
|
@ -50,16 +27,7 @@ class SettingsFragment: PreferenceFragmentCompat() {
|
|||
}
|
||||
|
||||
findPreference<Preference>("appInfo")?.setOnPreferenceClickListener {
|
||||
findNavController().navigate(SettingsFragmentDirections.actionSettingsFragmentToAboutLibraries())
|
||||
true
|
||||
}
|
||||
|
||||
findPreference<EditTextPreference>("image_cache_size")?.setOnBindEditTextListener { editText ->
|
||||
editText.inputType = InputType.TYPE_CLASS_NUMBER
|
||||
}
|
||||
|
||||
findPreference<EditTextPreference>("deviceName")?.setOnPreferenceChangeListener { _, name ->
|
||||
viewModel.updateDeviceName(name.toString())
|
||||
findNavController().navigate(TwoPaneSettingsFragmentDirections.actionSettingsFragmentToAboutLibraries())
|
||||
true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import dev.jdtech.jellyfin.R
|
||||
|
||||
@Suppress("unused")
|
||||
class SettingsLanguageFragment : PreferenceFragmentCompat() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.fragment_settings_language, rootKey)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import dev.jdtech.jellyfin.R
|
||||
|
||||
@Suppress("unused")
|
||||
class SettingsPlayerFragment : PreferenceFragmentCompat() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.fragment_settings_player, rootKey)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package dev.jdtech.jellyfin.fragments
|
||||
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceHeaderFragmentCompat
|
||||
|
||||
class TwoPaneSettingsFragment : PreferenceHeaderFragmentCompat() {
|
||||
override fun onCreatePreferenceHeader(): PreferenceFragmentCompat {
|
||||
return SettingsFragment()
|
||||
}
|
||||
}
|
|
@ -5,6 +5,7 @@ import android.content.Context
|
|||
import android.net.Uri
|
||||
import android.os.Environment
|
||||
import androidx.core.content.getSystemService
|
||||
import androidx.preference.PreferenceManager
|
||||
import dev.jdtech.jellyfin.database.DownloadDatabaseDao
|
||||
import dev.jdtech.jellyfin.models.DownloadItem
|
||||
import dev.jdtech.jellyfin.models.DownloadRequestItem
|
||||
|
@ -50,9 +51,13 @@ fun requestDownload(
|
|||
}
|
||||
|
||||
private fun downloadFile(request: DownloadManager.Request, context: Context): Long {
|
||||
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
val downloadOverData = preferences.getBoolean("download_mobile_data", false)
|
||||
val downloadWhenRoaming = preferences.getBoolean("download_roaming", false)
|
||||
|
||||
request.apply {
|
||||
setAllowedOverMetered(false)
|
||||
setAllowedOverRoaming(false)
|
||||
setAllowedOverMetered(downloadOverData)
|
||||
setAllowedOverRoaming(downloadWhenRoaming)
|
||||
}
|
||||
return context.getSystemService<DownloadManager>()!!.enqueue(request)
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ package dev.jdtech.jellyfin.viewmodels
|
|||
|
||||
import android.app.Application
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import androidx.lifecycle.*
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dev.jdtech.jellyfin.database.DownloadDatabaseDao
|
||||
|
@ -180,13 +179,8 @@ constructor(
|
|||
}
|
||||
|
||||
private fun getDateString(item: BaseItemDto): String {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
val instant = item.premiereDate?.toInstant(ZoneOffset.UTC)
|
||||
val date = Date.from(instant)
|
||||
DateFormat.getDateInstance(DateFormat.SHORT).format(date)
|
||||
} else {
|
||||
// TODO: Implement a way to get the year from LocalDateTime in Android < O
|
||||
item.premiereDate.toString()
|
||||
}
|
||||
val instant = item.premiereDate?.toInstant(ZoneOffset.UTC)
|
||||
val date = Date.from(instant)
|
||||
return DateFormat.getDateInstance(DateFormat.SHORT).format(date)
|
||||
}
|
||||
}
|
|
@ -2,7 +2,6 @@ package dev.jdtech.jellyfin.viewmodels
|
|||
|
||||
import android.app.Application
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import androidx.lifecycle.LifecycleCoroutineScope
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
|
@ -249,17 +248,11 @@ constructor(
|
|||
return when (item.status) {
|
||||
"Continuing" -> dateString.plus(" - Present")
|
||||
"Ended" -> {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
return if (item.productionYear == item.endDate?.year) {
|
||||
dateString
|
||||
} else {
|
||||
dateString.plus(" - ${item.endDate?.year}")
|
||||
}
|
||||
} else {
|
||||
// TODO: Implement a way to get the year from LocalDateTime in Android < O
|
||||
return if (item.productionYear == item.endDate?.year) {
|
||||
dateString
|
||||
} else {
|
||||
dateString.plus(" - ${item.endDate?.year}")
|
||||
}
|
||||
|
||||
}
|
||||
else -> dateString
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ import org.jellyfin.sdk.model.api.DeviceOptions
|
|||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
internal class SettingsViewModel @Inject internal constructor(
|
||||
internal class SettingsDeviceViewModel @Inject internal constructor(
|
||||
private val api: JellyfinApi
|
||||
) : ViewModel() {
|
||||
|
|
@ -2,7 +2,8 @@
|
|||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:pathData="M21,15v4a2,2 0,0 1,-2 2H5a2,2 0,0 1,-2 -2v-4"
|
||||
android:strokeLineJoin="round"
|
||||
|
|
49
app/src/main/res/drawable/ic_languages.xml
Normal file
49
app/src/main/res/drawable/ic_languages.xml
Normal file
|
@ -0,0 +1,49 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:pathData="M5,8l6,6"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M4,14l6,-6 2,-3"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M2,5h12"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M7,2h1"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M22,22l-5,-10 -5,10"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M14,18h6"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
</vector>
|
|
@ -2,7 +2,8 @@
|
|||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:pathData="M5,3l14,9l-14,9l0,-18z"
|
||||
android:strokeLineJoin="round"
|
||||
|
|
|
@ -2,26 +2,20 @@
|
|||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:pathData="M21,15v4a2,2 0,0 1,-2 2H5a2,2 0,0 1,-2 -2v-4"
|
||||
android:pathData="M7,2L17,2A2,2 0,0 1,19 4L19,20A2,2 0,0 1,17 22L7,22A2,2 0,0 1,5 20L5,4A2,2 0,0 1,7 2z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@color/red"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M7,10l5,5l5,-5"
|
||||
android:pathData="M12,18h0.01"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@color/red"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M12,15L12,3"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="@color/red"
|
||||
android:strokeColor="@android:color/white"
|
||||
android:strokeLineCap="round"/>
|
||||
</vector>
|
|
@ -148,7 +148,8 @@
|
|||
android:foreground="@drawable/ripple_background"
|
||||
android:paddingHorizontal="24dp"
|
||||
android:paddingVertical="12dp"
|
||||
android:src="@drawable/ic_play" />
|
||||
android:src="@drawable/ic_play"
|
||||
app:tint="@android:color/white" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_circular"
|
||||
|
@ -195,7 +196,8 @@
|
|||
android:background="@drawable/button_accent_background"
|
||||
android:contentDescription="@string/download_button_description"
|
||||
android:padding="12dp"
|
||||
android:src="@drawable/ic_download" />
|
||||
android:src="@drawable/ic_download"
|
||||
app:tint="@android:color/white" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_download"
|
||||
|
|
|
@ -132,7 +132,8 @@
|
|||
android:foreground="@drawable/ripple_background"
|
||||
android:paddingHorizontal="24dp"
|
||||
android:paddingVertical="12dp"
|
||||
android:src="@drawable/ic_play" />
|
||||
android:src="@drawable/ic_play"
|
||||
app:tint="@android:color/white" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_circular"
|
||||
|
@ -184,7 +185,8 @@
|
|||
android:contentDescription="@string/download_button_description"
|
||||
android:padding="12dp"
|
||||
android:src="@drawable/ic_download"
|
||||
android:visibility="gone" />
|
||||
android:visibility="gone"
|
||||
app:tint="@android:color/white" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/delete_button"
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
app:destination="@id/episodeBottomSheetFragment" />
|
||||
<action
|
||||
android:id="@+id/action_navigation_home_to_navigation_settings"
|
||||
app:destination="@id/settingsFragment"
|
||||
app:destination="@id/twoPaneSettingsFragment"
|
||||
app:enterAnim="@anim/nav_default_enter_anim"
|
||||
app:exitAnim="@anim/nav_default_exit_anim"
|
||||
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
|
||||
|
@ -59,16 +59,20 @@
|
|||
</fragment>
|
||||
|
||||
<fragment
|
||||
android:id="@+id/settingsFragment"
|
||||
android:name="dev.jdtech.jellyfin.fragments.SettingsFragment"
|
||||
android:id="@+id/twoPaneSettingsFragment"
|
||||
android:name="dev.jdtech.jellyfin.fragments.TwoPaneSettingsFragment"
|
||||
android:label="@string/title_settings">
|
||||
<action
|
||||
android:id="@+id/action_navigation_settings_to_serverSelectFragment2"
|
||||
android:id="@+id/action_navigation_settings_to_serverSelectFragment"
|
||||
app:destination="@id/serverSelectFragment" />
|
||||
<action
|
||||
android:id="@+id/action_settingsFragment_to_about_libraries"
|
||||
app:destination="@id/about_libraries" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/settingsFragment"
|
||||
android:name="dev.jdtech.jellyfin.fragments.SettingsFragment">
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/libraryFragment"
|
||||
android:name="dev.jdtech.jellyfin.fragments.LibraryFragment"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
app:destination="@id/mediaDetailFragment" />
|
||||
<action
|
||||
android:id="@+id/action_navigation_home_to_settings"
|
||||
app:destination="@id/settingsFragment"
|
||||
app:destination="@id/twoPaneSettingsFragment"
|
||||
app:enterAnim="@anim/nav_default_enter_anim"
|
||||
app:exitAnim="@anim/nav_default_exit_anim"
|
||||
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
|
||||
|
@ -76,7 +76,7 @@
|
|||
</fragment>
|
||||
|
||||
<fragment
|
||||
android:id="@+id/settingsFragment"
|
||||
android:id="@+id/twoPaneSettingsFragment"
|
||||
android:name="dev.jdtech.jellyfin.fragments.SettingsFragment"
|
||||
android:label="@string/title_settings">
|
||||
</fragment>
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
<string name="initializing">Initializing…</string>
|
||||
<string name="settings_category_servers">Servers</string>
|
||||
<string name="settings_category_player">Player</string>
|
||||
<string name="settings_category_download">Downloads</string>
|
||||
<string name="manage_servers">Manage servers</string>
|
||||
<string name="settings_category_appearance">Appearance</string>
|
||||
<string name="device_name">Device name</string>
|
||||
|
@ -80,6 +81,8 @@
|
|||
<string name="select_subtile_track">Select subtitle track</string>
|
||||
<string name="select_playback_speed">Select playback speed</string>
|
||||
<string name="mpv_player">MPV Player</string>
|
||||
<string name="download_mobile_data">Download using mobile data</string>
|
||||
<string name="download_roaming">Download when roaming</string>
|
||||
<string name="mpv_player_summary">Use the experimental MPV Player to play videos. MPV has support for more video, audio and subtitle codecs.</string>
|
||||
<string name="force_software_decoding">Force software decoding</string>
|
||||
<string name="force_software_decoding_summary">Disable hardware decoding and use software decoding. Can be useful if hardware decoding gives weird artifacts.</string>
|
||||
|
|
|
@ -1,84 +1,39 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<PreferenceCategory app:title="@string/settings_category_language">
|
||||
<Preference
|
||||
app:fragment="dev.jdtech.jellyfin.fragments.SettingsLanguageFragment"
|
||||
app:title="@string/settings_category_language"
|
||||
app:icon="@drawable/ic_languages"/>
|
||||
|
||||
<ListPreference
|
||||
app:defaultValue="null"
|
||||
app:entries="@array/languages"
|
||||
app:entryValues="@array/languages_values"
|
||||
app:icon="@drawable/ic_speaker"
|
||||
app:key="audio_language"
|
||||
app:title="@string/settings_preferred_audio_language"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
<Preference
|
||||
app:icon="@drawable/ic_server"
|
||||
app:key="switchServer"
|
||||
app:title="@string/manage_servers" />
|
||||
|
||||
<ListPreference
|
||||
app:defaultValue="null"
|
||||
app:entries="@array/languages"
|
||||
app:entryValues="@array/languages_values"
|
||||
app:icon="@drawable/ic_closed_caption"
|
||||
app:key="subtitle_language"
|
||||
app:title="@string/settings_preferred_subtitle_language"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
<Preference
|
||||
app:fragment="dev.jdtech.jellyfin.fragments.SettingsAppearanceFragment"
|
||||
app:icon="@drawable/ic_palette"
|
||||
app:title="@string/settings_category_appearance" />
|
||||
|
||||
</PreferenceCategory>
|
||||
<Preference
|
||||
app:fragment="dev.jdtech.jellyfin.fragments.SettingsDownloadsFragment"
|
||||
app:icon="@drawable/ic_download"
|
||||
app:title="@string/settings_category_download"/>
|
||||
|
||||
<PreferenceCategory app:title="@string/settings_category_servers">
|
||||
<Preference
|
||||
app:fragment="dev.jdtech.jellyfin.fragments.SettingsPlayerFragment"
|
||||
app:icon="@drawable/ic_play"
|
||||
app:title="@string/settings_category_player" />
|
||||
|
||||
<Preference
|
||||
app:icon="@drawable/ic_server"
|
||||
app:key="switchServer"
|
||||
app:title="@string/manage_servers" />
|
||||
<Preference
|
||||
app:fragment="dev.jdtech.jellyfin.fragments.SettingsDeviceFragment"
|
||||
app:title="@string/settings_category_device"
|
||||
app:icon="@drawable/ic_smartphone" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory app:title="@string/settings_category_appearance">
|
||||
<ListPreference
|
||||
app:defaultValue="system"
|
||||
app:entries="@array/themes"
|
||||
app:entryValues="@array/themes_value"
|
||||
app:icon="@drawable/ic_palette"
|
||||
app:key="theme"
|
||||
app:title="@string/theme"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory app:title="@string/settings_category_player">
|
||||
<SwitchPreference
|
||||
app:key="mpv_player"
|
||||
app:summary="@string/mpv_player_summary"
|
||||
app:title="@string/mpv_player" />
|
||||
<SwitchPreference
|
||||
app:dependency="mpv_player"
|
||||
app:key="mpv_disable_hwdec"
|
||||
app:summary="@string/force_software_decoding_summary"
|
||||
app:title="@string/force_software_decoding" />
|
||||
<SwitchPreference
|
||||
app:key="display_extended_title"
|
||||
app:summary="@string/display_extended_title_summary"
|
||||
app:title="@string/display_extended_title" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory app:title="@string/settings_category_device">
|
||||
<EditTextPreference
|
||||
app:key="deviceName"
|
||||
app:title="@string/device_name"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory app:title="@string/settings_category_cache">
|
||||
<SwitchPreference
|
||||
app:key="use_image_cache"
|
||||
app:summary="@string/settings_use_cache_summary"
|
||||
app:title="@string/settings_use_cache_title" />
|
||||
<EditTextPreference
|
||||
app:defaultValue="250"
|
||||
app:dependency="use_image_cache"
|
||||
app:dialogMessage="@string/settings_cache_size_message"
|
||||
app:key="image_cache_size"
|
||||
app:title="@string/settings_cache_size"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceCategory>
|
||||
<Preference
|
||||
app:fragment="dev.jdtech.jellyfin.fragments.SettingsCacheFragment"
|
||||
app:title="@string/settings_category_cache" />
|
||||
|
||||
<PreferenceCategory app:title="@string/about">
|
||||
|
||||
|
|
10
app/src/main/res/xml/fragment_settings_appearance.xml
Normal file
10
app/src/main/res/xml/fragment_settings_appearance.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<ListPreference
|
||||
app:defaultValue="system"
|
||||
app:entries="@array/themes"
|
||||
app:entryValues="@array/themes_value"
|
||||
app:key="theme"
|
||||
app:title="@string/theme"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceScreen>
|
14
app/src/main/res/xml/fragment_settings_cache.xml
Normal file
14
app/src/main/res/xml/fragment_settings_cache.xml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<SwitchPreference
|
||||
app:key="use_image_cache"
|
||||
app:summary="@string/settings_use_cache_summary"
|
||||
app:title="@string/settings_use_cache_title" />
|
||||
<EditTextPreference
|
||||
app:defaultValue="250"
|
||||
app:dependency="use_image_cache"
|
||||
app:dialogMessage="@string/settings_cache_size_message"
|
||||
app:key="image_cache_size"
|
||||
app:title="@string/settings_cache_size"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceScreen>
|
7
app/src/main/res/xml/fragment_settings_device.xml
Normal file
7
app/src/main/res/xml/fragment_settings_device.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<EditTextPreference
|
||||
app:key="deviceName"
|
||||
app:title="@string/device_name"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceScreen>
|
12
app/src/main/res/xml/fragment_settings_downloads.xml
Normal file
12
app/src/main/res/xml/fragment_settings_downloads.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<SwitchPreference
|
||||
app:key="download_mobile_data"
|
||||
app:title="@string/download_mobile_data"
|
||||
android:defaultValue="false" />
|
||||
<SwitchPreference
|
||||
app:key="download_roaming"
|
||||
app:title="@string/download_roaming"
|
||||
android:defaultValue="false" />
|
||||
</PreferenceScreen>
|
20
app/src/main/res/xml/fragment_settings_language.xml
Normal file
20
app/src/main/res/xml/fragment_settings_language.xml
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<ListPreference
|
||||
app:defaultValue="null"
|
||||
app:entries="@array/languages"
|
||||
app:entryValues="@array/languages_values"
|
||||
app:icon="@drawable/ic_speaker"
|
||||
app:key="audio_language"
|
||||
app:title="@string/settings_preferred_audio_language"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<ListPreference
|
||||
app:defaultValue="null"
|
||||
app:entries="@array/languages"
|
||||
app:entryValues="@array/languages_values"
|
||||
app:icon="@drawable/ic_closed_caption"
|
||||
app:key="subtitle_language"
|
||||
app:title="@string/settings_preferred_subtitle_language"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceScreen>
|
16
app/src/main/res/xml/fragment_settings_player.xml
Normal file
16
app/src/main/res/xml/fragment_settings_player.xml
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<SwitchPreference
|
||||
app:key="mpv_player"
|
||||
app:summary="@string/mpv_player_summary"
|
||||
app:title="@string/mpv_player" />
|
||||
<SwitchPreference
|
||||
app:dependency="mpv_player"
|
||||
app:key="mpv_disable_hwdec"
|
||||
app:summary="@string/force_software_decoding_summary"
|
||||
app:title="@string/force_software_decoding" />
|
||||
<SwitchPreference
|
||||
app:key="display_extended_title"
|
||||
app:summary="@string/display_extended_title_summary"
|
||||
app:title="@string/display_extended_title" />
|
||||
</PreferenceScreen>
|
|
@ -8,7 +8,7 @@ buildscript {
|
|||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath("com.android.tools.build:gradle:7.1.1")
|
||||
classpath("com.android.tools.build:gradle:7.1.2")
|
||||
|
||||
val kotlinVersion = "1.6.10"
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
|
||||
|
@ -16,13 +16,12 @@ buildscript {
|
|||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle.kts files
|
||||
val navVersion = "2.4.1"
|
||||
// NOTE: 2.5.0-alpha01 is used because 2.4.0 is incompatible with AGP 7.1
|
||||
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$navVersion")
|
||||
|
||||
val hiltVersion = "2.40.5"
|
||||
val hiltVersion = "2.41"
|
||||
classpath("com.google.dagger:hilt-android-gradle-plugin:$hiltVersion")
|
||||
|
||||
val aboutLibrariesVersion = "8.9.4"
|
||||
val aboutLibrariesVersion = "10.0.0"
|
||||
classpath("com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$aboutLibrariesVersion")
|
||||
}
|
||||
}
|
||||
|
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
|||
#Sat May 29 10:38:39 CEST 2021
|
||||
#Tue Mar 08 18:30:46 CET 2022
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|
Loading…
Reference in a new issue