From b2cda81ccafe0a650f23076844d2a2650a853efb Mon Sep 17 00:00:00 2001 From: gianlucaparadise Date: Fri, 24 Dec 2021 11:02:38 +0100 Subject: [PATCH] MediaStatus handling android --- .../FlutterCastFrameworkPlugin.kt | 20 +++++++--- .../FlutterMediaLoadRequestDataHelper.kt | 37 +++++++++++++++++-- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt index 5604050..9d16a3d 100644 --- a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt +++ b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt @@ -11,8 +11,10 @@ import androidx.lifecycle.ProcessLifecycleOwner import com.gianlucaparadise.flutter_cast_framework.cast.CastDialogOpener import com.gianlucaparadise.flutter_cast_framework.cast.MessageCastingChannel 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.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.framework.CastContext 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 { override fun onStatusUpdated() { - val playerStateRaw = remoteMediaClient?.playerState ?: PLAYER_STATE_UNKNOWN - val playerStateLabel = when (playerStateRaw) { + val remoteMediaClient: RemoteMediaClient = remoteMediaClient ?: return + val mediaStatus = remoteMediaClient.mediaStatus ?: return + + val playerStateLabel = when (remoteMediaClient.playerState) { PLAYER_STATE_UNKNOWN -> "unknown" PLAYER_STATE_BUFFERING -> "buffering" PLAYER_STATE_IDLE -> "idle" @@ -190,7 +194,9 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa } Log.d(TAG, "RemoteMediaClient - onStatusUpdated: $playerStateLabel") super.onStatusUpdated() - flutterApi?.onStatusUpdated(playerStateRaw.toLong()) { } + + val flutterMediaStatus = getFlutterMediaStatus(mediaStatus) + flutterApi?.onStatusUpdated(flutterMediaStatus) { } } override fun onMetadataUpdated() { @@ -218,10 +224,14 @@ class FlutterCastFrameworkPlugin : FlutterPlugin, MethodCallHandler, ActivityAwa } override fun onAdBreakStatusUpdated() { - val isPlayingAd = remoteMediaClient?.mediaStatus?.isPlayingAd + val mediaStatus = remoteMediaClient?.mediaStatus ?: return + + val isPlayingAd = mediaStatus.isPlayingAd Log.d(TAG, "RemoteMediaClient - onAdBreakStatusUpdated - isPlayingAd: $isPlayingAd") super.onAdBreakStatusUpdated() - flutterApi?.onAdBreakStatusUpdated { } + + val flutterMediaStatus = getFlutterMediaStatus(mediaStatus) + flutterApi?.onAdBreakStatusUpdated(flutterMediaStatus) { } } override fun onMediaError(error: MediaError?) { diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/FlutterMediaLoadRequestDataHelper.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/FlutterMediaLoadRequestDataHelper.kt index 999899b..9608224 100644 --- a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/FlutterMediaLoadRequestDataHelper.kt +++ b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/media/FlutterMediaLoadRequestDataHelper.kt @@ -1,11 +1,42 @@ package com.gianlucaparadise.flutter_cast_framework.media import com.gianlucaparadise.flutter_cast_framework.PlatformBridgeApis -import com.google.android.gms.cast.MediaInfo -import com.google.android.gms.cast.MediaMetadata -import com.google.android.gms.cast.MediaTrack +import com.google.android.gms.cast.* 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 { val flutterMediaMetadata = getFlutterMediaMetadata(mediaInfo.metadata) val flutterMediaTracks = getFlutterMediaTracks(mediaInfo.mediaTracks)