package com.applicaster.quickbrickplayerplugin.quickbrickInterface import android.view.View import com.applicaster.quickbrickplayerplugin.VideoPlayerEvents import com.applicaster.quickbrickplayerplugin.helper.ReactArgumentsBuilder import com.applicaster.quickbrickplayerplugin.helper.ReactPropCallback import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.ReadableMap import com.facebook.react.bridge.WritableArray import com.facebook.react.bridge.WritableMap import com.facebook.react.uimanager.events.RCTEventEmitter import org.json.JSONObject import java.lang.Exception interface QuickBrickPlayer { companion object : ReactPropCallbacks { override val reactCallbackPropNames = VideoPlayerEvents.getListOfEvent() override val reactCallbackProps = mutableMapOf() } fun setPlayableItem(source: ReadableMap) fun setPlayerState(state: String?) fun getPlayerView(): View fun sendEvent(name: String, arguments: WritableMap?) { val playerView = getPlayerView() val context = playerView.context as ReactContext context.getJSModule(RCTEventEmitter::class.java).receiveEvent( playerView.id, name, arguments ) } fun onReadyForDisplay() { sendEvent(VideoPlayerEvents.eventReady, null) } fun onLoadStart(uri: String, videoType: String, isNetwork: Boolean ) { val arguments = ReactArgumentsBuilder() .putString(VideoPlayerEvents.payloadPropTextUri, uri) .putString(VideoPlayerEvents.payloadPropTextType, videoType) .putBoolean(VideoPlayerEvents.payloadPropIsNetwork, isNetwork) .build() sendEvent(VideoPlayerEvents.eventLoadStart, arguments) } fun onLoad(duration: Double, currentPosition: Double, videoWidth: Int, videoHeight: Int, audioTracks: WritableArray, textTracks: WritableArray ) { val naturalSize = HashMap() naturalSize.put(VideoPlayerEvents.payloadPropVideoWidth, videoWidth) naturalSize.put(VideoPlayerEvents.payloadPropVideoHeight, videoHeight) val arguments = ReactArgumentsBuilder() .putDouble(VideoPlayerEvents.payloadPropDuration, duration / 1000.0) .putDouble(VideoPlayerEvents.payloadPropCurrentPosition, currentPosition / 1000.0) .putString(VideoPlayerEvents.payloadNaturalSize, JSONObject(naturalSize).toString()) .putArray(VideoPlayerEvents.payloadPropAudioTracks, audioTracks) .putArray(VideoPlayerEvents.payloadPropTextTracks, textTracks) .build() sendEvent(VideoPlayerEvents.eventVideoLoad, arguments) } fun onError(errorMessage: String, exception: Exception) { val arguments = ReactArgumentsBuilder() .putString("message", errorMessage) .putString("exception", exception.message ?: "an error occurred") .build() sendEvent(VideoPlayerEvents.eventError, arguments) } fun onTimeUpdate(currentPosition: Long, videoDuration: Long){ val arguments = ReactArgumentsBuilder() .putDouble(VideoPlayerEvents.payloadPropCurrentTime, currentPosition / 1000.0) .putDouble(VideoPlayerEvents.payloadPropPlayableDuration, videoDuration / 1000.0) .build() sendEvent(VideoPlayerEvents.eventProgress, arguments) } fun onProgressChange(currentPosition: Long, bufferedDuration: Long, seekableDuration: Long) { val arguments = ReactArgumentsBuilder() .putDouble(VideoPlayerEvents.payloadPropCurrentTime, currentPosition / 1000.0) .putDouble(VideoPlayerEvents.payloadPropPlayableDuration, bufferedDuration / 1000.0) .putDouble(VideoPlayerEvents.payloadPropSeekableDuration, seekableDuration / 1000.0) .build() sendEvent(VideoPlayerEvents.eventProgress, arguments) } fun onSeek(currentPosition: Double?, seekTime: Long) { currentPosition?.let { val arguments = ReactArgumentsBuilder() .putDouble(VideoPlayerEvents.payloadPropCurrentTime, it.div(1000.0)) .putDouble(VideoPlayerEvents.payloadPropSeekTime, seekTime / 1000.0) .build() sendEvent(VideoPlayerEvents.eventSeek, arguments) } } fun onPlaybackStalled() { sendEvent(VideoPlayerEvents.eventStalled, null) } fun onBuffer() { sendEvent(VideoPlayerEvents.eventBuffer, null) } fun onEnd() { sendEvent(VideoPlayerEvents.eventEnd, null) } fun onFullscreenPlayerWillPresent() { sendEvent(VideoPlayerEvents.eventFullscreenDidPresent, null) } fun onFullscreenPlayerDidPresent() { sendEvent(VideoPlayerEvents.eventFullscreenWillDismiss, null) } fun onFullscreenPlayerWillDismiss() { sendEvent(VideoPlayerEvents.eventFullscreenDidDismiss, null) } fun onFullscreenPlayerDidDismiss() { sendEvent(VideoPlayerEvents.eventFullscreenDidDismiss, null) } fun onExternalPlaybackChange(isExternalPlaybackActive: Boolean) { val arguments = ReactArgumentsBuilder() .putBoolean(VideoPlayerEvents.payloadPropIsExternalPlaybackActive, isExternalPlaybackActive) .build() sendEvent(VideoPlayerEvents.eventExternalPlaybackChange, arguments) } fun onPlaybackRateChange(rate: Float) { val arguments = ReactArgumentsBuilder() .putDouble(VideoPlayerEvents.payloadPropPlaybackRate, rate.toDouble()) .build() sendEvent(VideoPlayerEvents.eventPlaybackRateChange, arguments) } fun audioBecomingNoisy() { sendEvent(VideoPlayerEvents.eventAudioBecomingNoisy, null) } fun onResume() { sendEvent(VideoPlayerEvents.eventVideoResume, null) } fun onPause() { sendEvent(VideoPlayerEvents.eventVideoPause, null) } }