refactor: centralize domain models into core.model module

This commit is contained in:
2026-07-01 17:06:02 +02:00
parent ff1844e49f
commit 657d39a293
28 changed files with 190 additions and 76 deletions
+1
View File
@@ -62,6 +62,7 @@ kotlin {
implementation(projects.core.audioplayer)
implementation(projects.core.coroutines)
implementation(projects.core.logging)
implementation(projects.core.model)
// Data modules
implementation(projects.data.subtitle)
@@ -1,15 +1,15 @@
package fr.ajaury.gwenedeg.player.data
import fr.ajaury.gwenedeg.core.logging.domain.Logger
import fr.ajaury.gwenedeg.core.model.Record
import fr.ajaury.gwenedeg.player.domain.AudioPlayer
import fr.ajaury.gwenedeg.player.domain.PlaybackRepository
import fr.ajaury.gwenedeg.player.model.PlaybackState
import fr.ajaury.gwenedeg.player.model.PlaybackTiming
import fr.ajaury.gwenedeg.records.domain.Record
import fr.ajaury.gwenedeg.resourcereader.data.domain.ResourceReader
import fr.ajaury.gwenedeg.subtitle.domain.GetCurrentSubtitleIndexUseCase
import fr.ajaury.gwenedeg.subtitle.domain.Subtitle
import fr.ajaury.gwenedeg.subtitle.domain.SubtitleRepository
import fr.ajaury.gwenedeg.subtitle.model.Subtitle
import gwenedeg.shared.generated.resources.Res
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
@@ -91,7 +91,7 @@ internal class PlaybackRepositoryImpl(
val translationContent = record.translationSubtitleResourcePath
?.let { resourceReader.read(resourcePath = it) }
subtitleRepository.getSubtitle(
content = content,
transcriptionContent = content,
translationContent = translationContent,
)
} catch (exception: Exception) {
@@ -1,9 +1,9 @@
package fr.ajaury.gwenedeg.player.domain
import fr.ajaury.gwenedeg.core.model.Record
import fr.ajaury.gwenedeg.player.model.PlaybackState
import fr.ajaury.gwenedeg.player.model.PlaybackTiming
import fr.ajaury.gwenedeg.records.domain.Record
import fr.ajaury.gwenedeg.subtitle.domain.Subtitle
import fr.ajaury.gwenedeg.subtitle.model.Subtitle
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlin.time.Duration
@@ -0,0 +1,9 @@
package fr.ajaury.gwenedeg.player.model
data class PlaybackTiming(
val positionMs: Long = 0L,
val durationMs: Long = 0L,
) {
val progress: Float
get() = if (durationMs > 0) (positionMs.toFloat() / durationMs).coerceIn(0f, 1f) else 0f
}
@@ -22,11 +22,12 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import fr.ajaury.gwenedeg.core.model.Phrase
import fr.ajaury.gwenedeg.player.model.PlaybackState
import fr.ajaury.gwenedeg.player.model.PlaybackTiming
import fr.ajaury.gwenedeg.player.ui.viewmodel.PlayerUiState
import fr.ajaury.gwenedeg.player.ui.viewmodel.PlayerViewModel
import fr.ajaury.gwenedeg.subtitle.domain.SubtitleLine
import fr.ajaury.gwenedeg.subtitle.model.SubtitleLine
import fr.ajaury.gwenedeg.theme.GwenedegTheme
import org.koin.compose.viewmodel.koinViewModel
import org.koin.core.parameter.parametersOf
@@ -133,9 +134,27 @@ fun PlayerScreen(
private val previewSubtitleLines =
listOf(
SubtitleLine(startTime = 0.milliseconds, text = "Demat deoc'h !", translation = "Bonjour !"),
SubtitleLine(startTime = 4310.milliseconds, text = "Kenavo !", translation = "Au revoir !"),
SubtitleLine(startTime = 7350.milliseconds, text = "Kenavo emberr !", translation = "À ce soir !"),
SubtitleLine(
startTime = 0.milliseconds,
phrase = Phrase(
transcription = "Demat deoc'h !",
translation = "Bonjour !",
),
),
SubtitleLine(
startTime = 4310.milliseconds,
phrase = Phrase(
transcription = "Kenavo !",
translation = "Au revoir !",
),
),
SubtitleLine(
startTime = 7350.milliseconds,
phrase = Phrase(
transcription = "Kenavo emberr !",
translation = "À ce soir !",
),
),
)
@Preview
@@ -27,7 +27,8 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import fr.ajaury.gwenedeg.subtitle.domain.SubtitleLine
import fr.ajaury.gwenedeg.core.model.Phrase
import fr.ajaury.gwenedeg.subtitle.model.SubtitleLine
import fr.ajaury.gwenedeg.theme.GwenedegTheme
import kotlin.math.abs
import kotlin.time.Duration.Companion.milliseconds
@@ -132,12 +133,12 @@ private fun Subtitle(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(2.dp),
) {
MainTextLine(
text = line.text,
TranscriptionLine(
text = line.phrase.transcription,
isCurrent = isCurrent,
contentColor = contentColor,
)
line.translation?.let { translation ->
line.phrase.translation?.let { translation ->
TranslationLine(
text = translation,
isCurrent = isCurrent,
@@ -148,7 +149,7 @@ private fun Subtitle(
}
@Composable
private fun MainTextLine(
private fun TranscriptionLine(
text: String,
isCurrent: Boolean,
contentColor: Color,
@@ -191,9 +192,27 @@ private fun TranslationLine(
private val previewSubtitleLines =
listOf(
SubtitleLine(startTime = 0.milliseconds, text = "Demat deoc'h !", translation = "Bonjour !"),
SubtitleLine(startTime = 4310.milliseconds, text = "Kenavo !", translation = "Au revoir !"),
SubtitleLine(startTime = 7350.milliseconds, text = "Kenavo emberr !", translation = "À ce soir !"),
SubtitleLine(
startTime = 0.milliseconds,
phrase = Phrase(
transcription = "Demat deoc'h !",
translation = "Bonjour !",
),
),
SubtitleLine(
startTime = 4310.milliseconds,
phrase = Phrase(
transcription = "Kenavo !",
translation = "Au revoir !",
),
),
SubtitleLine(
startTime = 7350.milliseconds,
phrase = Phrase(
transcription = "Kenavo emberr !",
translation = "À ce soir !",
),
),
)
@Preview
@@ -2,7 +2,7 @@ package fr.ajaury.gwenedeg.player.ui.viewmodel
import fr.ajaury.gwenedeg.player.model.PlaybackState
import fr.ajaury.gwenedeg.player.model.PlaybackTiming
import fr.ajaury.gwenedeg.subtitle.domain.SubtitleLine
import fr.ajaury.gwenedeg.subtitle.model.SubtitleLine
data class PlayerUiState(
val recordTitle: String = "",
@@ -3,10 +3,10 @@ package fr.ajaury.gwenedeg.player.ui.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import fr.ajaury.gwenedeg.core.logging.domain.Logger
import fr.ajaury.gwenedeg.core.model.Record
import fr.ajaury.gwenedeg.player.domain.AudioSessionManager
import fr.ajaury.gwenedeg.player.domain.PlaybackRepository
import fr.ajaury.gwenedeg.player.model.PlaybackState
import fr.ajaury.gwenedeg.records.domain.Record
import fr.ajaury.gwenedeg.records.domain.RecordRepository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@@ -1,7 +1,7 @@
package fr.ajaury.gwenedeg.records.data
import fr.ajaury.gwenedeg.records.domain.Record
import fr.ajaury.gwenedeg.records.domain.RecordRepository
import fr.ajaury.gwenedeg.core.model.Record
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
@@ -1,11 +0,0 @@
package fr.ajaury.gwenedeg.records.domain
data class Record(
val id: Int,
val index: Int,
val title: String,
val titleTranslation: String? = null,
val audioResourcePath: String,
val subtitleResourcePath: String,
val translationSubtitleResourcePath: String? = null,
)
@@ -1,5 +1,6 @@
package fr.ajaury.gwenedeg.records.domain
import fr.ajaury.gwenedeg.core.model.Record
import kotlinx.coroutines.flow.Flow
interface RecordRepository {
@@ -14,7 +14,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import fr.ajaury.gwenedeg.records.domain.Record
import fr.ajaury.gwenedeg.core.model.Record
@Composable
fun RecordView(
@@ -1,9 +1,7 @@
package fr.ajaury.gwenedeg.records.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.HorizontalDivider
@@ -14,7 +12,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import fr.ajaury.gwenedeg.records.domain.Record
import fr.ajaury.gwenedeg.core.model.Record
import fr.ajaury.gwenedeg.records.ui.viewmodel.RecordsViewModel
import org.koin.compose.viewmodel.koinViewModel
@@ -2,8 +2,8 @@ package fr.ajaury.gwenedeg.records.ui.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import fr.ajaury.gwenedeg.records.domain.Record
import fr.ajaury.gwenedeg.records.domain.RecordRepository
import fr.ajaury.gwenedeg.core.model.Record
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.stateIn