diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3b86829..ed906fa 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -28,6 +28,8 @@
+
+
diff --git a/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt b/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt
index 2978ce6..7681076 100644
--- a/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt
+++ b/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt
@@ -18,24 +18,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
-import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import eu.toldi.balazs.caster.ui.theme.CasterTheme
-import kotlinx.coroutines.Dispatchers.IO
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-import su.litvak.chromecast.api.v2.Application
-import su.litvak.chromecast.api.v2.ChromeCast
import com.yausername.youtubedl_android.YoutubeDL
-
-import com.yausername.youtubedl_android.YoutubeDLRequest
import com.yausername.youtubedl_android.YoutubeDLException
-import com.yausername.youtubedl_android.mapper.VideoInfo
import eu.toldi.balazs.caster.model.ChromecastManageViewmodel
import eu.toldi.balazs.caster.services.ChromecastManagerService
-import kotlinx.coroutines.withContext
+import eu.toldi.balazs.caster.ui.theme.CasterTheme
+import su.litvak.chromecast.api.v2.ChromeCast
import su.litvak.chromecast.api.v2.Media
import su.litvak.chromecast.api.v2.MediaStatus
@@ -59,7 +48,7 @@ class ChromecastManagerActivity : ComponentActivity() {
} catch (e: YoutubeDLException) {
Log.e("Caster", "failed to initialize youtubedl-android", e)
}
- val serviceIntent = Intent(this, ChromecastManagerService::class.java).also {
+ Intent(this, ChromecastManagerService::class.java).also {
it.action = ChromecastManagerService.ACTION_INIT
it.putExtra("CHROMECAST_ADDRESS", chromeCast.address)
it.putExtra("CHROMECAST_NAME", chromeCast.title)
@@ -72,7 +61,7 @@ class ChromecastManagerActivity : ComponentActivity() {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
Column {
- viewModel.fetchMediaStatus()
+ //viewModel.fetchMediaStatus()
MenuBar()
Column(
modifier = Modifier
@@ -107,14 +96,18 @@ class ChromecastManagerActivity : ComponentActivity() {
if (castEnabled.not()) {
CircularProgressIndicator()
}
- playBackControl()
+ PlayBackControl()
val mediaStatus = viewModel.mediaStatus.value
if (mediaStatus != null) {
- val nowPlaying = mediaStatus.media.metadata[Media.METADATA_TITLE]
+ val nowPlaying =
+ if (mediaStatus.media.metadata != null) mediaStatus.media.metadata[Media.METADATA_TITLE] else ""
Text(text = "Now playing: $nowPlaying")
- var sliderPosition by remember { mutableStateOf((mediaStatus.currentTime / mediaStatus.media.duration).toFloat()) }
-
+ var sliderPosition by remember { mutableStateOf(0.0f) }
+ var sliderMoving by remember { mutableStateOf(false) }
+ if (!sliderMoving)
+ sliderPosition =
+ (mediaStatus.currentTime / mediaStatus.media.duration).toFloat()
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
@@ -136,8 +129,10 @@ class ChromecastManagerActivity : ComponentActivity() {
}
Slider(value = sliderPosition, onValueChange = {
sliderPosition = it
+ sliderMoving = true
}, onValueChangeFinished = {
viewModel.seek(sliderPosition.toDouble())
+ sliderMoving = false
})
}
}
@@ -171,8 +166,10 @@ class ChromecastManagerActivity : ComponentActivity() {
}
@Composable
- fun playBackControl() {
- val mediaStatus = viewModel.mediaStatus.value
+ fun PlayBackControl() {
+ val mediaStatus = if (this::viewModel.isInitialized)
+ viewModel.mediaStatus.value
+ else null
Row {
IconButton(onClick = {
@@ -185,12 +182,6 @@ class ChromecastManagerActivity : ComponentActivity() {
contentDescription = "FastRewind"
)
}
- /*
- var playBackState by remember { mutableStateOf(MediaStatus.PlayerState.IDLE) }
- lifecycleScope.launch(IO) {
- if(chromeCast.mediaStatus != null)
- playBackState = chromeCast.mediaStatus.playerState
- }*/
IconButton(onClick = {
if (mediaStatus != null) {
@@ -200,7 +191,6 @@ class ChromecastManagerActivity : ComponentActivity() {
if (mediaStatus.playerState == MediaStatus.PlayerState.PAUSED) {
viewModel.play()
}
- viewModel.fetchMediaStatus()
}
}, enabled = mediaStatus != null) {
@@ -280,7 +270,7 @@ class ChromecastManagerActivity : ComponentActivity() {
Text(text = "Cast")
}
// val viewModel = ViewModelProvider(this).get(ChromecastManageViewmodel::class.java)
- //playBackControl(viewModel)
+ PlayBackControl()
Text(text = "Now playing: Some video")
var sliderPosition by remember { mutableStateOf(0f) }
Slider(value = sliderPosition, onValueChange = { sliderPosition = it })
diff --git a/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt b/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt
index 9a4c4e0..af705f7 100644
--- a/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt
+++ b/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt
@@ -9,11 +9,9 @@ import eu.toldi.balazs.caster.ChromeCastHelper
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
import su.litvak.chromecast.api.v2.ChromeCast
-import su.litvak.chromecast.api.v2.ChromeCastSpontaneousEvent
-import su.litvak.chromecast.api.v2.ChromeCastSpontaneousEventListener
import su.litvak.chromecast.api.v2.MediaStatus
-class ChromecastManageViewmodel : ViewModel(), ChromeCastSpontaneousEventListener {
+class ChromecastManageViewmodel : ViewModel() {
private val _mediaState = mutableStateOf(null)
val mediaStatus: State
@@ -23,13 +21,14 @@ class ChromecastManageViewmodel : ViewModel(), ChromeCastSpontaneousEventListene
init {
viewModelScope.launch(IO) {
+ fetchMediaStatus()
while (true) {
fetchMediaStatus()
- Thread.sleep(1000)
+ Thread.sleep(3000)
}
}
}
-
+/*
override fun spontaneousEventReceived(event: ChromeCastSpontaneousEvent?) {
Log.e(null, event?.type.toString())
if (event != null) {
@@ -37,11 +36,15 @@ class ChromecastManageViewmodel : ViewModel(), ChromeCastSpontaneousEventListene
_mediaState.value = event.data as MediaStatus
}
}
- }
+ }*/
fun fetchMediaStatus() {
viewModelScope.launch(IO) {
- _mediaState.value = ChromeCastHelper.fetchMediaStatus()
+ try {
+ _mediaState.value = ChromeCastHelper.fetchMediaStatus()
+ } catch (e: Exception) {
+ Log.e(null, e.stackTraceToString())
+ }
}
}
diff --git a/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt b/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt
index 9adc79a..6942414 100644
--- a/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt
+++ b/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt
@@ -6,9 +6,6 @@ import android.app.PendingIntent
import android.app.Service
import android.content.Intent
import android.media.MediaPlayer
-import android.media.session.MediaController
-import android.media.session.MediaSession
-import android.media.session.PlaybackState
import android.os.Build
import android.os.IBinder
import android.support.v4.media.session.MediaControllerCompat
@@ -19,12 +16,13 @@ import androidx.core.app.NotificationCompat
import eu.toldi.balazs.caster.App.Companion.CHANNEL_ID
import eu.toldi.balazs.caster.ChromeCastHelper
import eu.toldi.balazs.caster.R
-import kotlinx.coroutines.*
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers.IO
-
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import su.litvak.chromecast.api.v2.ChromeCast
import su.litvak.chromecast.api.v2.Media
-
import su.litvak.chromecast.api.v2.MediaStatus
@@ -100,7 +98,7 @@ class ChromecastManagerService : Service() {
} catch (e: Exception) {
Log.e(null,e.stackTraceToString())
}
- Thread.sleep(1000)
+ Thread.sleep(10500)
}
}
}