From cb1adac78b5368c829c2f1e6f7f26e4ccd0fc896 Mon Sep 17 00:00:00 2001 From: Davide Cavagnola <98320806+Cd16d@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:48:41 +0100 Subject: [PATCH] Add cast preference and singleton manager --- app/phone/build.gradle.kts | 3 ++- .../jdtech/jellyfin/cast/DefaultCastManager.kt | 17 +++++++++++++++++ .../java/dev/jdtech/jellyfin/di/CastModule.kt | 17 +++++++++++++++++ .../jellyfin/player/core/domain/CastManager.kt | 7 +++++++ .../jellyfin/settings/domain/AppPreferences.kt | 3 +++ .../presentation/settings/SettingsViewModel.kt | 17 +++++++++++++++++ settings/src/main/res/values/strings.xml | 5 ++++- 7 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 app/phone/src/main/java/dev/jdtech/jellyfin/cast/DefaultCastManager.kt create mode 100644 app/phone/src/main/java/dev/jdtech/jellyfin/di/CastModule.kt create mode 100644 player/core/src/main/java/dev/jdtech/jellyfin/player/core/domain/CastManager.kt diff --git a/app/phone/build.gradle.kts b/app/phone/build.gradle.kts index 1039eeffd3..c017687c3d 100644 --- a/app/phone/build.gradle.kts +++ b/app/phone/build.gradle.kts @@ -57,10 +57,11 @@ android { flavorDimensions += "variant" productFlavors { - register("libre") { + register("proprietary") { dimension = "variant" isDefault = true } + register("libre") { dimension = "variant" } } splits { diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/cast/DefaultCastManager.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/cast/DefaultCastManager.kt new file mode 100644 index 0000000000..d06a2f735b --- /dev/null +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/cast/DefaultCastManager.kt @@ -0,0 +1,17 @@ +package dev.jdtech.jellyfin.cast + +import dev.jdtech.jellyfin.player.core.domain.CastManager +import dev.jdtech.jellyfin.settings.domain.AppPreferences +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class DefaultCastManager @Inject constructor(private val appPreferences: AppPreferences) : + CastManager { + override val isCastingEnabled: Boolean + get() = appPreferences.getValue(appPreferences.playerCastEnabled) + + override fun setCastingEnabled(enabled: Boolean) { + appPreferences.setValue(appPreferences.playerCastEnabled, enabled) + } +} diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/di/CastModule.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/di/CastModule.kt new file mode 100644 index 0000000000..7842da5659 --- /dev/null +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/di/CastModule.kt @@ -0,0 +1,17 @@ +package dev.jdtech.jellyfin.di + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import dev.jdtech.jellyfin.cast.DefaultCastManager +import dev.jdtech.jellyfin.player.core.domain.CastManager +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class CastModule { + @Binds + @Singleton + abstract fun bindCastManager(impl: DefaultCastManager): CastManager +} diff --git a/player/core/src/main/java/dev/jdtech/jellyfin/player/core/domain/CastManager.kt b/player/core/src/main/java/dev/jdtech/jellyfin/player/core/domain/CastManager.kt new file mode 100644 index 0000000000..ee61ccacda --- /dev/null +++ b/player/core/src/main/java/dev/jdtech/jellyfin/player/core/domain/CastManager.kt @@ -0,0 +1,7 @@ +package dev.jdtech.jellyfin.player.core.domain + +interface CastManager { + val isCastingEnabled: Boolean + + fun setCastingEnabled(enabled: Boolean) +} diff --git a/settings/src/main/java/dev/jdtech/jellyfin/settings/domain/AppPreferences.kt b/settings/src/main/java/dev/jdtech/jellyfin/settings/domain/AppPreferences.kt index 9db4e93e8a..f47eaad4c0 100644 --- a/settings/src/main/java/dev/jdtech/jellyfin/settings/domain/AppPreferences.kt +++ b/settings/src/main/java/dev/jdtech/jellyfin/settings/domain/AppPreferences.kt @@ -78,6 +78,9 @@ class AppPreferences @Inject constructor(val sharedPreferences: SharedPreference // Player - PiP val playerPipGesture = Preference("pref_player_picture_in_picture_gesture", false) + // Player - cast + val playerCastEnabled = Preference("pref_player_cast_enabled", true) + // Downloads val downloadOverMobileData = Preference("pref_downloads_mobile_data", false) val downloadWhenRoaming = Preference("pref_downloads_roaming", false) diff --git a/settings/src/main/java/dev/jdtech/jellyfin/settings/presentation/settings/SettingsViewModel.kt b/settings/src/main/java/dev/jdtech/jellyfin/settings/presentation/settings/SettingsViewModel.kt index 87e036d9c6..2d39643556 100644 --- a/settings/src/main/java/dev/jdtech/jellyfin/settings/presentation/settings/SettingsViewModel.kt +++ b/settings/src/main/java/dev/jdtech/jellyfin/settings/presentation/settings/SettingsViewModel.kt @@ -241,6 +241,23 @@ class SettingsViewModel @Inject constructor(private val appPreferences: AppPrefe ) ) ), + PreferenceGroup( + nameStringResource = R.string.casting, + preferences = + listOf( + PreferenceSwitch( + nameStringResource = + R.string.pref_player_cast_enabled, + descriptionStringRes = + R.string + .pref_player_cast_enabled_summary, + iconDrawableId = R.drawable.ic_play, + supportedDeviceTypes = listOf(DeviceType.PHONE), + backendPreference = + appPreferences.playerCastEnabled, + ) + ), + ), PreferenceGroup( nameStringResource = R.string.mpv_player, preferences = diff --git a/settings/src/main/res/values/strings.xml b/settings/src/main/res/values/strings.xml index e4e87d72ad..37c0761075 100644 --- a/settings/src/main/res/values/strings.xml +++ b/settings/src/main/res/values/strings.xml @@ -60,6 +60,9 @@ Picture-in-picture Picture-in-picture home gesture Use home button or gesture to enter picture-in-picture while the video is playing + Casting + Enable casting + Show cast controls and allow playback on supported devices Offline Mode Watch movies and series without a connection to the server Theme @@ -100,4 +103,4 @@ Outro Intro None - \ No newline at end of file +