mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-07-16 09:23:07 +01:00
Attempt to get events working
This commit is contained in:
@@ -39,6 +39,7 @@ if (useManagedAndroidSdkVersions) {
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation 'org.videolan.android:libvlc-all:3.6.0-eap12'
|
implementation 'org.videolan.android:libvlc-all:3.6.0-eap12'
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.5.31"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.5.31"
|
||||||
|
implementation 'com.facebook.react:react-native:+'
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
|||||||
@@ -4,8 +4,12 @@ import android.content.Context
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.net.Uri
|
|
||||||
import androidx.lifecycle.LifecycleObserver
|
import androidx.lifecycle.LifecycleObserver
|
||||||
|
import android.net.Uri
|
||||||
|
import com.facebook.react.bridge.Arguments
|
||||||
|
import com.facebook.react.bridge.ReactContext
|
||||||
|
import com.facebook.react.bridge.ReactApplicationContext
|
||||||
|
import com.facebook.react.modules.core.DeviceEventManagerModule
|
||||||
import expo.modules.kotlin.AppContext
|
import expo.modules.kotlin.AppContext
|
||||||
import expo.modules.kotlin.views.ExpoView
|
import expo.modules.kotlin.views.ExpoView
|
||||||
import org.videolan.libvlc.LibVLC
|
import org.videolan.libvlc.LibVLC
|
||||||
@@ -13,7 +17,6 @@ import org.videolan.libvlc.Media
|
|||||||
import org.videolan.libvlc.MediaPlayer
|
import org.videolan.libvlc.MediaPlayer
|
||||||
import org.videolan.libvlc.util.VLCVideoLayout
|
import org.videolan.libvlc.util.VLCVideoLayout
|
||||||
|
|
||||||
// Needs to inhert from MediaPlayer.EventListener
|
|
||||||
class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context, appContext), LifecycleObserver, MediaPlayer.EventListener {
|
class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context, appContext), LifecycleObserver, MediaPlayer.EventListener {
|
||||||
|
|
||||||
private var libVLC: LibVLC? = null
|
private var libVLC: LibVLC? = null
|
||||||
@@ -193,7 +196,7 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
|
|||||||
MediaPlayer.Event.EncounteredError -> {
|
MediaPlayer.Event.EncounteredError -> {
|
||||||
Log.e("VlcPlayerView", "player.state ~ error")
|
Log.e("VlcPlayerView", "player.state ~ error")
|
||||||
stateInfo["state"] = "Error"
|
stateInfo["state"] = "Error"
|
||||||
onVideoLoadEnd?.invoke(stateInfo)
|
sendEvent("onVideoLoadEnd", stateInfo)
|
||||||
}
|
}
|
||||||
MediaPlayer.Event.Opening -> {
|
MediaPlayer.Event.Opening -> {
|
||||||
Log.d("VlcPlayerView", "player.state ~ opening")
|
Log.d("VlcPlayerView", "player.state ~ opening")
|
||||||
@@ -204,14 +207,14 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
|
|||||||
// Determine if the media has finished loading
|
// Determine if the media has finished loading
|
||||||
if (player.isPlaying && !isMediaReady) {
|
if (player.isPlaying && !isMediaReady) {
|
||||||
isMediaReady = true
|
isMediaReady = true
|
||||||
onVideoLoadEnd?.invoke(stateInfo)
|
sendEvent("onVideoLoadEnd", stateInfo)
|
||||||
seekToStartTime()
|
seekToStartTime()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastReportedState != currentState || lastReportedIsPlaying != player.isPlaying) {
|
if (lastReportedState != currentState || lastReportedIsPlaying != player.isPlaying) {
|
||||||
lastReportedState = currentState
|
lastReportedState = currentState
|
||||||
lastReportedIsPlaying = player.isPlaying
|
lastReportedIsPlaying = player.isPlaying
|
||||||
onVideoStateChange?.invoke(stateInfo)
|
sendEvent("onVideoStateChange", stateInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,18 +239,31 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
|
|||||||
val currentTimeMs = player.time.toInt()
|
val currentTimeMs = player.time.toInt()
|
||||||
val durationMs = player.media?.duration?.toInt() ?: 0
|
val durationMs = player.media?.duration?.toInt() ?: 0
|
||||||
|
|
||||||
println("currentTimeMs: $currentTimeMs")
|
println("currentTimeMs: $currentTimeMs, durationMs: $durationMs")
|
||||||
if (currentTimeMs >= 0 && currentTimeMs < durationMs) {
|
if (currentTimeMs >= 0 && currentTimeMs < durationMs) {
|
||||||
onVideoProgress?.invoke(
|
val progressInfo = mapOf(
|
||||||
mapOf(
|
"currentTime" to currentTimeMs,
|
||||||
"currentTime" to currentTimeMs,
|
"duration" to durationMs
|
||||||
"duration" to durationMs
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
sendEvent("onVideoProgress", progressInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun sendEvent(eventName: String, params: Map<String, Any>) {
|
||||||
|
val reactContext = appContext.reactContext as? ReactContext
|
||||||
|
Log.d("VlcPlayerView", "Sending event: $eventName with params: $params")
|
||||||
|
val eventMap = Arguments.createMap()
|
||||||
|
params.forEach { (key, value) ->
|
||||||
|
when (value) {
|
||||||
|
is Int -> eventMap.putInt(key, value)
|
||||||
|
is String -> eventMap.putString(key, value)
|
||||||
|
is Boolean -> eventMap.putBoolean(key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reactContext?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
||||||
|
?.emit(eventName, eventMap)
|
||||||
|
}
|
||||||
|
|
||||||
var onVideoLoadEnd: ((Map<String, Any>) -> Unit)? = null
|
var onVideoLoadEnd: ((Map<String, Any>) -> Unit)? = null
|
||||||
var onVideoStateChange: ((Map<String, Any>) -> Unit)? = null
|
var onVideoStateChange: ((Map<String, Any>) -> Unit)? = null
|
||||||
var onVideoProgress: ((Map<String, Any>) -> Unit)? = null
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user