diff --git a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/model/Record.kt b/core/model/src/commonMain/kotlin/bzh/ajaury/chombev/core/model/Record.kt similarity index 73% rename from data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/model/Record.kt rename to core/model/src/commonMain/kotlin/bzh/ajaury/chombev/core/model/Record.kt index 08ab634..4eca69d 100644 --- a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/model/Record.kt +++ b/core/model/src/commonMain/kotlin/bzh/ajaury/chombev/core/model/Record.kt @@ -1,6 +1,4 @@ -package bzh.ajaury.chombev.records.model - -import bzh.ajaury.chombev.core.model.Phrase +package bzh.ajaury.chombev.core.model data class Record( val id: Int, diff --git a/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt b/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt index 965ce47..9aa5609 100644 --- a/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt +++ b/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/data/PlaybackRepositoryImpl.kt @@ -3,13 +3,13 @@ package bzh.ajaury.chombev.player.data import bzh.ajaury.chombev.core.coroutines.domain.DispatcherProvider import bzh.ajaury.chombev.core.logging.domain.Logger import bzh.ajaury.chombev.core.model.Phrase +import bzh.ajaury.chombev.core.model.Record import bzh.ajaury.chombev.player.domain.AudioPlayer import bzh.ajaury.chombev.player.domain.PlaybackRepository import bzh.ajaury.chombev.player.model.PlaybackState import bzh.ajaury.chombev.player.model.PlaybackTiming import bzh.ajaury.chombev.player.model.PlayerState import bzh.ajaury.chombev.preferences.domain.PreferencesRepository -import bzh.ajaury.chombev.records.model.Record import bzh.ajaury.chombev.resources.domain.ResourceReader import bzh.ajaury.chombev.subtitle.domain.GetCurrentSubtitleIndexUseCase import bzh.ajaury.chombev.subtitle.domain.SubtitleRepository diff --git a/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/domain/PlaybackRepository.kt b/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/domain/PlaybackRepository.kt index 87f560c..be21d80 100644 --- a/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/domain/PlaybackRepository.kt +++ b/data/playback/src/commonMain/kotlin/bzh/ajaury/chombev/player/domain/PlaybackRepository.kt @@ -1,7 +1,7 @@ package bzh.ajaury.chombev.player.domain +import bzh.ajaury.chombev.core.model.Record import bzh.ajaury.chombev.player.model.PlayerState -import bzh.ajaury.chombev.records.model.Record import kotlinx.coroutines.flow.Flow import kotlin.time.Duration diff --git a/data/records/build.gradle.kts b/data/records/build.gradle.kts index 3a83291..ce3816a 100644 --- a/data/records/build.gradle.kts +++ b/data/records/build.gradle.kts @@ -5,7 +5,7 @@ plugins { kotlin { androidLibrary { - namespace = "bzh.ajaury.chombev.records" + namespace = "bzh.ajaury.chombev.records.data" } sourceSets { diff --git a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/JsonRecordRepository.kt b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/JsonRecordRepository.kt index 2002b5a..6fb1e92 100644 --- a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/JsonRecordRepository.kt +++ b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/JsonRecordRepository.kt @@ -2,10 +2,10 @@ package bzh.ajaury.chombev.records.data import bzh.ajaury.chombev.core.coroutines.domain.DispatcherProvider import bzh.ajaury.chombev.core.logging.domain.Logger +import bzh.ajaury.chombev.core.model.Record import bzh.ajaury.chombev.records.data.local.model.RecordDataModel import bzh.ajaury.chombev.records.data.mappers.RecordMapper import bzh.ajaury.chombev.records.domain.RecordRepository -import bzh.ajaury.chombev.records.model.Record import bzh.ajaury.chombev.resources.domain.ResourceReader import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow diff --git a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/local/model/RecordDataModel.kt b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/local/model/RecordDataModel.kt index 85ddcca..e595cd9 100644 --- a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/local/model/RecordDataModel.kt +++ b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/local/model/RecordDataModel.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable /** * A single record entry as stored in the un-versioned `files/records.json` data file. * - * This mirrors the JSON schema exactly; it is mapped to the domain [bzh.ajaury.chombev.records.model.Record] + * This mirrors the JSON schema exactly; it is mapped to the domain [bzh.ajaury.chombev.core.model.Record] * by [bzh.ajaury.chombev.records.data.mappers.RecordMapper]. */ @Serializable diff --git a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/mappers/RecordMapper.kt b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/mappers/RecordMapper.kt index ef722e6..88f42e0 100644 --- a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/mappers/RecordMapper.kt +++ b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/data/mappers/RecordMapper.kt @@ -1,8 +1,8 @@ package bzh.ajaury.chombev.records.data.mappers import bzh.ajaury.chombev.core.model.Phrase +import bzh.ajaury.chombev.core.model.Record import bzh.ajaury.chombev.records.data.local.model.RecordDataModel -import bzh.ajaury.chombev.records.model.Record /** * Maps the serialized [RecordDataModel]s from the data file to domain [Record]s, assigning a diff --git a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/domain/RecordRepository.kt b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/domain/RecordRepository.kt index fd3ab72..9ce100a 100644 --- a/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/domain/RecordRepository.kt +++ b/data/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/domain/RecordRepository.kt @@ -1,6 +1,6 @@ package bzh.ajaury.chombev.records.domain -import bzh.ajaury.chombev.records.model.Record +import bzh.ajaury.chombev.core.model.Record import kotlinx.coroutines.flow.Flow interface RecordRepository { diff --git a/feature/records/build.gradle.kts b/feature/records/build.gradle.kts new file mode 100644 index 0000000..dedf59d --- /dev/null +++ b/feature/records/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + id("gwenedeg.kmp.library") + id("gwenedeg.compose") +} + +kotlin { + androidLibrary { + namespace = "bzh.ajaury.chombev.records" + } + + sourceSets { + androidMain.dependencies { + implementation(libs.compose.uiToolingPreview) + } + commonMain.dependencies { + // Core modules + implementation(projects.core.model) + implementation(projects.core.logging) + implementation(projects.core.audioplayer) + + // Data modules + implementation(projects.data.playback) + implementation(projects.data.preferences) + implementation(projects.data.records) + implementation(projects.data.subtitle) + implementation(projects.data.resources) + + // UI - Compose + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.material3) + implementation(libs.compose.material.icons.extended) + implementation(libs.compose.ui) + implementation(libs.compose.uiToolingPreview) + implementation(libs.compose.components.resources) + + // Lifecycle + implementation(libs.lifecycle.viewmodelCompose) + implementation(libs.lifecycle.runtimeCompose) + + // DI + implementation(project.dependencies.platform(libs.koin.bom)) + implementation(libs.koin.core) + implementation(libs.koin.core.viewmodel) + implementation(libs.koin.compose.viewmodel) + } + } +} + +dependencies { + androidRuntimeClasspath(libs.compose.uiTooling) +} diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlaybackSpeedBottomSheet.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlaybackSpeedBottomSheet.kt similarity index 98% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlaybackSpeedBottomSheet.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlaybackSpeedBottomSheet.kt index 6727243..617ca5c 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlaybackSpeedBottomSheet.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlaybackSpeedBottomSheet.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.SheetState import androidx.compose.material3.rememberModalBottomSheetState @@ -18,7 +19,6 @@ import bzh.ajaury.chombev.resources.generated.resources.Res import bzh.ajaury.chombev.resources.generated.resources.break_between_phrases_title import bzh.ajaury.chombev.resources.generated.resources.break_between_phrases_value import bzh.ajaury.chombev.resources.generated.resources.playback_speed_title -import bzh.ajaury.chombev.theme.ChomBevTheme import org.jetbrains.compose.resources.stringResource import kotlin.math.roundToInt @@ -102,7 +102,7 @@ internal fun formatPlaybackSpeed(speed: Float): String { @Preview @Composable private fun PlaybackSpeedContentPreview() { - ChomBevTheme { + MaterialTheme { PlaybackSpeedContent( speed = 0.7f, breakSeconds = 2f, diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerControl.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerControl.kt similarity index 97% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerControl.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerControl.kt index f4036f1..eb41a74 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerControl.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerControl.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -18,7 +19,6 @@ import bzh.ajaury.chombev.player.ui.components.PlayButton import bzh.ajaury.chombev.player.ui.components.PlaybackProgress import bzh.ajaury.chombev.player.ui.components.PreviousButton import bzh.ajaury.chombev.player.ui.components.SpeedPreferenceButton -import bzh.ajaury.chombev.theme.ChomBevTheme import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -93,7 +93,7 @@ fun PlayerControl( @Preview @Composable private fun PlayerControlPreview() { - ChomBevTheme { + MaterialTheme { PlayerControl( playbackState = PlaybackState.PLAYING, playbackTiming = PlaybackTiming(position = 1.2.seconds, duration = 5.seconds), @@ -108,7 +108,7 @@ private fun PlayerControlPreview() { @Preview @Composable private fun PlayerControlFirstSentencePreview() { - ChomBevTheme { + MaterialTheme { PlayerControl( playbackState = PlaybackState.PLAYING, playbackTiming = PlaybackTiming(position = 1.2.seconds, duration = 5.seconds), @@ -123,7 +123,7 @@ private fun PlayerControlFirstSentencePreview() { @Preview @Composable private fun PlayerControlActiveSpeedPreview() { - ChomBevTheme { + MaterialTheme { PlayerControl( playbackState = PlaybackState.PLAYING, playbackTiming = PlaybackTiming(position = 1.2.seconds, duration = 5.seconds), @@ -138,7 +138,7 @@ private fun PlayerControlActiveSpeedPreview() { @Preview @Composable private fun PlayerControlLastSentencePreview() { - ChomBevTheme { + MaterialTheme { PlayerControl( playbackState = PlaybackState.PLAYING, playbackTiming = PlaybackTiming(position = 1.2.seconds, duration = 5.seconds), diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerScreen.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerScreen.kt similarity index 99% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerScreen.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerScreen.kt index bcfc2f7..0fccda6 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerScreen.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/PlayerScreen.kt @@ -39,7 +39,6 @@ import bzh.ajaury.chombev.resources.generated.resources.Res import bzh.ajaury.chombev.resources.generated.resources.player_back import bzh.ajaury.chombev.resources.generated.resources.subtitle_preferences_action import bzh.ajaury.chombev.subtitle.model.SubtitleLine -import bzh.ajaury.chombev.theme.ChomBevTheme import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel import org.koin.core.parameter.parametersOf @@ -239,7 +238,7 @@ private val previewSubtitleLines = @Preview @Composable private fun PlayerScreenPlayingPreview() { - ChomBevTheme { + MaterialTheme { PlayerScreen( uiState = PlayerUiState( recordEmoji = "πŸ™", @@ -264,7 +263,7 @@ private fun PlayerScreenPlayingPreview() { @Preview @Composable private fun PlayerScreenPausedPreview() { - ChomBevTheme { + MaterialTheme { PlayerScreen( uiState = PlayerUiState( recordEmoji = "πŸ™", @@ -289,7 +288,7 @@ private fun PlayerScreenPausedPreview() { @Preview @Composable private fun PlayerScreenEndedPreview() { - ChomBevTheme { + MaterialTheme { PlayerScreen( uiState = PlayerUiState( recordEmoji = "πŸ™", diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/SubtitleList.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/SubtitleList.kt similarity index 99% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/SubtitleList.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/SubtitleList.kt index 30c4397..15cae37 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/SubtitleList.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/SubtitleList.kt @@ -39,7 +39,6 @@ import bzh.ajaury.chombev.core.model.Phrase import bzh.ajaury.chombev.player.ui.components.TranscriptionText import bzh.ajaury.chombev.preferences.model.SubtitlePreferences import bzh.ajaury.chombev.subtitle.model.SubtitleLine -import bzh.ajaury.chombev.theme.ChomBevTheme import kotlin.math.abs import kotlin.time.Duration.Companion.milliseconds @@ -250,7 +249,7 @@ private val previewSubtitleLines = @Preview @Composable private fun SubtitleListPreview() { - ChomBevTheme { + MaterialTheme { SubtitleList( lines = previewSubtitleLines, currentIndex = 1, diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/LabeledSlider.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/LabeledSlider.kt similarity index 96% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/LabeledSlider.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/LabeledSlider.kt index dfb45a7..a064ba2 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/LabeledSlider.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/LabeledSlider.kt @@ -12,7 +12,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import bzh.ajaury.chombev.theme.ChomBevTheme @Composable fun LabeledSlider( @@ -51,7 +50,7 @@ fun LabeledSlider( @Preview @Composable private fun LabeledSliderPreview() { - ChomBevTheme { + MaterialTheme { LabeledSlider( title = "Playback speed", valueLabel = "x0.7", diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/NextButton.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/NextButton.kt similarity index 93% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/NextButton.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/NextButton.kt index c6d9b16..59e7e77 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/NextButton.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/NextButton.kt @@ -5,13 +5,13 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.SkipNext import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import bzh.ajaury.chombev.resources.generated.resources.Res import bzh.ajaury.chombev.resources.generated.resources.player_next_sentence -import bzh.ajaury.chombev.theme.ChomBevTheme import org.jetbrains.compose.resources.stringResource @Composable @@ -34,7 +34,7 @@ fun NextButton( @Preview @Composable private fun NextButtonCanGoToNextSentencePreview() { - ChomBevTheme { + MaterialTheme { NextButton( canGoToNextSentence = true, ) @@ -44,7 +44,7 @@ private fun NextButtonCanGoToNextSentencePreview() { @Preview @Composable private fun NextButtonCanNotGoToNextSentencePreview() { - ChomBevTheme { + MaterialTheme { NextButton( canGoToNextSentence = false, ) diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlayButton.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlayButton.kt similarity index 96% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlayButton.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlayButton.kt index 3af6870..3817864 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlayButton.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlayButton.kt @@ -13,6 +13,7 @@ import androidx.compose.material.icons.filled.Replay import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember @@ -26,7 +27,6 @@ import bzh.ajaury.chombev.resources.generated.resources.Res import bzh.ajaury.chombev.resources.generated.resources.player_pause import bzh.ajaury.chombev.resources.generated.resources.player_play import bzh.ajaury.chombev.resources.generated.resources.player_replay -import bzh.ajaury.chombev.theme.ChomBevTheme import org.jetbrains.compose.resources.stringResource import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -103,7 +103,7 @@ private fun PlaybackState.toActionContentDescription(): String = @Preview @Composable private fun PlayButtonPlayingPreview() { - ChomBevTheme { + MaterialTheme { PlayButton( playbackState = PlaybackState.PLAYING, ) @@ -113,7 +113,7 @@ private fun PlayButtonPlayingPreview() { @Preview @Composable private fun PlayButtonBreakingPreview() { - ChomBevTheme { + MaterialTheme { PlayButton( playbackState = PlaybackState.BREAKING, breakDuration = 3.seconds, @@ -124,7 +124,7 @@ private fun PlayButtonBreakingPreview() { @Preview @Composable private fun PlayButtonPausedPreview() { - ChomBevTheme { + MaterialTheme { PlayButton( playbackState = PlaybackState.PAUSED, ) @@ -134,7 +134,7 @@ private fun PlayButtonPausedPreview() { @Preview @Composable private fun PlayButtonEndedPreview() { - ChomBevTheme { + MaterialTheme { PlayButton( playbackState = PlaybackState.ENDED, ) @@ -144,7 +144,7 @@ private fun PlayButtonEndedPreview() { @Preview @Composable private fun PlayButtonIdlePreview() { - ChomBevTheme { + MaterialTheme { PlayButton( playbackState = PlaybackState.IDLE, ) diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlaybackProgress.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlaybackProgress.kt similarity index 94% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlaybackProgress.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlaybackProgress.kt index e3eb217..295a28f 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlaybackProgress.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PlaybackProgress.kt @@ -1,6 +1,7 @@ package bzh.ajaury.chombev.player.ui.components import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Slider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -10,7 +11,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import bzh.ajaury.chombev.player.model.PlaybackTiming -import bzh.ajaury.chombev.theme.ChomBevTheme import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds @@ -40,7 +40,7 @@ fun PlaybackProgress( @Preview @Composable private fun PlaybackProgressPreview() { - ChomBevTheme { + MaterialTheme { PlaybackProgress( playbackTiming = PlaybackTiming(0.seconds, 0.seconds), ) @@ -50,7 +50,7 @@ private fun PlaybackProgressPreview() { @Preview @Composable private fun PlaybackProgressInProgressPreview() { - ChomBevTheme { + MaterialTheme { PlaybackProgress( playbackTiming = PlaybackTiming(7.seconds, 10.seconds), ) @@ -60,7 +60,7 @@ private fun PlaybackProgressInProgressPreview() { @Preview @Composable private fun PlaybackProgressEndedPreview() { - ChomBevTheme { + MaterialTheme { PlaybackProgress( playbackTiming = PlaybackTiming(10.seconds, 10.seconds), ) diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PreviousButton.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PreviousButton.kt similarity index 94% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PreviousButton.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PreviousButton.kt index 5761473..bcde2c3 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PreviousButton.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/PreviousButton.kt @@ -5,13 +5,13 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.SkipPrevious import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import bzh.ajaury.chombev.resources.generated.resources.Res import bzh.ajaury.chombev.resources.generated.resources.player_previous_sentence -import bzh.ajaury.chombev.theme.ChomBevTheme import org.jetbrains.compose.resources.stringResource @Composable @@ -34,7 +34,7 @@ fun PreviousButton( @Preview @Composable private fun PreviousButtonCanGoToPreviousSentencePreview() { - ChomBevTheme { + MaterialTheme { PreviousButton( canGoToPreviousSentence = true, ) @@ -44,7 +44,7 @@ private fun PreviousButtonCanGoToPreviousSentencePreview() { @Preview @Composable private fun PreviousButtonCanNotGoToPreviousSentencePreview() { - ChomBevTheme { + MaterialTheme { PreviousButton( canGoToPreviousSentence = false, ) diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/SpeedPreferenceButton.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/SpeedPreferenceButton.kt similarity index 95% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/SpeedPreferenceButton.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/SpeedPreferenceButton.kt index c499126..44529b9 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/SpeedPreferenceButton.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/SpeedPreferenceButton.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import bzh.ajaury.chombev.resources.generated.resources.Res import bzh.ajaury.chombev.resources.generated.resources.playback_settings_action -import bzh.ajaury.chombev.theme.ChomBevTheme import org.jetbrains.compose.resources.stringResource /** @@ -40,7 +39,7 @@ fun SpeedPreferenceButton( @Preview @Composable private fun SpeedPreferenceButtonDefaultPreview() { - ChomBevTheme { + MaterialTheme { SpeedPreferenceButton( isActive = false, ) @@ -50,7 +49,7 @@ private fun SpeedPreferenceButtonDefaultPreview() { @Preview @Composable private fun SpeedPreferenceButtonActivePreview() { - ChomBevTheme { + MaterialTheme { SpeedPreferenceButton( isActive = true, ) diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/TranscriptionText.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/TranscriptionText.kt similarity index 98% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/TranscriptionText.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/TranscriptionText.kt index 6f20064..0d6b68b 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/TranscriptionText.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/components/TranscriptionText.kt @@ -28,7 +28,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em import androidx.compose.ui.unit.sp -import bzh.ajaury.chombev.theme.ChomBevTheme /** * Matches a single letter marked in a transcription, either: @@ -243,7 +242,7 @@ private fun inlineId(index: Int): String = "marked-letter-$index" @Preview(backgroundColor = 0xFFFFFFFF) @Composable private fun TranscriptionTextLiaisonPreview() { - ChomBevTheme { + MaterialTheme { TranscriptionText( text = "Tomm eo ma(n) divskouarn, penn ma fri", color = MaterialTheme.colorScheme.onSurface, @@ -255,7 +254,7 @@ private fun TranscriptionTextLiaisonPreview() { @Preview(backgroundColor = 0xFFFFFFFF) @Composable private fun TranscriptionTextBracketPreview() { - ChomBevTheme { + MaterialTheme { TranscriptionText( text = "LΓ’rit[t] din, mar plij[k] geneoc'h.", color = MaterialTheme.colorScheme.onSurface, @@ -267,7 +266,7 @@ private fun TranscriptionTextBracketPreview() { @Preview(backgroundColor = 0xFFFFFFFF) @Composable private fun LiaisonLetterPreview() { - ChomBevTheme { + MaterialTheme { LiaisonLetter( letter = "D", color = MaterialTheme.colorScheme.onSurface, diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerUiState.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerUiState.kt similarity index 100% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerUiState.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerUiState.kt diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt similarity index 99% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt index 0b066c7..54a2fe5 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/player/ui/viewmodel/PlayerViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import bzh.ajaury.chombev.core.logging.domain.Logger import bzh.ajaury.chombev.core.model.Phrase +import bzh.ajaury.chombev.core.model.Record import bzh.ajaury.chombev.player.domain.AudioSessionManager import bzh.ajaury.chombev.player.domain.PlaybackRepository import bzh.ajaury.chombev.player.model.PlaybackState @@ -11,7 +12,6 @@ import bzh.ajaury.chombev.preferences.domain.PreferencesRepository import bzh.ajaury.chombev.preferences.model.PlaybackPreferences import bzh.ajaury.chombev.preferences.model.SubtitlePreferences import bzh.ajaury.chombev.records.domain.RecordRepository -import bzh.ajaury.chombev.records.model.Record import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/PreferenceToggle.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/PreferenceToggle.kt similarity index 96% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/PreferenceToggle.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/PreferenceToggle.kt index b0cbfd5..8a891c1 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/PreferenceToggle.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/PreferenceToggle.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import bzh.ajaury.chombev.theme.ChomBevTheme @Composable fun PreferenceToggle( @@ -66,7 +65,7 @@ fun PreferenceToggle( @Preview @Composable private fun PreferenceTogglePreview() { - ChomBevTheme { + MaterialTheme { PreferenceToggle( title = "Subtitle", subtitle = "Subtitle", @@ -79,7 +78,7 @@ private fun PreferenceTogglePreview() { @Preview @Composable private fun PreferenceToggleWithIconPreview() { - ChomBevTheme { + MaterialTheme { PreferenceToggle( title = "Subtitle", subtitle = "Subtitle", diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/SubtitlePreferencesBottomSheet.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/SubtitlePreferencesBottomSheet.kt similarity index 99% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/SubtitlePreferencesBottomSheet.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/SubtitlePreferencesBottomSheet.kt index 88542d8..dc4909a 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/SubtitlePreferencesBottomSheet.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/preferences/ui/SubtitlePreferencesBottomSheet.kt @@ -33,7 +33,6 @@ import bzh.ajaury.chombev.resources.generated.resources.subtitle_transcription_d import bzh.ajaury.chombev.resources.generated.resources.subtitle_transcription_label import bzh.ajaury.chombev.resources.generated.resources.subtitle_translation_description import bzh.ajaury.chombev.resources.generated.resources.subtitle_translation_label -import bzh.ajaury.chombev.theme.ChomBevTheme import org.jetbrains.compose.resources.stringResource import kotlin.math.roundToInt @@ -166,7 +165,7 @@ private fun formatTextScale(scale: Float): String { @Preview @Composable private fun SubtitlePreferencesContentPreview() { - ChomBevTheme { + MaterialTheme { SubtitlePreferencesContent( subtitlePreferences = SubtitlePreferences( showTranscription = true, diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordView.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordView.kt similarity index 97% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordView.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordView.kt index b6c5d15..35007b9 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordView.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordView.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import bzh.ajaury.chombev.core.model.Phrase -import bzh.ajaury.chombev.records.model.Record +import bzh.ajaury.chombev.core.model.Record @Composable fun RecordView( diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordsScreen.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordsScreen.kt similarity index 96% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordsScreen.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordsScreen.kt index 7ebb58b..48c4cfc 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordsScreen.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/RecordsScreen.kt @@ -14,9 +14,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import bzh.ajaury.chombev.core.model.Phrase -import bzh.ajaury.chombev.records.model.Record +import bzh.ajaury.chombev.core.model.Record import bzh.ajaury.chombev.records.ui.viewmodel.RecordsViewModel -import bzh.ajaury.chombev.theme.ChomBevTheme import org.koin.compose.viewmodel.koinViewModel @Composable @@ -68,7 +67,7 @@ fun RecordsScreen( @Preview @Composable private fun RecordsScreenPreview() { - ChomBevTheme { + MaterialTheme { RecordsScreen( records = listOf( Record( diff --git a/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/di/RecordsFeatureModule.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/di/RecordsFeatureModule.kt new file mode 100644 index 0000000..855dd83 --- /dev/null +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/di/RecordsFeatureModule.kt @@ -0,0 +1,31 @@ +package bzh.ajaury.chombev.records.ui.di + +import bzh.ajaury.chombev.player.di.audioPlayerModule +import bzh.ajaury.chombev.player.di.playbackModule +import bzh.ajaury.chombev.player.ui.viewmodel.PlayerViewModel +import bzh.ajaury.chombev.preferences.di.preferencesModule +import bzh.ajaury.chombev.records.di.recordsModule +import bzh.ajaury.chombev.records.ui.viewmodel.RecordsViewModel +import bzh.ajaury.chombev.resources.di.resourcesModule +import bzh.ajaury.chombev.subtitle.di.subtitleModule +import org.koin.core.module.Module +import org.koin.core.module.dsl.viewModelOf +import org.koin.dsl.module + +/** + * DI for the records feature: the record list, the player, and subtitle preferences UI. + */ +val recordsFeatureModule: Module = module { + + includes( + playbackModule, + preferencesModule, + recordsModule, + resourcesModule, + audioPlayerModule, + subtitleModule, + ) + + viewModelOf(::RecordsViewModel) + viewModelOf(::PlayerViewModel) +} diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/viewmodel/RecordsViewModel.kt b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/viewmodel/RecordsViewModel.kt similarity index 93% rename from shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/viewmodel/RecordsViewModel.kt rename to feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/viewmodel/RecordsViewModel.kt index 5690d8d..277fe51 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/viewmodel/RecordsViewModel.kt +++ b/feature/records/src/commonMain/kotlin/bzh/ajaury/chombev/records/ui/viewmodel/RecordsViewModel.kt @@ -2,8 +2,8 @@ package bzh.ajaury.chombev.records.ui.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import bzh.ajaury.chombev.core.model.Record import bzh.ajaury.chombev.records.domain.RecordRepository -import bzh.ajaury.chombev.records.model.Record import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn diff --git a/feature/webview/src/commonMain/kotlin/bzh/ajaury/chombev/web/di/WebviewModule.kt b/feature/webview/src/commonMain/kotlin/bzh/ajaury/chombev/web/di/WebviewModule.kt index e2fb541..8a59eca 100644 --- a/feature/webview/src/commonMain/kotlin/bzh/ajaury/chombev/web/di/WebviewModule.kt +++ b/feature/webview/src/commonMain/kotlin/bzh/ajaury/chombev/web/di/WebviewModule.kt @@ -1,10 +1,12 @@ package bzh.ajaury.chombev.web.di +import bzh.ajaury.chombev.resources.di.resourcesModule import bzh.ajaury.chombev.web.ui.viewmodel.WebViewModel import org.koin.core.module.Module import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module val webviewModule: Module = module { + includes(resourcesModule) viewModelOf(::WebViewModel) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5e84c6c..043fc84 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -52,4 +52,5 @@ include(":data:resources") include(":data:subtitle") // Feature modules +include(":feature:records") include(":feature:webview") diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index c3c1336..658798d 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -33,19 +33,15 @@ kotlin { } commonMain.dependencies { // Core modules - implementation(projects.core.audioplayer) implementation(projects.core.coroutines) implementation(projects.core.logging) implementation(projects.core.model) // Data modules - implementation(projects.data.playback) - implementation(projects.data.preferences) - implementation(projects.data.records) implementation(projects.data.resources) - implementation(projects.data.subtitle) // Feature modules + implementation(projects.feature.records) implementation(projects.feature.webview) implementation(libs.compose.runtime) diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/App.kt b/shared/src/commonMain/kotlin/bzh/ajaury/chombev/App.kt index 34fc3fb..dfe7204 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/App.kt +++ b/shared/src/commonMain/kotlin/bzh/ajaury/chombev/App.kt @@ -17,10 +17,8 @@ import bzh.ajaury.chombev.navigation.MainBottomBar import bzh.ajaury.chombev.navigation.MainTopBar import bzh.ajaury.chombev.navigation.Route import bzh.ajaury.chombev.navigation.WebPages -import bzh.ajaury.chombev.player.di.audioPlayerModule import bzh.ajaury.chombev.player.ui.PlayerScreen import bzh.ajaury.chombev.records.ui.RecordsScreen -import bzh.ajaury.chombev.subtitle.di.subtitleModule import bzh.ajaury.chombev.theme.ChomBevTheme import bzh.ajaury.chombev.web.model.WebPage import bzh.ajaury.chombev.web.ui.WebViewScreen @@ -32,9 +30,7 @@ val appModule = module { includes( loggingModule, sharedModule, - audioPlayerModule, coroutinesModule, - subtitleModule, ) } diff --git a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/di/Modules.kt b/shared/src/commonMain/kotlin/bzh/ajaury/chombev/di/Modules.kt index 6f4dcfc..9d0e178 100644 --- a/shared/src/commonMain/kotlin/bzh/ajaury/chombev/di/Modules.kt +++ b/shared/src/commonMain/kotlin/bzh/ajaury/chombev/di/Modules.kt @@ -1,23 +1,12 @@ package bzh.ajaury.chombev.di import bzh.ajaury.chombev.core.logging.di.loggingModule -import bzh.ajaury.chombev.player.di.playbackModule -import bzh.ajaury.chombev.player.ui.viewmodel.PlayerViewModel -import bzh.ajaury.chombev.preferences.di.preferencesModule -import bzh.ajaury.chombev.records.di.recordsModule -import bzh.ajaury.chombev.records.ui.viewmodel.RecordsViewModel -import bzh.ajaury.chombev.resources.di.resourcesModule +import bzh.ajaury.chombev.records.ui.di.recordsFeatureModule import bzh.ajaury.chombev.web.di.webviewModule -import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module val sharedModule = module { includes(loggingModule) - includes(playbackModule) - includes(preferencesModule) - includes(recordsModule) - includes(resourcesModule) + includes(recordsFeatureModule) includes(webviewModule) - viewModelOf(::RecordsViewModel) - viewModelOf(::PlayerViewModel) }