Browse Source

media player controls

media player controls
Milan Jurkulak 3 năm trước cách đây
mục cha
commit
02e6c0408a

+ 30 - 44
app/objectbox-models/default.json

@@ -4,33 +4,33 @@
   "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
   "entities": [
     {
-      "id": "2:4443390238791095335",
-      "lastPropertyId": "5:3227702207504655113",
+      "id": "1:3071221304691859969",
+      "lastPropertyId": "5:7380842637055147338",
       "name": "Message",
       "properties": [
         {
-          "id": "1:9181207467579711968",
+          "id": "1:5903489558647133731",
           "name": "id",
           "type": 6,
           "flags": 1
         },
         {
-          "id": "2:7878822690631343409",
+          "id": "2:5521220968116696283",
           "name": "title",
           "type": 9
         },
         {
-          "id": "3:8698615341365709390",
+          "id": "3:153079673900562691",
           "name": "message",
           "type": 9
         },
         {
-          "id": "4:5800615359027913030",
+          "id": "4:7830966794090126749",
           "name": "read",
           "type": 1
         },
         {
-          "id": "5:3227702207504655113",
+          "id": "5:7380842637055147338",
           "name": "deleted",
           "type": 1
         }
@@ -38,48 +38,48 @@
       "relations": []
     },
     {
-      "id": "3:4059129936998639264",
-      "lastPropertyId": "14:7902663083706437677",
+      "id": "2:7141750768191734097",
+      "lastPropertyId": "8:6917239407098203120",
       "name": "Movie",
       "properties": [
         {
-          "id": "1:79872378504965607",
-          "name": "studio",
-          "type": 9
-        },
-        {
-          "id": "2:2887560408739691883",
+          "id": "1:2336450843545835846",
           "name": "id",
           "type": 6,
           "flags": 1
         },
         {
-          "id": "3:6635382699773571328",
-          "name": "title",
+          "id": "2:4325777566417003871",
+          "name": "category",
           "type": 9
         },
         {
-          "id": "4:7978893519829993708",
-          "name": "description",
+          "id": "3:3140383628530752513",
+          "name": "studio",
           "type": 9
         },
         {
-          "id": "10:1240897976285873448",
-          "name": "category",
+          "id": "4:7177523158231354514",
+          "name": "title",
           "type": 9
         },
         {
-          "id": "11:7524624707189609038",
-          "name": "image",
+          "id": "5:6928102760022948176",
+          "name": "description",
           "type": 9
         },
         {
-          "id": "12:2282776854525830842",
+          "id": "6:3074162147955651553",
           "name": "background",
           "type": 9
         },
         {
-          "id": "14:7902663083706437677",
+          "id": "7:1404798181518812606",
+          "name": "image",
+          "type": 9
+        },
+        {
+          "id": "8:6917239407098203120",
           "name": "uri",
           "type": 9
         }
@@ -87,29 +87,15 @@
       "relations": []
     }
   ],
-  "lastEntityId": "3:4059129936998639264",
+  "lastEntityId": "2:7141750768191734097",
   "lastIndexId": "0:0",
-  "lastRelationId": "2:396422642806804570",
+  "lastRelationId": "0:0",
   "lastSequenceId": "0:0",
   "modelVersion": 5,
   "modelVersionParserMinimum": 5,
-  "retiredEntityUids": [
-    3030959493509716735
-  ],
+  "retiredEntityUids": [],
   "retiredIndexUids": [],
-  "retiredPropertyUids": [
-    1108745223315696762,
-    6095925557554561759,
-    6414793273986255814,
-    2948458933622163117,
-    1566325096395519801,
-    711808614186853341,
-    1320881708669364482,
-    5550314592152910590
-  ],
-  "retiredRelationUids": [
-    3943431700917187926,
-    396422642806804570
-  ],
+  "retiredPropertyUids": [],
+  "retiredRelationUids": [],
   "version": 1
 }

+ 0 - 114
app/objectbox-models/default.json.bak

@@ -1,114 +0,0 @@
-{
-  "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
-  "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
-  "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
-  "entities": [
-    {
-      "id": "2:4443390238791095335",
-      "lastPropertyId": "5:3227702207504655113",
-      "name": "Message",
-      "properties": [
-        {
-          "id": "1:9181207467579711968",
-          "name": "id",
-          "type": 6,
-          "flags": 1
-        },
-        {
-          "id": "2:7878822690631343409",
-          "name": "title",
-          "type": 9
-        },
-        {
-          "id": "3:8698615341365709390",
-          "name": "message",
-          "type": 9
-        },
-        {
-          "id": "4:5800615359027913030",
-          "name": "read",
-          "type": 1
-        },
-        {
-          "id": "5:3227702207504655113",
-          "name": "deleted",
-          "type": 1
-        }
-      ],
-      "relations": []
-    },
-    {
-      "id": "3:4059129936998639264",
-      "lastPropertyId": "13:5550314592152910590",
-      "name": "Movie",
-      "properties": [
-        {
-          "id": "1:79872378504965607",
-          "name": "studio",
-          "type": 9
-        },
-        {
-          "id": "2:2887560408739691883",
-          "name": "id",
-          "type": 6,
-          "flags": 1
-        },
-        {
-          "id": "3:6635382699773571328",
-          "name": "title",
-          "type": 9
-        },
-        {
-          "id": "4:7978893519829993708",
-          "name": "description",
-          "type": 9
-        },
-        {
-          "id": "10:1240897976285873448",
-          "name": "category",
-          "type": 9
-        },
-        {
-          "id": "11:7524624707189609038",
-          "name": "image",
-          "type": 9
-        },
-        {
-          "id": "12:2282776854525830842",
-          "name": "background",
-          "type": 9
-        },
-        {
-          "id": "13:5550314592152910590",
-          "name": "video",
-          "type": 9
-        }
-      ],
-      "relations": []
-    }
-  ],
-  "lastEntityId": "3:4059129936998639264",
-  "lastIndexId": "0:0",
-  "lastRelationId": "2:396422642806804570",
-  "lastSequenceId": "0:0",
-  "modelVersion": 5,
-  "modelVersionParserMinimum": 5,
-  "retiredEntityUids": [
-    3030959493509716735
-  ],
-  "retiredIndexUids": [],
-  "retiredPropertyUids": [
-    1108745223315696762,
-    6095925557554561759,
-    6414793273986255814,
-    2948458933622163117,
-    1566325096395519801,
-    711808614186853341,
-    1320881708669364482
-  ],
-  "retiredRelationUids": [
-    3943431700917187926,
-    396422642806804570
-  ],
-  "version": 1
-}

+ 1 - 2
app/src/main/kotlin/org/mjdev/tvapp/ui/components/MediaPlayer.kt

@@ -20,7 +20,6 @@ import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.layout.ContentScale
 import org.mjdev.tvlib.annotations.TvPreview
-import org.mjdev.tvlib.extensions.ModifierExt.tvAspectRatio
 import org.mjdev.tvlib.extensions.StringExt.parseUri
 import org.mjdev.tvlib.interfaces.ItemWithBackground
 import org.mjdev.tvlib.interfaces.ItemWithImage
@@ -60,7 +59,7 @@ fun MediaPlayer(
             .fillMaxSize()
             .background(Color.Black, RectangleShape),
     ) {
-        // todo does not show
+        // todo: does not show
         ImageAny(
             modifier = Modifier.fillMaxSize(),
             src = background,

+ 2 - 1
app/src/main/kotlin/org/mjdev/tvapp/ui/pages/MainPage.kt

@@ -141,7 +141,8 @@ class MainPage : Page() {
                 },
                 onItemFocused = onItemSelect,
                 onItemClicked = onItemClick,
-                customRows = mutableListOf<@Composable () -> Unit>().apply {
+                customRows =
+                mutableListOf<@Composable () -> Unit>().apply {
                     if (viewModel.appsList.size > 0) {
                         add { AppsRow(apps = viewModel.appsList) }
                     }

+ 2 - 1
app/src/main/kotlin/org/mjdev/tvapp/ui/pages/PluginsPage.kt

@@ -29,6 +29,7 @@ import org.mjdev.tvlib.annotations.TvPreview
 import org.mjdev.tvlib.ui.components.card.CardContent
 import org.mjdev.tvlib.ui.components.page.Page
 import org.mjdev.tvlib.ui.components.text.TextAny
+import org.mjdev.tvlib.ui.components.card.Card
 
 class PluginsPage : Page() {
 
@@ -44,7 +45,7 @@ class PluginsPage : Page() {
                 .fillMaxSize()
                 .padding(16.dp)
         ) {
-            org.mjdev.tvlib.ui.components.card.Card(
+            Card(
                 onClick = {},
                 onLongClick = {},
                 modifier = Modifier.fillMaxSize(),

+ 24 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/extensions/ViewExt.kt

@@ -8,6 +8,7 @@
 
 package org.mjdev.tvlib.extensions
 
+import android.content.res.ColorStateList
 import android.graphics.Bitmap
 import android.graphics.Canvas
 import android.graphics.Rect
@@ -17,6 +18,11 @@ import android.os.Looper
 import android.view.PixelCopy
 import android.view.View
 import android.view.Window
+import android.widget.ImageButton
+import androidx.core.graphics.drawable.DrawableCompat
+import androidx.core.view.allViews
+import androidx.media3.ui.PlayerControlView
+import androidx.media3.ui.PlayerView
 
 @Suppress("unused")
 object ViewExt {
@@ -53,4 +59,22 @@ object ViewExt {
         }
     }
 
+    val PlayerView.controller: PlayerControlView?
+        get() = allViews.firstOrNull { v -> v is PlayerControlView } as? PlayerControlView
+
+    val PlayerView.buttons: List<ImageButton>
+        get() = allViews.map { v -> v as? ImageButton }.filterNotNull().toList()
+
+    fun tintButton(button: ImageButton, color: Int) {
+        val drawable = DrawableCompat.wrap(button.drawable)
+        DrawableCompat.setTintList(drawable.mutate(), ColorStateList.valueOf(color))
+        button.setImageDrawable(drawable)
+    }
+
+    fun tintButtonBackground(button: ImageButton, color: Int) {
+        val drawable = DrawableCompat.wrap(button.background)
+        DrawableCompat.setTintList(drawable.mutate(), ColorStateList.valueOf(color))
+        button.setImageDrawable(drawable)
+    }
+
 }

+ 34 - 9
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/ExoPlayerImpl.kt

@@ -15,13 +15,17 @@ import android.view.SurfaceHolder
 import android.view.SurfaceView
 import android.view.TextureView
 import androidx.compose.foundation.background
+import androidx.compose.foundation.focusable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.input.key.onPreviewKeyEvent
 import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.media3.common.AudioAttributes
@@ -43,6 +47,7 @@ import androidx.media3.ui.PlayerView
 import org.mjdev.tvlib.extensions.ComposeExt.isEditMode
 import org.mjdev.tvlib.extensions.ContextExt.isATv
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
+import org.mjdev.tvlib.extensions.ViewExt.controller
 
 @Suppress("DEPRECATION")
 @UnstableApi
@@ -53,27 +58,49 @@ class ExoPlayerImpl(
     @UnstableApi
     @Composable
     override fun GetPlayerView() {
+        val context = LocalContext.current
         val width = LocalConfiguration.current.screenWidthDp
         val height = LocalConfiguration.current.screenHeightDp
         val isEdit = isEditMode()
+        val isAtv = context.isATv
+        val playerView = remember {
+            PlayerView(context).apply {
+                controllerAutoShow = !isAtv
+                controllerHideOnTouch = !isAtv
+                useArtwork = true
+                artworkDisplayMode = PlayerView.ARTWORK_DISPLAY_MODE_FIT
+                player = exoPlayer
+                // todo : buttons tint
+//                doOnAttach {
+//                    buttons.forEach { b ->
+//                        tintButtonBackground(b, Color.Green.toArgb())
+//                    }
+//                }
+            }
+        }
         Box(
             modifier = Modifier
                 .recomposeHighlighter()
                 .size(width.dp, height.dp)
                 .background(Color.Black, RectangleShape)
+                .onPreviewKeyEvent { ev ->
+                    val controller = playerView.controller
+                    if (controller?.isShown == true) {
+                        playerView.controller?.dispatchKeyEvent(ev.nativeKeyEvent) ?: false
+                    } else {
+                        controller?.show()
+                        true
+                    }
+                }
+                .focusable()
         ) {
             if (!isEdit) {
                 AndroidView(
                     modifier = Modifier
                         .size(width.dp, height.dp)
                         .recomposeHighlighter(),
-                    factory = { context ->
-                        val isAtv = context.isATv
-                        PlayerView(context).apply {
-                            controllerAutoShow = !isAtv
-                            controllerHideOnTouch = !isAtv
-                            player = exoPlayer
-                        }
+                    factory = {
+                        playerView
                     }
                 )
             }
@@ -97,7 +124,6 @@ class ExoPlayerImpl(
     }
 
     override fun resume() {
-        // todo test
         exoPlayer.playWhenReady = true
     }
 
@@ -106,7 +132,6 @@ class ExoPlayerImpl(
     }
 
     override fun dispose() {
-        // todo test
         exoPlayer.release()
     }
 

+ 1 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/IMediaPlayer.kt

@@ -30,6 +30,7 @@ import androidx.media3.common.VideoSize
 import androidx.media3.common.text.CueGroup
 import androidx.media3.common.util.Size
 
+@Suppress("DeprecatedCallableAddReplaceWith")
 @androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
 interface IMediaPlayer : Player {
 

+ 0 - 6
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/MediaPlayerContainer.kt

@@ -28,10 +28,6 @@ fun MediaPlayerContainer(
     autoPlay: Boolean = true,
     startSeek: Long = 0L,
     mediaPlayer: IMediaPlayer = MediaPlayerContainerDefaults.exoPlayer,
-    mediaPlayerOverlay: @Composable (state: MediaPlayerState) -> Unit = {},
-    mediaPlayerControls: @Composable (state: MediaPlayerState) -> Unit = { state ->
-        MediaPlayerControls(state)
-    }
 ) {
     val state = rememberMediaPlayerState(
         mediaPlayer,
@@ -45,8 +41,6 @@ fun MediaPlayerContainer(
             .fillMaxSize()
     ) {
         mediaPlayer.GetPlayerView()
-        mediaPlayerOverlay(state)
-        mediaPlayerControls(state)
     }
     DisposableEffect(state) {
         if (state.hasMediaToPlay) {

+ 12 - 11
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/MediaPlayerContainerDefaults.kt

@@ -12,10 +12,11 @@ import android.media.MediaPlayer
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.platform.LocalContext
+import androidx.media3.common.util.UnstableApi
 import androidx.media3.exoplayer.ExoPlayer
 import org.mjdev.tvlib.extensions.ComposeExt.isEditMode
 
-@Suppress("unused", "MemberVisibilityCanBePrivate")
+@UnstableApi @Suppress("unused", "MemberVisibilityCanBePrivate")
 object MediaPlayerContainerDefaults {
 
     val isEdit: Boolean
@@ -26,10 +27,10 @@ object MediaPlayerContainerDefaults {
         @Composable
         get() = arrayOf(
             exoPlayer,
-//            internalPlayer
+            internalPlayer
         )
 
-    val exoPlayer: IMediaPlayer
+    val  exoPlayer: IMediaPlayer
         @Composable
         get() = run {
             val context = LocalContext.current
@@ -39,13 +40,13 @@ object MediaPlayerContainerDefaults {
             }
         }
 
-//    val internalPlayer: IMediaPlayer
-//        @Composable
-//        get() = run {
-//            if (isEdit) IMediaPlayer.EMPTY
-//            else remember {
-//                NativePlayerImpl(MediaPlayer())
-//            }
-//        }
+    val internalPlayer: IMediaPlayer
+        @Composable
+        get() = run {
+            if (isEdit) IMediaPlayer.EMPTY
+            else remember {
+                NativePlayerImpl(MediaPlayer())
+            }
+        }
 
 }

+ 0 - 44
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/MediaPlayerControls.kt

@@ -1,44 +0,0 @@
-/*
- * Copyright (c) Milan Jurkulák 2023.
- *  Contact:
- *  e: mimoccc@gmail.com
- *  e: mj@mjdev.org
- *  w: https://mjdev.org
- */
-
-package org.mjdev.tvlib.ui.components.media
-
-import android.annotation.SuppressLint
-import android.view.View
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.viewinterop.AndroidView
-import androidx.core.view.allViews
-import androidx.media3.ui.PlayerControlView
-import org.mjdev.tvlib.annotations.TvPreview
-import org.mjdev.tvlib.ui.components.media.MediaPlayerState.Companion.rememberMediaPlayerState
-
-@SuppressLint("PrivateResource", "ModifierParameter")
-@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
-@TvPreview
-@Composable
-fun MediaPlayerControls(
-    state: MediaPlayerState = rememberMediaPlayerState(null),
-    modifier: Modifier = Modifier,
-    views: MutableMap<Int, View?> = remember { mutableMapOf() }
-) {
-    AndroidView(
-        modifier = modifier.fillMaxSize(),
-        factory = { context ->
-            PlayerControlView(context).apply {
-                player = state.player
-                allViews.forEach { v ->
-                    if (v.id >= 0) views[v.id] = v
-                }
-            }
-        }
-    )
-
-}

+ 624 - 604
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/NativePlayerImpl.kt

@@ -1,604 +1,624 @@
-///*
-// * Copyright (c) Milan Jurkulák 2023.
-// *  Contact:
-// *  e: mimoccc@gmail.com
-// *  e: mj@mjdev.org
-// *  w: https://mjdev.org
-// */
-//
-//package org.mjdev.tvlib.ui.components.media
-//
-//import android.media.MediaPlayer
-//import android.net.Uri
-//import android.os.Looper
-//import android.view.Surface
-//import android.view.SurfaceHolder
-//import android.view.SurfaceView
-//import android.view.TextureView
-//import androidx.compose.foundation.background
-//import androidx.compose.foundation.layout.Box
-//import androidx.compose.foundation.layout.size
-//import androidx.compose.runtime.Composable
-//import androidx.compose.ui.Modifier
-//import androidx.compose.ui.graphics.Color
-//import androidx.compose.ui.graphics.RectangleShape
-//import androidx.compose.ui.platform.LocalConfiguration
-//import androidx.compose.ui.unit.dp
-//import androidx.compose.ui.viewinterop.AndroidView
-//import androidx.media3.common.AudioAttributes
-//import androidx.media3.common.DeviceInfo
-//import androidx.media3.common.MediaItem
-//import androidx.media3.common.MediaMetadata
-//import androidx.media3.common.PlaybackException
-//import androidx.media3.common.PlaybackParameters
-//import androidx.media3.common.Player
-//import androidx.media3.common.Timeline
-//import androidx.media3.common.TrackSelectionParameters
-//import androidx.media3.common.Tracks
-//import androidx.media3.common.VideoSize
-//import androidx.media3.common.text.CueGroup
-//import androidx.media3.common.util.Size
-//import org.mjdev.tvlib.extensions.ComposeExt
-//import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
-//
-//// todo
-//@Suppress("unused")
-//class NativePlayerImpl(
-//    private val mediaPlayer: MediaPlayer
-//) : IMediaPlayer {
-//
-//    @Composable
-//    override fun GetPlayerView() {
-//        val width = LocalConfiguration.current.screenWidthDp
-//        val height = LocalConfiguration.current.screenHeightDp
-//        val isEdit = ComposeExt.isEditMode()
-//        Box(
-//            modifier = Modifier
-//                .recomposeHighlighter()
-//                .size(width.dp, height.dp)
-//                .background(Color.Black, RectangleShape)
-//        ) {
-//            if (!isEdit) {
-//                AndroidView(
-//                    modifier = Modifier
-//                        .size(width.dp, height.dp)
-//                        .recomposeHighlighter(),
-//                    factory = { context ->
-//                        SurfaceView(context).apply {
-//                            mediaPlayer.setDisplay(holder)
-//                        }
-//                    }
-//                )
-//            }
-//        }
-//    }
-//
-//    override fun setMediaUri(uri: Uri) {
-//        mediaPlayer.setDataSource(uri.toString())
-//    }
-//
-//    override fun prepare() {
-//        mediaPlayer.prepareAsync()
-//    }
-//
-//    override fun play() {
-//        mediaPlayer.start()
-//    }
-//
-//    override fun pause() {
-//        mediaPlayer.pause()
-//    }
-//
-//    override fun resume() {
-//        mediaPlayer.start()
-//    }
-//
-//    override fun stop() {
-//        mediaPlayer.stop()
-//    }
-//
-//    override fun dispose() {
-//        mediaPlayer.release()
-//    }
-//
-//    override fun seekTo(value: Long) {
-//        mediaPlayer.seekTo(value.toInt())
-//    }
-//
-//    override fun seekTo(mediaItemIndex: Int, positionMs: Long) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getApplicationLooper(): Looper {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun addListener(listener: Player.Listener) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun removeListener(listener: Player.Listener) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setMediaItems(mediaItems: MutableList<MediaItem>) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setMediaItems(mediaItems: MutableList<MediaItem>, resetPosition: Boolean) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setMediaItems(
-//        mediaItems: MutableList<MediaItem>,
-//        startIndex: Int,
-//        startPositionMs: Long
-//    ) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setMediaItem(mediaItem: MediaItem) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setMediaItem(mediaItem: MediaItem, startPositionMs: Long) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setMediaItem(mediaItem: MediaItem, resetPosition: Boolean) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun addMediaItem(mediaItem: MediaItem) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun addMediaItem(index: Int, mediaItem: MediaItem) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun addMediaItems(mediaItems: MutableList<MediaItem>) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun addMediaItems(index: Int, mediaItems: MutableList<MediaItem>) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun moveMediaItem(currentIndex: Int, newIndex: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun moveMediaItems(fromIndex: Int, toIndex: Int, newIndex: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun replaceMediaItem(index: Int, mediaItem: MediaItem) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun replaceMediaItems(
-//        fromIndex: Int,
-//        toIndex: Int,
-//        mediaItems: MutableList<MediaItem>
-//    ) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun removeMediaItem(index: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun removeMediaItems(fromIndex: Int, toIndex: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun clearMediaItems() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isCommandAvailable(command: Int): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun canAdvertiseSession(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getAvailableCommands(): Player.Commands {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPlaybackState(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPlaybackSuppressionReason(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isPlaying(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPlayerError(): PlaybackException? {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setPlayWhenReady(playWhenReady: Boolean) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPlayWhenReady(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setRepeatMode(repeatMode: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getRepeatMode(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setShuffleModeEnabled(shuffleModeEnabled: Boolean) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getShuffleModeEnabled(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isLoading(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToDefaultPosition() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToDefaultPosition(mediaItemIndex: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getSeekBackIncrement(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekBack() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getSeekForwardIncrement(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekForward() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun hasPrevious(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun hasPreviousWindow(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun hasPreviousMediaItem(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun previous() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToPreviousWindow() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToPreviousMediaItem() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getMaxSeekToPreviousPosition(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToPrevious() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun hasNext(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun hasNextWindow(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun hasNextMediaItem(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun next() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToNextWindow() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToNextMediaItem() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun seekToNext() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setPlaybackParameters(playbackParameters: PlaybackParameters) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setPlaybackSpeed(speed: Float) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPlaybackParameters(): PlaybackParameters {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun release() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentTracks(): Tracks {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getTrackSelectionParameters(): TrackSelectionParameters {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setTrackSelectionParameters(parameters: TrackSelectionParameters) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getMediaMetadata(): MediaMetadata {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPlaylistMetadata(): MediaMetadata {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setPlaylistMetadata(mediaMetadata: MediaMetadata) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentManifest(): Any? {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentTimeline(): Timeline {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentPeriodIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentWindowIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentMediaItemIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getNextWindowIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getNextMediaItemIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPreviousWindowIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getPreviousMediaItemIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentMediaItem(): MediaItem? {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getMediaItemCount(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getMediaItemAt(index: Int): MediaItem {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getDuration(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentPosition(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getBufferedPosition(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getBufferedPercentage(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getTotalBufferedDuration(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isCurrentWindowDynamic(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isCurrentMediaItemDynamic(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isCurrentWindowLive(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isCurrentMediaItemLive(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentLiveOffset(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isCurrentWindowSeekable(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isCurrentMediaItemSeekable(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isPlayingAd(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentAdGroupIndex(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentAdIndexInAdGroup(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getContentDuration(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getContentPosition(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getContentBufferedPosition(): Long {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getAudioAttributes(): AudioAttributes {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setVolume(volume: Float) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getVolume(): Float {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun clearVideoSurface() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun clearVideoSurface(surface: Surface?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setVideoSurface(surface: Surface?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setVideoSurfaceHolder(surfaceHolder: SurfaceHolder?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun clearVideoSurfaceHolder(surfaceHolder: SurfaceHolder?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setVideoSurfaceView(surfaceView: SurfaceView?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun clearVideoSurfaceView(surfaceView: SurfaceView?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setVideoTextureView(textureView: TextureView?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun clearVideoTextureView(textureView: TextureView?) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getVideoSize(): VideoSize {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getSurfaceSize(): Size {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getCurrentCues(): CueGroup {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getDeviceInfo(): DeviceInfo {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun getDeviceVolume(): Int {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun isDeviceMuted(): Boolean {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setDeviceVolume(volume: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setDeviceVolume(volume: Int, flags: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun increaseDeviceVolume() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun increaseDeviceVolume(flags: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun decreaseDeviceVolume() {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun decreaseDeviceVolume(flags: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setDeviceMuted(muted: Boolean) {
-//        TODO("Not yet implemented")
-//    }
-//
-//    override fun setDeviceMuted(muted: Boolean, flags: Int) {
-//        TODO("Not yet implemented")
-//    }
-//
-//}
+/*
+ * Copyright (c) Milan Jurkulák 2023.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.tvlib.ui.components.media
+
+import android.annotation.SuppressLint
+import android.media.MediaPlayer
+import android.net.Uri
+import android.os.Looper
+import android.view.Surface
+import android.view.SurfaceHolder
+import android.view.SurfaceView
+import android.view.TextureView
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.media3.common.AudioAttributes
+import androidx.media3.common.DeviceInfo
+import androidx.media3.common.MediaItem
+import androidx.media3.common.MediaMetadata
+import androidx.media3.common.PlaybackException
+import androidx.media3.common.PlaybackParameters
+import androidx.media3.common.Player
+import androidx.media3.common.Timeline
+import androidx.media3.common.TrackSelectionParameters
+import androidx.media3.common.Tracks
+import androidx.media3.common.VideoSize
+import androidx.media3.common.text.CueGroup
+import androidx.media3.common.util.Size
+import org.mjdev.tvlib.extensions.ComposeExt
+import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
+
+// todo
+@Suppress("unused", "DeprecatedCallableAddReplaceWith")
+@SuppressLint("UnsafeOptInUsageError")
+class NativePlayerImpl(
+    private val mediaPlayer: MediaPlayer
+) : IMediaPlayer {
+
+    @Composable
+    override fun GetPlayerView() {
+        val width = LocalConfiguration.current.screenWidthDp
+        val height = LocalConfiguration.current.screenHeightDp
+        val isEdit = ComposeExt.isEditMode()
+        Box(
+            modifier = Modifier
+                .recomposeHighlighter()
+                .size(width.dp, height.dp)
+                .background(Color.Black, RectangleShape)
+        ) {
+            if (!isEdit) {
+                AndroidView(
+                    modifier = Modifier
+                        .size(width.dp, height.dp)
+                        .recomposeHighlighter(),
+                    factory = { context ->
+                        SurfaceView(context).apply {
+                            mediaPlayer.setDisplay(holder)
+                        }
+                    }
+                )
+            }
+        }
+    }
+
+    override fun setMediaUri(uri: Uri) {
+        mediaPlayer.setDataSource(uri.toString())
+    }
+
+    override fun prepare() {
+        mediaPlayer.prepareAsync()
+    }
+
+    override fun play() {
+        mediaPlayer.start()
+    }
+
+    override fun pause() {
+        mediaPlayer.pause()
+    }
+
+    override fun resume() {
+        mediaPlayer.start()
+    }
+
+    override fun stop() {
+        mediaPlayer.stop()
+    }
+
+    override fun dispose() {
+        mediaPlayer.release()
+    }
+
+    override fun seekTo(value: Long) {
+        mediaPlayer.seekTo(value.toInt())
+    }
+
+    override fun seekTo(mediaItemIndex: Int, positionMs: Long) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getApplicationLooper(): Looper {
+        TODO("Not yet implemented")
+    }
+
+    override fun addListener(listener: Player.Listener) {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeListener(listener: Player.Listener) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setMediaItems(mediaItems: MutableList<MediaItem>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setMediaItems(mediaItems: MutableList<MediaItem>, resetPosition: Boolean) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setMediaItems(
+        mediaItems: MutableList<MediaItem>,
+        startIndex: Int,
+        startPositionMs: Long
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setMediaItem(mediaItem: MediaItem) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setMediaItem(mediaItem: MediaItem, startPositionMs: Long) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setMediaItem(mediaItem: MediaItem, resetPosition: Boolean) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addMediaItem(mediaItem: MediaItem) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addMediaItem(index: Int, mediaItem: MediaItem) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addMediaItems(mediaItems: MutableList<MediaItem>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun addMediaItems(index: Int, mediaItems: MutableList<MediaItem>) {
+        TODO("Not yet implemented")
+    }
+
+    override fun moveMediaItem(currentIndex: Int, newIndex: Int) {
+        TODO("Not yet implemented")
+    }
+
+    override fun moveMediaItems(fromIndex: Int, toIndex: Int, newIndex: Int) {
+        TODO("Not yet implemented")
+    }
+
+    override fun replaceMediaItem(index: Int, mediaItem: MediaItem) {
+        TODO("Not yet implemented")
+    }
+
+    override fun replaceMediaItems(
+        fromIndex: Int,
+        toIndex: Int,
+        mediaItems: MutableList<MediaItem>
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeMediaItem(index: Int) {
+        TODO("Not yet implemented")
+    }
+
+    override fun removeMediaItems(fromIndex: Int, toIndex: Int) {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearMediaItems() {
+        TODO("Not yet implemented")
+    }
+
+    override fun isCommandAvailable(command: Int): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun canAdvertiseSession(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAvailableCommands(): Player.Commands {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPlaybackState(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPlaybackSuppressionReason(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun isPlaying(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPlayerError(): PlaybackException? {
+        TODO("Not yet implemented")
+    }
+
+    override fun setPlayWhenReady(playWhenReady: Boolean) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPlayWhenReady(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun setRepeatMode(repeatMode: Int) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getRepeatMode(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun setShuffleModeEnabled(shuffleModeEnabled: Boolean) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getShuffleModeEnabled(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun isLoading(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekToDefaultPosition() {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekToDefaultPosition(mediaItemIndex: Int) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSeekBackIncrement(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekBack() {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSeekForwardIncrement(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekForward() {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun hasPrevious(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun hasPreviousWindow(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun hasPreviousMediaItem(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun previous() {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun seekToPreviousWindow() {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekToPreviousMediaItem() {
+        TODO("Not yet implemented")
+    }
+
+    override fun getMaxSeekToPreviousPosition(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekToPrevious() {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun hasNext(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun hasNextWindow(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun hasNextMediaItem(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun next() {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun seekToNextWindow() {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekToNextMediaItem() {
+        TODO("Not yet implemented")
+    }
+
+    override fun seekToNext() {
+        TODO("Not yet implemented")
+    }
+
+    override fun setPlaybackParameters(playbackParameters: PlaybackParameters) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setPlaybackSpeed(speed: Float) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPlaybackParameters(): PlaybackParameters {
+        TODO("Not yet implemented")
+    }
+
+    override fun release() {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentTracks(): Tracks {
+        TODO("Not yet implemented")
+    }
+
+    override fun getTrackSelectionParameters(): TrackSelectionParameters {
+        TODO("Not yet implemented")
+    }
+
+    override fun setTrackSelectionParameters(parameters: TrackSelectionParameters) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getMediaMetadata(): MediaMetadata {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPlaylistMetadata(): MediaMetadata {
+        TODO("Not yet implemented")
+    }
+
+    override fun setPlaylistMetadata(mediaMetadata: MediaMetadata) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentManifest(): Any? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentTimeline(): Timeline {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentPeriodIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun getCurrentWindowIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentMediaItemIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun getNextWindowIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getNextMediaItemIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun getPreviousWindowIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getPreviousMediaItemIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentMediaItem(): MediaItem? {
+        TODO("Not yet implemented")
+    }
+
+    override fun getMediaItemCount(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getMediaItemAt(index: Int): MediaItem {
+        TODO("Not yet implemented")
+    }
+
+    override fun getDuration(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentPosition(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getBufferedPosition(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getBufferedPercentage(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getTotalBufferedDuration(): Long {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun isCurrentWindowDynamic(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun isCurrentMediaItemDynamic(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun isCurrentWindowLive(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun isCurrentMediaItemLive(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentLiveOffset(): Long {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun isCurrentWindowSeekable(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun isCurrentMediaItemSeekable(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun isPlayingAd(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentAdGroupIndex(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentAdIndexInAdGroup(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun getContentDuration(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getContentPosition(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getContentBufferedPosition(): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun getAudioAttributes(): AudioAttributes {
+        TODO("Not yet implemented")
+    }
+
+    override fun setVolume(volume: Float) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getVolume(): Float {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearVideoSurface() {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearVideoSurface(surface: Surface?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setVideoSurface(surface: Surface?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setVideoSurfaceHolder(surfaceHolder: SurfaceHolder?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearVideoSurfaceHolder(surfaceHolder: SurfaceHolder?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setVideoSurfaceView(surfaceView: SurfaceView?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearVideoSurfaceView(surfaceView: SurfaceView?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setVideoTextureView(textureView: TextureView?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun clearVideoTextureView(textureView: TextureView?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getVideoSize(): VideoSize {
+        TODO("Not yet implemented")
+    }
+
+    override fun getSurfaceSize(): Size {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCurrentCues(): CueGroup {
+        TODO("Not yet implemented")
+    }
+
+    override fun getDeviceInfo(): DeviceInfo {
+        TODO("Not yet implemented")
+    }
+
+    override fun getDeviceVolume(): Int {
+        TODO("Not yet implemented")
+    }
+
+    override fun isDeviceMuted(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun setDeviceVolume(volume: Int) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setDeviceVolume(volume: Int, flags: Int) {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun increaseDeviceVolume() {
+        TODO("Not yet implemented")
+    }
+
+    override fun increaseDeviceVolume(flags: Int) {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun decreaseDeviceVolume() {
+        TODO("Not yet implemented")
+    }
+
+    override fun decreaseDeviceVolume(flags: Int) {
+        TODO("Not yet implemented")
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun setDeviceMuted(muted: Boolean) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setDeviceMuted(muted: Boolean, flags: Int) {
+        TODO("Not yet implemented")
+    }
+
+}