From feb38967276c94e5f8e8494f4e30f624d4457ee4 Mon Sep 17 00:00:00 2001 From: Antoine Jaury Date: Mon, 22 Jun 2026 19:16:24 +0200 Subject: [PATCH] fix: handle invalid index in centerItem and return null for out-of-range subtitle indices --- .../subtitle/domain/GetCurrentSubtitleIndexUseCase.kt | 2 +- .../gwenedeg/subtitle/GetCurrentSubtitleIndexUseCaseTest.kt | 4 ++-- .../kotlin/fr/ajaury/gwenedeg/player/ui/SubtitleList.kt | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/subtitle/src/commonMain/kotlin/fr/ajaury/gwenedeg/subtitle/domain/GetCurrentSubtitleIndexUseCase.kt b/data/subtitle/src/commonMain/kotlin/fr/ajaury/gwenedeg/subtitle/domain/GetCurrentSubtitleIndexUseCase.kt index 0cf3ee7..649b4b1 100644 --- a/data/subtitle/src/commonMain/kotlin/fr/ajaury/gwenedeg/subtitle/domain/GetCurrentSubtitleIndexUseCase.kt +++ b/data/subtitle/src/commonMain/kotlin/fr/ajaury/gwenedeg/subtitle/domain/GetCurrentSubtitleIndexUseCase.kt @@ -4,5 +4,5 @@ class GetCurrentSubtitleIndexUseCase { operator fun invoke( subtitle: Subtitle, progressMs: Long, - ): Int = subtitle.lines.indexOfLast { it.startMs <= progressMs } + ): Int? = subtitle.lines.indexOfLast { it.startMs <= progressMs }.takeIf { it >= 0 } } diff --git a/data/subtitle/src/commonTest/kotlin/fr/ajaury/gwenedeg/subtitle/GetCurrentSubtitleIndexUseCaseTest.kt b/data/subtitle/src/commonTest/kotlin/fr/ajaury/gwenedeg/subtitle/GetCurrentSubtitleIndexUseCaseTest.kt index 04eba02..f4502b7 100644 --- a/data/subtitle/src/commonTest/kotlin/fr/ajaury/gwenedeg/subtitle/GetCurrentSubtitleIndexUseCaseTest.kt +++ b/data/subtitle/src/commonTest/kotlin/fr/ajaury/gwenedeg/subtitle/GetCurrentSubtitleIndexUseCaseTest.kt @@ -21,7 +21,7 @@ class GetCurrentSubtitleIndexUseCaseTest { @Test fun returns_minus_one_before_the_first_cue() { - assertEquals(-1, getCurrentSubtitleIndex(subtitle, progressMs = -1)) + assertEquals(null, getCurrentSubtitleIndex(subtitle, progressMs = -1)) } @Test @@ -39,6 +39,6 @@ class GetCurrentSubtitleIndexUseCaseTest { @Test fun returns_minus_one_for_an_empty_subtitle() { - assertEquals(-1, getCurrentSubtitleIndex(Subtitle(emptyList()), progressMs = 1_000)) + assertEquals(null, getCurrentSubtitleIndex(Subtitle(emptyList()), progressMs = 1_000)) } } diff --git a/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/SubtitleList.kt b/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/SubtitleList.kt index 3951873..6182323 100644 --- a/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/SubtitleList.kt +++ b/shared/src/commonMain/kotlin/fr/ajaury/gwenedeg/player/ui/SubtitleList.kt @@ -98,6 +98,8 @@ fun SubtitleList( } private suspend fun LazyListState.centerItem(index: Int) { + if (index < 0 || index >= this.layoutInfo.totalItemsCount) return + val info = this.layoutInfo val viewportCenter = (info.viewportStartOffset + info.viewportEndOffset) / 2 val item = info.visibleItemsInfo.firstOrNull { it.index == index }