RemoteMediaClient playerState android, ios, flutter

This commit is contained in:
gianlucaparadise 2021-11-30 06:50:25 +01:00
parent d669c9e9ce
commit 447bdd576d
5 changed files with 61 additions and 40 deletions

View file

@ -12,6 +12,7 @@ import com.gianlucaparadise.flutter_cast_framework.cast.MessageCastingChannel
import com.gianlucaparadise.flutter_cast_framework.media.getFlutterMediaInfo import com.gianlucaparadise.flutter_cast_framework.media.getFlutterMediaInfo
import com.gianlucaparadise.flutter_cast_framework.media.getMediaLoadRequestData import com.gianlucaparadise.flutter_cast_framework.media.getMediaLoadRequestData
import com.google.android.gms.cast.MediaError import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.MediaStatus.PLAYER_STATE_UNKNOWN
import com.google.android.gms.cast.framework.CastContext import com.google.android.gms.cast.framework.CastContext
import com.google.android.gms.cast.framework.CastSession import com.google.android.gms.cast.framework.CastSession
import com.google.android.gms.cast.framework.SessionManager import com.google.android.gms.cast.framework.SessionManager
@ -177,7 +178,8 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa
override fun onStatusUpdated() { override fun onStatusUpdated() {
Log.d(TAG, "RemoteMediaClient - onStatusUpdated") Log.d(TAG, "RemoteMediaClient - onStatusUpdated")
super.onStatusUpdated() super.onStatusUpdated()
flutterApi?.onStatusUpdated { } val playerStateRaw = remoteMediaClient?.playerState ?: PLAYER_STATE_UNKNOWN
flutterApi?.onStatusUpdated(playerStateRaw.toLong()) { }
} }
override fun onMetadataUpdated() { override fun onMetadataUpdated() {

View file

@ -68,8 +68,8 @@ class _MyAppState extends State<MyApp> {
}); });
} }
void _onRemoteMediaClientStatusUpdated() { void _onRemoteMediaClientStatusUpdated(PlayerState playerState) {
debugPrint("RemoteMediaClient status updated"); debugPrint("RemoteMediaClient status updated - playerState $playerState");
} }
void _onSendMessage() { void _onSendMessage() {

View file

@ -29,7 +29,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
var castSession: GCKCastSession? { var castSession: GCKCastSession? {
get { return _castSession } get { return _castSession }
set { set {
print("Updating castSession - castSession changed: \(_castSession != newValue)") debugPrint("Updating castSession - castSession changed: \(_castSession != newValue)")
let oldSession = _castSession let oldSession = _castSession
let newSession = newValue let newSession = newValue
@ -39,7 +39,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
remoteMediaClient = newValue?.remoteMediaClient remoteMediaClient = newValue?.remoteMediaClient
flutterApi.getSessionMessageNamespaces { (namespaces, err) in flutterApi.getSessionMessageNamespaces { (namespaces, err) in
print("Updating castSession - getSessionMessageNamespaces success - param: \(namespaces.joined(separator: ", "))") debugPrint("Updating castSession - getSessionMessageNamespaces success - param: \(namespaces.joined(separator: ", "))")
if (oldSession == nil && newSession == nil) { if (oldSession == nil && newSession == nil) {
return // nothing to do here return // nothing to do here
} }
@ -68,7 +68,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
var remoteMediaClient: GCKRemoteMediaClient? { var remoteMediaClient: GCKRemoteMediaClient? {
get { return _remoteMediaClient } get { return _remoteMediaClient }
set { set {
print("Updating remoteMediaClient - remoteMediaClient changed: \(_remoteMediaClient != newValue)") debugPrint("Updating remoteMediaClient - remoteMediaClient changed: \(_remoteMediaClient != newValue)")
_remoteMediaClient?.remove(self) _remoteMediaClient?.remove(self)
newValue?.add(self) newValue?.add(self)
@ -98,7 +98,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
} }
@objc func appDidBecomeActive() { @objc func appDidBecomeActive() {
print("AppLife: appDidBecomeActive - App moved to foreground!") debugPrint("AppLife: appDidBecomeActive - App moved to foreground!")
self.sessionManager.add(self) self.sessionManager.add(self)
self.castSession = self.sessionManager.currentCastSession self.castSession = self.sessionManager.currentCastSession
@ -106,14 +106,14 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
} }
@objc func appWillResignActive() { @objc func appWillResignActive() {
print("AppLife: appWillResignActive - App moved to background!") debugPrint("AppLife: appWillResignActive - App moved to background!")
self.sessionManager.remove(self) self.sessionManager.remove(self)
self.castSession = nil self.castSession = nil
} }
private func onCastStateChanged(state: GCKCastContext, change: NSKeyValueObservedChange<GCKCastState>) { private func onCastStateChanged(state: GCKCastContext, change: NSKeyValueObservedChange<GCKCastState>) {
let castState = GCKCastContext.sharedInstance().castState let castState = GCKCastContext.sharedInstance().castState
print("cast state change to: \(castState.rawValue)") debugPrint("cast state change to: \(castState.rawValue)")
notifyCastState(castState: castState) notifyCastState(castState: castState)
} }
@ -219,14 +219,14 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onSessionSuspended // onSessionSuspended
public func sessionManager(_ sessionManager: GCKSessionManager, didSuspend session: GCKCastSession, with reason: GCKConnectionSuspendReason) { public func sessionManager(_ sessionManager: GCKSessionManager, didSuspend session: GCKCastSession, with reason: GCKConnectionSuspendReason) {
print("SessionListener: didSuspend") debugPrint("SessionListener: didSuspend")
flutterApi.onSessionSuspended { (_:Error?) in flutterApi.onSessionSuspended { (_:Error?) in
} }
} }
// onSessionStarting // onSessionStarting
public func sessionManager(_ sessionManager: GCKSessionManager, willStart session: GCKCastSession) { public func sessionManager(_ sessionManager: GCKSessionManager, willStart session: GCKCastSession) {
print("SessionListener: willStart") debugPrint("SessionListener: willStart")
flutterApi.onSessionStarting { (_:Error?) in flutterApi.onSessionStarting { (_:Error?) in
} }
@ -235,7 +235,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onSessionResuming // onSessionResuming
public func sessionManager(_ sessionManager: GCKSessionManager, willResumeCastSession session: GCKCastSession) { public func sessionManager(_ sessionManager: GCKSessionManager, willResumeCastSession session: GCKCastSession) {
print("SessionListener: willResumeCastSession") debugPrint("SessionListener: willResumeCastSession")
flutterApi.onSessionResuming { (_:Error?) in flutterApi.onSessionResuming { (_:Error?) in
} }
@ -244,7 +244,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onSessionEnding // onSessionEnding
public func sessionManager(_ sessionManager: GCKSessionManager, willEnd session: GCKCastSession) { public func sessionManager(_ sessionManager: GCKSessionManager, willEnd session: GCKCastSession) {
print("SessionListener: willEnd") debugPrint("SessionListener: willEnd")
stopProgressTImer() stopProgressTImer()
flutterApi.onSessionEnding { (_:Error?) in flutterApi.onSessionEnding { (_:Error?) in
} }
@ -252,7 +252,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onSessionStartFailed // onSessionStartFailed
public func sessionManager(_ sessionManager: GCKSessionManager, didFailToStart session: GCKCastSession, withError error: Error) { public func sessionManager(_ sessionManager: GCKSessionManager, didFailToStart session: GCKCastSession, withError error: Error) {
print("SessionListener: didFailToStart") debugPrint("SessionListener: didFailToStart")
flutterApi.onSessionStartFailed { (_:Error?) in flutterApi.onSessionStartFailed { (_:Error?) in
} }
} }
@ -261,7 +261,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onSessionStarted // onSessionStarted
public func sessionManager(_ sessionManager: GCKSessionManager, didStart session: GCKCastSession) { public func sessionManager(_ sessionManager: GCKSessionManager, didStart session: GCKCastSession) {
print("SessionListener: didStart") debugPrint("SessionListener: didStart")
flutterApi.onSessionStarted { (_:Error?) in flutterApi.onSessionStarted { (_:Error?) in
} }
@ -270,7 +270,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onSessionResumed // onSessionResumed
public func sessionManager(_ sessionManager: GCKSessionManager, didResumeCastSession session: GCKCastSession) { public func sessionManager(_ sessionManager: GCKSessionManager, didResumeCastSession session: GCKCastSession) {
print("SessionListener: didResumeCastSession") debugPrint("SessionListener: didResumeCastSession")
flutterApi.onSessionResumed { (_:Error?) in flutterApi.onSessionResumed { (_:Error?) in
} }
@ -279,52 +279,53 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onSessionEnded // onSessionEnded
public func sessionManager(_ sessionManager: GCKSessionManager, didEnd session: GCKCastSession, withError error: Error?) { public func sessionManager(_ sessionManager: GCKSessionManager, didEnd session: GCKCastSession, withError error: Error?) {
print("SessionListener: didEnd") debugPrint("SessionListener: didEnd")
flutterApi.onSessionEnded { (_:Error?) in flutterApi.onSessionEnded { (_:Error?) in
} }
} }
// onQueueStatusUpdated // onQueueStatusUpdated
public func remoteMediaClientDidUpdateQueue(_ client: GCKRemoteMediaClient) { public func remoteMediaClientDidUpdateQueue(_ client: GCKRemoteMediaClient) {
print("RemoteMediaClientListener: didUpdateQueue") debugPrint("RemoteMediaClientListener: didUpdateQueue")
flutterApi.onQueueStatusUpdated { (_:Error?) in flutterApi.onQueueStatusUpdated { (_:Error?) in
} }
} }
// onPreloadStatusUpdated // onPreloadStatusUpdated
public func remoteMediaClientDidUpdatePreloadStatus(_ client: GCKRemoteMediaClient) { public func remoteMediaClientDidUpdatePreloadStatus(_ client: GCKRemoteMediaClient) {
print("RemoteMediaClientListener: didUpdatePreloadStatus") debugPrint("RemoteMediaClientListener: didUpdatePreloadStatus")
flutterApi.onPreloadStatusUpdated { (_:Error?) in flutterApi.onPreloadStatusUpdated { (_:Error?) in
} }
} }
// onStatusUpdated // onStatusUpdated
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdate mediaStatus: GCKMediaStatus?) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdate mediaStatus: GCKMediaStatus?) {
var playerState = "" var playerStateLabel = ""
switch mediaStatus?.playerState { switch mediaStatus?.playerState {
case .unknown: case .unknown:
playerState = "PlayerStateUnknown" playerStateLabel = "PlayerStateUnknown"
case .idle: case .idle:
playerState = "PlayerStateIdle" playerStateLabel = "PlayerStateIdle"
case .playing: case .playing:
playerState = "PlayerStatePlaying" playerStateLabel = "PlayerStatePlaying"
startProgressTimer() startProgressTimer()
case .paused: case .paused:
playerState = "PlayerStatePaused" playerStateLabel = "PlayerStatePaused"
startProgressTimer() startProgressTimer()
case .buffering: case .buffering:
playerState = "PlayerStateBuffering" playerStateLabel = "PlayerStateBuffering"
startProgressTimer() startProgressTimer()
case .loading: case .loading:
playerState = "PlayerStateLoading" playerStateLabel = "PlayerStateLoading"
startProgressTimer() startProgressTimer()
default: break default: break
} }
debugPrint("RemoteMediaClientListener: didUpdate mediaStatus - playerState: \(playerState)") debugPrint("RemoteMediaClientListener: didUpdate mediaStatus - playerState: \(playerStateLabel)")
let playerState = mediaStatus?.playerState ?? GCKMediaPlayerState.unknown
flutterApi.onStatusUpdated { (_:Error?) in let nsPlayerState = NSNumber(value: playerState.rawValue)
flutterApi.onStatusUpdatedPlayerStateRaw(nsPlayerState) { (_:Error?) in
} }
} }
@ -333,49 +334,49 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
// onMetadataUpdated // onMetadataUpdated
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdate mediaMetadata: GCKMediaMetadata?) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdate mediaMetadata: GCKMediaMetadata?) {
print("RemoteMediaClientListener: didUpdate mediaMetadata") debugPrint("RemoteMediaClientListener: didUpdate mediaMetadata")
flutterApi.onMetadataUpdated { (_:Error?) in flutterApi.onMetadataUpdated { (_:Error?) in
} }
} }
// onQueueStatusUpdated // onQueueStatusUpdated
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didReceive queueItems: [GCKMediaQueueItem]) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didReceive queueItems: [GCKMediaQueueItem]) {
print("RemoteMediaClientListener: didReceive queueItems") debugPrint("RemoteMediaClientListener: didReceive queueItems")
flutterApi.onQueueStatusUpdated { (_:Error?) in flutterApi.onQueueStatusUpdated { (_:Error?) in
} }
} }
// onSendingRemoteMediaRequest // onSendingRemoteMediaRequest
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didStartMediaSessionWithID sessionID: Int) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didStartMediaSessionWithID sessionID: Int) {
print("RemoteMediaClientListener: didStartMediaSessionWithID") debugPrint("RemoteMediaClientListener: didStartMediaSessionWithID")
flutterApi.onSendingRemoteMediaRequest { (_:Error?) in flutterApi.onSendingRemoteMediaRequest { (_:Error?) in
} }
} }
// onQueueStatusUpdated // onQueueStatusUpdated
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didReceiveQueueItemIDs queueItemIDs: [NSNumber]) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didReceiveQueueItemIDs queueItemIDs: [NSNumber]) {
print("RemoteMediaClientListener: didReceiveQueueItemIDs") debugPrint("RemoteMediaClientListener: didReceiveQueueItemIDs")
flutterApi.onQueueStatusUpdated { (_:Error?) in flutterApi.onQueueStatusUpdated { (_:Error?) in
} }
} }
// onQueueStatusUpdated // onQueueStatusUpdated
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdateQueueItemsWithIDs queueItemIDs: [NSNumber]) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdateQueueItemsWithIDs queueItemIDs: [NSNumber]) {
print("RemoteMediaClientListener: didUpdateQueueItemsWithIDs") debugPrint("RemoteMediaClientListener: didUpdateQueueItemsWithIDs")
flutterApi.onQueueStatusUpdated { (_:Error?) in flutterApi.onQueueStatusUpdated { (_:Error?) in
} }
} }
// onQueueStatusUpdated // onQueueStatusUpdated
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didRemoveQueueItemsWithIDs queueItemIDs: [NSNumber]) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didRemoveQueueItemsWithIDs queueItemIDs: [NSNumber]) {
print("RemoteMediaClientListener: didRemoveQueueItemsWithIDs") debugPrint("RemoteMediaClientListener: didRemoveQueueItemsWithIDs")
flutterApi.onQueueStatusUpdated { (_:Error?) in flutterApi.onQueueStatusUpdated { (_:Error?) in
} }
} }
// onQueueStatusUpdated // onQueueStatusUpdated
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didInsertQueueItemsWithIDs queueItemIDs: [NSNumber], beforeItemWithID beforeItemID: UInt) { public func remoteMediaClient(_ client: GCKRemoteMediaClient, didInsertQueueItemsWithIDs queueItemIDs: [NSNumber], beforeItemWithID beforeItemID: UInt) {
print("RemoteMediaClientListener: didInsertQueueItemsWithIDs") debugPrint("RemoteMediaClientListener: didInsertQueueItemsWithIDs")
flutterApi.onQueueStatusUpdated { (_:Error?) in flutterApi.onQueueStatusUpdated { (_:Error?) in
} }
} }

