Skip to content

Commit 2acb4ad

Browse files
authored
fix: restart on previous on player screen (#309)
1 parent 0730e6e commit 2acb4ad

File tree

4 files changed

+34
-12
lines changed

4 files changed

+34
-12
lines changed

app/src/main/kotlin/org/fossify/musicplayer/activities/TrackActivity.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import org.fossify.musicplayer.extensions.getTrackCoverArt
5050
import org.fossify.musicplayer.extensions.getTrackFromUri
5151
import org.fossify.musicplayer.extensions.isReallyPlaying
5252
import org.fossify.musicplayer.extensions.loadGlideResource
53+
import org.fossify.musicplayer.extensions.maybeRestartOnPrevious
5354
import org.fossify.musicplayer.extensions.nextMediaItem
5455
import org.fossify.musicplayer.extensions.sendCommand
5556
import org.fossify.musicplayer.extensions.setRepeatMode
@@ -198,9 +199,9 @@ class TrackActivity : SimpleControllerActivity(), PlaybackSpeedListener {
198199

199200
private fun setupButtons() = binding.apply {
200201
activityTrackToggleShuffle.setOnClickListener { withPlayer { toggleShuffle() } }
201-
activityTrackPrevious.setOnClickListener { seekWithDelay(previous = true) }
202+
activityTrackPrevious.setOnClickListener { seekToPrevious() }
202203
activityTrackPlayPause.setOnClickListener { togglePlayback() }
203-
activityTrackNext.setOnClickListener { seekWithDelay() }
204+
activityTrackNext.setOnClickListener { seekToNext() }
204205
activityTrackProgressCurrent.setOnClickListener { seekBack() }
205206
activityTrackProgressMax.setOnClickListener { seekForward() }
206207
activityTrackPlaybackSetting.setOnClickListener { togglePlaybackSetting() }
@@ -494,12 +495,24 @@ class TrackActivity : SimpleControllerActivity(), PlaybackSpeedListener {
494495
binding.activityTrackPlayPause.updatePlayPauseIcon(isPlaying, getProperTextColor())
495496
}
496497

498+
private fun seekToNext() {
499+
seekCount += 1
500+
seekWithDelay()
501+
}
502+
503+
private fun seekToPrevious() {
504+
withPlayer {
505+
if (maybeRestartOnPrevious()) return@withPlayer
506+
seekCount -= 1
507+
seekWithDelay()
508+
}
509+
}
510+
497511
/**
498512
* This is here so the player can quickly seek next/previous without doing too much work.
499513
* It probably won't be needed once https://github.com/androidx/media/issues/81 is resolved.
500514
*/
501-
private fun seekWithDelay(previous: Boolean = false) {
502-
if (previous) seekCount -= 1 else seekCount += 1
515+
private fun seekWithDelay() {
503516
seekJob?.cancel()
504517
seekJob = scope.launch {
505518
delay(timeMillis = SEEK_COALESCE_INTERVAL_MS)

app/src/main/kotlin/org/fossify/musicplayer/extensions/Player.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.media3.common.MediaItem
66
import androidx.media3.common.Player
77
import org.fossify.commons.helpers.ensureBackgroundThread
88
import org.fossify.musicplayer.helpers.PlaybackSetting
9+
import org.fossify.musicplayer.helpers.RESTART_ON_PREVIOUS_THRESHOLD
910
import org.fossify.musicplayer.models.Track
1011
import org.fossify.musicplayer.models.toMediaItemsFast
1112

@@ -99,6 +100,15 @@ fun Player.setRepeatMode(playbackSetting: PlaybackSetting) {
99100
}
100101
}
101102

103+
fun Player.maybeRestartOnPrevious(): Boolean {
104+
if (currentPosition > RESTART_ON_PREVIOUS_THRESHOLD) {
105+
seekTo(0)
106+
return true
107+
} else {
108+
return false
109+
}
110+
}
111+
102112
/**
103113
* Force seek to the next media item regardless of the current [Player.RepeatMode]. Returns true on success.
104114
*/

app/src/main/kotlin/org/fossify/musicplayer/helpers/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ const val SORT_PLAYLIST_PREFIX = "sort_playlist_"
6666

6767
const val SEEK_INTERVAL_MS = 10000L
6868
const val SEEK_INTERVAL_S = 10
69+
const val RESTART_ON_PREVIOUS_THRESHOLD = 5000L
6970

7071
const val SHOW_FILENAME_NEVER = 1
7172
const val SHOW_FILENAME_IF_UNAVAILABLE = 2

app/src/main/kotlin/org/fossify/musicplayer/playback/player/SimpleMusicPlayer.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.media3.exoplayer.source.ShuffleOrder.DefaultShuffleOrder
99
import org.fossify.musicplayer.extensions.currentMediaItems
1010
import org.fossify.musicplayer.extensions.maybeForceNext
1111
import org.fossify.musicplayer.extensions.maybeForcePrevious
12+
import org.fossify.musicplayer.extensions.maybeRestartOnPrevious
1213
import org.fossify.musicplayer.extensions.move
1314
import org.fossify.musicplayer.extensions.shuffledMediaItemsIndices
1415
import org.fossify.musicplayer.inlines.indexOfFirstOrNull
@@ -37,18 +38,15 @@ class SimpleMusicPlayer(private val exoPlayer: ExoPlayer) : ForwardingPlayer(exo
3738

3839
override fun seekToNext() {
3940
play()
40-
if (!maybeForceNext()) {
41-
super.seekToNext()
42-
}
41+
if (maybeForceNext()) return
42+
super.seekToNext()
4343
}
4444

4545
override fun seekToPrevious() {
4646
play()
47-
if (currentPosition > 5000) {
48-
seekTo(0)
49-
} else if (!maybeForcePrevious()) {
50-
super.seekToPrevious()
51-
}
47+
if (maybeRestartOnPrevious()) return
48+
if (maybeForcePrevious()) return
49+
super.seekToPrevious()
5250
}
5351

5452
override fun seekToNextMediaItem() = seekToNext()

0 commit comments

Comments
 (0)