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
+