From a9d5feed4e9b4f1f3ee35293729b03f872ae333a Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Wed, 26 Oct 2022 21:17:26 -0500 Subject: [PATCH 1/7] Add message parsing utility to parse generic message objects --- .../ForemWebView/Utils/MessageParser.swift | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Sources/ForemWebView/Utils/MessageParser.swift diff --git a/Sources/ForemWebView/Utils/MessageParser.swift b/Sources/ForemWebView/Utils/MessageParser.swift new file mode 100644 index 0000000..9a25ee0 --- /dev/null +++ b/Sources/ForemWebView/Utils/MessageParser.swift @@ -0,0 +1,46 @@ +// +// MessageParser.swift +// +// +// Created by Daniel Chick on 10/26/22. +// + +import Foundation + +public typealias Json = [String: Any] + +public class MessageParser { + public init () {} + + public func parse(jsonArray: [Json]) -> T? { + guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: jsonArray) else { + return nil + } + + return parseObject(serializedJson: serializedInnerJSON) + } + + public func parse(json: Json) -> T? { + guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: json) else { + return nil + } + + return parseObject(serializedJson: serializedInnerJSON) + } + + public func parse(json: Any) -> T? { + guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: json) else { + return nil + } + + return parseObject(serializedJson: serializedInnerJSON) + } + + private func parseObject (serializedJson: Data) -> T? { + do { + return try JSONDecoder().decode(T.self, from: serializedJson) + } catch { + return nil + } + } +} From 3a89c02c94a22673d7ee26f24d201edb2a84b03e Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Wed, 26 Oct 2022 21:17:46 -0500 Subject: [PATCH 2/7] Add Podcast poso --- .../ForemWebView/Models/PodcastAction.swift | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Sources/ForemWebView/Models/PodcastAction.swift diff --git a/Sources/ForemWebView/Models/PodcastAction.swift b/Sources/ForemWebView/Models/PodcastAction.swift new file mode 100644 index 0000000..53825e7 --- /dev/null +++ b/Sources/ForemWebView/Models/PodcastAction.swift @@ -0,0 +1,30 @@ +// +// PodcastAction.swift +// +// +// Created by Daniel Chick on 10/26/22. +// + +import Foundation + +public final class Podcast: Codable { + let action: PodcastAction + let url: String? + let seconds: String? + let rate: Float? + let muted: Bool? + let volume: Float? +} + +public enum PodcastAction: String, Codable { + case play + case load + case seek + case rate + case muted + case pause + case terminate + case volume + case metadata + +} From 117a7c6fa91c7a1ba4caa7ee1d378e971e9d126d Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Wed, 26 Oct 2022 21:18:25 -0500 Subject: [PATCH 3/7] Create new function for handling podcasts with the podcast object --- .../ForemMediaManager/ForemMediaManager.swift | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift b/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift index b2d8580..d886a3a 100644 --- a/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift +++ b/Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift @@ -47,6 +47,33 @@ class ForemMediaManager: NSObject { } } + internal func handle(_ podcast: Podcast) { + switch podcast.action { + case .play: + play(audioUrl: podcast.url, at: podcast.seconds) + case .load: + load(audioUrl: podcast.url) + case .seek: + seek(to: podcast.seconds) + case .rate: + podcastRate = podcast.rate ?? 1 + avPlayer?.rate = podcastRate ?? 1 + case .muted: + avPlayer?.isMuted = podcast.muted ?? false + case .pause: + avPlayer?.pause() + case .terminate: + avPlayer?.pause() + clearObservers() + UIApplication.shared.endReceivingRemoteControlEvents() + case .volume: + podcastVolume = podcast.volume ?? 1 + avPlayer?.rate = podcastVolume ?? 1 + case .metadata: + break + } + } + internal func handlePodcastMessage(_ message: [String: String]) { ensureAudioSessionIsActive() From 4169d2425d2f0f8a0df5c8bce80c6023662b393c Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Wed, 26 Oct 2022 21:19:00 -0500 Subject: [PATCH 4/7] parse message into podcast object --- .../ForemWebView+WKScriptMessageHandler.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift b/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift index 3a16ab2..c4ee633 100644 --- a/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift +++ b/Sources/ForemWebView/ForemWebView+WKScriptMessageHandler.swift @@ -17,7 +17,10 @@ extension ForemWebView: WKScriptMessageHandler { didReceive message: WKScriptMessage) { switch message.name { case "podcast": - mediaManager.handlePodcastMessage(message.body as? [String: String] ?? [:]) + if let podcast: Podcast = MessageParser().parse(json: message.body) { + mediaManager.handle(podcast) + } +// mediaManager.handlePodcastMessage(message.body as? [String: String] ?? [:]) case "video": mediaManager.handleVideoMessage(message.body as? [String: String] ?? [:]) case "imageUpload": @@ -37,7 +40,8 @@ extension ForemWebView: WKScriptMessageHandler { foremWebViewDelegate?.didLogin(userData: foremUser) ensureForemInstance() } - default: () + default: + break } } From 304e67c828cfaf36beff1ddd5cb7d7d50165c7c8 Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Wed, 26 Oct 2022 21:20:20 -0500 Subject: [PATCH 5/7] File rename --- .../ForemWebView/Models/{PodcastAction.swift => Podcast.swift} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Sources/ForemWebView/Models/{PodcastAction.swift => Podcast.swift} (94%) diff --git a/Sources/ForemWebView/Models/PodcastAction.swift b/Sources/ForemWebView/Models/Podcast.swift similarity index 94% rename from Sources/ForemWebView/Models/PodcastAction.swift rename to Sources/ForemWebView/Models/Podcast.swift index 53825e7..14b8383 100644 --- a/Sources/ForemWebView/Models/PodcastAction.swift +++ b/Sources/ForemWebView/Models/Podcast.swift @@ -1,5 +1,5 @@ // -// PodcastAction.swift +// Podcast.swift // // // Created by Daniel Chick on 10/26/22. From 8e1fefd28766535a9d8890ada786afdc0c814f2f Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Wed, 26 Oct 2022 21:22:52 -0500 Subject: [PATCH 6/7] Make object internal and convert to struct --- Sources/ForemWebView/Models/Podcast.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/ForemWebView/Models/Podcast.swift b/Sources/ForemWebView/Models/Podcast.swift index 14b8383..47d073b 100644 --- a/Sources/ForemWebView/Models/Podcast.swift +++ b/Sources/ForemWebView/Models/Podcast.swift @@ -7,7 +7,7 @@ import Foundation -public final class Podcast: Codable { +struct Podcast: Codable { let action: PodcastAction let url: String? let seconds: String? @@ -16,7 +16,7 @@ public final class Podcast: Codable { let volume: Float? } -public enum PodcastAction: String, Codable { +enum PodcastAction: String, Codable { case play case load case seek From 7ac487b889d3efd2f1693d69e514b864221499af Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Wed, 26 Oct 2022 21:24:05 -0500 Subject: [PATCH 7/7] Remove newline --- Sources/ForemWebView/Models/Podcast.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/ForemWebView/Models/Podcast.swift b/Sources/ForemWebView/Models/Podcast.swift index 47d073b..1dd2959 100644 --- a/Sources/ForemWebView/Models/Podcast.swift +++ b/Sources/ForemWebView/Models/Podcast.swift @@ -26,5 +26,4 @@ enum PodcastAction: String, Codable { case terminate case volume case metadata - }