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