diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8dde33ea..7488998a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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") } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt index 9dbdfd79..d0f6f975 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt @@ -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) diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index 61391794..e1754aeb 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -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() } 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 3742bc47..bdeaf39d 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -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 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 531cc015..c20cf9d4 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -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) diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt new file mode 100644 index 00000000..f45c4237 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt @@ -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("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 + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt new file mode 100644 index 00000000..f0586fb2 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt @@ -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("image_cache_size")?.setOnBindEditTextListener { editText -> + editText.inputType = InputType.TYPE_CLASS_NUMBER + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt new file mode 100644 index 00000000..aeea1b5c --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt @@ -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("deviceName")?.setOnPreferenceChangeListener { _, name -> + viewModel.updateDeviceName(name.toString()) + true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt new file mode 100644 index 00000000..cb5e4994 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt @@ -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) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt index d6885aad..dcbf4ba5 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt @@ -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("switchServer")?.setOnPreferenceClickListener { - findNavController().navigate(SettingsFragmentDirections.actionNavigationSettingsToServerSelectFragment2()) - true - } - - findPreference("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("appInfo")?.setOnPreferenceClickListener { - findNavController().navigate(SettingsFragmentDirections.actionSettingsFragmentToAboutLibraries()) - true - } - - findPreference("image_cache_size")?.setOnBindEditTextListener { editText -> - editText.inputType = InputType.TYPE_CLASS_NUMBER - } - - findPreference("deviceName")?.setOnPreferenceChangeListener { _, name -> - viewModel.updateDeviceName(name.toString()) + findNavController().navigate(TwoPaneSettingsFragmentDirections.actionSettingsFragmentToAboutLibraries()) true } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt new file mode 100644 index 00000000..213f9f5f --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt @@ -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) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt new file mode 100644 index 00000000..95bf0d59 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt @@ -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) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt new file mode 100644 index 00000000..c79de4f5 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt @@ -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() + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt b/app/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt index f6be45cb..11c1bd5f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt @@ -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()!!.enqueue(request) } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt index 0c8d9e70..4ca87da5 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -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) } } \ 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 cca8a007..2230c8fd 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -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 } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt similarity index 90% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt rename to app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt index 8109ec71..5ba864f2 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt @@ -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() { diff --git a/app/src/main/res/drawable/ic_download.xml b/app/src/main/res/drawable/ic_download.xml index ea8168ae..12958641 100644 --- a/app/src/main/res/drawable/ic_download.xml +++ b/app/src/main/res/drawable/ic_download.xml @@ -2,7 +2,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?attr/colorControlNormal"> + + + + + + + diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml index 17da1f55..0bf84f11 100644 --- a/app/src/main/res/drawable/ic_play.xml +++ b/app/src/main/res/drawable/ic_play.xml @@ -2,7 +2,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?attr/colorControlNormal"> + android:viewportHeight="24" + android:tint="?attr/colorControlNormal"> - diff --git a/app/src/main/res/layout/episode_bottom_sheet.xml b/app/src/main/res/layout/episode_bottom_sheet.xml index 4137c56c..d1980b91 100644 --- a/app/src/main/res/layout/episode_bottom_sheet.xml +++ b/app/src/main/res/layout/episode_bottom_sheet.xml @@ -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" /> + android:src="@drawable/ic_download" + app:tint="@android:color/white" /> + android:src="@drawable/ic_play" + app:tint="@android:color/white" /> + android:visibility="gone" + app:tint="@android:color/white" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5222d7b9..9af0dded 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,6 +57,7 @@ Initializing… Servers Player + Downloads Manage servers Appearance Device name @@ -80,6 +81,8 @@ Select subtitle track Select playback speed MPV Player + Download using mobile data + Download when roaming Use the experimental MPV Player to play videos. MPV has support for more video, audio and subtitle codecs. Force software decoding Disable hardware decoding and use software decoding. Can be useful if hardware decoding gives weird artifacts. diff --git a/app/src/main/res/xml/fragment_settings.xml b/app/src/main/res/xml/fragment_settings.xml index a927abd1..a346cf2d 100644 --- a/app/src/main/res/xml/fragment_settings.xml +++ b/app/src/main/res/xml/fragment_settings.xml @@ -1,84 +1,39 @@ - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/xml/fragment_settings_appearance.xml b/app/src/main/res/xml/fragment_settings_appearance.xml new file mode 100644 index 00000000..2c5cf939 --- /dev/null +++ b/app/src/main/res/xml/fragment_settings_appearance.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/fragment_settings_cache.xml b/app/src/main/res/xml/fragment_settings_cache.xml new file mode 100644 index 00000000..104cac8c --- /dev/null +++ b/app/src/main/res/xml/fragment_settings_cache.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/fragment_settings_device.xml b/app/src/main/res/xml/fragment_settings_device.xml new file mode 100644 index 00000000..98b709d7 --- /dev/null +++ b/app/src/main/res/xml/fragment_settings_device.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/fragment_settings_downloads.xml b/app/src/main/res/xml/fragment_settings_downloads.xml new file mode 100644 index 00000000..e245447d --- /dev/null +++ b/app/src/main/res/xml/fragment_settings_downloads.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/fragment_settings_language.xml b/app/src/main/res/xml/fragment_settings_language.xml new file mode 100644 index 00000000..bdbd99e4 --- /dev/null +++ b/app/src/main/res/xml/fragment_settings_language.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/fragment_settings_player.xml b/app/src/main/res/xml/fragment_settings_player.xml new file mode 100644 index 00000000..9877327a --- /dev/null +++ b/app/src/main/res/xml/fragment_settings_player.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index b8a95df2..b520ddd6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -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") } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8aeb67f6..3fdcbff2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -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