diff --git a/ListenerGS/Assets.xcassets/ButtonColor.colorset/Contents.json b/ListenerGS/Assets.xcassets/ButtonColor.colorset/Contents.json new file mode 100644 index 0000000..773c84d --- /dev/null +++ b/ListenerGS/Assets.xcassets/ButtonColor.colorset/Contents.json @@ -0,0 +1,29 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "205", + "green" : "97", + "red" : "0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListenerGS/Assets.xcassets/ButtonTextColor.colorset/Contents.json b/ListenerGS/Assets.xcassets/ButtonTextColor.colorset/Contents.json new file mode 100644 index 0000000..22c4bb0 --- /dev/null +++ b/ListenerGS/Assets.xcassets/ButtonTextColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListenerGS/Assets.xcassets/InactiveButtonColor.colorset/Contents.json b/ListenerGS/Assets.xcassets/InactiveButtonColor.colorset/Contents.json new file mode 100644 index 0000000..a84c24d --- /dev/null +++ b/ListenerGS/Assets.xcassets/InactiveButtonColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "253", + "green" : "224", + "red" : "188" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "60", + "green" : "60", + "red" : "60" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListenerGS/Assets.xcassets/InactiveButtonTextColor.colorset/Contents.json b/ListenerGS/Assets.xcassets/InactiveButtonTextColor.colorset/Contents.json new file mode 100644 index 0000000..34ceef4 --- /dev/null +++ b/ListenerGS/Assets.xcassets/InactiveButtonTextColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.700", + "blue" : "255", + "green" : "255", + "red" : "255" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "119", + "green" : "119", + "red" : "119" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListenerGS/GSView.swift b/ListenerGS/GSView.swift index b317c2e..063ace5 100644 --- a/ListenerGS/GSView.swift +++ b/ListenerGS/GSView.swift @@ -7,12 +7,6 @@ import SwiftUI -extension Color { - static let defaultBlue = Color(red: 0, green: 97 / 255.0, blue: 205 / 255.0) - static let paleBlue = Color(red: 188 / 255.0, green: 224 / 255.0, blue: 253 / 255.0) - static let paleWhite = Color(white: 1, opacity: 179 / 255.0) -} - struct GSButtonStyle : ButtonStyle { func makeBody(configuration: Self.Configuration) -> some View { GSButtonStyleView(configuration: configuration) @@ -23,6 +17,7 @@ private extension GSButtonStyle { struct GSButtonStyleView: View { // tracks if the button is enabled or not @Environment(\.isEnabled) var isEnabled + @Environment(\.colorScheme) var colorScheme // tracks the pressed state let configuration: GSButtonStyle.Configuration @@ -31,8 +26,8 @@ private extension GSButtonStyle { .lineLimit(nil) .padding() .frame(maxWidth: .infinity) - .background(isEnabled ? Color.defaultBlue : Color.paleBlue) - .foregroundColor(isEnabled ? .white : .paleWhite) + .background(isEnabled ? Color("ButtonColor") : Color("InactiveButtonColor")) + .foregroundColor(isEnabled ? Color("ButtonTextColor") : Color("InactiveButtonTextColor")) .font(.subheadline) .clipShape(Capsule()) .opacity(configuration.isPressed ? 0.8 : 1.0) @@ -47,30 +42,37 @@ struct GSView: View { var body: some View { VStack { - Button(speechForwarder.connected ? - "\(Image(systemName: "desktopcomputer.trianglebadge.exclamationmark")) Disconnect from \(ipAddress)" : - "\(Image(systemName: "desktopcomputer.and.arrow.down")) Connect to \(ipAddress)") { - if (speechForwarder.connected) { - speechForwarder.disconnect() - } else { - speechForwarder.connect(destination: ipAddress) + VStack { + Button(speechForwarder.connected ? + "\(Image(systemName: "desktopcomputer.trianglebadge.exclamationmark")) Disconnect from \(ipAddress)" : + "\(Image(systemName: "desktopcomputer.and.arrow.down")) Connect to \(ipAddress)") { + if (speechForwarder.connected) { + speechForwarder.disconnect() + } else { + speechForwarder.connect(destination: ipAddress) + } } + .disabled(false) + .buttonStyle(GSButtonStyle()) + + Button(speechForwarder.listening ? + "\(Image(systemName: "ear.trianglebadge.exclamationmark")) Stop Listening" : + "\(Image(systemName: "ear.and.waveform")) Listen and Send Text") { + speechForwarder.listen() + } + .disabled(!speechForwarder.connected) + .buttonStyle(GSButtonStyle()) } - .disabled(false) - .buttonStyle(GSButtonStyle()) - - Button(speechForwarder.listening ? - "\(Image(systemName: "ear.trianglebadge.exclamationmark")) Stop Listening" : - "\(Image(systemName: "ear.and.waveform")) Listen and Send Text") { - speechForwarder.listen() - } - .disabled(!speechForwarder.connected) - .buttonStyle(GSButtonStyle()) - - Spacer() + .fixedSize(horizontal: true, vertical: false) + .navigationBarTitle(ipAddress) } - .fixedSize(horizontal: true, vertical: false) - .navigationBarTitle(ipAddress) + + Text(speechForwarder.textHeard) + .truncationMode(.head) + .lineLimit(15) + .padding() + + Spacer() } init(ipAddress : String) { diff --git a/ListenerGS/Info.plist b/ListenerGS/Info.plist index 0ae7f72..77bbe6c 100644 --- a/ListenerGS/Info.plist +++ b/ListenerGS/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.0 CFBundleVersion - 358 + 378 LSApplicationCategoryType public.app-category.utilities LSRequiresIPhoneOS diff --git a/ListenerGS/SpeechForwarder.swift b/ListenerGS/SpeechForwarder.swift index 0807c9b..1ec400a 100644 --- a/ListenerGS/SpeechForwarder.swift +++ b/ListenerGS/SpeechForwarder.swift @@ -12,7 +12,7 @@ import Speech class SpeechForwarder : ObservableObject { @Published var listening = false @Published var connected = false - private var textHeard = "" + @Published var textHeard = "" let LISTEN_STATE_MSG = 1 let LISTEN_TEXT_MSG = 2 @@ -20,7 +20,7 @@ class SpeechForwarder : ObservableObject { let port = 19026 private var client: TCPClient? - private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))! + private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: Locale.preferredLanguages[0]))! private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? @@ -144,15 +144,24 @@ class SpeechForwarder : ObservableObject { if (stringToSend.count > 0) { // TODO - Handle strings to send that are longer than 64K (doubt that would happen though) - // TODO - Try to convert encoding from utf8 to something the GS can understand. - switch (client.send(data: pack("