From df79f9921a1080cd458429b495884fc80ec77e96 Mon Sep 17 00:00:00 2001 From: Viktor Kushnerov Date: Fri, 13 Dec 2019 23:08:42 +0300 Subject: [PATCH] Broadcast station #63: Send bookmarks from macOS to mobile devices. --- .../Networking/ConnectionServerStatus.swift | 14 ++++++- .../StatusBarView_Listener.swift | 22 +++++++--- ReaderTranslatorMac/Info.plist | 2 +- ReaderTranslatorPlayer/Store/Store.swift | 2 + ReaderTranslatorPlayer/Views/HostsView.swift | 42 +++++++++++++------ ReaderTranslatorSafari/Info.plist | 2 +- 6 files changed, 63 insertions(+), 21 deletions(-) diff --git a/ReaderTranslator/Networking/ConnectionServerStatus.swift b/ReaderTranslator/Networking/ConnectionServerStatus.swift index 005f172..52de36b 100644 --- a/ReaderTranslator/Networking/ConnectionServerStatus.swift +++ b/ReaderTranslator/Networking/ConnectionServerStatus.swift @@ -22,7 +22,19 @@ enum ErrorServerConnection: Error { } } -enum ConnectionServerStatus { +enum ConnectionServerStatus: Equatable { + static func == (lhs: ConnectionServerStatus, rhs: ConnectionServerStatus) -> Bool { + switch (lhs, rhs) { + case (.none, .none): return true + case (.ready, .ready): return true + case (let .started(lName, lPasscode), let .started(rName, rPasscode)): + return lName == rName && lPasscode == rPasscode + case (.connected, .connected): return true + case (let .failed(lError), let .failed(rError)): return lError.status == rError.status + default: return false + } + } + case none case started(name: String, passcode: String) case ready diff --git a/ReaderTranslator/Views/StatusBarView/StatusBarView_Listener.swift b/ReaderTranslator/Views/StatusBarView/StatusBarView_Listener.swift index d003a4c..c7a9947 100644 --- a/ReaderTranslator/Views/StatusBarView/StatusBarView_Listener.swift +++ b/ReaderTranslator/Views/StatusBarView/StatusBarView_Listener.swift @@ -10,6 +10,8 @@ import SwiftUI import Network struct StatusBarView_Listener: View { + @ObservedObject var store = Store.shared + class Coordinator: ObservableObject { var name: String { "ReaderTranslator_\(connectionCount)" } var generatePasscode: String { String("\(randomInt)\(randomInt)\(randomInt)\(randomInt)") } @@ -23,7 +25,21 @@ struct StatusBarView_Listener: View { @ObservedObject var coordinator: Coordinator = Coordinator() var body: some View { - Text(coordinator.status.status).onTapGesture(perform: coordinator.start) + HStack { + Text(coordinator.status.status).onTapGesture(perform: coordinator.start) + if coordinator.status == .connected { + Button(action: { + do { + let jsonData = try JSONEncoder().encode(self.store.bookmarks) + if let jsonString = String(data: jsonData, encoding: .utf8) { + sharedConnection?.sendMove(jsonString) + } + } catch { + print("\(self.theClassName)_\(#function)", error) + } + }, label: { Text("Send bookmarks") }) + } + } } } @@ -68,10 +84,6 @@ extension StatusBarView_Listener.Coordinator: PeerConnectionDelegate { } func receivedMessage(content: Data?, message: NWProtocolFramer.Message) { guard let content = content else { return } - print(content) - logMessage(content) - } - func logMessage(_ content: Data) { if let text = String(data: content, encoding: .unicode) { print(text) } diff --git a/ReaderTranslatorMac/Info.plist b/ReaderTranslatorMac/Info.plist index f32aadd..8e16569 100644 --- a/ReaderTranslatorMac/Info.plist +++ b/ReaderTranslatorMac/Info.plist @@ -21,7 +21,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 1169 + 1184 LSApplicationCategoryType public.app-category.education LSMinimumSystemVersion diff --git a/ReaderTranslatorPlayer/Store/Store.swift b/ReaderTranslatorPlayer/Store/Store.swift index 5bd2e2b..bd5024e 100644 --- a/ReaderTranslatorPlayer/Store/Store.swift +++ b/ReaderTranslatorPlayer/Store/Store.swift @@ -29,4 +29,6 @@ class Store: ObservableObject { @Published(wrappedValue: nil, key: "lastAudio") var lastAudio: URL? @Published(key: "audioRate") var audioRate: Float = 1 + + @Published(key: "bookmarks") var bookmarks: Bookmarks = [] } diff --git a/ReaderTranslatorPlayer/Views/HostsView.swift b/ReaderTranslatorPlayer/Views/HostsView.swift index 1dae31a..7dce412 100644 --- a/ReaderTranslatorPlayer/Views/HostsView.swift +++ b/ReaderTranslatorPlayer/Views/HostsView.swift @@ -13,8 +13,10 @@ struct HostsView: View { class Coordinator: ObservableObject { @Published var hosts = [NWBrowser.Result]() @Published var status = ConnectionClientStatus.none + @ObservedObject var store = Store.shared } + @ObservedObject var store = Store.shared @ObservedObject var coordinator = Coordinator() @State var passcode = "" @@ -25,18 +27,25 @@ struct HostsView: View { } var body: some View { - List { + VStack { TextField("Enter pass code", text: $passcode) - ForEach(coordinator.hosts, id: \.self) { host in - Button( - action: { self.join(host: host) }, - label: { - HStack { - Text(self.hostInfo(host)) - Spacer() - Text(self.coordinator.status.status) - } - }) + List { + ForEach(coordinator.hosts, id: \.self) { host in + Button( + action: { self.join(host: host) }, + label: { + HStack { + Text(self.hostInfo(host)) + Spacer() + Text(self.coordinator.status.status) + } + }) + } + } + List { + ForEach(store.bookmarks, id: \.self) { bookmark in + Text("\(bookmark.text)") + } } } } @@ -69,7 +78,6 @@ extension HostsView.Coordinator: PeerBrowserDelegate { extension HostsView.Coordinator: PeerConnectionDelegate { func connectionReady() { status = .connected - sharedConnection?.sendMove("Let's go") } func connectionFailed() { @@ -77,7 +85,15 @@ extension HostsView.Coordinator: PeerConnectionDelegate { } func receivedMessage(content: Data?, message: NWProtocolFramer.Message) { - print("\(#function)") + guard let content = content else { return } + if let data = String(data: content, encoding: .unicode) { + guard let jsonData = data.data(using: .utf8) else { return } + do { + store.bookmarks = try JSONDecoder().decode(Bookmarks.self, from: jsonData) + } catch { + print("HostsView.Coordinator_\(#function)", error) + } + } } } diff --git a/ReaderTranslatorSafari/Info.plist b/ReaderTranslatorSafari/Info.plist index b5c4d7b..113c9ef 100644 --- a/ReaderTranslatorSafari/Info.plist +++ b/ReaderTranslatorSafari/Info.plist @@ -21,7 +21,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 1870 + 1900 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSAppleEventsUsageDescription