diff --git a/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsComposable.kt b/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsComposable.kt index e499bf4..666e27d 100644 --- a/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsComposable.kt +++ b/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsComposable.kt @@ -31,6 +31,7 @@ import androidx.compose.material3.SliderDefaults import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment @@ -94,11 +95,15 @@ fun LessonContent( viewModel: LessonsViewModel ) { val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.anim_plant)) - + val context = LocalContext.current val sliderPosition by viewModel.playbackPosition.collectAsState() val playbackDuration by viewModel.playbackDuration.collectAsState() val isPlaying by viewModel.isPlaying.collectAsState() + LaunchedEffect(key1 = lessonDetails) { + viewModel.preparePlayer(context, lessonDetails.lessonDetails.audioResId) + } + Column( modifier = modifier ) { diff --git a/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsViewModel.kt b/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsViewModel.kt index bc9aecd..8205647 100644 --- a/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsViewModel.kt +++ b/app/src/main/kotlin/com/d4rk/englishwithlidia/plus/ui/lessons/LessonsViewModel.kt @@ -15,6 +15,8 @@ import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import com.d4rk.englishwithlidia.plus.data.model.ui.lessons.UiLessonsAsset import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -41,41 +43,41 @@ class LessonsViewModel @OptIn(UnstableApi::class) private var player: Player? = null - fun preparePlayer(context: Context, audioPath: String) { + init { viewModelScope.launch { - player?.release() - - val resourceId = context.resources.getIdentifier( - audioPath, "raw", context.packageName - ) + player = ExoPlayer.Builder(getApplication()).build() + } + } - if (resourceId != 0) { - val audioUri = Uri.parse("android.resource://${context.packageName}/$resourceId") - player = ExoPlayer.Builder(getApplication()).build().apply { - setMediaItem(MediaItem.fromUri(audioUri)) - prepare() - playWhenReady = false + fun preparePlayer(context: Context, audioResId: Int) { + viewModelScope.launch { + player?.release() - addListener(object : Player.Listener { - override fun onIsPlayingChanged(isPlaying: Boolean) { - _isPlaying.value = isPlaying - } + val audioUri = Uri.parse("android.resource://${context.packageName}/$audioResId") + player = ExoPlayer.Builder(getApplication()).build().apply { + setMediaItem(MediaItem.fromUri(audioUri)) + prepare() + playWhenReady = false - override fun onPlaybackStateChanged(playbackState: Int) { - if (playbackState == Player.STATE_READY) { - _playbackDuration.value = duration - } - } + addListener(object : Player.Listener { + override fun onIsPlayingChanged(isPlaying: Boolean) { + _isPlaying.value = isPlaying + } - override fun onPositionDiscontinuity( - oldPosition: Player.PositionInfo, - newPosition: Player.PositionInfo, - reason: Int - ) { - _playbackPosition.value = currentPosition + override fun onPlaybackStateChanged(playbackState: Int) { + if (playbackState == Player.STATE_READY) { + _playbackDuration.value = duration } - }) - } + } + + override fun onPositionDiscontinuity( + oldPosition: Player.PositionInfo, + newPosition: Player.PositionInfo, + reason: Int + ) { + _playbackPosition.value = currentPosition + } + }) } startPositionUpdateJob() } @@ -99,6 +101,10 @@ class LessonsViewModel @OptIn(UnstableApi::class) viewModelScope.launch { while (true) { _playbackPosition.value = player?.currentPosition ?: 0L + delay(100) + if (player?.isPlaying == false) { + break + } } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f41dfe2..53d50ea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,7 +130,7 @@ License About - Learn more about Cart Calculator + Learn more about English with Lidia App info Application build version