Stability changes

Signed-off-by: Balazs Toldi <balazs@toldi.eu>
This commit is contained in:
Balazs Toldi 2021-11-29 12:04:52 +01:00
parent cf4374d34b
commit 0432c0be90
Signed by: Bazsalanszky
GPG key ID: 933820884952BE27
4 changed files with 36 additions and 43 deletions

View file

@ -28,6 +28,8 @@
<entry key="../../../../../layout/compose-model-1637656156044.xml" value="0.25" /> <entry key="../../../../../layout/compose-model-1637656156044.xml" value="0.25" />
<entry key="../../../../../layout/compose-model-1637673325505.xml" value="0.11570945945945946" /> <entry key="../../../../../layout/compose-model-1637673325505.xml" value="0.11570945945945946" />
<entry key="../../../../../layout/compose-model-1637674242617.xml" value="0.49537037037037035" /> <entry key="../../../../../layout/compose-model-1637674242617.xml" value="0.49537037037037035" />
<entry key="../../../../../layout/compose-model-1638180237267.xml" value="0.3095439189189189" />
<entry key="../../../../../layout/compose-model-1638183069943.xml" value="0.33" />
</map> </map>
</option> </option>
</component> </component>

View file

@ -18,24 +18,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider 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.YoutubeDL
import com.yausername.youtubedl_android.YoutubeDLRequest
import com.yausername.youtubedl_android.YoutubeDLException 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.model.ChromecastManageViewmodel
import eu.toldi.balazs.caster.services.ChromecastManagerService 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.Media
import su.litvak.chromecast.api.v2.MediaStatus import su.litvak.chromecast.api.v2.MediaStatus
@ -59,7 +48,7 @@ class ChromecastManagerActivity : ComponentActivity() {
} catch (e: YoutubeDLException) { } catch (e: YoutubeDLException) {
Log.e("Caster", "failed to initialize youtubedl-android", e) 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.action = ChromecastManagerService.ACTION_INIT
it.putExtra("CHROMECAST_ADDRESS", chromeCast.address) it.putExtra("CHROMECAST_ADDRESS", chromeCast.address)
it.putExtra("CHROMECAST_NAME", chromeCast.title) it.putExtra("CHROMECAST_NAME", chromeCast.title)
@ -72,7 +61,7 @@ class ChromecastManagerActivity : ComponentActivity() {
// A surface container using the 'background' color from the theme // A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) { Surface(color = MaterialTheme.colors.background) {
Column { Column {
viewModel.fetchMediaStatus() //viewModel.fetchMediaStatus()
MenuBar() MenuBar()
Column( Column(
modifier = Modifier modifier = Modifier
@ -107,14 +96,18 @@ class ChromecastManagerActivity : ComponentActivity() {
if (castEnabled.not()) { if (castEnabled.not()) {
CircularProgressIndicator() CircularProgressIndicator()
} }
playBackControl() PlayBackControl()
val mediaStatus = viewModel.mediaStatus.value val mediaStatus = viewModel.mediaStatus.value
if (mediaStatus != null) { 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") 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( Row(
Modifier.fillMaxWidth(), Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween horizontalArrangement = Arrangement.SpaceBetween
@ -136,8 +129,10 @@ class ChromecastManagerActivity : ComponentActivity() {
} }
Slider(value = sliderPosition, onValueChange = { Slider(value = sliderPosition, onValueChange = {
sliderPosition = it sliderPosition = it
sliderMoving = true
}, onValueChangeFinished = { }, onValueChangeFinished = {
viewModel.seek(sliderPosition.toDouble()) viewModel.seek(sliderPosition.toDouble())
sliderMoving = false
}) })
} }
} }
@ -171,8 +166,10 @@ class ChromecastManagerActivity : ComponentActivity() {
} }
@Composable @Composable
fun playBackControl() { fun PlayBackControl() {
val mediaStatus = viewModel.mediaStatus.value val mediaStatus = if (this::viewModel.isInitialized)
viewModel.mediaStatus.value
else null
Row { Row {
IconButton(onClick = { IconButton(onClick = {
@ -185,12 +182,6 @@ class ChromecastManagerActivity : ComponentActivity() {
contentDescription = "FastRewind" contentDescription = "FastRewind"
) )
} }
/*
var playBackState by remember { mutableStateOf(MediaStatus.PlayerState.IDLE) }
lifecycleScope.launch(IO) {
if(chromeCast.mediaStatus != null)
playBackState = chromeCast.mediaStatus.playerState
}*/
IconButton(onClick = { IconButton(onClick = {
if (mediaStatus != null) { if (mediaStatus != null) {
@ -200,7 +191,6 @@ class ChromecastManagerActivity : ComponentActivity() {
if (mediaStatus.playerState == MediaStatus.PlayerState.PAUSED) { if (mediaStatus.playerState == MediaStatus.PlayerState.PAUSED) {
viewModel.play() viewModel.play()
} }
viewModel.fetchMediaStatus()
} }
}, enabled = mediaStatus != null) { }, enabled = mediaStatus != null) {
@ -280,7 +270,7 @@ class ChromecastManagerActivity : ComponentActivity() {
Text(text = "Cast") Text(text = "Cast")
} }
// val viewModel = ViewModelProvider(this).get(ChromecastManageViewmodel::class.java) // val viewModel = ViewModelProvider(this).get(ChromecastManageViewmodel::class.java)
//playBackControl(viewModel) PlayBackControl()
Text(text = "Now playing: Some video") Text(text = "Now playing: Some video")
var sliderPosition by remember { mutableStateOf(0f) } var sliderPosition by remember { mutableStateOf(0f) }
Slider(value = sliderPosition, onValueChange = { sliderPosition = it }) Slider(value = sliderPosition, onValueChange = { sliderPosition = it })

View file

@ -9,11 +9,9 @@ import eu.toldi.balazs.caster.ChromeCastHelper
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import su.litvak.chromecast.api.v2.ChromeCast 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 import su.litvak.chromecast.api.v2.MediaStatus
class ChromecastManageViewmodel : ViewModel(), ChromeCastSpontaneousEventListener { class ChromecastManageViewmodel : ViewModel() {
private val _mediaState = mutableStateOf<MediaStatus?>(null) private val _mediaState = mutableStateOf<MediaStatus?>(null)
val mediaStatus: State<MediaStatus?> val mediaStatus: State<MediaStatus?>
@ -23,13 +21,14 @@ class ChromecastManageViewmodel : ViewModel(), ChromeCastSpontaneousEventListene
init { init {
viewModelScope.launch(IO) { viewModelScope.launch(IO) {
fetchMediaStatus()
while (true) { while (true) {
fetchMediaStatus() fetchMediaStatus()
Thread.sleep(1000) Thread.sleep(3000)
} }
} }
} }
/*
override fun spontaneousEventReceived(event: ChromeCastSpontaneousEvent?) { override fun spontaneousEventReceived(event: ChromeCastSpontaneousEvent?) {
Log.e(null, event?.type.toString()) Log.e(null, event?.type.toString())
if (event != null) { if (event != null) {
@ -37,11 +36,15 @@ class ChromecastManageViewmodel : ViewModel(), ChromeCastSpontaneousEventListene
_mediaState.value = event.data as MediaStatus _mediaState.value = event.data as MediaStatus
} }
} }
} }*/
fun fetchMediaStatus() { fun fetchMediaStatus() {
viewModelScope.launch(IO) { viewModelScope.launch(IO) {
_mediaState.value = ChromeCastHelper.fetchMediaStatus() try {
_mediaState.value = ChromeCastHelper.fetchMediaStatus()
} catch (e: Exception) {
Log.e(null, e.stackTraceToString())
}
} }
} }

View file

@ -6,9 +6,6 @@ import android.app.PendingIntent
import android.app.Service import android.app.Service
import android.content.Intent import android.content.Intent
import android.media.MediaPlayer 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.Build
import android.os.IBinder import android.os.IBinder
import android.support.v4.media.session.MediaControllerCompat 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.App.Companion.CHANNEL_ID
import eu.toldi.balazs.caster.ChromeCastHelper import eu.toldi.balazs.caster.ChromeCastHelper
import eu.toldi.balazs.caster.R import eu.toldi.balazs.caster.R
import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers.IO 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.ChromeCast
import su.litvak.chromecast.api.v2.Media import su.litvak.chromecast.api.v2.Media
import su.litvak.chromecast.api.v2.MediaStatus import su.litvak.chromecast.api.v2.MediaStatus
@ -100,7 +98,7 @@ class ChromecastManagerService : Service() {
} catch (e: Exception) { } catch (e: Exception) {
Log.e(null,e.stackTraceToString()) Log.e(null,e.stackTraceToString())
} }
Thread.sleep(1000) Thread.sleep(10500)
} }
} }
} }