MediaStatus handling android

This commit is contained in:
gianlucaparadise 2021-12-24 11:02:38 +01:00
parent 1b4e5ac33b
commit b2cda81cca
2 changed files with 49 additions and 8 deletions

View file

@ -11,8 +11,10 @@ import androidx.lifecycle.ProcessLifecycleOwner
import com.gianlucaparadise.flutter_cast_framework.cast.CastDialogOpener import com.gianlucaparadise.flutter_cast_framework.cast.CastDialogOpener
import com.gianlucaparadise.flutter_cast_framework.cast.MessageCastingChannel 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.getFlutterMediaStatus
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
import com.google.android.gms.cast.MediaStatus.* import com.google.android.gms.cast.MediaStatus.*
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
@ -178,8 +180,10 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa
private inner class RemoteMediaClientListener : RemoteMediaClient.Callback(), RemoteMediaClient.ProgressListener { private inner class RemoteMediaClientListener : RemoteMediaClient.Callback(), RemoteMediaClient.ProgressListener {
override fun onStatusUpdated() { override fun onStatusUpdated() {
val playerStateRaw = remoteMediaClient?.playerState ?: PLAYER_STATE_UNKNOWN val remoteMediaClient: RemoteMediaClient = remoteMediaClient ?: return
val playerStateLabel = when (playerStateRaw) { val mediaStatus = remoteMediaClient.mediaStatus ?: return
val playerStateLabel = when (remoteMediaClient.playerState) {
PLAYER_STATE_UNKNOWN -> "unknown" PLAYER_STATE_UNKNOWN -> "unknown"
PLAYER_STATE_BUFFERING -> "buffering" PLAYER_STATE_BUFFERING -> "buffering"
PLAYER_STATE_IDLE -> "idle" PLAYER_STATE_IDLE -> "idle"
@ -190,7 +194,9 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa
} }
Log.d(TAG, "RemoteMediaClient - onStatusUpdated: $playerStateLabel") Log.d(TAG, "RemoteMediaClient - onStatusUpdated: $playerStateLabel")
super.onStatusUpdated() super.onStatusUpdated()
flutterApi?.onStatusUpdated(playerStateRaw.toLong()) { }
val flutterMediaStatus = getFlutterMediaStatus(mediaStatus)
flutterApi?.onStatusUpdated(flutterMediaStatus) { }
} }
override fun onMetadataUpdated() { override fun onMetadataUpdated() {
@ -218,10 +224,14 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa
} }
override fun onAdBreakStatusUpdated() { override fun onAdBreakStatusUpdated() {
val isPlayingAd = remoteMediaClient?.mediaStatus?.isPlayingAd val mediaStatus = remoteMediaClient?.mediaStatus ?: return
val isPlayingAd = mediaStatus.isPlayingAd
Log.d(TAG, "RemoteMediaClient - onAdBreakStatusUpdated - isPlayingAd: $isPlayingAd") Log.d(TAG, "RemoteMediaClient - onAdBreakStatusUpdated - isPlayingAd: $isPlayingAd")
super.onAdBreakStatusUpdated() super.onAdBreakStatusUpdated()
flutterApi?.onAdBreakStatusUpdated { }
val flutterMediaStatus = getFlutterMediaStatus(mediaStatus)
flutterApi?.onAdBreakStatusUpdated(flutterMediaStatus) { }
} }
override fun onMediaError(error: MediaError?) { override fun onMediaError(error: MediaError?) {

View file

@ -1,11 +1,42 @@
package com.gianlucaparadise.flutter_cast_framework.media package com.gianlucaparadise.flutter_cast_framework.media
import com.gianlucaparadise.flutter_cast_framework.PlatformBridgeApis import com.gianlucaparadise.flutter_cast_framework.PlatformBridgeApis
import com.google.android.gms.cast.MediaInfo import com.google.android.gms.cast.*
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaTrack
import com.google.android.gms.common.images.WebImage import com.google.android.gms.common.images.WebImage
fun getFlutterMediaStatus(mediaStatus: MediaStatus): PlatformBridgeApis.MediaStatus {
val flutterMediaInfo = getFlutterMediaInfo(mediaStatus.mediaInfo)
val flutterPlayerState = getFlutterPlayerState(mediaStatus.playerState)
val flutterAdBreakStatus = getFlutterAdBreakStatus(mediaStatus.adBreakStatus)
return PlatformBridgeApis.MediaStatus().apply {
isPlayingAd = mediaStatus.isPlayingAd
mediaInfo = flutterMediaInfo
playerState = flutterPlayerState
adBreakStatus = flutterAdBreakStatus
}
}
fun getFlutterAdBreakStatus(adBreakStatus: AdBreakStatus?): PlatformBridgeApis.AdBreakStatus {
return PlatformBridgeApis.AdBreakStatus().apply {
adBreakId = adBreakStatus?.breakId ?: ""
adBreakClipId = adBreakStatus?.breakClipId ?: ""
whenSkippableMs = adBreakStatus?.whenSkippableInMs ?: -1
}
}
fun getFlutterPlayerState(playerStateRaw: Int): PlatformBridgeApis.PlayerState {
return when (playerStateRaw) {
MediaStatus.PLAYER_STATE_UNKNOWN -> PlatformBridgeApis.PlayerState.unknown
MediaStatus.PLAYER_STATE_BUFFERING -> PlatformBridgeApis.PlayerState.buffering
MediaStatus.PLAYER_STATE_IDLE -> PlatformBridgeApis.PlayerState.idle
MediaStatus.PLAYER_STATE_LOADING -> PlatformBridgeApis.PlayerState.loading
MediaStatus.PLAYER_STATE_PAUSED -> PlatformBridgeApis.PlayerState.paused
MediaStatus.PLAYER_STATE_PLAYING -> PlatformBridgeApis.PlayerState.playing
else -> PlatformBridgeApis.PlayerState.unknown
}
}
fun getFlutterMediaInfo(mediaInfo: MediaInfo): PlatformBridgeApis.MediaInfo { fun getFlutterMediaInfo(mediaInfo: MediaInfo): PlatformBridgeApis.MediaInfo {
val flutterMediaMetadata = getFlutterMediaMetadata(mediaInfo.metadata) val flutterMediaMetadata = getFlutterMediaMetadata(mediaInfo.metadata)
val flutterMediaTracks = getFlutterMediaTracks(mediaInfo.mediaTracks) val flutterMediaTracks = getFlutterMediaTracks(mediaInfo.mediaTracks)