Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions airsync-mac/Core/AppState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ class AppState: ObservableObject {
self.menubarTextMaxLength = (savedMaxLength >= 50) ? savedMaxLength : 150

self.showMenubarIcon = UserDefaults.standard.object(forKey: "showMenubarIcon") == nil ? true : UserDefaults.standard.bool(forKey: "showMenubarIcon")
self.showMenubarNetworkStatus = UserDefaults.standard.object(forKey: "showMenubarNetworkStatus") == nil ? true : UserDefaults.standard.bool(forKey: "showMenubarNetworkStatus")
self.menubarBatteryStyle = UserDefaults.standard.string(forKey: "menubarBatteryStyle") ?? "both"
self.showMenubarMusicIcon = UserDefaults.standard.object(forKey: "showMenubarMusicIcon") == nil ? true : UserDefaults.standard.bool(forKey: "showMenubarMusicIcon")
self.showMenubarAlbumArt = UserDefaults.standard.object(forKey: "showMenubarAlbumArt") == nil ? true : UserDefaults.standard.bool(forKey: "showMenubarAlbumArt")
Expand Down Expand Up @@ -292,6 +293,7 @@ class AppState: ObservableObject {
@Published var status: DeviceStatus? = nil {
didSet { syncMediaTimerToPlayState() }
}
@Published var cellularNetwork: String? = nil
@Published var myDevice: Device? = nil
@Published var port: UInt16 = Defaults.serverPort
@Published var androidApps: [String: AndroidApp] = [:]
Expand Down Expand Up @@ -426,6 +428,12 @@ class AppState: ObservableObject {
}
}

@Published var showMenubarNetworkStatus: Bool {
didSet {
UserDefaults.standard.set(showMenubarNetworkStatus, forKey: "showMenubarNetworkStatus")
}
}

@Published var menubarBatteryStyle: String {
didSet {
UserDefaults.standard.set(menubarBatteryStyle, forKey: "menubarBatteryStyle")
Expand Down
199 changes: 113 additions & 86 deletions airsync-mac/Core/MenuBarManager.swift

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion airsync-mac/Core/WebSocket/WebSocketServer+Handlers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,7 @@ extension WebSocketServer {
}

let oldTitle = AppState.shared.status?.music?.title
let cellularNetwork = dict["cellularNetwork"] as? String

AppState.shared.status = DeviceStatus(
battery: .init(level: level, isCharging: isCharging),
Expand All @@ -368,10 +369,12 @@ extension WebSocketServer {
duration: durationSec,
position: positionSec,
isBuffering: isBuffering
)
),
cellularNetwork: cellularNetwork
)

DispatchQueue.main.async {
AppState.shared.cellularNetwork = cellularNetwork
if oldTitle != title {
AppState.shared.handleTrackChange()
} else {
Expand Down
7 changes: 7 additions & 0 deletions airsync-mac/Localization/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,13 @@
"settings.menubar.batteryStyle.both": "Both Icon & Percentage",
"settings.menubar.batteryStyle.icon": "Icon Only",
"settings.menubar.batteryStyle.percentage": "Percentage Only",
"settings.menubar.batteryStyle.none": "Disable",
"settings.menubar.showNetworkStatus": "Show Network Status",
"network.no_signal": "No Signal",
"network.no_service": "No Service",
"network.emergency_only": "Emergency Only",
"network.wifi_calling": "Wi-Fi Calling",
"network.cellular_data_sync": "Cellular Data Sync",
"settings.menubar.notifications": "Notifications",
"settings.menubar.notifications.both": "Both Count & Icons",
"settings.menubar.notifications.count": "Count Only",
Expand Down
1 change: 1 addition & 0 deletions airsync-mac/Model/DeviceStatus.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,5 @@ struct DeviceStatus: Codable {
var battery: Battery
var isPaired: Bool
var music: Music?
var cellularNetwork: String?
}
32 changes: 27 additions & 5 deletions airsync-mac/Screens/HomeScreen/PhoneView/DeviceStatusView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,33 @@ struct DeviceStatusView: View {


HStack{
Image(systemName: batteryIcon(for: batteryLevel, isCharging: batteryIsCharging))
.help("\(batteryLevel)%")
.contentTransition(.symbolEffect)
Text("\(batteryLevel)%")
.font(.caption2)
if appState.showMenubarNetworkStatus, let network = appState.cellularNetwork {
if network == "NO_SIGNAL" {
Image(systemName: "antenna.radiowaves.left.and.right.slash")
.font(.caption2.weight(.semibold))
.foregroundColor(.red)
.help(Localizer.shared.text("network.no_signal"))
} else {
let locKey = "network.\(network.lowercased())"
let locVal = Localizer.shared.text(locKey)
let displayText = locVal == locKey ? network.replacingOccurrences(of: "_", with: " ") : locVal
Text(displayText)
.font(.caption2.weight(.semibold))
.foregroundColor(network.contains("5G") ? .green : (network == "LTE" ? .orange : .primary))
}
}

if appState.menubarBatteryStyle != "none" {
if appState.menubarBatteryStyle == "icon" || appState.menubarBatteryStyle == "both" {
Image(systemName: batteryIcon(for: batteryLevel, isCharging: batteryIsCharging))
.help("\(batteryLevel)%")
.contentTransition(.symbolEffect)
}
if appState.menubarBatteryStyle == "percentage" || appState.menubarBatteryStyle == "both" {
Text("\(batteryLevel)%")
.font(.caption2)
}
}
}
.padding(.leading, 4)

Expand Down
8 changes: 8 additions & 0 deletions airsync-mac/Screens/Settings/MenubarSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,13 @@ struct MenubarSettingsView: View {
Toggle("", isOn: $appState.showMenubarDeviceName)
.toggleStyle(.switch)
}

HStack {
Label(L("settings.menubar.showNetworkStatus"), systemImage: "antenna.radiowaves.left.and.right")
Spacer()
Toggle("", isOn: $appState.showMenubarNetworkStatus)
.toggleStyle(.switch)
}
}
.disabled(!appState.showMenubarText)
.opacity(appState.showMenubarText ? 1.0 : 0.6)
Expand All @@ -121,6 +128,7 @@ struct MenubarSettingsView: View {
Text(L("settings.menubar.batteryStyle.both")).tag("both")
Text(L("settings.menubar.batteryStyle.icon")).tag("icon")
Text(L("settings.menubar.batteryStyle.percentage")).tag("percentage")
Text(L("settings.menubar.batteryStyle.none")).tag("none")
}
.pickerStyle(MenuPickerStyle())
}
Expand Down