Coverage Summary for Class: PlayClickTrackViewModelImpl (com.vsevolodganin.clicktrack.play)

Class Method, % Branch, % Line, % Instruction, %
PlayClickTrackViewModelImpl 0% (0/11) 0% (0/12) 0% (0/35) 0% (0/209)
PlayClickTrackViewModelImpl$onBackClick$$inlined$pop$default$1 0% (0/1)
PlayClickTrackViewModelImpl$onBackClick$$inlined$pop$default$2 0% (0/1)
PlayClickTrackViewModelImpl$onCancelExportClick$1 0% (0/1) 0% (0/1) 0% (0/8)
PlayClickTrackViewModelImpl$onExportClick$1 0% (0/1) 0% (0/1) 0% (0/16)
PlayClickTrackViewModelImpl$onRemoveClick$1 0% (0/1) 0% (0/2) 0% (0/26)
PlayClickTrackViewModelImpl$onRemoveClick$1$1 0% (0/1) 0% (0/1) 0% (0/5)
PlayClickTrackViewModelImpl$onRemoveClick$1$1$invokeSuspend$$inlined$pop$default$1 0% (0/1)
PlayClickTrackViewModelImpl$onRemoveClick$1$1$invokeSuspend$$inlined$pop$default$2 0% (0/1)
PlayClickTrackViewModelImpl$special$$inlined$registerSaveStateFor$1 0% (0/1)
PlayClickTrackViewModelImpl$state$1 0% (0/1) 0% (0/4) 0% (0/4) 0% (0/27)
Total 0% (0/21) 0% (0/16) 0% (0/44) 0% (0/291)


 package com.vsevolodganin.clicktrack.play
 
 import com.arkivanov.decompose.ComponentContext
 import com.arkivanov.decompose.router.stack.pop
 import com.vsevolodganin.clicktrack.ScreenConfiguration
 import com.vsevolodganin.clicktrack.ScreenStackNavigation
 import com.vsevolodganin.clicktrack.export.ExportWorkLauncher
 import com.vsevolodganin.clicktrack.player.PlayerServiceAccess
 import com.vsevolodganin.clicktrack.storage.ClickTrackRepository
 import com.vsevolodganin.clicktrack.storage.UserPreferencesRepository
 import com.vsevolodganin.clicktrack.utils.decompose.consumeSavedState
 import com.vsevolodganin.clicktrack.utils.decompose.coroutineScope
 import com.vsevolodganin.clicktrack.utils.decompose.pushIfUnique
 import com.vsevolodganin.clicktrack.utils.decompose.registerSaveStateFor
 import com.vsevolodganin.clicktrack.utils.grabIf
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import me.tatarka.inject.annotations.Assisted
 import me.tatarka.inject.annotations.Inject
 
 @Inject
 class PlayClickTrackViewModelImpl(
     @Assisted componentContext: ComponentContext,
     @Assisted private val config: ScreenConfiguration.PlayClickTrack,
     private val navigation: ScreenStackNavigation,
     private val clickTrackRepository: ClickTrackRepository,
     private val playerServiceAccess: PlayerServiceAccess,
     private val userPreferences: UserPreferencesRepository,
     private val exportWorkLauncher: ExportWorkLauncher,
 ) : PlayClickTrackViewModel, ComponentContext by componentContext {
     private val scope = coroutineScope()
 
     override val state: StateFlow<PlayClickTrackState?> = combine(
         clickTrackRepository.getById(config.id).filterNotNull(),
         userPreferences.playTrackingMode.flow,
         playerServiceAccess.playbackState(),
     ) { clickTrack, playTrackingMode, playbackState ->
         PlayClickTrackState(
             clickTrack = clickTrack,
             playProgress = grabIf(playbackState?.id == clickTrack.id) { playbackState?.progress },
             playTrackingMode = playTrackingMode,
         )
     }.stateIn(scope, SharingStarted.Eagerly, consumeSavedState())
 
     init {
         registerSaveStateFor(state)
     }
 
     override fun onBackClick() = navigation.pop()
 
     override fun onTogglePlayStop() {
         val state = state.value ?: return
         if (state.isPlaying) {
             playerServiceAccess.stop()
         } else {
             playerServiceAccess.start(config.id)
         }
     }
 
     override fun onTogglePlayPause() {
         val state = state.value ?: return
         if (state.isPaused) {
             playerServiceAccess.resume()
         } else {
             playerServiceAccess.pause()
         }
     }
 
     override fun onTogglePlayTrackingMode() = userPreferences.playTrackingMode.edit { !it }
 
     override fun onProgressDragStart() = playerServiceAccess.pause()
 
     override fun onProgressDrop(progress: Double) {
         val state = state.value ?: return
         if (state.isPlaying) {
             playerServiceAccess.start(config.id, progress)
         }
     }
 
     override fun onEditClick() = navigation.pushIfUnique(ScreenConfiguration.EditClickTrack(config.id, isInitialEdit = false))
 
     override fun onRemoveClick() {
         scope.launch {
             clickTrackRepository.remove(config.id)
             withContext(Dispatchers.Main) {
                 navigation.pop()
             }
         }
     }
 
     override fun onExportClick() {
         scope.launch {
             exportWorkLauncher.launchExportToAudioFile(config.id)
         }
     }
 
     override fun onCancelExportClick() {
         scope.launch {
             exportWorkLauncher.stopExportToAudioFile(config.id)
         }
     }
 }