fix(tvos): handle play pause remote

close #1230
This commit is contained in:
edde746
2026-06-03 14:19:23 +02:00
parent 08491511e9
commit 92bfae322e
9 changed files with 260 additions and 15 deletions
+107
View File
@@ -5,6 +5,113 @@ import universal_gamepad
import os_media_controls
import wakelock_plus
@objc class PlezyFlutterViewController: FlutterViewController {
private lazy var tvRemoteChannel = FlutterBasicMessageChannel(
name: "flutter/gamepadtouchevent",
binaryMessenger: binaryMessenger,
codec: FlutterJSONMessageCodec.sharedInstance()
)
override var canBecomeFirstResponder: Bool {
true
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
resignFirstResponder()
super.viewWillDisappear(animated)
}
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
if handlePlayPausePress(presses) {
return
}
super.pressesBegan(presses, with: event)
}
override func pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
if containsPlayPausePress(presses) {
return
}
super.pressesEnded(presses, with: event)
}
override func pressesCancelled(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
if containsPlayPausePress(presses) {
return
}
super.pressesCancelled(presses, with: event)
}
override func remoteControlReceived(with event: UIEvent?) {
guard let event = event else {
super.remoteControlReceived(with: event)
return
}
let subtype = event.subtype
print("PlezyTvRemote: remote control event subtype=\(remoteControlSubtypeName(subtype))")
switch subtype {
case .remoteControlPlay, .remoteControlPause, .remoteControlTogglePlayPause:
sendPlayPauseEvent(source: "remote_control", detail: remoteControlSubtypeName(subtype))
default:
super.remoteControlReceived(with: event)
}
}
private func handlePlayPausePress(_ presses: Set<UIPress>) -> Bool {
guard containsPlayPausePress(presses) else { return false }
sendPlayPauseEvent(source: "presses", detail: "playPause")
return true
}
private func containsPlayPausePress(_ presses: Set<UIPress>) -> Bool {
presses.contains { press in
press.type == .playPause
}
}
private func sendPlayPauseEvent(source: String, detail: String) {
print("PlezyTvRemote: intercepted play/pause source=\(source) detail=\(detail)")
tvRemoteChannel.sendMessage(["type": "play_pause", "source": source, "detail": detail])
}
private func remoteControlSubtypeName(_ subtype: UIEvent.EventSubtype) -> String {
switch subtype {
case .remoteControlPlay:
return "remoteControlPlay"
case .remoteControlPause:
return "remoteControlPause"
case .remoteControlTogglePlayPause:
return "remoteControlTogglePlayPause"
case .remoteControlStop:
return "remoteControlStop"
case .remoteControlNextTrack:
return "remoteControlNextTrack"
case .remoteControlPreviousTrack:
return "remoteControlPreviousTrack"
case .remoteControlBeginSeekingForward:
return "remoteControlBeginSeekingForward"
case .remoteControlEndSeekingForward:
return "remoteControlEndSeekingForward"
case .remoteControlBeginSeekingBackward:
return "remoteControlBeginSeekingBackward"
case .remoteControlEndSeekingBackward:
return "remoteControlEndSeekingBackward"
default:
return "unknown(\(subtype.rawValue))"
}
}
}
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(