new: extract Records feature module
This commit is contained in:
+1
-3
@@ -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,
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ plugins {
|
||||
|
||||
kotlin {
|
||||
androidLibrary {
|
||||
namespace = "bzh.ajaury.chombev.records"
|
||||
namespace = "bzh.ajaury.chombev.records.data"
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
+2
-2
@@ -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,
|
||||
+5
-5
@@ -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),
|
||||
+3
-4
@@ -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 = "🙏",
|
||||
+1
-2
@@ -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,
|
||||
+1
-2
@@ -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",
|
||||
+3
-3
@@ -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,
|
||||
)
|
||||
+6
-6
@@ -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,
|
||||
)
|
||||
+4
-4
@@ -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),
|
||||
)
|
||||
+3
-3
@@ -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,
|
||||
)
|
||||
+2
-3
@@ -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,
|
||||
)
|
||||
+3
-4
@@ -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,
|
||||
+1
-1
@@ -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
|
||||
+2
-3
@@ -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",
|
||||
+1
-2
@@ -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,
|
||||
+1
-1
@@ -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(
|
||||
+2
-3
@@ -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(
|
||||
+31
@@ -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)
|
||||
}
|
||||
+1
-1
@@ -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
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -52,4 +52,5 @@ include(":data:resources")
|
||||
include(":data:subtitle")
|
||||
|
||||
// Feature modules
|
||||
include(":feature:records")
|
||||
include(":feature:webview")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user