From a5dfa653ad9f7d0b407a7386867f04302a1cd4f5 Mon Sep 17 00:00:00 2001 From: Koen <koen@pop-os.localdomain> Date: Wed, 29 Nov 2023 16:02:58 +0100 Subject: [PATCH] Removed last mentions of FastCast and added backwards compatibility. --- .../casting/AirPlayCastingDevice.kt | 3 +- .../platformplayer/casting/CastingDevice.kt | 28 +++++++++++++++++-- .../casting/ChomecastCastingDevice.kt | 2 -- ...CastingDevice.kt => FCastCastingDevice.kt} | 18 ++++++------ .../platformplayer/casting/StateCasting.kt | 12 ++++---- .../casting/models/{FastCast.kt => FCast.kt} | 10 +++---- .../dialogs/CastingAddDialog.kt | 5 +--- .../dialogs/ConnectedCastingDialog.kt | 4 +-- .../views/adapters/DeviceViewHolder.kt | 4 +-- app/src/main/res/values/strings.xml | 2 +- 10 files changed, 51 insertions(+), 37 deletions(-) rename app/src/main/java/com/futo/platformplayer/casting/{FastCastCastingDevice.kt => FCastCastingDevice.kt} (95%) rename app/src/main/java/com/futo/platformplayer/casting/models/{FastCast.kt => FCast.kt} (71%) diff --git a/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt index e8a8a573..a6748cf2 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/AirPlayCastingDevice.kt @@ -3,7 +3,6 @@ package com.futo.platformplayer.casting import android.os.Looper import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.api.http.ManagedHttpClient -import com.futo.platformplayer.casting.models.FastCastSetVolumeMessage import com.futo.platformplayer.getConnectedSocket import com.futo.platformplayer.models.CastingDeviceInfo import com.futo.platformplayer.toInetAddress @@ -49,7 +48,7 @@ class AirPlayCastingDevice : CastingDevice { return; } - Logger.i(FastCastCastingDevice.TAG, "Start streaming (streamType: $streamType, contentType: $contentType, contentId: $contentId, resumePosition: $resumePosition, duration: $duration)"); + Logger.i(FCastCastingDevice.TAG, "Start streaming (streamType: $streamType, contentType: $contentType, contentId: $contentId, resumePosition: $resumePosition, duration: $duration)"); time = resumePosition; if (resumePosition > 0.0) { diff --git a/app/src/main/java/com/futo/platformplayer/casting/CastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/CastingDevice.kt index 66a655be..8beba2f2 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/CastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/CastingDevice.kt @@ -1,10 +1,15 @@ package com.futo.platformplayer.casting -import android.content.Context -import com.futo.platformplayer.api.media.models.video.IPlatformVideoDetails import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.getNowDiffMiliseconds import com.futo.platformplayer.models.CastingDeviceInfo +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder import java.net.InetAddress import java.time.OffsetDateTime @@ -14,10 +19,27 @@ enum class CastConnectionState { CONNECTED } +@Serializable(with = CastProtocolType.CastProtocolTypeSerializer::class) enum class CastProtocolType { CHROMECAST, AIRPLAY, - FASTCAST + FCAST; + + object CastProtocolTypeSerializer : KSerializer<CastProtocolType> { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("CastProtocolType", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: CastProtocolType) { + encoder.encodeString(value.name) + } + + override fun deserialize(decoder: Decoder): CastProtocolType { + val name = decoder.decodeString() + return when (name) { + "FASTCAST" -> FCAST // Handle the renamed case + else -> CastProtocolType.valueOf(name) + } + } + } } abstract class CastingDevice { diff --git a/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt index 39b8c640..6102a846 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt @@ -2,7 +2,6 @@ package com.futo.platformplayer.casting import android.os.Looper import android.util.Log -import com.futo.platformplayer.casting.models.FastCastSetVolumeMessage import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.getConnectedSocket import com.futo.platformplayer.models.CastingDeviceInfo @@ -13,7 +12,6 @@ import kotlinx.coroutines.* import org.json.JSONObject import java.io.DataInputStream import java.io.DataOutputStream -import java.io.IOException import java.net.InetAddress import java.security.cert.X509Certificate import javax.net.ssl.SSLContext diff --git a/app/src/main/java/com/futo/platformplayer/casting/FastCastCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt similarity index 95% rename from app/src/main/java/com/futo/platformplayer/casting/FastCastCastingDevice.kt rename to app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt index da4f8fbf..e3524846 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/FastCastCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt @@ -30,10 +30,10 @@ enum class Opcode(val value: Byte) { SET_VOLUME(8) } -class FastCastCastingDevice : CastingDevice { +class FCastCastingDevice : CastingDevice { //See for more info: TODO - override val protocol: CastProtocolType get() = CastProtocolType.FASTCAST; + override val protocol: CastProtocolType get() = CastProtocolType.FCAST; override val isReady: Boolean get() = name != null && addresses != null && addresses?.isNotEmpty() == true && port != 0; override var usedRemoteAddress: InetAddress? = null; override var localAddress: InetAddress? = null; @@ -72,7 +72,7 @@ class FastCastCastingDevice : CastingDevice { Logger.i(TAG, "Start streaming (streamType: $streamType, contentType: $contentType, contentId: $contentId, resumePosition: $resumePosition, duration: $duration)"); time = resumePosition; - sendMessage(Opcode.PLAY, FastCastPlayMessage( + sendMessage(Opcode.PLAY, FCastPlayMessage( container = contentType, url = contentId, time = resumePosition.toInt() @@ -87,7 +87,7 @@ class FastCastCastingDevice : CastingDevice { Logger.i(TAG, "Start streaming content (contentType: $contentType, resumePosition: $resumePosition, duration: $duration)"); time = resumePosition; - sendMessage(Opcode.PLAY, FastCastPlayMessage( + sendMessage(Opcode.PLAY, FCastPlayMessage( container = contentType, content = content, time = resumePosition.toInt() @@ -100,7 +100,7 @@ class FastCastCastingDevice : CastingDevice { } this.volume = volume - sendMessage(Opcode.SET_VOLUME, FastCastSetVolumeMessage(volume)) + sendMessage(Opcode.SET_VOLUME, FCastSetVolumeMessage(volume)) } override fun seekVideo(timeSeconds: Double) { @@ -108,7 +108,7 @@ class FastCastCastingDevice : CastingDevice { return; } - sendMessage(Opcode.SEEK, FastCastSeekMessage( + sendMessage(Opcode.SEEK, FCastSeekMessage( time = timeSeconds.toInt() )); } @@ -282,7 +282,7 @@ class FastCastCastingDevice : CastingDevice { return; } - val playbackUpdate = Json.decodeFromString<FastCastPlaybackUpdateMessage>(json); + val playbackUpdate = Json.decodeFromString<FCastPlaybackUpdateMessage>(json); time = playbackUpdate.time.toDouble(); isPlaying = when (playbackUpdate.state) { 1 -> true @@ -295,7 +295,7 @@ class FastCastCastingDevice : CastingDevice { return; } - val volumeUpdate = Json.decodeFromString<FastCastVolumeUpdateMessage>(json); + val volumeUpdate = Json.decodeFromString<FCastVolumeUpdateMessage>(json); volume = volumeUpdate.volume; } else -> { } @@ -398,7 +398,7 @@ class FastCastCastingDevice : CastingDevice { } override fun getDeviceInfo(): CastingDeviceInfo { - return CastingDeviceInfo(name!!, CastProtocolType.FASTCAST, addresses!!.filter { a -> a.hostAddress != null }.map { a -> a.hostAddress!! }.toTypedArray(), port); + return CastingDeviceInfo(name!!, CastProtocolType.FCAST, addresses!!.filter { a -> a.hostAddress != null }.map { a -> a.hostAddress!! }.toTypedArray(), port); } companion object { diff --git a/app/src/main/java/com/futo/platformplayer/casting/StateCasting.kt b/app/src/main/java/com/futo/platformplayer/casting/StateCasting.kt index b71094b2..399c3817 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/StateCasting.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/StateCasting.kt @@ -345,7 +345,7 @@ class StateCasting { } else { StateApp.instance.scope.launch(Dispatchers.IO) { try { - if (ad is FastCastCastingDevice) { + if (ad is FCastCastingDevice) { Logger.i(TAG, "Casting as DASH direct"); castDashDirect(contentResolver, video, videoSource as IVideoUrlSource?, audioSource as IAudioUrlSource?, subtitleSource, resumePosition); } else if (ad is AirPlayCastingDevice) { @@ -961,7 +961,7 @@ class StateCasting { private suspend fun castDashIndirect(contentResolver: ContentResolver, video: IPlatformVideoDetails, videoSource: IVideoUrlSource?, audioSource: IAudioUrlSource?, subtitleSource: ISubtitleSource?, resumePosition: Double) : List<String> { val ad = activeDevice ?: return listOf(); - val proxyStreams = ad !is FastCastCastingDevice; + val proxyStreams = ad !is FCastCastingDevice; val url = "http://${ad.localAddress.toString().trim('/')}:${_castServer.port}"; val id = UUID.randomUUID(); @@ -1042,8 +1042,8 @@ class StateCasting { CastProtocolType.AIRPLAY -> { AirPlayCastingDevice(deviceInfo); } - CastProtocolType.FASTCAST -> { - FastCastCastingDevice(deviceInfo); + CastProtocolType.FCAST -> { + FCastCastingDevice(deviceInfo); } else -> throw Exception("${deviceInfo.type} is not a valid casting protocol") } @@ -1090,8 +1090,8 @@ class StateCasting { } private fun addOrUpdateFastCastDevice(name: String, addresses: Array<InetAddress>, port: Int) { - return addOrUpdateCastDevice<FastCastCastingDevice>(name, - deviceFactory = { FastCastCastingDevice(name, addresses, port) }, + return addOrUpdateCastDevice<FCastCastingDevice>(name, + deviceFactory = { FCastCastingDevice(name, addresses, port) }, deviceUpdater = { d -> if (d.isReady) { return@addOrUpdateCastDevice false; diff --git a/app/src/main/java/com/futo/platformplayer/casting/models/FastCast.kt b/app/src/main/java/com/futo/platformplayer/casting/models/FCast.kt similarity index 71% rename from app/src/main/java/com/futo/platformplayer/casting/models/FastCast.kt rename to app/src/main/java/com/futo/platformplayer/casting/models/FCast.kt index 5b8e8272..64de18ba 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/models/FastCast.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/models/FCast.kt @@ -3,7 +3,7 @@ package com.futo.platformplayer.casting.models import kotlinx.serialization.Serializable @kotlinx.serialization.Serializable -data class FastCastPlayMessage( +data class FCastPlayMessage( val container: String, val url: String? = null, val content: String? = null, @@ -11,23 +11,23 @@ data class FastCastPlayMessage( ) { } @kotlinx.serialization.Serializable -data class FastCastSeekMessage( +data class FCastSeekMessage( val time: Int ) { } @kotlinx.serialization.Serializable -data class FastCastPlaybackUpdateMessage( +data class FCastPlaybackUpdateMessage( val time: Int, val state: Int ) { } @Serializable -data class FastCastVolumeUpdateMessage( +data class FCastVolumeUpdateMessage( val volume: Double ) @Serializable -data class FastCastSetVolumeMessage( +data class FCastSetVolumeMessage( val volume: Double ) \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/dialogs/CastingAddDialog.kt b/app/src/main/java/com/futo/platformplayer/dialogs/CastingAddDialog.kt index 9966e40a..8abe1ce4 100644 --- a/app/src/main/java/com/futo/platformplayer/dialogs/CastingAddDialog.kt +++ b/app/src/main/java/com/futo/platformplayer/dialogs/CastingAddDialog.kt @@ -12,10 +12,7 @@ import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.casting.CastProtocolType import com.futo.platformplayer.casting.StateCasting import com.futo.platformplayer.models.CastingDeviceInfo -import com.futo.platformplayer.states.StateApp import com.futo.platformplayer.toInetAddress -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch class CastingAddDialog(context: Context?) : AlertDialog(context) { @@ -62,7 +59,7 @@ class CastingAddDialog(context: Context?) : AlertDialog(context) { _buttonConfirm.setOnClickListener { val castProtocolType: CastProtocolType = when (_spinnerType.selectedItemPosition) { - 0 -> CastProtocolType.FASTCAST + 0 -> CastProtocolType.FCAST 1 -> CastProtocolType.CHROMECAST 2 -> CastProtocolType.AIRPLAY else -> { diff --git a/app/src/main/java/com/futo/platformplayer/dialogs/ConnectedCastingDialog.kt b/app/src/main/java/com/futo/platformplayer/dialogs/ConnectedCastingDialog.kt index 612c7a8c..619db900 100644 --- a/app/src/main/java/com/futo/platformplayer/dialogs/ConnectedCastingDialog.kt +++ b/app/src/main/java/com/futo/platformplayer/dialogs/ConnectedCastingDialog.kt @@ -16,9 +16,7 @@ import com.futo.platformplayer.casting.* import com.futo.platformplayer.states.StateApp import com.google.android.material.slider.Slider import com.google.android.material.slider.Slider.OnChangeListener -import com.google.android.material.slider.Slider.OnSliderTouchListener import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch class ConnectedCastingDialog(context: Context?) : AlertDialog(context) { @@ -105,7 +103,7 @@ class ConnectedCastingDialog(context: Context?) : AlertDialog(context) { } else if (d is AirPlayCastingDevice) { _imageDevice.setImageResource(R.drawable.ic_airplay); _textType.text = "AirPlay"; - } else if (d is FastCastCastingDevice) { + } else if (d is FCastCastingDevice) { _imageDevice.setImageResource(R.drawable.ic_fc); _textType.text = "FastCast"; } diff --git a/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt b/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt index 6eddcc98..8d4a6f0a 100644 --- a/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt +++ b/app/src/main/java/com/futo/platformplayer/views/adapters/DeviceViewHolder.kt @@ -74,9 +74,9 @@ class DeviceViewHolder : ViewHolder { } else if (d is AirPlayCastingDevice) { _imageDevice.setImageResource(R.drawable.ic_airplay); _textType.text = "AirPlay"; - } else if (d is FastCastCastingDevice) { + } else if (d is FCastCastingDevice) { _imageDevice.setImageResource(R.drawable.ic_fc); - _textType.text = "FastCast"; + _textType.text = "FCast"; } _textName.text = d.name; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 16bc9d01..5af4d54d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -839,7 +839,7 @@ <item>Russian</item> </string-array> <string-array name="casting_device_type_array" translatable="false"> - <item>FastCast</item> + <item>FCast</item> <item>ChromeCast</item> <item>AirPlay</item> </string-array> -- GitLab