iOS/Sources/Shared/API/Webhook/Sensors/FrontmostAppSensor.swift
Zac West da2574a3b5
Cache date formatter for frontmost app sensor (#1567)
Since we change the settings on the formatter, we end up paying initialization cost for each one, which adds up fast when command-tabbing.
2021-04-03 10:58:47 -07:00

69 lines
2.1 KiB
Swift

import Foundation
import PromiseKit
final class FrontmostAppSensorUpdateSignaler: SensorProviderUpdateSignaler {
let signal: () -> Void
init(signal: @escaping () -> Void) {
self.signal = signal
#if targetEnvironment(macCatalyst)
Current.macBridge.workspaceNotificationCenter.addObserver(
self,
selector: #selector(frontmostAppDidChange(_:)),
name: Current.macBridge.frontmostApplicationDidChangeNotification,
object: nil
)
#endif
}
@objc private func frontmostAppDidChange(_ note: Notification) {
signal()
}
}
final class FrontmostAppSensor: SensorProvider {
public enum FrostmostAppError: Error, Equatable {
case unsupportedPlatform
}
let request: SensorProviderRequest
init(request: SensorProviderRequest) {
self.request = request
}
private static let dateFormatter = with(ISO8601DateFormatter()) {
$0.formatOptions = [.withInternetDateTime]
}
func sensors() -> Promise<[WebhookSensor]> {
#if targetEnvironment(macCatalyst)
var sensors = [WebhookSensor]()
let frontmost = Current.macBridge.frontmostApplication
sensors.append(with(WebhookSensor(
name: "Frontmost App",
uniqueID: "frontmost_app",
icon: "mdi:traffic-light",
state: frontmost?.localizedName ?? "None"
)) {
var attributes = [String: Any]()
attributes["Bundle Identifier"] = frontmost?.bundleIdentifier ?? "N/A"
attributes["Launch Date"] = frontmost?.launchDate.map { Self.dateFormatter.string(from: $0) } ?? "N/A"
attributes["Is Hidden"] = frontmost?.isHidden ?? "N/A"
attributes["Owns Menu Bar"] = frontmost?.ownsMenuBar ?? "N/A"
$0.Attributes = attributes
})
// Set up our observer
let _: FrontmostAppSensorUpdateSignaler = request.dependencies.updateSignaler(for: self)
return .value(sensors)
#else
return .init(error: FrostmostAppError.unsupportedPlatform)
#endif
}
}