View file

@ -7,7 +7,8 @@ class SessionManager {
SessionManager(this._hostApi); SessionManager(this._hostApi);
final ValueNotifier<SessionState> state = ValueNotifier(SessionState.idle); final state = ValueNotifier(SessionState.idle);
final playerState = ValueNotifier(PlayerState.unknown);
void onSessionStateChanged(SessionState sessionState) { void onSessionStateChanged(SessionState sessionState) {
switch (sessionState) { switch (sessionState) {
@ -28,9 +29,14 @@ class SessionManager {
} }
} }
void dispatchOnPlayerStateUpdated(PlayerState playerState) {
this.playerState.value = playerState;
onStatusUpdated?.call(playerState);
}
MessageReceivedCallback? onMessageReceived; MessageReceivedCallback? onMessageReceived;
VoidCallback? onStatusUpdated; StatusUpdatedCallback? onStatusUpdated;
VoidCallback? onMetadataUpdated; VoidCallback? onMetadataUpdated;
VoidCallback? onQueueStatusUpdated; VoidCallback? onQueueStatusUpdated;
VoidCallback? onPreloadStatusUpdated; VoidCallback? onPreloadStatusUpdated;
@ -80,3 +86,14 @@ enum SessionState {
session_resume_failed, session_resume_failed,
session_suspended, session_suspended,
} }
typedef StatusUpdatedCallback = void Function(PlayerState);
enum PlayerState {
unknown, // 0
idle, // 1
playing, // 2
paused, // 3
buffering, // 4
loading, // 5
}

View file

@ -122,8 +122,9 @@ class FlutterCastFramework extends CastFlutterApi {
} }
@override @override
void onStatusUpdated() { void onStatusUpdated(int playerStateRaw) {
castContext.sessionManager.onStatusUpdated?.call(); final playerState = PlayerState.values[playerStateRaw];
castContext.sessionManager.dispatchOnPlayerStateUpdated(playerState);
} }
@override @override