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