diff --git a/Jetcaster/app/build.gradle.kts b/Jetcaster/app/build.gradle.kts
index 0344801aa8..46d0d4c8b4 100644
--- a/Jetcaster/app/build.gradle.kts
+++ b/Jetcaster/app/build.gradle.kts
@@ -101,6 +101,7 @@ dependencies {
implementation(libs.androidx.compose.foundation)
implementation(libs.androidx.compose.material)
+ implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.materialWindow)
implementation(libs.androidx.compose.material.iconsExtended)
implementation(libs.androidx.compose.ui.tooling.preview)
@@ -117,15 +118,8 @@ dependencies {
implementation(libs.coil.kt.compose)
- implementation(libs.okhttp3)
- implementation(libs.okhttp.logging)
+ implementation(project(":core"))
+ implementation(project(":designsystem"))
- implementation(libs.rometools.rome)
- implementation(libs.rometools.modules)
-
- implementation(libs.androidx.room.runtime)
- implementation(libs.androidx.room.ktx)
-
- ksp(libs.androidx.room.compiler)
coreLibraryDesugaring(libs.core.jdk.desugaring)
}
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/JetcasterApplication.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/JetcasterApplication.kt
index 42b4d133ba..1493a62e3f 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/JetcasterApplication.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/JetcasterApplication.kt
@@ -19,6 +19,7 @@ package com.example.jetcaster
import android.app.Application
import coil.ImageLoader
import coil.ImageLoaderFactory
+import com.example.jetcaster.core.data.di.Graph
/**
* Application which sets up our dependency [Graph] with a context.
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt
index 571648e9cc..b7db0741ad 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/Home.kt
@@ -75,9 +75,9 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import coil.compose.AsyncImage
import com.example.jetcaster.R
-import com.example.jetcaster.data.Category
-import com.example.jetcaster.data.EpisodeToPodcast
-import com.example.jetcaster.data.PodcastWithExtraInfo
+import com.example.jetcaster.core.data.database.model.Category
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
+import com.example.jetcaster.core.data.database.model.PodcastWithExtraInfo
import com.example.jetcaster.ui.home.category.PodcastCategoryViewState
import com.example.jetcaster.ui.home.discover.DiscoverViewState
import com.example.jetcaster.ui.home.discover.discoverItems
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/HomeViewModel.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/HomeViewModel.kt
index 9240c54076..07317b592f 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/HomeViewModel.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/HomeViewModel.kt
@@ -18,14 +18,14 @@ package com.example.jetcaster.ui.home
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.example.jetcaster.Graph
-import com.example.jetcaster.data.Category
-import com.example.jetcaster.data.CategoryStore
-import com.example.jetcaster.data.EpisodeStore
-import com.example.jetcaster.data.EpisodeToPodcast
-import com.example.jetcaster.data.PodcastStore
-import com.example.jetcaster.data.PodcastWithExtraInfo
-import com.example.jetcaster.data.PodcastsRepository
+import com.example.jetcaster.core.data.database.model.Category
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
+import com.example.jetcaster.core.data.database.model.PodcastWithExtraInfo
+import com.example.jetcaster.core.data.di.Graph
+import com.example.jetcaster.core.data.repository.CategoryStore
+import com.example.jetcaster.core.data.repository.EpisodeStore
+import com.example.jetcaster.core.data.repository.PodcastStore
+import com.example.jetcaster.core.data.repository.PodcastsRepository
import com.example.jetcaster.ui.home.category.PodcastCategoryViewState
import com.example.jetcaster.ui.home.discover.DiscoverViewState
import com.example.jetcaster.util.combine
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/PreviewData.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/PreviewData.kt
index 3a6d96ecc3..a0968fd164 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/PreviewData.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/PreviewData.kt
@@ -16,11 +16,11 @@
package com.example.jetcaster.ui.home
-import com.example.jetcaster.data.Category
-import com.example.jetcaster.data.Episode
-import com.example.jetcaster.data.EpisodeToPodcast
-import com.example.jetcaster.data.Podcast
-import com.example.jetcaster.data.PodcastWithExtraInfo
+import com.example.jetcaster.core.data.database.model.Category
+import com.example.jetcaster.core.data.database.model.Episode
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
+import com.example.jetcaster.core.data.database.model.Podcast
+import com.example.jetcaster.core.data.database.model.PodcastWithExtraInfo
import java.time.OffsetDateTime
import java.time.ZoneOffset
import kotlinx.collections.immutable.toPersistentList
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt
index e8f3528724..321d72e3f8 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/category/PodcastCategory.kt
@@ -68,10 +68,10 @@ import androidx.constraintlayout.compose.Dimension.Companion.preferredWrapConten
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.example.jetcaster.R
-import com.example.jetcaster.data.Episode
-import com.example.jetcaster.data.EpisodeToPodcast
-import com.example.jetcaster.data.Podcast
-import com.example.jetcaster.data.PodcastWithExtraInfo
+import com.example.jetcaster.core.data.database.model.Episode
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
+import com.example.jetcaster.core.data.database.model.Podcast
+import com.example.jetcaster.core.data.database.model.PodcastWithExtraInfo
import com.example.jetcaster.ui.home.PreviewEpisodes
import com.example.jetcaster.ui.home.PreviewPodcasts
import com.example.jetcaster.ui.theme.JetcasterTheme
@@ -218,15 +218,16 @@ fun EpisodeListItem(
)
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
+ val duration = episode.duration
Text(
text = when {
- episode.duration != null -> {
+ duration != null -> {
// If we have the duration, we combine the date/duration via a
// formatted string
stringResource(
R.string.episode_date_duration,
MediumDateFormatter.format(episode.published),
- episode.duration.toMinutes().toInt()
+ duration.toMinutes().toInt()
)
}
// Otherwise we just use the date
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt
index 638ea2fb24..817d620b70 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/discover/Discover.kt
@@ -30,7 +30,7 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import com.example.jetcaster.data.Category
+import com.example.jetcaster.core.data.database.model.Category
import com.example.jetcaster.ui.home.category.PodcastCategoryViewState
import com.example.jetcaster.ui.home.category.podcastCategory
import com.example.jetcaster.ui.theme.Keyline1
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/library/Library.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/library/Library.kt
index 8f12f6a591..490ea28c9b 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/library/Library.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/home/library/Library.kt
@@ -19,7 +19,7 @@ package com.example.jetcaster.ui.home.library
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.items
import androidx.compose.ui.Modifier
-import com.example.jetcaster.data.EpisodeToPodcast
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
import com.example.jetcaster.ui.home.category.EpisodeListItem
fun LazyListScope.libraryItems(
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/player/PlayerViewModel.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/player/PlayerViewModel.kt
index 73265ee436..177104f714 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/player/PlayerViewModel.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/player/PlayerViewModel.kt
@@ -26,9 +26,9 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.savedstate.SavedStateRegistryOwner
-import com.example.jetcaster.Graph
-import com.example.jetcaster.data.EpisodeStore
-import com.example.jetcaster.data.PodcastStore
+import com.example.jetcaster.core.data.di.Graph
+import com.example.jetcaster.core.data.repository.EpisodeStore
+import com.example.jetcaster.core.data.repository.PodcastStore
import java.time.Duration
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Theme.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Theme.kt
index 477332fe46..a6c728a5eb 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Theme.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Theme.kt
@@ -16,8 +16,232 @@
package com.example.jetcaster.ui.theme
+import android.app.Activity
+import android.os.Build
+import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.MaterialTheme
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.dynamicDarkColorScheme
+import androidx.compose.material3.dynamicLightColorScheme
+import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalView
+import androidx.core.view.WindowCompat
+import com.example.jetcaster.designsystem.theme.backgroundDark
+import com.example.jetcaster.designsystem.theme.backgroundDarkHighContrast
+import com.example.jetcaster.designsystem.theme.backgroundDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.backgroundLight
+import com.example.jetcaster.designsystem.theme.backgroundLightHighContrast
+import com.example.jetcaster.designsystem.theme.backgroundLightMediumContrast
+import com.example.jetcaster.designsystem.theme.errorContainerDark
+import com.example.jetcaster.designsystem.theme.errorContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.errorContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.errorContainerLight
+import com.example.jetcaster.designsystem.theme.errorContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.errorContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.errorDark
+import com.example.jetcaster.designsystem.theme.errorDarkHighContrast
+import com.example.jetcaster.designsystem.theme.errorDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.errorLight
+import com.example.jetcaster.designsystem.theme.errorLightHighContrast
+import com.example.jetcaster.designsystem.theme.errorLightMediumContrast
+import com.example.jetcaster.designsystem.theme.inverseOnSurfaceDark
+import com.example.jetcaster.designsystem.theme.inverseOnSurfaceDarkHighContrast
+import com.example.jetcaster.designsystem.theme.inverseOnSurfaceDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.inverseOnSurfaceLight
+import com.example.jetcaster.designsystem.theme.inverseOnSurfaceLightHighContrast
+import com.example.jetcaster.designsystem.theme.inverseOnSurfaceLightMediumContrast
+import com.example.jetcaster.designsystem.theme.inversePrimaryDark
+import com.example.jetcaster.designsystem.theme.inversePrimaryDarkHighContrast
+import com.example.jetcaster.designsystem.theme.inversePrimaryDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.inversePrimaryLight
+import com.example.jetcaster.designsystem.theme.inversePrimaryLightHighContrast
+import com.example.jetcaster.designsystem.theme.inversePrimaryLightMediumContrast
+import com.example.jetcaster.designsystem.theme.inverseSurfaceDark
+import com.example.jetcaster.designsystem.theme.inverseSurfaceDarkHighContrast
+import com.example.jetcaster.designsystem.theme.inverseSurfaceDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.inverseSurfaceLight
+import com.example.jetcaster.designsystem.theme.inverseSurfaceLightHighContrast
+import com.example.jetcaster.designsystem.theme.inverseSurfaceLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onBackgroundDark
+import com.example.jetcaster.designsystem.theme.onBackgroundDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onBackgroundDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onBackgroundLight
+import com.example.jetcaster.designsystem.theme.onBackgroundLightHighContrast
+import com.example.jetcaster.designsystem.theme.onBackgroundLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onErrorContainerDark
+import com.example.jetcaster.designsystem.theme.onErrorContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onErrorContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onErrorContainerLight
+import com.example.jetcaster.designsystem.theme.onErrorContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.onErrorContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onErrorDark
+import com.example.jetcaster.designsystem.theme.onErrorDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onErrorDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onErrorLight
+import com.example.jetcaster.designsystem.theme.onErrorLightHighContrast
+import com.example.jetcaster.designsystem.theme.onErrorLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryContainerDark
+import com.example.jetcaster.designsystem.theme.onPrimaryContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryContainerLight
+import com.example.jetcaster.designsystem.theme.onPrimaryContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryDark
+import com.example.jetcaster.designsystem.theme.onPrimaryDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryLight
+import com.example.jetcaster.designsystem.theme.onPrimaryLightHighContrast
+import com.example.jetcaster.designsystem.theme.onPrimaryLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryContainerDark
+import com.example.jetcaster.designsystem.theme.onSecondaryContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryContainerLight
+import com.example.jetcaster.designsystem.theme.onSecondaryContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryDark
+import com.example.jetcaster.designsystem.theme.onSecondaryDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryLight
+import com.example.jetcaster.designsystem.theme.onSecondaryLightHighContrast
+import com.example.jetcaster.designsystem.theme.onSecondaryLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceDark
+import com.example.jetcaster.designsystem.theme.onSurfaceDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceLight
+import com.example.jetcaster.designsystem.theme.onSurfaceLightHighContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceVariantDark
+import com.example.jetcaster.designsystem.theme.onSurfaceVariantDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceVariantDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceVariantLight
+import com.example.jetcaster.designsystem.theme.onSurfaceVariantLightHighContrast
+import com.example.jetcaster.designsystem.theme.onSurfaceVariantLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryContainerDark
+import com.example.jetcaster.designsystem.theme.onTertiaryContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryContainerLight
+import com.example.jetcaster.designsystem.theme.onTertiaryContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryDark
+import com.example.jetcaster.designsystem.theme.onTertiaryDarkHighContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryLight
+import com.example.jetcaster.designsystem.theme.onTertiaryLightHighContrast
+import com.example.jetcaster.designsystem.theme.onTertiaryLightMediumContrast
+import com.example.jetcaster.designsystem.theme.outlineDark
+import com.example.jetcaster.designsystem.theme.outlineDarkHighContrast
+import com.example.jetcaster.designsystem.theme.outlineDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.outlineLight
+import com.example.jetcaster.designsystem.theme.outlineLightHighContrast
+import com.example.jetcaster.designsystem.theme.outlineLightMediumContrast
+import com.example.jetcaster.designsystem.theme.outlineVariantDark
+import com.example.jetcaster.designsystem.theme.outlineVariantDarkHighContrast
+import com.example.jetcaster.designsystem.theme.outlineVariantDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.outlineVariantLight
+import com.example.jetcaster.designsystem.theme.outlineVariantLightHighContrast
+import com.example.jetcaster.designsystem.theme.outlineVariantLightMediumContrast
+import com.example.jetcaster.designsystem.theme.primaryContainerDark
+import com.example.jetcaster.designsystem.theme.primaryContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.primaryContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.primaryContainerLight
+import com.example.jetcaster.designsystem.theme.primaryContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.primaryContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.primaryDark
+import com.example.jetcaster.designsystem.theme.primaryDarkHighContrast
+import com.example.jetcaster.designsystem.theme.primaryDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.primaryLight
+import com.example.jetcaster.designsystem.theme.primaryLightHighContrast
+import com.example.jetcaster.designsystem.theme.primaryLightMediumContrast
+import com.example.jetcaster.designsystem.theme.scrimDark
+import com.example.jetcaster.designsystem.theme.scrimDarkHighContrast
+import com.example.jetcaster.designsystem.theme.scrimDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.scrimLight
+import com.example.jetcaster.designsystem.theme.scrimLightHighContrast
+import com.example.jetcaster.designsystem.theme.scrimLightMediumContrast
+import com.example.jetcaster.designsystem.theme.secondaryContainerDark
+import com.example.jetcaster.designsystem.theme.secondaryContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.secondaryContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.secondaryContainerLight
+import com.example.jetcaster.designsystem.theme.secondaryContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.secondaryContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.secondaryDark
+import com.example.jetcaster.designsystem.theme.secondaryDarkHighContrast
+import com.example.jetcaster.designsystem.theme.secondaryDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.secondaryLight
+import com.example.jetcaster.designsystem.theme.secondaryLightHighContrast
+import com.example.jetcaster.designsystem.theme.secondaryLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceBrightDark
+import com.example.jetcaster.designsystem.theme.surfaceBrightDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceBrightDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceBrightLight
+import com.example.jetcaster.designsystem.theme.surfaceBrightLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceBrightLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerDark
+import com.example.jetcaster.designsystem.theme.surfaceContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighDark
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighLight
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighestDark
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighestDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighestDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighestLight
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighestLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerHighestLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLight
+import com.example.jetcaster.designsystem.theme.surfaceContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowDark
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowLight
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowestDark
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowestDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowestDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowestLight
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowestLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceContainerLowestLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceDark
+import com.example.jetcaster.designsystem.theme.surfaceDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceDimDark
+import com.example.jetcaster.designsystem.theme.surfaceDimDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceDimDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceDimLight
+import com.example.jetcaster.designsystem.theme.surfaceDimLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceDimLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceLight
+import com.example.jetcaster.designsystem.theme.surfaceLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceLightMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceVariantDark
+import com.example.jetcaster.designsystem.theme.surfaceVariantDarkHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceVariantDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.surfaceVariantLight
+import com.example.jetcaster.designsystem.theme.surfaceVariantLightHighContrast
+import com.example.jetcaster.designsystem.theme.surfaceVariantLightMediumContrast
+import com.example.jetcaster.designsystem.theme.tertiaryContainerDark
+import com.example.jetcaster.designsystem.theme.tertiaryContainerDarkHighContrast
+import com.example.jetcaster.designsystem.theme.tertiaryContainerDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.tertiaryContainerLight
+import com.example.jetcaster.designsystem.theme.tertiaryContainerLightHighContrast
+import com.example.jetcaster.designsystem.theme.tertiaryContainerLightMediumContrast
+import com.example.jetcaster.designsystem.theme.tertiaryDark
+import com.example.jetcaster.designsystem.theme.tertiaryDarkHighContrast
+import com.example.jetcaster.designsystem.theme.tertiaryDarkMediumContrast
+import com.example.jetcaster.designsystem.theme.tertiaryLight
+import com.example.jetcaster.designsystem.theme.tertiaryLightHighContrast
+import com.example.jetcaster.designsystem.theme.tertiaryLightMediumContrast
@Composable
fun JetcasterTheme(
@@ -30,3 +254,275 @@ fun JetcasterTheme(
content = content
)
}
+
+private val lightScheme = lightColorScheme(
+ primary = primaryLight,
+ onPrimary = onPrimaryLight,
+ primaryContainer = primaryContainerLight,
+ onPrimaryContainer = onPrimaryContainerLight,
+ secondary = secondaryLight,
+ onSecondary = onSecondaryLight,
+ secondaryContainer = secondaryContainerLight,
+ onSecondaryContainer = onSecondaryContainerLight,
+ tertiary = tertiaryLight,
+ onTertiary = onTertiaryLight,
+ tertiaryContainer = tertiaryContainerLight,
+ onTertiaryContainer = onTertiaryContainerLight,
+ error = errorLight,
+ onError = onErrorLight,
+ errorContainer = errorContainerLight,
+ onErrorContainer = onErrorContainerLight,
+ background = backgroundLight,
+ onBackground = onBackgroundLight,
+ surface = surfaceLight,
+ onSurface = onSurfaceLight,
+ surfaceVariant = surfaceVariantLight,
+ onSurfaceVariant = onSurfaceVariantLight,
+ outline = outlineLight,
+ outlineVariant = outlineVariantLight,
+ scrim = scrimLight,
+ inverseSurface = inverseSurfaceLight,
+ inverseOnSurface = inverseOnSurfaceLight,
+ inversePrimary = inversePrimaryLight,
+ surfaceDim = surfaceDimLight,
+ surfaceBright = surfaceBrightLight,
+ surfaceContainerLowest = surfaceContainerLowestLight,
+ surfaceContainerLow = surfaceContainerLowLight,
+ surfaceContainer = surfaceContainerLight,
+ surfaceContainerHigh = surfaceContainerHighLight,
+ surfaceContainerHighest = surfaceContainerHighestLight,
+)
+
+private val darkScheme = darkColorScheme(
+ primary = primaryDark,
+ onPrimary = onPrimaryDark,
+ primaryContainer = primaryContainerDark,
+ onPrimaryContainer = onPrimaryContainerDark,
+ secondary = secondaryDark,
+ onSecondary = onSecondaryDark,
+ secondaryContainer = secondaryContainerDark,
+ onSecondaryContainer = onSecondaryContainerDark,
+ tertiary = tertiaryDark,
+ onTertiary = onTertiaryDark,
+ tertiaryContainer = tertiaryContainerDark,
+ onTertiaryContainer = onTertiaryContainerDark,
+ error = errorDark,
+ onError = onErrorDark,
+ errorContainer = errorContainerDark,
+ onErrorContainer = onErrorContainerDark,
+ background = backgroundDark,
+ onBackground = onBackgroundDark,
+ surface = surfaceDark,
+ onSurface = onSurfaceDark,
+ surfaceVariant = surfaceVariantDark,
+ onSurfaceVariant = onSurfaceVariantDark,
+ outline = outlineDark,
+ outlineVariant = outlineVariantDark,
+ scrim = scrimDark,
+ inverseSurface = inverseSurfaceDark,
+ inverseOnSurface = inverseOnSurfaceDark,
+ inversePrimary = inversePrimaryDark,
+ surfaceDim = surfaceDimDark,
+ surfaceBright = surfaceBrightDark,
+ surfaceContainerLowest = surfaceContainerLowestDark,
+ surfaceContainerLow = surfaceContainerLowDark,
+ surfaceContainer = surfaceContainerDark,
+ surfaceContainerHigh = surfaceContainerHighDark,
+ surfaceContainerHighest = surfaceContainerHighestDark,
+)
+
+private val mediumContrastLightColorScheme = lightColorScheme(
+ primary = primaryLightMediumContrast,
+ onPrimary = onPrimaryLightMediumContrast,
+ primaryContainer = primaryContainerLightMediumContrast,
+ onPrimaryContainer = onPrimaryContainerLightMediumContrast,
+ secondary = secondaryLightMediumContrast,
+ onSecondary = onSecondaryLightMediumContrast,
+ secondaryContainer = secondaryContainerLightMediumContrast,
+ onSecondaryContainer = onSecondaryContainerLightMediumContrast,
+ tertiary = tertiaryLightMediumContrast,
+ onTertiary = onTertiaryLightMediumContrast,
+ tertiaryContainer = tertiaryContainerLightMediumContrast,
+ onTertiaryContainer = onTertiaryContainerLightMediumContrast,
+ error = errorLightMediumContrast,
+ onError = onErrorLightMediumContrast,
+ errorContainer = errorContainerLightMediumContrast,
+ onErrorContainer = onErrorContainerLightMediumContrast,
+ background = backgroundLightMediumContrast,
+ onBackground = onBackgroundLightMediumContrast,
+ surface = surfaceLightMediumContrast,
+ onSurface = onSurfaceLightMediumContrast,
+ surfaceVariant = surfaceVariantLightMediumContrast,
+ onSurfaceVariant = onSurfaceVariantLightMediumContrast,
+ outline = outlineLightMediumContrast,
+ outlineVariant = outlineVariantLightMediumContrast,
+ scrim = scrimLightMediumContrast,
+ inverseSurface = inverseSurfaceLightMediumContrast,
+ inverseOnSurface = inverseOnSurfaceLightMediumContrast,
+ inversePrimary = inversePrimaryLightMediumContrast,
+ surfaceDim = surfaceDimLightMediumContrast,
+ surfaceBright = surfaceBrightLightMediumContrast,
+ surfaceContainerLowest = surfaceContainerLowestLightMediumContrast,
+ surfaceContainerLow = surfaceContainerLowLightMediumContrast,
+ surfaceContainer = surfaceContainerLightMediumContrast,
+ surfaceContainerHigh = surfaceContainerHighLightMediumContrast,
+ surfaceContainerHighest = surfaceContainerHighestLightMediumContrast,
+)
+
+private val highContrastLightColorScheme = lightColorScheme(
+ primary = primaryLightHighContrast,
+ onPrimary = onPrimaryLightHighContrast,
+ primaryContainer = primaryContainerLightHighContrast,
+ onPrimaryContainer = onPrimaryContainerLightHighContrast,
+ secondary = secondaryLightHighContrast,
+ onSecondary = onSecondaryLightHighContrast,
+ secondaryContainer = secondaryContainerLightHighContrast,
+ onSecondaryContainer = onSecondaryContainerLightHighContrast,
+ tertiary = tertiaryLightHighContrast,
+ onTertiary = onTertiaryLightHighContrast,
+ tertiaryContainer = tertiaryContainerLightHighContrast,
+ onTertiaryContainer = onTertiaryContainerLightHighContrast,
+ error = errorLightHighContrast,
+ onError = onErrorLightHighContrast,
+ errorContainer = errorContainerLightHighContrast,
+ onErrorContainer = onErrorContainerLightHighContrast,
+ background = backgroundLightHighContrast,
+ onBackground = onBackgroundLightHighContrast,
+ surface = surfaceLightHighContrast,
+ onSurface = onSurfaceLightHighContrast,
+ surfaceVariant = surfaceVariantLightHighContrast,
+ onSurfaceVariant = onSurfaceVariantLightHighContrast,
+ outline = outlineLightHighContrast,
+ outlineVariant = outlineVariantLightHighContrast,
+ scrim = scrimLightHighContrast,
+ inverseSurface = inverseSurfaceLightHighContrast,
+ inverseOnSurface = inverseOnSurfaceLightHighContrast,
+ inversePrimary = inversePrimaryLightHighContrast,
+ surfaceDim = surfaceDimLightHighContrast,
+ surfaceBright = surfaceBrightLightHighContrast,
+ surfaceContainerLowest = surfaceContainerLowestLightHighContrast,
+ surfaceContainerLow = surfaceContainerLowLightHighContrast,
+ surfaceContainer = surfaceContainerLightHighContrast,
+ surfaceContainerHigh = surfaceContainerHighLightHighContrast,
+ surfaceContainerHighest = surfaceContainerHighestLightHighContrast,
+)
+
+private val mediumContrastDarkColorScheme = darkColorScheme(
+ primary = primaryDarkMediumContrast,
+ onPrimary = onPrimaryDarkMediumContrast,
+ primaryContainer = primaryContainerDarkMediumContrast,
+ onPrimaryContainer = onPrimaryContainerDarkMediumContrast,
+ secondary = secondaryDarkMediumContrast,
+ onSecondary = onSecondaryDarkMediumContrast,
+ secondaryContainer = secondaryContainerDarkMediumContrast,
+ onSecondaryContainer = onSecondaryContainerDarkMediumContrast,
+ tertiary = tertiaryDarkMediumContrast,
+ onTertiary = onTertiaryDarkMediumContrast,
+ tertiaryContainer = tertiaryContainerDarkMediumContrast,
+ onTertiaryContainer = onTertiaryContainerDarkMediumContrast,
+ error = errorDarkMediumContrast,
+ onError = onErrorDarkMediumContrast,
+ errorContainer = errorContainerDarkMediumContrast,
+ onErrorContainer = onErrorContainerDarkMediumContrast,
+ background = backgroundDarkMediumContrast,
+ onBackground = onBackgroundDarkMediumContrast,
+ surface = surfaceDarkMediumContrast,
+ onSurface = onSurfaceDarkMediumContrast,
+ surfaceVariant = surfaceVariantDarkMediumContrast,
+ onSurfaceVariant = onSurfaceVariantDarkMediumContrast,
+ outline = outlineDarkMediumContrast,
+ outlineVariant = outlineVariantDarkMediumContrast,
+ scrim = scrimDarkMediumContrast,
+ inverseSurface = inverseSurfaceDarkMediumContrast,
+ inverseOnSurface = inverseOnSurfaceDarkMediumContrast,
+ inversePrimary = inversePrimaryDarkMediumContrast,
+ surfaceDim = surfaceDimDarkMediumContrast,
+ surfaceBright = surfaceBrightDarkMediumContrast,
+ surfaceContainerLowest = surfaceContainerLowestDarkMediumContrast,
+ surfaceContainerLow = surfaceContainerLowDarkMediumContrast,
+ surfaceContainer = surfaceContainerDarkMediumContrast,
+ surfaceContainerHigh = surfaceContainerHighDarkMediumContrast,
+ surfaceContainerHighest = surfaceContainerHighestDarkMediumContrast,
+)
+
+private val highContrastDarkColorScheme = darkColorScheme(
+ primary = primaryDarkHighContrast,
+ onPrimary = onPrimaryDarkHighContrast,
+ primaryContainer = primaryContainerDarkHighContrast,
+ onPrimaryContainer = onPrimaryContainerDarkHighContrast,
+ secondary = secondaryDarkHighContrast,
+ onSecondary = onSecondaryDarkHighContrast,
+ secondaryContainer = secondaryContainerDarkHighContrast,
+ onSecondaryContainer = onSecondaryContainerDarkHighContrast,
+ tertiary = tertiaryDarkHighContrast,
+ onTertiary = onTertiaryDarkHighContrast,
+ tertiaryContainer = tertiaryContainerDarkHighContrast,
+ onTertiaryContainer = onTertiaryContainerDarkHighContrast,
+ error = errorDarkHighContrast,
+ onError = onErrorDarkHighContrast,
+ errorContainer = errorContainerDarkHighContrast,
+ onErrorContainer = onErrorContainerDarkHighContrast,
+ background = backgroundDarkHighContrast,
+ onBackground = onBackgroundDarkHighContrast,
+ surface = surfaceDarkHighContrast,
+ onSurface = onSurfaceDarkHighContrast,
+ surfaceVariant = surfaceVariantDarkHighContrast,
+ onSurfaceVariant = onSurfaceVariantDarkHighContrast,
+ outline = outlineDarkHighContrast,
+ outlineVariant = outlineVariantDarkHighContrast,
+ scrim = scrimDarkHighContrast,
+ inverseSurface = inverseSurfaceDarkHighContrast,
+ inverseOnSurface = inverseOnSurfaceDarkHighContrast,
+ inversePrimary = inversePrimaryDarkHighContrast,
+ surfaceDim = surfaceDimDarkHighContrast,
+ surfaceBright = surfaceBrightDarkHighContrast,
+ surfaceContainerLowest = surfaceContainerLowestDarkHighContrast,
+ surfaceContainerLow = surfaceContainerLowDarkHighContrast,
+ surfaceContainer = surfaceContainerDarkHighContrast,
+ surfaceContainerHigh = surfaceContainerHighDarkHighContrast,
+ surfaceContainerHighest = surfaceContainerHighestDarkHighContrast,
+)
+
+@Immutable
+data class ColorFamily(
+ val color: Color,
+ val onColor: Color,
+ val colorContainer: Color,
+ val onColorContainer: Color
+)
+
+val unspecified_scheme = ColorFamily(
+ Color.Unspecified, Color.Unspecified, Color.Unspecified, Color.Unspecified
+)
+
+@Composable
+fun JetcasterThemeM3(
+ darkTheme: Boolean = isSystemInDarkTheme(),
+ // Dynamic color is available on Android 12+
+ dynamicColor: Boolean = true,
+ content: @Composable () -> Unit
+) {
+ val colorScheme = when {
+ dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
+ val context = LocalContext.current
+ if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
+ }
+
+ darkTheme -> darkScheme
+ else -> lightScheme
+ }
+ val view = LocalView.current
+ if (!view.isInEditMode) {
+ SideEffect {
+ val window = (view.context as Activity).window
+ window.statusBarColor = colorScheme.primary.toArgb()
+ WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
+ }
+ }
+
+ androidx.compose.material3.MaterialTheme(
+ colorScheme = colorScheme,
+ typography = JetcasterTypographyM3,
+ content = content
+ )
+}
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Type.kt b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Type.kt
index 1c407e52cb..0fcabdd969 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Type.kt
+++ b/Jetcaster/app/src/main/java/com/example/jetcaster/ui/theme/Type.kt
@@ -18,18 +18,9 @@ package com.example.jetcaster.ui.theme
import androidx.compose.material.Typography
import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
-import com.example.jetcaster.R
-
-private val Montserrat = FontFamily(
- Font(R.font.montserrat_light, FontWeight.Light),
- Font(R.font.montserrat_regular, FontWeight.Normal),
- Font(R.font.montserrat_medium, FontWeight.Medium),
- Font(R.font.montserrat_semibold, FontWeight.SemiBold)
-)
+import com.example.jetcaster.designsystem.theme.Montserrat
val JetcasterTypography = Typography(
h1 = TextStyle(
@@ -120,3 +111,105 @@ val JetcasterTypography = Typography(
letterSpacing = 1.sp
)
)
+
+val JetcasterTypographyM3 = androidx.compose.material3.Typography(
+ displayLarge = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 57.sp,
+ fontWeight = FontWeight.W400,
+ lineHeight = 64.sp,
+ letterSpacing = (-0.25).sp
+ ),
+ displayMedium = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 45.sp,
+ fontWeight = FontWeight.W400,
+ lineHeight = 52.sp
+ ),
+ displaySmall = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 36.sp,
+ fontWeight = FontWeight.W400,
+ lineHeight = 44.sp
+ ),
+ headlineLarge = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 32.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 40.sp
+ ),
+ headlineMedium = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 28.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 36.sp
+ ),
+ headlineSmall = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 24.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 32.sp
+ ),
+ titleLarge = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 22.sp,
+ fontWeight = FontWeight.W400,
+ lineHeight = 28.sp
+ ),
+ titleMedium = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 16.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 24.sp,
+ letterSpacing = 0.15.sp
+ ),
+ titleSmall = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 14.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 20.sp,
+ letterSpacing = 0.1.sp
+ ),
+ labelLarge = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 14.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 20.sp,
+ letterSpacing = 0.1.sp
+ ),
+ labelMedium = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 12.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp
+ ),
+ labelSmall = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 11.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp
+ ),
+ bodyLarge = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 16.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 24.sp,
+ letterSpacing = 0.5.sp
+ ),
+ bodyMedium = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 14.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 20.sp,
+ letterSpacing = 0.25.sp
+ ),
+ bodySmall = TextStyle(
+ fontFamily = Montserrat,
+ fontSize = 12.sp,
+ fontWeight = FontWeight.W500,
+ lineHeight = 16.sp,
+ letterSpacing = 0.4.sp
+ ),
+)
diff --git a/Jetcaster/build.gradle.kts b/Jetcaster/build.gradle.kts
index c83db36f52..c9c401efd5 100644
--- a/Jetcaster/build.gradle.kts
+++ b/Jetcaster/build.gradle.kts
@@ -15,8 +15,11 @@
*/
plugins {
+ alias(libs.plugins.android.application) apply false
+ alias(libs.plugins.android.library) apply false
+ alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.gradle.versions)
alias(libs.plugins.version.catalog.update)
}
-apply("${project.rootDir}/buildscripts/toml-updater-config.gradle")
\ No newline at end of file
+apply("${project.rootDir}/buildscripts/toml-updater-config.gradle")
diff --git a/Jetcaster/core/.gitignore b/Jetcaster/core/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/Jetcaster/core/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Jetcaster/core/build.gradle.kts b/Jetcaster/core/build.gradle.kts
new file mode 100644
index 0000000000..b4d57239f4
--- /dev/null
+++ b/Jetcaster/core/build.gradle.kts
@@ -0,0 +1,57 @@
+plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.ksp)
+}
+
+// TODO(chris): Set up convention plugin
+android {
+ namespace = "com.example.jetcaster.core"
+ compileSdk = libs.versions.compileSdk.get().toInt()
+
+ defaultConfig {
+ minSdk = libs.versions.minSdk.get().toInt()
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles("consumer-rules.pro")
+ }
+
+ buildFeatures {
+ buildConfig = true
+ }
+
+ buildTypes {
+ release {
+ isMinifyEnabled = false
+ proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
+ }
+ }
+ compileOptions {
+ isCoreLibraryDesugaringEnabled = true
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+}
+
+dependencies {
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.appcompat)
+ implementation(libs.androidx.compose.runtime)
+
+ implementation(libs.coil.kt.compose)
+
+ val composeBom = platform(libs.androidx.compose.bom)
+ implementation(composeBom)
+
+ implementation(libs.okhttp3)
+ implementation(libs.okhttp.logging)
+
+ implementation(libs.androidx.room.runtime)
+ implementation(libs.androidx.room.ktx)
+ ksp(libs.androidx.room.compiler)
+
+ implementation(libs.rometools.rome)
+ implementation(libs.rometools.modules)
+
+ coreLibraryDesugaring(libs.core.jdk.desugaring)
+}
diff --git a/Jetcaster/core/consumer-rules.pro b/Jetcaster/core/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Jetcaster/core/proguard-rules.pro b/Jetcaster/core/proguard-rules.pro
new file mode 100644
index 0000000000..481bb43481
--- /dev/null
+++ b/Jetcaster/core/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/Jetcaster/core/src/main/AndroidManifest.xml b/Jetcaster/core/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..8bdb7e14b3
--- /dev/null
+++ b/Jetcaster/core/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/DateTimeTypeConverters.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/DateTimeTypeConverters.kt
similarity index 97%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/DateTimeTypeConverters.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/DateTimeTypeConverters.kt
index 4b4fb5d0a9..0199678c4c 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/DateTimeTypeConverters.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/DateTimeTypeConverters.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database
import androidx.room.TypeConverter
import java.time.Duration
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/JetcasterDatabase.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/JetcasterDatabase.kt
similarity index 63%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/JetcasterDatabase.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/JetcasterDatabase.kt
index cc4f2a24e7..ced5d408b0 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/JetcasterDatabase.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/JetcasterDatabase.kt
@@ -14,16 +14,22 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
-import com.example.jetcaster.data.Category
-import com.example.jetcaster.data.Episode
-import com.example.jetcaster.data.Podcast
-import com.example.jetcaster.data.PodcastCategoryEntry
-import com.example.jetcaster.data.PodcastFollowedEntry
+import com.example.jetcaster.core.data.database.dao.CategoriesDao
+import com.example.jetcaster.core.data.database.dao.EpisodesDao
+import com.example.jetcaster.core.data.database.dao.PodcastCategoryEntryDao
+import com.example.jetcaster.core.data.database.dao.PodcastFollowedEntryDao
+import com.example.jetcaster.core.data.database.dao.PodcastsDao
+import com.example.jetcaster.core.data.database.dao.TransactionRunnerDao
+import com.example.jetcaster.core.data.database.model.Category
+import com.example.jetcaster.core.data.database.model.Episode
+import com.example.jetcaster.core.data.database.model.Podcast
+import com.example.jetcaster.core.data.database.model.PodcastCategoryEntry
+import com.example.jetcaster.core.data.database.model.PodcastFollowedEntry
/**
* The [RoomDatabase] we use in this app.
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/BaseDao.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/BaseDao.kt
similarity index 95%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/BaseDao.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/BaseDao.kt
index 4eac0f395b..eca987c370 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/BaseDao.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/BaseDao.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database.dao
import androidx.room.Delete
import androidx.room.Insert
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/CategoriesDao.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/CategoriesDao.kt
similarity index 92%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/CategoriesDao.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/CategoriesDao.kt
index 7f851339fa..f9b36601cb 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/CategoriesDao.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/CategoriesDao.kt
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database.dao
import androidx.room.Dao
import androidx.room.Query
-import com.example.jetcaster.data.Category
+import com.example.jetcaster.core.data.database.model.Category
import kotlinx.coroutines.flow.Flow
/**
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/EpisodesDao.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/EpisodesDao.kt
similarity index 90%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/EpisodesDao.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/EpisodesDao.kt
index 52701d6298..5ba874532c 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/EpisodesDao.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/EpisodesDao.kt
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Transaction
-import com.example.jetcaster.data.Episode
-import com.example.jetcaster.data.EpisodeToPodcast
+import com.example.jetcaster.core.data.database.model.Episode
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
import kotlinx.coroutines.flow.Flow
/**
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastCategoryEntryDao.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastCategoryEntryDao.kt
similarity index 86%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastCategoryEntryDao.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastCategoryEntryDao.kt
index 681c828125..5291649e34 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastCategoryEntryDao.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastCategoryEntryDao.kt
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database.dao
import androidx.room.Dao
-import com.example.jetcaster.data.PodcastCategoryEntry
+import com.example.jetcaster.core.data.database.model.PodcastCategoryEntry
/**
* [Room] DAO for [PodcastCategoryEntry] related operations.
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastFollowedEntryDao.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastFollowedEntryDao.kt
similarity index 90%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastFollowedEntryDao.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastFollowedEntryDao.kt
index 69c8dbf0d9..0816cc05e7 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastFollowedEntryDao.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastFollowedEntryDao.kt
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database.dao
import androidx.room.Dao
import androidx.room.Query
-import com.example.jetcaster.data.PodcastFollowedEntry
+import com.example.jetcaster.core.data.database.model.PodcastFollowedEntry
@Dao
abstract class PodcastFollowedEntryDao : BaseDao {
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastsDao.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastsDao.kt
similarity index 94%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastsDao.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastsDao.kt
index 7c04dcd005..9a5426e849 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/PodcastsDao.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/PodcastsDao.kt
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Transaction
-import com.example.jetcaster.data.Podcast
-import com.example.jetcaster.data.PodcastWithExtraInfo
+import com.example.jetcaster.core.data.database.model.Podcast
+import com.example.jetcaster.core.data.database.model.PodcastWithExtraInfo
import kotlinx.coroutines.flow.Flow
/**
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/TransactionRunnerDao.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/TransactionRunnerDao.kt
similarity index 95%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/room/TransactionRunnerDao.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/TransactionRunnerDao.kt
index e7c51cad4f..6f4b0c49e6 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/room/TransactionRunnerDao.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/dao/TransactionRunnerDao.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data.room
+package com.example.jetcaster.core.data.database.dao
import androidx.room.Dao
import androidx.room.Ignore
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Category.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Category.kt
similarity index 94%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/Category.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Category.kt
index 3279017b3a..4dff2871ef 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Category.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Category.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.database.model
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Episode.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Episode.kt
similarity index 97%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/Episode.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Episode.kt
index b5dc88b94d..6a035d9646 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Episode.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Episode.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.database.model
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/EpisodeToPodcast.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/EpisodeToPodcast.kt
similarity index 96%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/EpisodeToPodcast.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/EpisodeToPodcast.kt
index 4f87ba9e05..7945f20316 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/EpisodeToPodcast.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/EpisodeToPodcast.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.database.model
import androidx.room.Embedded
import androidx.room.Ignore
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Podcast.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Podcast.kt
similarity index 95%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/Podcast.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Podcast.kt
index 969908f14a..1d86f31f91 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Podcast.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/Podcast.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.database.model
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastCategoryEntry.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastCategoryEntry.kt
similarity index 96%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastCategoryEntry.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastCategoryEntry.kt
index 394af2fca8..3c2c67878d 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastCategoryEntry.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastCategoryEntry.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.database.model
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastFollowedEntry.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastFollowedEntry.kt
similarity index 96%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastFollowedEntry.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastFollowedEntry.kt
index 0be51c77bc..420e68f38f 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastFollowedEntry.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastFollowedEntry.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.database.model
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastWithExtraInfo.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastWithExtraInfo.kt
similarity index 96%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastWithExtraInfo.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastWithExtraInfo.kt
index 200e6248c2..8794a46e47 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastWithExtraInfo.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/database/model/PodcastWithExtraInfo.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.database.model
import androidx.room.ColumnInfo
import androidx.room.Embedded
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/Graph.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/di/Graph.kt
similarity index 85%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/Graph.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/di/Graph.kt
index 3d831558a7..30b6069fd6 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/Graph.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/di/Graph.kt
@@ -14,17 +14,18 @@
* limitations under the License.
*/
-package com.example.jetcaster
+package com.example.jetcaster.core.data.di
import android.content.Context
import androidx.room.Room
-import com.example.jetcaster.data.CategoryStore
-import com.example.jetcaster.data.EpisodeStore
-import com.example.jetcaster.data.PodcastStore
-import com.example.jetcaster.data.PodcastsFetcher
-import com.example.jetcaster.data.PodcastsRepository
-import com.example.jetcaster.data.room.JetcasterDatabase
-import com.example.jetcaster.data.room.TransactionRunner
+import com.example.jetcaster.core.BuildConfig
+import com.example.jetcaster.core.data.database.JetcasterDatabase
+import com.example.jetcaster.core.data.database.dao.TransactionRunner
+import com.example.jetcaster.core.data.network.PodcastsFetcher
+import com.example.jetcaster.core.data.repository.CategoryStore
+import com.example.jetcaster.core.data.repository.EpisodeStore
+import com.example.jetcaster.core.data.repository.PodcastStore
+import com.example.jetcaster.core.data.repository.PodcastsRepository
import com.rometools.rome.io.SyndFeedInput
import java.io.File
import kotlinx.coroutines.CoroutineDispatcher
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Feeds.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/Feeds.kt
similarity index 97%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/Feeds.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/Feeds.kt
index 651ebf423f..ead4bbb3e4 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/Feeds.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/Feeds.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.network
/**
* A hand selected list of feeds URLs used for the purposes of displaying real information
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/OkHttpExtensions.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/OkHttpExtensions.kt
similarity index 97%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/OkHttpExtensions.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/OkHttpExtensions.kt
index e9a516f0ed..147fed436e 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/OkHttpExtensions.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/OkHttpExtensions.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.network
import java.io.IOException
import kotlin.coroutines.resumeWithException
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastFetcher.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/PodcastFetcher.kt
similarity index 96%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastFetcher.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/PodcastFetcher.kt
index a13cdca901..eaf619487d 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastFetcher.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/network/PodcastFetcher.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.network
import coil.network.HttpException
+import com.example.jetcaster.core.data.database.model.Category
+import com.example.jetcaster.core.data.database.model.Episode
+import com.example.jetcaster.core.data.database.model.Podcast
import com.rometools.modules.itunes.EntryInformation
import com.rometools.modules.itunes.FeedInformation
import com.rometools.rome.feed.synd.SyndEntry
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/CategoryStore.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/CategoryStore.kt
similarity index 81%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/CategoryStore.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/CategoryStore.kt
index cabf7e9e29..20af8ee599 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/CategoryStore.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/CategoryStore.kt
@@ -14,12 +14,16 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.repository
-import com.example.jetcaster.data.room.CategoriesDao
-import com.example.jetcaster.data.room.EpisodesDao
-import com.example.jetcaster.data.room.PodcastCategoryEntryDao
-import com.example.jetcaster.data.room.PodcastsDao
+import com.example.jetcaster.core.data.database.dao.CategoriesDao
+import com.example.jetcaster.core.data.database.dao.EpisodesDao
+import com.example.jetcaster.core.data.database.dao.PodcastCategoryEntryDao
+import com.example.jetcaster.core.data.database.dao.PodcastsDao
+import com.example.jetcaster.core.data.database.model.Category
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
+import com.example.jetcaster.core.data.database.model.PodcastCategoryEntry
+import com.example.jetcaster.core.data.database.model.PodcastWithExtraInfo
import kotlinx.coroutines.flow.Flow
/**
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/EpisodeStore.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/EpisodeStore.kt
similarity index 86%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/EpisodeStore.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/EpisodeStore.kt
index d60fa6e7c4..bc21bac561 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/EpisodeStore.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/EpisodeStore.kt
@@ -14,9 +14,11 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.repository
-import com.example.jetcaster.data.room.EpisodesDao
+import com.example.jetcaster.core.data.database.dao.EpisodesDao
+import com.example.jetcaster.core.data.database.model.Episode
+import com.example.jetcaster.core.data.database.model.EpisodeToPodcast
import kotlinx.coroutines.flow.Flow
/**
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastStore.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/PodcastStore.kt
similarity index 84%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastStore.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/PodcastStore.kt
index b9ace6b52e..5d47decb4f 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastStore.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/PodcastStore.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.repository
-import com.example.jetcaster.data.room.PodcastFollowedEntryDao
-import com.example.jetcaster.data.room.PodcastsDao
-import com.example.jetcaster.data.room.TransactionRunner
+import com.example.jetcaster.core.data.database.dao.PodcastFollowedEntryDao
+import com.example.jetcaster.core.data.database.dao.PodcastsDao
+import com.example.jetcaster.core.data.database.dao.TransactionRunner
+import com.example.jetcaster.core.data.database.model.Podcast
+import com.example.jetcaster.core.data.database.model.PodcastFollowedEntry
+import com.example.jetcaster.core.data.database.model.PodcastWithExtraInfo
import kotlinx.coroutines.flow.Flow
/**
diff --git a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastsRepository.kt b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/PodcastsRepository.kt
similarity index 89%
rename from Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastsRepository.kt
rename to Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/PodcastsRepository.kt
index f078b12f85..2458eb5a22 100644
--- a/Jetcaster/app/src/main/java/com/example/jetcaster/data/PodcastsRepository.kt
+++ b/Jetcaster/core/src/main/java/com/example/jetcaster/core/data/repository/PodcastsRepository.kt
@@ -14,13 +14,15 @@
* limitations under the License.
*/
-package com.example.jetcaster.data
+package com.example.jetcaster.core.data.repository
-import com.example.jetcaster.data.room.TransactionRunner
+import com.example.jetcaster.core.data.database.dao.TransactionRunner
+import com.example.jetcaster.core.data.network.PodcastRssResponse
+import com.example.jetcaster.core.data.network.PodcastsFetcher
+import com.example.jetcaster.core.data.network.SampleFeeds
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
diff --git a/Jetcaster/designsystem/.gitignore b/Jetcaster/designsystem/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/Jetcaster/designsystem/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Jetcaster/designsystem/build.gradle.kts b/Jetcaster/designsystem/build.gradle.kts
new file mode 100644
index 0000000000..566a565b39
--- /dev/null
+++ b/Jetcaster/designsystem/build.gradle.kts
@@ -0,0 +1,38 @@
+plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+}
+
+// TODO(chris): Set up convention plugin
+android {
+ namespace = "com.example.jetcaster.designsystem"
+ compileSdk = libs.versions.compileSdk.get().toInt()
+
+ defaultConfig {
+ minSdk = libs.versions.minSdk.get().toInt()
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles("consumer-rules.pro")
+ }
+
+ buildTypes {
+ release {
+ isMinifyEnabled = false
+ proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+}
+
+dependencies {
+ val composeBom = platform(libs.androidx.compose.bom)
+ implementation(composeBom)
+ implementation(libs.androidx.compose.ui.graphics)
+ implementation(libs.androidx.compose.ui.text)
+
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.appcompat)
+}
diff --git a/Jetcaster/designsystem/consumer-rules.pro b/Jetcaster/designsystem/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Jetcaster/designsystem/proguard-rules.pro b/Jetcaster/designsystem/proguard-rules.pro
new file mode 100644
index 0000000000..481bb43481
--- /dev/null
+++ b/Jetcaster/designsystem/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/Jetcaster/designsystem/src/main/AndroidManifest.xml b/Jetcaster/designsystem/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..8bdb7e14b3
--- /dev/null
+++ b/Jetcaster/designsystem/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Jetcaster/designsystem/src/main/java/com/example/jetcaster/designsystem/theme/Color.kt b/Jetcaster/designsystem/src/main/java/com/example/jetcaster/designsystem/theme/Color.kt
new file mode 100644
index 0000000000..51ab6000bc
--- /dev/null
+++ b/Jetcaster/designsystem/src/main/java/com/example/jetcaster/designsystem/theme/Color.kt
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.jetcaster.designsystem.theme
+import androidx.compose.ui.graphics.Color
+
+val primaryLight = Color(0xFF885200)
+val onPrimaryLight = Color(0xFFFFFFFF)
+val primaryContainerLight = Color(0xFFFFAC46)
+val onPrimaryContainerLight = Color(0xFF482900)
+val secondaryLight = Color(0xFF7A5817)
+val onSecondaryLight = Color(0xFFFFFFFF)
+val secondaryContainerLight = Color(0xFFFFD798)
+val onSecondaryContainerLight = Color(0xFF5C3F00)
+val tertiaryLight = Color(0xFF994700)
+val onTertiaryLight = Color(0xFFFFFFFF)
+val tertiaryContainerLight = Color(0xFFFF801F)
+val onTertiaryContainerLight = Color(0xFF2D1000)
+val errorLight = Color(0xFFA4384A)
+val onErrorLight = Color(0xFFFFFFFF)
+val errorContainerLight = Color(0xFFF87889)
+val onErrorContainerLight = Color(0xFF32000A)
+val backgroundLight = Color(0xFFFFF8F4)
+val onBackgroundLight = Color(0xFF221A11)
+val surfaceLight = Color(0xFFFFF8F4)
+val onSurfaceLight = Color(0xFF221A11)
+val surfaceVariantLight = Color(0xFFF7DEC8)
+val onSurfaceVariantLight = Color(0xFF544434)
+val outlineLight = Color(0xFF877461)
+val outlineVariantLight = Color(0xFFDAC3AD)
+val scrimLight = Color(0xFF000000)
+val inverseSurfaceLight = Color(0xFF382F25)
+val inverseOnSurfaceLight = Color(0xFFFFEEDF)
+val inversePrimaryLight = Color(0xFFFFB868)
+val surfaceDimLight = Color(0xFFE8D7C9)
+val surfaceBrightLight = Color(0xFFFFF8F4)
+val surfaceContainerLowestLight = Color(0xFFFFFFFF)
+val surfaceContainerLowLight = Color(0xFFFFF1E6)
+val surfaceContainerLight = Color(0xFFFCEBDC)
+val surfaceContainerHighLight = Color(0xFFF6E5D7)
+val surfaceContainerHighestLight = Color(0xFFF1E0D1)
+
+val primaryLightMediumContrast = Color(0xFF623A00)
+val onPrimaryLightMediumContrast = Color(0xFFFFFFFF)
+val primaryContainerLightMediumContrast = Color(0xFFA76600)
+val onPrimaryContainerLightMediumContrast = Color(0xFFFFFFFF)
+val secondaryLightMediumContrast = Color(0xFF5A3D00)
+val onSecondaryLightMediumContrast = Color(0xFFFFFFFF)
+val secondaryContainerLightMediumContrast = Color(0xFF936E2B)
+val onSecondaryContainerLightMediumContrast = Color(0xFFFFFFFF)
+val tertiaryLightMediumContrast = Color(0xFF6F3100)
+val onTertiaryLightMediumContrast = Color(0xFFFFFFFF)
+val tertiaryContainerLightMediumContrast = Color(0xFFBC5800)
+val onTertiaryContainerLightMediumContrast = Color(0xFFFFFFFF)
+val errorLightMediumContrast = Color(0xFF7F1B30)
+val onErrorLightMediumContrast = Color(0xFFFFFFFF)
+val errorContainerLightMediumContrast = Color(0xFFC14E5F)
+val onErrorContainerLightMediumContrast = Color(0xFFFFFFFF)
+val backgroundLightMediumContrast = Color(0xFFFFF8F4)
+val onBackgroundLightMediumContrast = Color(0xFF221A11)
+val surfaceLightMediumContrast = Color(0xFFFFF8F4)
+val onSurfaceLightMediumContrast = Color(0xFF221A11)
+val surfaceVariantLightMediumContrast = Color(0xFFF7DEC8)
+val onSurfaceVariantLightMediumContrast = Color(0xFF504030)
+val outlineLightMediumContrast = Color(0xFF6E5C4A)
+val outlineVariantLightMediumContrast = Color(0xFF8B7765)
+val scrimLightMediumContrast = Color(0xFF000000)
+val inverseSurfaceLightMediumContrast = Color(0xFF382F25)
+val inverseOnSurfaceLightMediumContrast = Color(0xFFFFEEDF)
+val inversePrimaryLightMediumContrast = Color(0xFFFFB868)
+val surfaceDimLightMediumContrast = Color(0xFFE8D7C9)
+val surfaceBrightLightMediumContrast = Color(0xFFFFF8F4)
+val surfaceContainerLowestLightMediumContrast = Color(0xFFFFFFFF)
+val surfaceContainerLowLightMediumContrast = Color(0xFFFFF1E6)
+val surfaceContainerLightMediumContrast = Color(0xFFFCEBDC)
+val surfaceContainerHighLightMediumContrast = Color(0xFFF6E5D7)
+val surfaceContainerHighestLightMediumContrast = Color(0xFFF1E0D1)
+
+val primaryLightHighContrast = Color(0xFF351D00)
+val onPrimaryLightHighContrast = Color(0xFFFFFFFF)
+val primaryContainerLightHighContrast = Color(0xFF623A00)
+val onPrimaryContainerLightHighContrast = Color(0xFFFFFFFF)
+val secondaryLightHighContrast = Color(0xFF301F00)
+val onSecondaryLightHighContrast = Color(0xFFFFFFFF)
+val secondaryContainerLightHighContrast = Color(0xFF5A3D00)
+val onSecondaryContainerLightHighContrast = Color(0xFFFFFFFF)
+val tertiaryLightHighContrast = Color(0xFF3C1800)
+val onTertiaryLightHighContrast = Color(0xFFFFFFFF)
+val tertiaryContainerLightHighContrast = Color(0xFF6F3100)
+val onTertiaryContainerLightHighContrast = Color(0xFFFFFFFF)
+val errorLightHighContrast = Color(0xFF4C0014)
+val onErrorLightHighContrast = Color(0xFFFFFFFF)
+val errorContainerLightHighContrast = Color(0xFF7F1B30)
+val onErrorContainerLightHighContrast = Color(0xFFFFFFFF)
+val backgroundLightHighContrast = Color(0xFFFFF8F4)
+val onBackgroundLightHighContrast = Color(0xFF221A11)
+val surfaceLightHighContrast = Color(0xFFFFF8F4)
+val onSurfaceLightHighContrast = Color(0xFF000000)
+val surfaceVariantLightHighContrast = Color(0xFFF7DEC8)
+val onSurfaceVariantLightHighContrast = Color(0xFF2E2113)
+val outlineLightHighContrast = Color(0xFF504030)
+val outlineVariantLightHighContrast = Color(0xFF504030)
+val scrimLightHighContrast = Color(0xFF000000)
+val inverseSurfaceLightHighContrast = Color(0xFF382F25)
+val inverseOnSurfaceLightHighContrast = Color(0xFFFFFFFF)
+val inversePrimaryLightHighContrast = Color(0xFFFFE8D4)
+val surfaceDimLightHighContrast = Color(0xFFE8D7C9)
+val surfaceBrightLightHighContrast = Color(0xFFFFF8F4)
+val surfaceContainerLowestLightHighContrast = Color(0xFFFFFFFF)
+val surfaceContainerLowLightHighContrast = Color(0xFFFFF1E6)
+val surfaceContainerLightHighContrast = Color(0xFFFCEBDC)
+val surfaceContainerHighLightHighContrast = Color(0xFFF6E5D7)
+val surfaceContainerHighestLightHighContrast = Color(0xFFF1E0D1)
+
+val primaryDark = Color(0xFFFFCF9E)
+val onPrimaryDark = Color(0xFF482900)
+val primaryContainerDark = Color(0xFFF79900)
+val onPrimaryContainerDark = Color(0xFF371E00)
+val secondaryDark = Color(0xFFFFFEFF)
+val onSecondaryDark = Color(0xFF422C00)
+val secondaryContainerDark = Color(0xFFFBCC80)
+val onSecondaryContainerDark = Color(0xFF553A00)
+val tertiaryDark = Color(0xFFFFB68B)
+val onTertiaryDark = Color(0xFF522300)
+val tertiaryContainerDark = Color(0xFFE76E00)
+val onTertiaryContainerDark = Color(0xFF000000)
+val errorDark = Color(0xFFFFB2B9)
+val onErrorDark = Color(0xFF65041F)
+val errorContainerDark = Color(0xFFC14E5F)
+val onErrorContainerDark = Color(0xFFFFFFFF)
+val backgroundDark = Color(0xFF1A120A)
+val onBackgroundDark = Color(0xFFF1E0D1)
+val surfaceDark = Color(0xFF1A120A)
+val onSurfaceDark = Color(0xFFF1E0D1)
+val surfaceVariantDark = Color(0xFF544434)
+val onSurfaceVariantDark = Color(0xFFDAC3AD)
+val outlineDark = Color(0xFFA28D7A)
+val outlineVariantDark = Color(0xFF544434)
+val scrimDark = Color(0xFF000000)
+val inverseSurfaceDark = Color(0xFFF1E0D1)
+val inverseOnSurfaceDark = Color(0xFF382F25)
+val inversePrimaryDark = Color(0xFF885200)
+val surfaceDimDark = Color(0xFF1A120A)
+val surfaceBrightDark = Color(0xFF42372D)
+val surfaceContainerLowestDark = Color(0xFF140D06)
+val surfaceContainerLowDark = Color(0xFF221A11)
+val surfaceContainerDark = Color(0xFF271E15)
+val surfaceContainerHighDark = Color(0xFF32281F)
+val surfaceContainerHighestDark = Color(0xFF3D3329)
+
+val primaryDarkMediumContrast = Color(0xFFFFCF9E)
+val onPrimaryDarkMediumContrast = Color(0xFF351D00)
+val primaryContainerDarkMediumContrast = Color(0xFFF79900)
+val onPrimaryContainerDarkMediumContrast = Color(0xFF000000)
+val secondaryDarkMediumContrast = Color(0xFFFFFEFF)
+val onSecondaryDarkMediumContrast = Color(0xFF422C00)
+val secondaryContainerDarkMediumContrast = Color(0xFFFBCC80)
+val onSecondaryContainerDarkMediumContrast = Color(0xFF2C1C00)
+val tertiaryDarkMediumContrast = Color(0xFFFFBC95)
+val onTertiaryDarkMediumContrast = Color(0xFF2A0E00)
+val tertiaryContainerDarkMediumContrast = Color(0xFFE76E00)
+val onTertiaryContainerDarkMediumContrast = Color(0xFF000000)
+val errorDarkMediumContrast = Color(0xFFFFB8BE)
+val onErrorDarkMediumContrast = Color(0xFF36000C)
+val errorContainerDarkMediumContrast = Color(0xFFE5697A)
+val onErrorContainerDarkMediumContrast = Color(0xFF000000)
+val backgroundDarkMediumContrast = Color(0xFF1A120A)
+val onBackgroundDarkMediumContrast = Color(0xFFF1E0D1)
+val surfaceDarkMediumContrast = Color(0xFF1A120A)
+val onSurfaceDarkMediumContrast = Color(0xFFFFFAF8)
+val surfaceVariantDarkMediumContrast = Color(0xFF544434)
+val onSurfaceVariantDarkMediumContrast = Color(0xFFDEC7B1)
+val outlineDarkMediumContrast = Color(0xFFB59F8B)
+val outlineVariantDarkMediumContrast = Color(0xFF93806D)
+val scrimDarkMediumContrast = Color(0xFF000000)
+val inverseSurfaceDarkMediumContrast = Color(0xFFF1E0D1)
+val inverseOnSurfaceDarkMediumContrast = Color(0xFF32281F)
+val inversePrimaryDarkMediumContrast = Color(0xFF693E00)
+val surfaceDimDarkMediumContrast = Color(0xFF1A120A)
+val surfaceBrightDarkMediumContrast = Color(0xFF42372D)
+val surfaceContainerLowestDarkMediumContrast = Color(0xFF140D06)
+val surfaceContainerLowDarkMediumContrast = Color(0xFF221A11)
+val surfaceContainerDarkMediumContrast = Color(0xFF271E15)
+val surfaceContainerHighDarkMediumContrast = Color(0xFF32281F)
+val surfaceContainerHighestDarkMediumContrast = Color(0xFF3D3329)
+
+val primaryDarkHighContrast = Color(0xFFFFFAF8)
+val onPrimaryDarkHighContrast = Color(0xFF000000)
+val primaryContainerDarkHighContrast = Color(0xFFFFBE76)
+val onPrimaryContainerDarkHighContrast = Color(0xFF000000)
+val secondaryDarkHighContrast = Color(0xFFFFFEFF)
+val onSecondaryDarkHighContrast = Color(0xFF000000)
+val secondaryContainerDarkHighContrast = Color(0xFFFBCC80)
+val onSecondaryContainerDarkHighContrast = Color(0xFF000000)
+val tertiaryDarkHighContrast = Color(0xFFFFFAF8)
+val onTertiaryDarkHighContrast = Color(0xFF000000)
+val tertiaryContainerDarkHighContrast = Color(0xFFFFBC95)
+val onTertiaryContainerDarkHighContrast = Color(0xFF000000)
+val errorDarkHighContrast = Color(0xFFFFF9F9)
+val onErrorDarkHighContrast = Color(0xFF000000)
+val errorContainerDarkHighContrast = Color(0xFFFFB8BE)
+val onErrorContainerDarkHighContrast = Color(0xFF000000)
+val backgroundDarkHighContrast = Color(0xFF1A120A)
+val onBackgroundDarkHighContrast = Color(0xFFF1E0D1)
+val surfaceDarkHighContrast = Color(0xFF1A120A)
+val onSurfaceDarkHighContrast = Color(0xFFFFFFFF)
+val surfaceVariantDarkHighContrast = Color(0xFF544434)
+val onSurfaceVariantDarkHighContrast = Color(0xFFFFFAF8)
+val outlineDarkHighContrast = Color(0xFFDEC7B1)
+val outlineVariantDarkHighContrast = Color(0xFFDEC7B1)
+val scrimDarkHighContrast = Color(0xFF000000)
+val inverseSurfaceDarkHighContrast = Color(0xFFF1E0D1)
+val inverseOnSurfaceDarkHighContrast = Color(0xFF000000)
+val inversePrimaryDarkHighContrast = Color(0xFF3F2400)
+val surfaceDimDarkHighContrast = Color(0xFF1A120A)
+val surfaceBrightDarkHighContrast = Color(0xFF42372D)
+val surfaceContainerLowestDarkHighContrast = Color(0xFF140D06)
+val surfaceContainerLowDarkHighContrast = Color(0xFF221A11)
+val surfaceContainerDarkHighContrast = Color(0xFF271E15)
+val surfaceContainerHighDarkHighContrast = Color(0xFF32281F)
+val surfaceContainerHighestDarkHighContrast = Color(0xFF3D3329)
diff --git a/Jetcaster/designsystem/src/main/java/com/example/jetcaster/designsystem/theme/Typography.kt b/Jetcaster/designsystem/src/main/java/com/example/jetcaster/designsystem/theme/Typography.kt
new file mode 100644
index 0000000000..bd9320cd6d
--- /dev/null
+++ b/Jetcaster/designsystem/src/main/java/com/example/jetcaster/designsystem/theme/Typography.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.jetcaster.designsystem.theme
+
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import com.example.jetcaster.designsystem.R
+
+val Montserrat = FontFamily(
+ Font(R.font.montserrat_light, FontWeight.Light),
+ Font(R.font.montserrat_regular, FontWeight.Normal),
+ Font(R.font.montserrat_medium, FontWeight.Medium),
+ Font(R.font.montserrat_semibold, FontWeight.SemiBold)
+)
diff --git a/Jetcaster/app/src/main/res/font/montserrat_light.ttf b/Jetcaster/designsystem/src/main/res/font/montserrat_light.ttf
similarity index 100%
rename from Jetcaster/app/src/main/res/font/montserrat_light.ttf
rename to Jetcaster/designsystem/src/main/res/font/montserrat_light.ttf
diff --git a/Jetcaster/app/src/main/res/font/montserrat_medium.ttf b/Jetcaster/designsystem/src/main/res/font/montserrat_medium.ttf
similarity index 100%
rename from Jetcaster/app/src/main/res/font/montserrat_medium.ttf
rename to Jetcaster/designsystem/src/main/res/font/montserrat_medium.ttf
diff --git a/Jetcaster/app/src/main/res/font/montserrat_regular.ttf b/Jetcaster/designsystem/src/main/res/font/montserrat_regular.ttf
similarity index 100%
rename from Jetcaster/app/src/main/res/font/montserrat_regular.ttf
rename to Jetcaster/designsystem/src/main/res/font/montserrat_regular.ttf
diff --git a/Jetcaster/app/src/main/res/font/montserrat_semibold.ttf b/Jetcaster/designsystem/src/main/res/font/montserrat_semibold.ttf
similarity index 100%
rename from Jetcaster/app/src/main/res/font/montserrat_semibold.ttf
rename to Jetcaster/designsystem/src/main/res/font/montserrat_semibold.ttf
diff --git a/Jetcaster/gradle/libs.versions.toml b/Jetcaster/gradle/libs.versions.toml
index 502cf6f9aa..402d8fdfb2 100644
--- a/Jetcaster/gradle/libs.versions.toml
+++ b/Jetcaster/gradle/libs.versions.toml
@@ -77,9 +77,11 @@ androidx-compose-runtime = { module = "androidx.compose.runtime:runtime" }
androidx-compose-runtime-livedata = { module = "androidx.compose.runtime:runtime-livedata" }
androidx-compose-ui = { module = "androidx.compose.ui:ui" }
androidx-compose-ui-googlefonts = { module = "androidx.compose.ui:ui-text-google-fonts" }
+androidx-compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" }
androidx-compose-ui-test = { module = "androidx.compose.ui:ui-test" }
androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" }
androidx-compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" }
+androidx-compose-ui-text = { module = "androidx.compose.ui:ui-text" }
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
androidx-compose-ui-util = { module = "androidx.compose.ui:ui-util" }
@@ -134,6 +136,7 @@ rometools-rome = { module = "com.rometools:rome", version.ref = "rome" }
[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
android-test = { id = "com.android.test", version.ref = "androidGradlePlugin" }
+android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }
gradle-versions = { id = "com.github.ben-manes.versions", version.ref = "gradle-versions" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
diff --git a/Jetcaster/settings.gradle.kts b/Jetcaster/settings.gradle.kts
index a7c272a185..966fed261f 100644
--- a/Jetcaster/settings.gradle.kts
+++ b/Jetcaster/settings.gradle.kts
@@ -35,5 +35,4 @@ dependencyResolutionManagement {
}
}
rootProject.name = "Jetcaster"
-include(":app")
-
+include(":app", ":core", ":designsystem")