@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user