Meshtastic-Apple/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift

118 lines
4 KiB
Swift
Raw Normal View History

2023-03-25 14:30:18 -07:00
//
// RingtoneConfig.swift
// Meshtastic
//
// Created by Garth Vander Houwen on 3/25/23.
//
import SwiftUI
struct RtttlConfig: View {
@Environment(\.managedObjectContext) var context
@EnvironmentObject var bleManager: BLEManager
@Environment(\.dismiss) private var goBack
var node: NodeInfoEntity?
@State private var isPresentingSaveConfirm: Bool = false
@State var hasChanges = false
@State var ringtone: String = ""
var body: some View {
VStack {
Form {
ConfigHeader(title: "RTTTL Ringtone", config: \.rtttlConfig, node: node, onAppear: setRtttLConfigValue)
2023-03-25 14:30:18 -07:00
Section(header: Text("options")) {
HStack {
2023-03-27 10:43:01 -07:00
Label("ringtone", systemImage: "music.quarternote.3")
2023-03-25 14:30:18 -07:00
TextField("Ringtone Transfer Language", text: $ringtone, axis: .vertical)
.foregroundColor(.gray)
.autocapitalization(.none)
.disableAutocorrection(true)
.onChange(of: ringtone, perform: { _ in
let totalBytes = ringtone.utf8.count
// Only mess with the value if it is too big
if totalBytes > 228 {
let firstNBytes = Data(ringtone.utf8.prefix(228))
if let maxBytesString = String(data: firstNBytes, encoding: String.Encoding.utf8) {
// Set the ringtone back to the last place where it was the right size
ringtone = maxBytesString
}
}
})
.foregroundColor(.gray)
}
.keyboardType(.default)
Text("Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications.")
.font(.caption)
}
}
.disabled(self.bleManager.connectedPeripheral == nil || node?.rtttlConfig == nil)
Button {
isPresentingSaveConfirm = true
} label: {
Label("save", systemImage: "square.and.arrow.down")
}
2023-03-26 09:46:51 -07:00
.disabled(bleManager.connectedPeripheral == nil || !hasChanges)
2023-03-25 14:30:18 -07:00
.buttonStyle(.bordered)
.buttonBorderShape(.capsule)
.controlSize(.large)
.padding()
.confirmationDialog(
"are.you.sure",
isPresented: $isPresentingSaveConfirm,
titleVisibility: .visible
) {
let nodeName = node?.user?.longName ?? "unknown".localized
let buttonText = String.localizedStringWithFormat("save.config %@".localized, nodeName)
2023-03-25 14:30:18 -07:00
Button(buttonText) {
let connectedNode = getNodeInfo(id: bleManager.connectedPeripheral.num, context: context)
if connectedNode != nil {
2024-01-19 10:56:57 -08:00
let adminMessageId = bleManager.saveRtttlConfig(ringtone: ringtone.trimmingCharacters(in: .whitespacesAndNewlines), fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode?.myInfo?.adminIndex ?? 0)
2023-03-25 14:30:18 -07:00
if adminMessageId > 0 {
// Should show a saved successfully alert once I know that to be true
// for now just disable the button after a successful save
hasChanges = false
goBack()
}
}
}
}
message: {
Text("config.save.confirm")
}
2023-03-26 09:46:51 -07:00
.navigationTitle("ringtone.config")
2023-03-25 14:30:18 -07:00
.navigationBarItems(trailing:
ZStack {
2023-09-02 17:37:35 -07:00
ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "?")
2023-03-25 14:30:18 -07:00
})
.onAppear {
2024-01-14 11:25:00 -08:00
if self.bleManager.context == nil {
self.bleManager.context = context
}
2023-03-25 14:30:18 -07:00
setRtttLConfigValue()
// Need to request a Rtttl Config from the remote node before allowing changes
2023-03-26 09:46:51 -07:00
if bleManager.connectedPeripheral != nil && (node?.rtttlConfig == nil || node?.rtttlConfig?.ringtone?.count ?? 0 == 0) {
2023-03-25 14:30:18 -07:00
let connectedNode = getNodeInfo(id: bleManager.connectedPeripheral.num, context: context)
if node != nil && connectedNode != nil {
2023-03-25 15:18:44 -07:00
_ = bleManager.requestRtttlConfig(fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode?.myInfo?.adminIndex ?? 0)
2023-03-25 14:30:18 -07:00
}
}
}
.onChange(of: ringtone) { newRingtone in
if node != nil && node!.rtttlConfig != nil {
if newRingtone != node!.rtttlConfig!.ringtone { hasChanges = true }
}
}
}
}
func setRtttLConfigValue() {
self.ringtone = node?.rtttlConfig?.ringtone ?? ""
self.hasChanges = false
}
}