Skip to content

Commit

Permalink
fix(player): premature hide of the UI
Browse files Browse the repository at this point in the history
  • Loading branch information
urFate committed Jan 20, 2025
1 parent 5d44464 commit d243325
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ class PlayerActivity : ComponentActivity() {

rememberSystemUiController().apply { Util.hideSystemUi(this) }

val exoPlayer = remember { ExoPlayer.Builder(context).build().apply(ExoPlayer::prepare) }

val model = hiltViewModel<PlayerViewModel, PlayerViewModel.PlayerViewModelFactory> {
it.create(
contentUid = arguments!!.getLong("content_uid"),
Expand All @@ -74,11 +76,10 @@ class PlayerActivity : ComponentActivity() {
team = arguments.getString("acting_team").toString(),
repository = arguments.getString("repository").toString(),
initialEpisode = arguments.getInt("episode"),
exoPlayer = exoPlayer
)
}

val exoPlayer = remember { ExoPlayer.Builder(context).build().apply(ExoPlayer::prepare) }

player = exoPlayer

ShiraPlayer(exoPlayer = exoPlayer, model = model)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.media3.exoplayer.ExoPlayer
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.catch
Expand All @@ -27,6 +30,7 @@ import org.shirabox.core.entity.EpisodeEntity
import org.shirabox.core.model.ContentType
import org.shirabox.core.model.Quality
import org.shirabox.core.util.Util
import org.shirabox.core.util.Values
import org.shirabox.data.EpisodesHelper
import org.shirabox.data.animeskip.AnimeSkipRepository
import org.shirabox.data.content.ContentRepositoryRegistry
Expand All @@ -39,6 +43,7 @@ class PlayerViewModel @AssistedInject constructor(
@Assisted("team") val team: String,
@Assisted("repository") val repository: String,
@Assisted val initialEpisode: Int,
@Assisted val exoPlayer: ExoPlayer,
@ApplicationContext context: Context
) : ViewModel() {

Expand All @@ -57,6 +62,8 @@ class PlayerViewModel @AssistedInject constructor(
val currentRepository = ContentRepositoryRegistry.getRepositoryByName(repository)
val isCurrentItemOffline = mutableStateOf(false)

var controlsVisibilityJob: Job? = null

@AssistedFactory
interface PlayerViewModelFactory {
fun create(
Expand All @@ -65,6 +72,7 @@ class PlayerViewModel @AssistedInject constructor(
@Assisted("contentEnName") contentEnName: String,
@Assisted("team") team: String,
@Assisted("repository") repository: String,
exoPlayer: ExoPlayer,
initialEpisode: Int
): PlayerViewModel
}
Expand Down Expand Up @@ -151,6 +159,16 @@ class PlayerViewModel @AssistedInject constructor(
}
}

fun hideUi() {
controlsVisibilityJob?.cancel()
controlsVisibilityJob = viewModelScope.launch {
val delayMs = Values.CONTROLS_HIDE_DELAY
delay(delayMs).let {
if (exoPlayer.isPlaying) controlsVisibilityState = false
}
}
}

fun defaultQualityPreferenceFlow(context: Context): Flow<Int?> =
AppDataStore.read(context, DataStoreScheme.FIELD_DEFAULT_QUALITY.key)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,8 @@ import androidx.media3.exoplayer.hls.HlsMediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource
import androidx.media3.ui.PlayerView
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import org.shirabox.app.ui.activity.player.presentation.PlayerScaffold
import org.shirabox.app.ui.activity.player.presentation.SettingsBottomSheet
import org.shirabox.app.ui.activity.player.presentation.hideControls
import org.shirabox.core.datastore.DataStoreScheme
import org.shirabox.core.entity.EpisodeEntity
import org.shirabox.core.model.Quality
Expand All @@ -47,7 +45,6 @@ import org.shirabox.data.content.AbstractContentRepository
@OptIn(UnstableApi::class)
@Composable
fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {
val coroutineScope = rememberCoroutineScope()
val interactionSource = remember(::MutableInteractionSource)

val playlist by model.playlistFlow().collectAsStateWithLifecycle(initialValue = emptyList())
Expand All @@ -60,10 +57,8 @@ fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {
.clickable(
interactionSource = interactionSource, indication = null
) {
coroutineScope.launch {
model.controlsVisibilityState = !model.controlsVisibilityState
hideControls(exoPlayer, model)
}
model.controlsVisibilityState = !model.controlsVisibilityState
model.hideUi()
}
) {
androidx.compose.animation.AnimatedVisibility(
Expand All @@ -83,7 +78,11 @@ fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {

@OptIn(UnstableApi::class)
@Composable
private fun PlayerSurface(exoPlayer: ExoPlayer, model: PlayerViewModel, playlist: List<EpisodeEntity>) {
private fun PlayerSurface(
exoPlayer: ExoPlayer,
model: PlayerViewModel,
playlist: List<EpisodeEntity>
) {
val context = LocalContext.current
val playerView = PlayerView(context)
val coroutineScope = rememberCoroutineScope()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Expand All @@ -24,7 +23,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.media3.common.Player
import androidx.media3.exoplayer.ExoPlayer
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.shirabox.app.ui.activity.player.PlayerViewModel
import org.shirabox.app.ui.activity.player.presentation.controls.InstantSeekArea
import org.shirabox.app.ui.activity.player.presentation.controls.PlaybackControls
Expand All @@ -33,13 +31,15 @@ import org.shirabox.app.ui.activity.player.presentation.controls.PlayerSkipButto
import org.shirabox.app.ui.activity.player.presentation.controls.PlayerTopBar
import org.shirabox.core.datastore.DataStoreScheme
import org.shirabox.core.entity.EpisodeEntity
import org.shirabox.core.util.Values

@Composable
fun PlayerScaffold(exoPlayer: ExoPlayer, playlist: List<EpisodeEntity>, model: PlayerViewModel) {
fun PlayerScaffold(
exoPlayer: ExoPlayer,
playlist: List<EpisodeEntity>,
model: PlayerViewModel
) {
val context = LocalContext.current
val activity = context as Activity
val coroutineScope = rememberCoroutineScope()

var isPlaying by remember { mutableStateOf(exoPlayer.isPlaying) }
var currentPosition by remember { mutableLongStateOf(exoPlayer.currentPosition) }
Expand Down Expand Up @@ -148,10 +148,8 @@ fun PlayerScaffold(exoPlayer: ExoPlayer, playlist: List<EpisodeEntity>, model: P
)
},
onClick = {
coroutineScope.launch {
model.controlsVisibilityState = !model.controlsVisibilityState
hideControls(exoPlayer, model)
}
model.controlsVisibilityState = !model.controlsVisibilityState
model.hideUi()
}
)

Expand Down Expand Up @@ -202,7 +200,7 @@ fun PlayerScaffold(exoPlayer: ExoPlayer, playlist: List<EpisodeEntity>, model: P
},
onPlayToggle = {
exoPlayer.playWhenReady = !exoPlayer.isPlaying
coroutineScope.launch { hideControls(exoPlayer, model) }
model.hideUi()
},
onSkipNext = {
model.saveEpisodePosition(currentEpisodeInt, exoPlayer.currentPosition, exoPlayer.duration)
Expand Down Expand Up @@ -238,15 +236,4 @@ fun PlayerScaffold(exoPlayer: ExoPlayer, playlist: List<EpisodeEntity>, model: P
}
})
}
}

suspend fun hideControls(
exoPlayer: ExoPlayer,
model: PlayerViewModel
) {
val delayMs = Values.CONTROLS_HIDE_DELAY

delay(delayMs).let {
if (exoPlayer.isPlaying) model.controlsVisibilityState = false
}
}

0 comments on commit d243325

Please sign in to comment.