From 786e4d21a03e1ad38636a1e4d124a3b172153759 Mon Sep 17 00:00:00 2001 From: Michael Arkhangelskiy <38901444+MichaelArkh@users.noreply.github.com> Date: Sat, 19 Feb 2022 08:58:46 -0500 Subject: [PATCH 1/8] Add switch to toggle downloads over mobile network (#85) * Added switch to toggle downloads over mobile network * Add roaming and mobile data functions --- .../dev/jdtech/jellyfin/utils/DownloadUtilities.kt | 9 +++++++-- app/src/main/res/values/strings.xml | 3 +++ app/src/main/res/xml/fragment_settings.xml | 14 +++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) 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/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..827ce45e 100644 --- a/app/src/main/res/xml/fragment_settings.xml +++ b/app/src/main/res/xml/fragment_settings.xml @@ -1,5 +1,6 @@ - + @@ -43,6 +44,17 @@ app:useSimpleSummaryProvider="true" /> + + + + + Date: Sat, 19 Feb 2022 17:33:58 +0100 Subject: [PATCH 2/8] Redesign settings to two pane layout (#90) * Redesign settings to two pane layout * Add downloads settings * Suppress unused settings fragments warnings * Fix download icon in other places Also removes the filled download drawable --- .../java/dev/jdtech/jellyfin/MainActivity.kt | 2 +- .../fragments/EpisodeBottomSheetFragment.kt | 22 ++-- .../jellyfin/fragments/MediaInfoFragment.kt | 35 ++++-- .../fragments/SettingsAppearanceFragment.kt | 23 ++++ .../fragments/SettingsCacheFragment.kt | 18 +++ .../fragments/SettingsDeviceFragment.kt | 25 ++++ .../fragments/SettingsDownloadsFragment.kt | 12 ++ .../jellyfin/fragments/SettingsFragment.kt | 36 +----- .../fragments/SettingsLanguageFragment.kt | 12 ++ .../fragments/SettingsPlayerFragment.kt | 12 ++ .../fragments/TwoPaneSettingsFragment.kt | 10 ++ ...iewModel.kt => SettingsDeviceViewModel.kt} | 2 +- app/src/main/res/drawable/ic_download.xml | 3 +- app/src/main/res/drawable/ic_languages.xml | 49 ++++++++ app/src/main/res/drawable/ic_play.xml | 3 +- ..._download_filled.xml => ic_smartphone.xml} | 18 +-- .../main/res/layout/episode_bottom_sheet.xml | 6 +- .../main/res/layout/fragment_media_info.xml | 6 +- .../main/res/navigation/app_navigation.xml | 12 +- app/src/main/res/navigation/tv_navigation.xml | 4 +- app/src/main/res/xml/fragment_settings.xml | 113 +++++------------- .../res/xml/fragment_settings_appearance.xml | 10 ++ .../main/res/xml/fragment_settings_cache.xml | 14 +++ .../main/res/xml/fragment_settings_device.xml | 7 ++ .../res/xml/fragment_settings_downloads.xml | 12 ++ .../res/xml/fragment_settings_language.xml | 20 ++++ .../main/res/xml/fragment_settings_player.xml | 16 +++ 27 files changed, 338 insertions(+), 164 deletions(-) create mode 100644 app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt rename app/src/main/java/dev/jdtech/jellyfin/viewmodels/{SettingsViewModel.kt => SettingsDeviceViewModel.kt} (90%) create mode 100644 app/src/main/res/drawable/ic_languages.xml rename app/src/main/res/drawable/{ic_download_filled.xml => ic_smartphone.xml} (50%) create mode 100644 app/src/main/res/xml/fragment_settings_appearance.xml create mode 100644 app/src/main/res/xml/fragment_settings_cache.xml create mode 100644 app/src/main/res/xml/fragment_settings_device.xml create mode 100644 app/src/main/res/xml/fragment_settings_downloads.xml create mode 100644 app/src/main/res/xml/fragment_settings_language.xml create mode 100644 app/src/main/res/xml/fragment_settings_player.xml 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/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/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/xml/fragment_settings.xml b/app/src/main/res/xml/fragment_settings.xml index 827ce45e..a346cf2d 100644 --- a/app/src/main/res/xml/fragment_settings.xml +++ b/app/src/main/res/xml/fragment_settings.xml @@ -1,96 +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 From 4b47d3b8de575692ad9baaeea539e36e1c81b05a Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester <32322857+jarnedemeulemeester@users.noreply.github.com> Date: Sat, 26 Feb 2022 16:06:47 +0100 Subject: [PATCH 3/8] Target SDK 32, up minimum to 26 (#97) minSdk 24 -> 26 targetSdk 31 -> 32 compileSdk 31 -> 32 --- app/build.gradle.kts | 6 +++--- .../viewmodels/EpisodeBottomSheetViewModel.kt | 12 +++--------- .../jellyfin/viewmodels/MediaInfoViewModel.kt | 13 +++---------- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8dde33ea..bc2e0e9a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,13 +9,13 @@ 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" 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 } From 3af6fc3ce21803dc2dc7c3a3eb40ce66d53d8eea Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Sat, 26 Feb 2022 17:49:40 +0100 Subject: [PATCH 4/8] Upgrade dependencies Android Gradle plugin 7.1.1 -> 7.1.2 hilt 2.40.5 -> 2.41 room 2.4.1 -> 2.4.2 glide 4.13.0 -> 4.13.1 --- app/build.gradle.kts | 6 +++--- build.gradle.kts | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bc2e0e9a..55f5b755 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -92,7 +92,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 +106,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") diff --git a/build.gradle.kts b/build.gradle.kts index b8a95df2..f064fb4e 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,10 +16,9 @@ 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" From 88308134746c864e3691ead0a60feb007c402276 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 6 Mar 2022 12:28:20 +0100 Subject: [PATCH 5/8] Add option to turn off subtitles (#100) --- app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt | 2 ++ 1 file changed, 2 insertions(+) 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() } From ab25b97d99d8aa85f5a51980cea37a1b8ec680da Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Tue, 8 Mar 2022 18:38:49 +0100 Subject: [PATCH 6/8] Upgrade gradle 7.2 -> 7.4 --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 2e1e02cb0755c4b9a85f265e2af51a1c7672fe73 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Sat, 12 Mar 2022 15:10:29 +0100 Subject: [PATCH 7/8] Upgrade AboutLibraries 8.9.4 -> 10.0.0 --- app/build.gradle.kts | 2 +- build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 55f5b755..30026887 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -128,7 +128,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") diff --git a/build.gradle.kts b/build.gradle.kts index f064fb4e..b520ddd6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,7 +21,7 @@ buildscript { 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") } } From 964659af010920d4f54e8ae222ddc77549f53fd9 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Sat, 12 Mar 2022 15:31:57 +0100 Subject: [PATCH 8/8] Remove coreLibraryDesugaring and testing dependencies Testing dependencies may be added again later when we finally start writing some tests. --- app/build.gradle.kts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 30026887..7488998a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,8 +18,6 @@ android { 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 } @@ -131,11 +128,4 @@ dependencies { 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