RecordingLiveActivityIntent.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import AppIntents
  2. import Foundation
  3. enum RecordingLiveActivityCommand: String, Sendable {
  4. case togglePause
  5. case stop
  6. }
  7. extension Notification.Name {
  8. static let recordingLiveActivityCommand = Notification.Name(
  9. "com.celestia.trace.recording-live-activity-command"
  10. )
  11. }
  12. private enum RecordingLiveActivityIntentDispatcher {
  13. @MainActor
  14. static func post(_ command: RecordingLiveActivityCommand, sessionID: String) {
  15. NotificationCenter.default.post(
  16. name: .recordingLiveActivityCommand,
  17. object: nil,
  18. userInfo: [
  19. "sessionID": sessionID,
  20. "command": command.rawValue
  21. ]
  22. )
  23. }
  24. }
  25. struct TogglePauseRecordingIntent: LiveActivityIntent {
  26. static var title: LocalizedStringResource = "暂停或继续录音"
  27. static var description = IntentDescription("在锁屏或灵动岛上静默切换当前录音的暂停状态。")
  28. static var openAppWhenRun = false
  29. @Parameter(title: "记录 ID")
  30. var sessionID: String
  31. init() {}
  32. init(sessionID: UUID) {
  33. self.sessionID = sessionID.uuidString
  34. }
  35. func perform() async throws -> some IntentResult {
  36. await RecordingLiveActivityIntentDispatcher.post(
  37. .togglePause,
  38. sessionID: sessionID
  39. )
  40. return .result()
  41. }
  42. }
  43. struct StopRecordingIntent: LiveActivityIntent {
  44. static var title: LocalizedStringResource = "结束录音"
  45. static var description = IntentDescription("在锁屏或灵动岛上静默结束当前录音。")
  46. static var openAppWhenRun = false
  47. @Parameter(title: "记录 ID")
  48. var sessionID: String
  49. init() {}
  50. init(sessionID: UUID) {
  51. self.sessionID = sessionID.uuidString
  52. }
  53. func perform() async throws -> some IntentResult {
  54. await RecordingLiveActivityIntentDispatcher.post(
  55. .stop,
  56. sessionID: sessionID
  57. )
  58. return .result()
  59. }
  60. }