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) } } }