Skip to content

Commit dd7e55b

Browse files
author
innix
authored
feat: Add ability for seek skip duration to be added up progressively
Adds a new option on player settings which when enabled, Adds 5 seconds to each seek skip incrementally on each tap until the clicking stops found this myself when listening to long songs but it could be useful for other use-cases too
1 parent e9dae32 commit dd7e55b

File tree

5 files changed

+44
-9
lines changed

5 files changed

+44
-9
lines changed

app/src/main/kotlin/com/metrolist/music/constants/PreferenceKeys.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ val SliderStyleKey = stringPreferencesKey("sliderStyle")
1818
val SwipeToSongKey = booleanPreferencesKey("SwipeToSong")
1919
val UseNewPlayerDesignKey= booleanPreferencesKey("useNewPlayerDesign")
2020
val UseNewMiniPlayerDesignKey = booleanPreferencesKey("useNewMiniPlayerDesign")
21+
val SeekExtraSeconds = booleanPreferencesKey("seekExtraSeconds")
2122

2223
enum class SliderStyle {
2324
DEFAULT,

app/src/main/kotlin/com/metrolist/music/ui/player/Thumbnail.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import androidx.compose.runtime.LaunchedEffect
3737
import androidx.compose.runtime.collectAsState
3838
import androidx.compose.runtime.derivedStateOf
3939
import androidx.compose.runtime.getValue
40+
import androidx.compose.runtime.mutableLongStateOf
4041
import androidx.compose.runtime.mutableStateOf
4142
import androidx.compose.runtime.remember
4243
import androidx.compose.runtime.rememberCoroutineScope
@@ -67,6 +68,7 @@ import com.metrolist.music.R
6768
import com.metrolist.music.constants.PlayerBackgroundStyle
6869
import com.metrolist.music.constants.PlayerBackgroundStyleKey
6970
import com.metrolist.music.constants.PlayerHorizontalPadding
71+
import com.metrolist.music.constants.SeekExtraSeconds
7072
import com.metrolist.music.constants.SwipeThumbnailKey
7173
import com.metrolist.music.constants.ThumbnailCornerRadius
7274
import com.metrolist.music.utils.rememberEnumPreference
@@ -241,7 +243,6 @@ fun Thumbnail(
241243
style = MaterialTheme.typography.titleMedium,
242244
color = textBackgroundColor
243245
)
244-
245246
// Show album title or queue title
246247
val playingFrom = queueTitle ?: mediaMetadata?.album?.title
247248
if (!playingFrom.isNullOrBlank()) {
@@ -278,6 +279,10 @@ fun Thumbnail(
278279
item.mediaId.ifEmpty { "unknown_${item.hashCode()}" }
279280
}
280281
) { item ->
282+
val incrementalSeekSkipEnabled by rememberPreference(SeekExtraSeconds, defaultValue = false)
283+
var skipMultiplier by remember { mutableStateOf(1) }
284+
var lastTapTime by remember { mutableLongStateOf(0L) }
285+
281286
Box(
282287
modifier = Modifier
283288
.width(horizontalLazyGridItemWidth)
@@ -287,21 +292,33 @@ fun Thumbnail(
287292
detectTapGestures(
288293
onDoubleTap = { offset ->
289294
val currentPosition = playerConnection.player.currentPosition
295+
val duration = playerConnection.player.duration
296+
297+
val now = System.currentTimeMillis()
298+
if (incrementalSeekSkipEnabled && now - lastTapTime < 1000) {
299+
skipMultiplier++
300+
} else {
301+
skipMultiplier = 1
302+
}
303+
lastTapTime = now
304+
305+
val skipAmount = 5000 * skipMultiplier
306+
290307
if ((layoutDirection == LayoutDirection.Ltr && offset.x < size.width / 2) ||
291308
(layoutDirection == LayoutDirection.Rtl && offset.x > size.width / 2)
292309
) {
293310
playerConnection.player.seekTo(
294-
(currentPosition - 5000).coerceAtLeast(0)
311+
(currentPosition - skipAmount).coerceAtLeast(0)
295312
)
296-
seekDirection = context.getString(R.string.seek_backward)
313+
seekDirection =
314+
context.getString(R.string.seek_backward_dynamic, skipAmount / 1000)
297315
} else {
298316
playerConnection.player.seekTo(
299-
(currentPosition + 5000).coerceAtMost(
300-
playerConnection.player.duration
301-
)
317+
(currentPosition + skipAmount).coerceAtMost(duration)
302318
)
303-
seekDirection = context.getString(R.string.seek_forward)
319+
seekDirection = context.getString(R.string.seek_forward_dynamic, skipAmount / 1000)
304320
}
321+
305322
showSeekEffect = true
306323
}
307324
)

app/src/main/kotlin/com/metrolist/music/ui/screens/settings/PlayerSettings.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import com.metrolist.music.constants.SimilarContent
4848
import com.metrolist.music.constants.SkipSilenceKey
4949
import com.metrolist.music.constants.StopMusicOnTaskClearKey
5050
import com.metrolist.music.constants.HistoryDuration
51+
import com.metrolist.music.constants.SeekExtraSeconds
5152
import com.metrolist.music.ui.component.EnumListPreference
5253
import com.metrolist.music.ui.component.IconButton
5354
import com.metrolist.music.ui.component.PreferenceGroupTitle
@@ -80,6 +81,12 @@ fun PlayerSettings(
8081
AudioNormalizationKey,
8182
defaultValue = true
8283
)
84+
85+
val (seekExtraSeconds, onSeekExtraSeconds) = rememberPreference(
86+
SeekExtraSeconds,
87+
defaultValue = false
88+
)
89+
8390
val (autoLoadMore, onAutoLoadMoreChange) = rememberPreference(
8491
AutoLoadMoreKey,
8592
defaultValue = true
@@ -157,6 +164,14 @@ fun PlayerSettings(
157164
onCheckedChange = onAudioNormalizationChange
158165
)
159166

167+
SwitchPreference(
168+
title = { Text(stringResource(R.string.seek_seconds_addup)) },
169+
description = stringResource(R.string.seek_seconds_addup_description),
170+
icon = { Icon(painterResource(R.drawable.arrow_forward), null) },
171+
checked = seekExtraSeconds,
172+
onCheckedChange = onSeekExtraSeconds
173+
)
174+
160175
PreferenceGroupTitle(
161176
title = stringResource(R.string.queue)
162177
)

app/src/main/res/values/metrolist_strings.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@
6767
<item quantity="other">%d times</item>
6868
</plurals>
6969

70-
<string name="seek_backward">5 seconds backward</string>
71-
<string name="seek_forward">5 seconds forward</string>
70+
<string name="seek_forward_dynamic">+%1$d seconds forwards</string>
71+
<string name="seek_backward_dynamic">-%1$d seconds backwards</string>
7272

7373
<string name="similar_content">Similar content</string>
7474

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@
284284
<string name="auto_load_more_desc">Automatically add more songs when the end of the queue is reached, if possible</string>
285285
<string name="skip_silence">Skip silence</string>
286286
<string name="audio_normalization">Audio normalization</string>
287+
<string name="seek_seconds_addup">Progressive seek</string>
288+
<string name="seek_seconds_addup_description">If enabled, Adds up 5 extra seconds incrementally on each seek skip</string>
287289
<string name="auto_skip_next_on_error">Auto skip to next song when error occurs</string>
288290
<string name="auto_skip_next_on_error_desc">Ensure your continuous playback experience</string>
289291
<string name="stop_music_on_task_clear">Stop music on task clear</string>

0 commit comments

Comments
 (0)