diff --git a/android-core/designsystem/build.gradle.kts b/android-core/designsystem/build.gradle.kts
index d4fd47154..503350b8f 100644
--- a/android-core/designsystem/build.gradle.kts
+++ b/android-core/designsystem/build.gradle.kts
@@ -18,7 +18,6 @@ dependencies {
implementation(projects.androidCore.resources)
implementation(libs.kenburns)
- implementation(libs.accompanist.insetsui)
implementation(libs.androidx.core)
implementation(libs.androidx.compose.foundation)
implementation(libs.androidx.compose.material.icons)
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Buttons.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Buttons.kt
index 417e2c983..f37d9c332 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Buttons.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Buttons.kt
@@ -10,12 +10,12 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.Text
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@@ -54,7 +54,7 @@ fun TvManiacOutlinedButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
- textPadding: Dp = 4.dp,
+ textPadding: Dp = 0.dp,
borderColor: Color = MaterialTheme.colorScheme.secondary,
leadingIcon: @Composable (() -> Unit)? = null,
) {
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Card.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Card.kt
index 765f689a2..2dd7640c4 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Card.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Card.kt
@@ -7,10 +7,10 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
-import androidx.compose.material.Text
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Chip.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Chip.kt
index 20c95de1d..4be24b71b 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Chip.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Chip.kt
@@ -2,13 +2,13 @@ package com.thomaskioko.tvmaniac.compose.components
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.Text
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilterChip
import androidx.compose.material3.FilterChipDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/ErrorLayout.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/ErrorLayout.kt
index f2d1460b3..e008ffe30 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/ErrorLayout.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/ErrorLayout.kt
@@ -14,14 +14,13 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Collections
import androidx.compose.material.icons.outlined.ErrorOutline
import androidx.compose.material.icons.outlined.SignalWifi4Bar
import androidx.compose.material.icons.outlined.SignalWifiOff
+import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
@@ -57,7 +56,6 @@ fun ConnectionStatus(
Box(
modifier = modifier
.background(backgroundColor)
- .statusBarsPadding()
.fillMaxWidth()
.padding(8.dp),
contentAlignment = Alignment.TopCenter,
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Navigation.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Navigation.kt
new file mode 100644
index 000000000..148af0dcd
--- /dev/null
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Navigation.kt
@@ -0,0 +1,67 @@
+package com.thomaskioko.tvmaniac.compose.components
+
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.NavigationBar
+import androidx.compose.material3.NavigationBarItem
+import androidx.compose.material3.NavigationBarItemDefaults
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.unit.dp
+
+@Composable
+fun TvManiacNavigationBar(
+ modifier: Modifier = Modifier,
+ content: @Composable RowScope.() -> Unit,
+) {
+ NavigationBar(
+ modifier = modifier,
+ contentColor = NavigationDefaultColors.navigationContentColor(),
+ tonalElevation = 8.dp,
+ content = content,
+ )
+}
+
+@Composable
+fun RowScope.TvManiacBottomNavigationItem(
+ imageVector: ImageVector,
+ title: String,
+ selected: Boolean,
+ modifier: Modifier = Modifier,
+ onClick: () -> Unit,
+) {
+ NavigationBarItem(
+ modifier = modifier,
+ icon = {
+ Icon(
+ imageVector = imageVector,
+ contentDescription = title,
+ )
+ },
+ label = { Text(title) },
+ selected = selected,
+ alwaysShowLabel = true,
+ colors = NavigationBarItemDefaults.colors(
+ selectedIconColor = NavigationDefaultColors.navigationSelectedItemColor(),
+ unselectedIconColor = NavigationDefaultColors.navigationContentColor(),
+ selectedTextColor = NavigationDefaultColors.navigationSelectedItemColor(),
+ unselectedTextColor = NavigationDefaultColors.navigationContentColor(),
+ indicatorColor = NavigationDefaultColors.navigationIndicatorColor(),
+ ),
+ onClick = onClick,
+ )
+}
+
+object NavigationDefaultColors {
+ @Composable
+ fun navigationContentColor() = MaterialTheme.colorScheme.onSurfaceVariant
+
+ @Composable
+ fun navigationSelectedItemColor() = MaterialTheme.colorScheme.secondary
+
+ @Composable
+ fun navigationIndicatorColor() = MaterialTheme.colorScheme.primaryContainer
+}
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Text.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Text.kt
index 0b628d8ee..a78a8688d 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Text.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/Text.kt
@@ -6,10 +6,10 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.material.CircularProgressIndicator
-import androidx.compose.material.Text
+import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -18,6 +18,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.font.FontWeight.Companion.Bold
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -98,6 +99,7 @@ fun TextLoadingItem(
fun ExpandingText(
text: String,
modifier: Modifier = Modifier,
+ fontWeight: FontWeight = FontWeight.Normal,
textStyle: TextStyle = MaterialTheme.typography.bodyMedium,
expandable: Boolean = true,
collapsedMaxLines: Int = 4,
@@ -109,6 +111,7 @@ fun ExpandingText(
Text(
text = text,
style = textStyle,
+ fontWeight = fontWeight,
overflow = TextOverflow.Ellipsis,
color = MaterialTheme.colorScheme.onSurface,
maxLines = if (expanded) expandedMaxLines else collapsedMaxLines,
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/TopBar.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/TopBar.kt
index 59074e512..b1c7bb352 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/TopBar.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/components/TopBar.kt
@@ -8,39 +8,44 @@ import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
-import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars
-import androidx.compose.material.Icon
-import androidx.compose.material.IconButton
-import androidx.compose.material.Text
-import androidx.compose.material.TopAppBar
+import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Settings
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
+import androidx.compose.material3.TopAppBarColors
+import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
-import com.google.accompanist.insets.ui.TopAppBar
import com.thomaskioko.tvmaniac.compose.extensions.iconButtonBackgroundScrim
import com.thomaskioko.tvmaniac.compose.theme.TvManiacTheme
import com.thomaskioko.tvmaniac.resources.R
+@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TvManiacTopBar(
modifier: Modifier = Modifier,
- backgroundColor: Color = MaterialTheme.colorScheme.background,
+ elevation: Dp = 0.dp,
+ colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(),
title: String? = null,
showNavigationIcon: Boolean = false,
actionImageVector: ImageVector? = null,
@@ -48,11 +53,13 @@ fun TvManiacTopBar(
onBackClick: () -> Unit = {},
) {
TopAppBar(
+ modifier = modifier
+ .shadow(elevation = elevation),
title = {
if (title != null) {
Text(
text = title,
- style = MaterialTheme.typography.headlineSmall.copy(
+ style = MaterialTheme.typography.titleSmall.copy(
color = MaterialTheme.colorScheme.onSurface,
),
maxLines = 1,
@@ -67,13 +74,13 @@ fun TvManiacTopBar(
painter = painterResource(R.drawable.ic_baseline_arrow_back_24),
contentDescription = null,
colorFilter = ColorFilter.tint(color = MaterialTheme.colorScheme.onSurface),
- modifier = modifier
+ modifier = Modifier
.clickable(onClick = onBackClick)
.padding(16.dp),
)
}
},
- backgroundColor = backgroundColor,
+ colors = colors,
actions = {
if (actionImageVector != null) {
IconButton(
@@ -90,6 +97,7 @@ fun TvManiacTopBar(
)
}
+@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CollapsableAppBar(
title: String?,
@@ -118,25 +126,21 @@ fun CollapsableAppBar(
TopAppBar(
title = {
Crossfade(
- showAppBarBackground && title != null,
+ targetState = showAppBarBackground && title != null,
label = "titleAnimation",
) { show ->
if (show) {
Text(
- text = title!!,
- style = MaterialTheme.typography.headlineSmall.copy(
+ text = title ?: "",
+ style = MaterialTheme.typography.titleMedium.copy(
color = MaterialTheme.colorScheme.onSurface,
),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
- fontWeight = FontWeight.Bold,
)
}
}
},
- contentPadding = WindowInsets.systemBars
- .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
- .asPaddingValues(),
navigationIcon = {
IconButton(
onClick = onNavIconPressed,
@@ -149,12 +153,19 @@ fun CollapsableAppBar(
)
}
},
- elevation = elevation,
- backgroundColor = backgroundColor,
- modifier = modifier,
+ colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
+ containerColor = backgroundColor,
+ ),
+ modifier = modifier
+ .windowInsetsPadding(
+ WindowInsets.systemBars
+ .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top),
+ )
+ .shadow(elevation = elevation),
)
}
+@OptIn(ExperimentalMaterial3Api::class)
@ThemePreviews
@Composable
private fun TopBarPreview() {
@@ -166,6 +177,7 @@ private fun TopBarPreview() {
}
}
+@OptIn(ExperimentalMaterial3Api::class)
@ThemePreviews
@Composable
private fun TopBarActionPreview() {
@@ -178,6 +190,7 @@ private fun TopBarActionPreview() {
}
}
+@OptIn(ExperimentalMaterial3Api::class)
@ThemePreviews
@Composable
private fun TopBarScrimPreview() {
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Colors.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Colors.kt
index 7b1788388..9b24f9894 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Colors.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Colors.kt
@@ -11,6 +11,7 @@ import kotlin.math.min
val green = Color(0xFF00b300)
val md_theme_light_primary = Color(0xFF0049c7)
+val md_theme_light_primaryContainer = Color(0xFFdbe8f8)
val md_theme_light_onPrimary = Color(0xFFFFFFFF)
val md_theme_light_secondary = Color(0xFF3947EA)
val md_theme_light_onSecondary = Color(0xFFFFFFFF)
@@ -22,6 +23,7 @@ val md_theme_light_onSurface = Color(0xFF1F2123)
val md_theme_light_outline = Color(0xFF1646F7)
val md_theme_dark_primary = Color(0xFF1F2123)
+val md_theme_dark_primaryContainer = Color(0xFF1F2123)
val md_theme_dark_onPrimary = Color(0xFFE0E0FF)
val md_theme_dark_secondary = Color(0xFFF7d633)
val md_theme_dark_onSecondary = Color(0xFFFFFFFF)
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Theme.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Theme.kt
index 094a88ea9..a949932c5 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Theme.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Theme.kt
@@ -11,6 +11,7 @@ import androidx.compose.ui.unit.dp
private val LightColorScheme = lightColorScheme(
primary = md_theme_light_primary,
onPrimary = md_theme_light_onPrimary,
+ primaryContainer = md_theme_light_primaryContainer,
secondary = md_theme_light_secondary,
onSecondary = md_theme_light_onSecondary,
error = md_theme_light_error,
@@ -24,6 +25,7 @@ private val LightColorScheme = lightColorScheme(
private val DarkColorScheme = darkColorScheme(
primary = md_theme_dark_primary,
onPrimary = md_theme_dark_onPrimary,
+ primaryContainer = md_theme_dark_primaryContainer,
secondary = md_theme_dark_secondary,
onSecondary = md_theme_dark_onSecondary,
error = md_theme_dark_error,
@@ -51,8 +53,8 @@ fun TvManiacTheme(
) {
MaterialTheme(
colorScheme = colorScheme,
+ typography = tvManiacTypography,
content = content,
- // TODO:: Add Typography
)
}
}
diff --git a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Type.kt b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Type.kt
index 208e0aa70..b2729bfb5 100644
--- a/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Type.kt
+++ b/android-core/designsystem/src/main/kotlin/com/thomaskioko/tvmaniac/compose/theme/Type.kt
@@ -1,6 +1,6 @@
package com.thomaskioko.tvmaniac.compose.theme
-import androidx.compose.material.Typography
+import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
@@ -36,58 +36,113 @@ private val workSansFontFamily = FontFamily(
weight = FontWeight.W700,
style = FontStyle.Normal,
),
-
),
)
-val TvManiacTypography = Typography(
- h4 = TextStyle(
+val tvManiacTypography = Typography(
+ displayLarge = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.W600,
- fontSize = 30.sp,
+ fontWeight = FontWeight.Normal,
+ fontSize = 57.sp,
+ lineHeight = 64.sp,
+ letterSpacing = (-0.25).sp,
+ ),
+ displayMedium = TextStyle(
+ fontFamily = workSansFontFamily,
+ fontWeight = FontWeight.Normal,
+ fontSize = 45.sp,
+ lineHeight = 52.sp,
+ letterSpacing = 0.sp,
),
- h5 = TextStyle(
+ displaySmall = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.W600,
+ fontWeight = FontWeight.Normal,
+ fontSize = 36.sp,
+ lineHeight = 44.sp,
+ letterSpacing = 0.sp,
+ ),
+ headlineLarge = TextStyle(
+ fontFamily = workSansFontFamily,
+ fontWeight = FontWeight.SemiBold,
+ fontSize = 32.sp,
+ lineHeight = 40.sp,
+ letterSpacing = 0.sp,
+ ),
+ headlineMedium = TextStyle(
+ fontFamily = workSansFontFamily,
+ fontWeight = FontWeight.SemiBold,
+ fontSize = 28.sp,
+ lineHeight = 36.sp,
+ letterSpacing = 0.sp,
+ ),
+ headlineSmall = TextStyle(
+ fontFamily = workSansFontFamily,
+ fontWeight = FontWeight.SemiBold,
fontSize = 24.sp,
+ lineHeight = 32.sp,
+ letterSpacing = 0.sp,
),
- h6 = TextStyle(
+ titleLarge = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.W600,
- fontSize = 20.sp,
+ fontWeight = FontWeight.SemiBold,
+ fontSize = 22.sp,
+ lineHeight = 28.sp,
+ letterSpacing = 0.sp,
),
- subtitle1 = TextStyle(
+ titleMedium = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.W600,
+ fontWeight = FontWeight.SemiBold,
fontSize = 16.sp,
+ lineHeight = 24.sp,
+ letterSpacing = 0.15.sp,
),
- subtitle2 = TextStyle(
+ titleSmall = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.W500,
+ fontWeight = FontWeight.Bold,
fontSize = 14.sp,
+ lineHeight = 20.sp,
+ letterSpacing = 0.1.sp,
),
- body1 = TextStyle(
+ bodyLarge = TextStyle(
fontFamily = workSansFontFamily,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
+ lineHeight = 24.sp,
+ letterSpacing = 0.15.sp,
),
- body2 = TextStyle(
+ bodyMedium = TextStyle(
fontFamily = workSansFontFamily,
+ fontWeight = FontWeight.Medium,
fontSize = 14.sp,
+ lineHeight = 20.sp,
+ letterSpacing = 0.25.sp,
+ ),
+ bodySmall = TextStyle(
+ fontFamily = workSansFontFamily,
+ fontWeight = FontWeight.Bold,
+ fontSize = 12.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.4.sp,
),
- button = TextStyle(
+ labelLarge = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.W500,
+ fontWeight = FontWeight.SemiBold,
fontSize = 14.sp,
+ lineHeight = 20.sp,
+ letterSpacing = 0.1.sp,
),
- caption = TextStyle(
+ labelMedium = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.Normal,
+ fontWeight = FontWeight.SemiBold,
fontSize = 12.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp,
),
- overline = TextStyle(
+ labelSmall = TextStyle(
fontFamily = workSansFontFamily,
- fontWeight = FontWeight.W500,
- fontSize = 12.sp,
+ fontWeight = FontWeight.SemiBold,
+ fontSize = 11.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp,
),
)
diff --git a/android-core/resources/src/main/res/values/strings.xml b/android-core/resources/src/main/res/values/strings.xml
index 0b01e31fb..3e72dc04e 100644
--- a/android-core/resources/src/main/res/values/strings.xml
+++ b/android-core/resources/src/main/res/values/strings.xml
@@ -18,7 +18,7 @@
Casts
Follow show
- Unfollow Show
+ Unfollow
Watch Trailer
More like this
Browse Seasons
diff --git a/android-features/discover/build.gradle.kts b/android-features/discover/build.gradle.kts
index ae9f37c2e..35b147de6 100644
--- a/android-features/discover/build.gradle.kts
+++ b/android-features/discover/build.gradle.kts
@@ -12,7 +12,7 @@ dependencies {
implementation(projects.data.category.api)
implementation(libs.androidx.compose.foundation)
- implementation(libs.androidx.compose.material)
+ implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.ui.util)
implementation(libs.flowredux)
implementation(libs.kotlinx.collections)
diff --git a/android-features/discover/src/main/java/com/thomaskioko/tvmaniac/discover/DiscoverScreen.kt b/android-features/discover/src/main/java/com/thomaskioko/tvmaniac/discover/DiscoverScreen.kt
index d8c2d10f1..464ab936b 100644
--- a/android-features/discover/src/main/java/com/thomaskioko/tvmaniac/discover/DiscoverScreen.kt
+++ b/android-features/discover/src/main/java/com/thomaskioko/tvmaniac/discover/DiscoverScreen.kt
@@ -32,7 +32,6 @@ import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SnackbarDuration
@@ -90,7 +89,6 @@ typealias Discover = @Composable (
onMoreClicked: (showType: Long) -> Unit,
) -> Unit
-@ExperimentalMaterialApi
@Inject
@Composable
fun Discover(
@@ -105,7 +103,6 @@ fun Discover(
)
}
-@ExperimentalMaterialApi
@Composable
internal fun DiscoverScreen(
viewModel: DiscoverViewModel,
@@ -114,7 +111,9 @@ internal fun DiscoverScreen(
onMoreClicked: (showType: Long) -> Unit,
) {
val discoverViewState by viewModel.state.collectAsStateWithLifecycle()
- val pagerState = rememberPagerState()
+ val pagerState = rememberPagerState(pageCount = {
+ (discoverViewState as? DataLoaded)?.recommendedShows?.size ?: 0
+ })
val snackBarHostState = remember { SnackbarHostState() }
DiscoverScreen(
@@ -360,7 +359,6 @@ fun HorizontalPagerItem(
),
) {
HorizontalPager(
- pageCount = list.size,
state = pagerState,
beyondBoundsPageCount = 2,
contentPadding = PaddingValues(horizontal = 45.dp),
@@ -483,7 +481,7 @@ private fun DiscoverScreenPreview(
TvManiacTheme {
TvManiacBackground {
Surface(Modifier.fillMaxWidth()) {
- val pagerState = rememberPagerState()
+ val pagerState = rememberPagerState(pageCount = { 5 })
val snackBarHostState = remember { SnackbarHostState() }
DiscoverScreen(
state = state,
diff --git a/android-features/home/build.gradle.kts b/android-features/home/build.gradle.kts
index d3cf0170c..6cb55d352 100644
--- a/android-features/home/build.gradle.kts
+++ b/android-features/home/build.gradle.kts
@@ -12,7 +12,7 @@ dependencies {
implementation(projects.androidCore.resources)
implementation(libs.accompanist.navigation.material)
- implementation(libs.androidx.compose.material)
+ implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.material.icons)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.navigation.common)
diff --git a/android-features/home/src/main/kotlin/com/thomaskioko/tvmaniac/home/HomeScreen.kt b/android-features/home/src/main/kotlin/com/thomaskioko/tvmaniac/home/HomeScreen.kt
index 222e98f86..56b92c8e1 100644
--- a/android-features/home/src/main/kotlin/com/thomaskioko/tvmaniac/home/HomeScreen.kt
+++ b/android-features/home/src/main/kotlin/com/thomaskioko/tvmaniac/home/HomeScreen.kt
@@ -1,14 +1,8 @@
package com.thomaskioko.tvmaniac.home
import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
-import androidx.compose.material.BottomNavigation
-import androidx.compose.material.BottomNavigationItem
-import androidx.compose.material.Icon
-import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.outlined.Movie
@@ -25,7 +19,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavController
import androidx.navigation.NavDestination.Companion.hierarchy
@@ -38,6 +31,8 @@ import androidx.navigation.plusAssign
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
import com.google.accompanist.navigation.material.ModalBottomSheetLayout
import com.google.accompanist.navigation.material.rememberBottomSheetNavigator
+import com.thomaskioko.tvmaniac.compose.components.TvManiacBottomNavigationItem
+import com.thomaskioko.tvmaniac.compose.components.TvManiacNavigationBar
import com.thomaskioko.tvmaniac.navigation.ComposeNavigationFactory
import com.thomaskioko.tvmaniac.navigation.NavigationScreen
import com.thomaskioko.tvmaniac.navigation.addNavigation
@@ -55,8 +50,7 @@ fun HomeScreen(
navController.navigatorProvider += bottomSheetNavigator
Scaffold(
- modifier = modifier
- .navigationBarsPadding(),
+ modifier = modifier,
containerColor = Color.Transparent,
contentColor = MaterialTheme.colorScheme.onBackground,
contentWindowInsets = WindowInsets(0, 0, 0, 0),
@@ -104,70 +98,39 @@ private fun TvManiacBottomNavigation(
onNavigationSelected: (NavigationScreen) -> Unit,
modifier: Modifier = Modifier,
) {
- BottomNavigation(
+ TvManiacNavigationBar(
modifier = modifier,
- backgroundColor = MaterialTheme.colorScheme.surface,
) {
TvManiacBottomNavigationItem(
- screen = NavigationScreen.DiscoverNavScreen,
imageVector = Icons.Outlined.Movie,
title = stringResource(id = R.string.menu_item_discover),
selected = currentSelectedItem == NavigationScreen.DiscoverNavScreen,
- onNavigationSelected = onNavigationSelected,
+ onClick = { onNavigationSelected(NavigationScreen.DiscoverNavScreen) },
)
TvManiacBottomNavigationItem(
- screen = NavigationScreen.SearchNavScreen,
imageVector = Icons.Outlined.Search,
title = stringResource(id = R.string.menu_item_search),
selected = currentSelectedItem == NavigationScreen.SearchNavScreen,
- onNavigationSelected = onNavigationSelected,
+ onClick = { onNavigationSelected(NavigationScreen.SearchNavScreen) },
)
TvManiacBottomNavigationItem(
- screen = NavigationScreen.WatchlistNavScreen,
imageVector = Icons.Outlined.Star,
title = stringResource(id = R.string.menu_item_follow),
selected = currentSelectedItem == NavigationScreen.WatchlistNavScreen,
- onNavigationSelected = onNavigationSelected,
+ onClick = { onNavigationSelected(NavigationScreen.WatchlistNavScreen) },
)
TvManiacBottomNavigationItem(
- screen = NavigationScreen.SettingsNavScreen,
imageVector = Icons.Filled.Settings,
title = stringResource(id = R.string.menu_item_settings),
selected = currentSelectedItem == NavigationScreen.SettingsNavScreen,
- onNavigationSelected = onNavigationSelected,
+ onClick = { onNavigationSelected(NavigationScreen.SettingsNavScreen) },
)
}
}
-@Composable
-fun RowScope.TvManiacBottomNavigationItem(
- screen: NavigationScreen,
- imageVector: ImageVector,
- title: String,
- selected: Boolean,
- modifier: Modifier = Modifier,
- onNavigationSelected: (NavigationScreen) -> Unit,
-) {
- BottomNavigationItem(
- modifier = modifier,
- icon = {
- Icon(
- imageVector = imageVector,
- contentDescription = title,
- )
- },
- label = { Text(title) },
- selected = selected,
- alwaysShowLabel = true,
- selectedContentColor = MaterialTheme.colorScheme.secondary,
- unselectedContentColor = MaterialTheme.colorScheme.onSurface,
- onClick = { onNavigationSelected(screen) },
- )
-}
-
@Composable
private fun currentRoute(navController: NavHostController): String {
val navBackStackEntry by navController.currentBackStackEntryAsState()
diff --git a/android-features/profile/build.gradle.kts b/android-features/profile/build.gradle.kts
index a68cda9e3..01246625f 100644
--- a/android-features/profile/build.gradle.kts
+++ b/android-features/profile/build.gradle.kts
@@ -12,7 +12,6 @@ dependencies {
implementation(libs.flowredux)
implementation(libs.snapper)
- implementation(libs.accompanist.insetsui)
implementation(libs.androidx.compose.constraintlayout)
implementation(libs.androidx.compose.material.icons)
}
diff --git a/android-features/profile/src/main/kotlin/com/thomaskioko/tvmaniac/profile/ProfileScreen.kt b/android-features/profile/src/main/kotlin/com/thomaskioko/tvmaniac/profile/ProfileScreen.kt
index 3bc25726a..eb3f15370 100644
--- a/android-features/profile/src/main/kotlin/com/thomaskioko/tvmaniac/profile/ProfileScreen.kt
+++ b/android-features/profile/src/main/kotlin/com/thomaskioko/tvmaniac/profile/ProfileScreen.kt
@@ -16,7 +16,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
@@ -29,6 +28,7 @@ import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Divider
+import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
@@ -106,6 +106,7 @@ internal fun ProfileScreen(
)
}
+@OptIn(ExperimentalMaterial3Api::class)
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
private fun ProfileScreen(
@@ -125,8 +126,7 @@ private fun ProfileScreen(
)
},
modifier = modifier
- .background(color = MaterialTheme.colorScheme.background)
- .statusBarsPadding(),
+ .background(color = MaterialTheme.colorScheme.background),
content = { contentPadding ->
when (state) {
diff --git a/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchBar.kt b/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchBar.kt
index c33d0a20a..02897864d 100644
--- a/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchBar.kt
+++ b/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchBar.kt
@@ -22,7 +22,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
-import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.onFocusEvent
import androidx.compose.ui.graphics.RectangleShape
@@ -65,7 +64,6 @@ fun SearchBar(
val KeyboardShownKey = SemanticsPropertyKey("KeyboardShownKey")
var SemanticsPropertyReceiver.keyboardShownProperty by KeyboardShownKey
-@OptIn(ExperimentalComposeUiApi::class)
@Composable
private fun SearchInputText(
onTextChanged: (TextFieldValue) -> Unit,
diff --git a/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchScreen.kt b/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchScreen.kt
index b0e6e446f..4a8bafe5b 100644
--- a/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchScreen.kt
+++ b/android-features/search/src/main/kotlin/com/thomaskioko/tvmaniac/search/SearchScreen.kt
@@ -1,10 +1,16 @@
package com.thomaskioko.tvmaniac.search
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
+import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.statusBarsPadding
+import androidx.compose.foundation.layout.windowInsetsPadding
+import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@@ -42,18 +48,27 @@ internal fun SearchScreen(
internal fun SearchScreen(
modifier: Modifier = Modifier,
) {
- Column(
- modifier
- .fillMaxSize()
- .statusBarsPadding()
- .padding(16.dp),
- ) {
- SearchBar(
- hint = stringResource(id = R.string.msg_search_show_hint),
+ Scaffold(
+ modifier = modifier
+ .statusBarsPadding(),
+ ) { padding ->
+ Column(
modifier = Modifier
- .fillMaxWidth(),
- onValueChange = {},
- )
+ .padding(16.dp)
+ .consumeWindowInsets(padding)
+ .windowInsetsPadding(
+ WindowInsets.safeDrawing.only(
+ WindowInsetsSides.Horizontal,
+ ),
+ ),
+ ) {
+ SearchBar(
+ modifier = Modifier
+ .fillMaxWidth(),
+ hint = stringResource(id = R.string.msg_search_show_hint),
+ onValueChange = {},
+ )
+ }
}
}
diff --git a/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/SeasonDetailsScreen.kt b/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/SeasonDetailsScreen.kt
index 77237ce93..6d78b3315 100644
--- a/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/SeasonDetailsScreen.kt
+++ b/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/SeasonDetailsScreen.kt
@@ -89,7 +89,6 @@ internal fun SeasonDetailScreen(
)
}
-@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun SeasonDetailScreen(
state: SeasonDetailsState,
@@ -140,6 +139,7 @@ internal fun SeasonDetailScreen(
)
}
+@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun TopBar(
title: String,
@@ -149,6 +149,7 @@ private fun TopBar(
title = title,
showNavigationIcon = true,
onBackClick = navigateUp,
+ elevation = 8.dp,
)
}
@@ -178,6 +179,7 @@ private fun SeasonContent(
LazyColumn(
state = listState,
contentPadding = contentPadding.copy(copyTop = false),
+ modifier = Modifier.fillMaxSize(),
) {
item { Spacer(modifier = Modifier.height(64.dp)) }
diff --git a/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/components/WatchNextList.kt b/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/components/WatchNextList.kt
index 2e8ccc5c5..57773e9b1 100644
--- a/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/components/WatchNextList.kt
+++ b/android-features/season-details/src/main/java/com/thomaskioko/tvmaniac/seasondetails/components/WatchNextList.kt
@@ -47,7 +47,8 @@ fun WatchNextContent(
episodeList?.let {
Box(
modifier = modifier
- .fillMaxWidth(),
+ .fillMaxWidth()
+ .padding(top = 16.dp),
contentAlignment = Alignment.Center,
) {
Spacer(modifier = Modifier.height(8.dp))
diff --git a/android-features/settings/build.gradle.kts b/android-features/settings/build.gradle.kts
index 4cba9f6e6..d9f714e41 100644
--- a/android-features/settings/build.gradle.kts
+++ b/android-features/settings/build.gradle.kts
@@ -12,7 +12,6 @@ dependencies {
implementation(projects.data.shows.api)
implementation(projects.presentation.settings)
- implementation(libs.accompanist.insetsui)
implementation(libs.flowredux)
}
diff --git a/android-features/settings/src/main/kotlin/com/thomaskioko/tvmaniac/settings/SettingsScreen.kt b/android-features/settings/src/main/kotlin/com/thomaskioko/tvmaniac/settings/SettingsScreen.kt
index 13640f392..b85b13a6a 100644
--- a/android-features/settings/src/main/kotlin/com/thomaskioko/tvmaniac/settings/SettingsScreen.kt
+++ b/android-features/settings/src/main/kotlin/com/thomaskioko/tvmaniac/settings/SettingsScreen.kt
@@ -16,20 +16,19 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.material.CircularProgressIndicator
-import androidx.compose.material.ContentAlpha
-import androidx.compose.material.DropdownMenu
-import androidx.compose.material.DropdownMenuItem
-import androidx.compose.material.LocalContentAlpha
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person
+import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Divider
+import androidx.compose.material3.DropdownMenu
+import androidx.compose.material3.DropdownMenuItem
+import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
+import androidx.compose.material3.RadioButtonDefaults
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHost
@@ -37,7 +36,6 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
@@ -46,6 +44,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
@@ -114,6 +113,7 @@ internal fun SettingsScreen(
)
}
+@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun SettingsScreen(
onBackClicked: () -> Unit,
@@ -140,9 +140,7 @@ internal fun SettingsScreen(
snackbarHost = {
SnackbarHost(hostState = snackbarHostState)
},
- modifier = modifier
- .background(color = MaterialTheme.colorScheme.background)
- .statusBarsPadding(),
+ modifier = modifier,
content = { innerPadding ->
LaunchedEffect(key1 = state.errorMessage) {
@@ -210,7 +208,6 @@ fun SettingsContent(
onLogoutClicked: () -> Unit,
onDismissDialogClicked: () -> Unit,
modifier: Modifier = Modifier,
-
) {
LazyColumn(
modifier = modifier,
@@ -517,29 +514,33 @@ private fun ThemeMenuItem(
onThemeSelected(theme)
onDismissTheme()
},
- ) {
- Row(
- modifier = Modifier
- .fillMaxWidth()
- .padding(start = 16.dp),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.SpaceBetween,
- ) {
- Text(
- text = themeTitle,
+ text = {
+ Row(
modifier = Modifier
- .weight(1f),
- )
+ .fillMaxWidth()
+ .padding(start = 16.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween,
+ ) {
+ Text(
+ text = themeTitle,
+ modifier = Modifier
+ .weight(1f),
+ )
- RadioButton(
- selected = selectedTheme == theme,
- onClick = {
- onThemeSelected(theme)
- onDismissTheme()
- },
- )
- }
- }
+ RadioButton(
+ selected = selectedTheme == theme,
+ colors = RadioButtonDefaults.colors(
+ selectedColor = MaterialTheme.colorScheme.secondary,
+ ),
+ onClick = {
+ onThemeSelected(theme)
+ onDismissTheme()
+ },
+ )
+ }
+ },
+ )
}
@Composable
@@ -556,12 +557,11 @@ private fun AboutSettingsItem() {
TitleItem(title = stringResource(R.string.settings_title_about))
- CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
- Text(
- text = stringResource(R.string.settings_about_description),
- style = MaterialTheme.typography.bodyMedium,
- )
- }
+ Text(
+ text = stringResource(R.string.settings_about_description),
+ style = MaterialTheme.typography.bodyMedium,
+ fontWeight = FontWeight.Normal,
+ )
Spacer(modifier = Modifier.height(8.dp))
@@ -598,13 +598,12 @@ fun SettingDescription(
description: String,
modifier: Modifier = Modifier,
) {
- CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
- Text(
- text = description,
- style = MaterialTheme.typography.bodyMedium,
- modifier = modifier,
- )
- }
+ Text(
+ text = description,
+ style = MaterialTheme.typography.bodyMedium,
+ modifier = modifier,
+ fontWeight = FontWeight.Normal,
+ )
}
/**
diff --git a/android-features/show-details/build.gradle.kts b/android-features/show-details/build.gradle.kts
index 8fa06267b..4560f5043 100644
--- a/android-features/show-details/build.gradle.kts
+++ b/android-features/show-details/build.gradle.kts
@@ -9,8 +9,6 @@ android {
dependencies {
api(projects.presentation.showDetails)
- implementation(libs.accompanist.insetsui)
- implementation(libs.accompanist.navigation.material)
implementation(libs.androidx.compose.constraintlayout)
implementation(libs.androidx.compose.material.icons)
implementation(libs.flowredux)
diff --git a/android-features/show-details/src/main/kotlin/com/thomaskioko/showdetails/ShowDetailScreen.kt b/android-features/show-details/src/main/kotlin/com/thomaskioko/showdetails/ShowDetailScreen.kt
index 2ce44438b..2b7f07cc2 100644
--- a/android-features/show-details/src/main/kotlin/com/thomaskioko/showdetails/ShowDetailScreen.kt
+++ b/android-features/show-details/src/main/kotlin/com/thomaskioko/showdetails/ShowDetailScreen.kt
@@ -25,24 +25,21 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.ContentAlpha
-import androidx.compose.material.Icon
-import androidx.compose.material.LocalContentAlpha
-import androidx.compose.material.Tab
-import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.PlayCircle
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
+import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScrollableTabRow
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Surface
+import androidx.compose.material3.Tab
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -277,7 +274,7 @@ private fun ShowDetailContent(
}
item {
- if (seasonsContent != null) {
+ seasonsContent?.let {
SeasonsContent(
isLoading = seasonsContent.isLoading,
seasonsList = seasonsContent.seasonsList,
@@ -377,7 +374,7 @@ private fun Body(
) {
Text(
text = show.title,
- style = MaterialTheme.typography.headlineMedium,
+ style = MaterialTheme.typography.headlineSmall,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.onSurface,
overflow = TextOverflow.Ellipsis,
@@ -386,12 +383,11 @@ private fun Body(
Spacer(modifier = Modifier.height(8.dp))
- CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
- ExpandingText(
- text = show.overview,
- textStyle = MaterialTheme.typography.bodyMedium,
- )
- }
+ ExpandingText(
+ text = show.overview,
+ textStyle = MaterialTheme.typography.bodyMedium,
+ fontWeight = FontWeight.Normal,
+ )
Spacer(modifier = Modifier.height(8.dp))
@@ -491,15 +487,14 @@ fun ShowMetadata(
append(divider)
}
- CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
- Text(
- text = text,
- style = MaterialTheme.typography.bodyMedium,
- modifier = Modifier.fillMaxWidth(),
- overflow = TextOverflow.Ellipsis,
- maxLines = 1,
- )
- }
+ Text(
+ text = text,
+ style = MaterialTheme.typography.bodyMedium,
+ modifier = Modifier.fillMaxWidth(),
+ overflow = TextOverflow.Ellipsis,
+ maxLines = 1,
+ fontWeight = FontWeight.Medium,
+ )
Spacer(modifier = Modifier.height(8.dp))
}
@@ -516,23 +511,21 @@ private fun GenreText(
Spacer(modifier = Modifier.width(4.dp))
- CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
- TvManiacTextButton(
- onClick = {},
- shape = RoundedCornerShape(4.dp),
- buttonColors = ButtonDefaults.buttonColors(
- contentColor = MaterialTheme.colorScheme.onSecondary,
- containerColor = MaterialTheme.colorScheme.secondary.copy(alpha = 0.08f),
- ),
- content = {
- Text(
- text = genre,
- style = MaterialTheme.typography.bodyMedium,
- color = MaterialTheme.colorScheme.secondary,
- )
- },
- )
- }
+ TvManiacTextButton(
+ onClick = {},
+ shape = RoundedCornerShape(4.dp),
+ buttonColors = ButtonDefaults.buttonColors(
+ contentColor = MaterialTheme.colorScheme.onSecondary,
+ containerColor = MaterialTheme.colorScheme.secondary.copy(alpha = 0.08f),
+ ),
+ content = {
+ Text(
+ text = genre,
+ style = MaterialTheme.typography.bodyMedium,
+ color = MaterialTheme.colorScheme.secondary,
+ )
+ },
+ )
}
}
}
@@ -604,46 +597,45 @@ private fun SeasonsContent(
seasonsList: List,
onSeasonClicked: (Long, String) -> Unit,
) {
- AnimatedVisibility(visible = seasonsList.isNotEmpty()) {
+ if (seasonsList.isNotEmpty()) {
TextLoadingItem(
isLoading = isLoading,
text = stringResource(id = R.string.title_seasons),
)
- }
-
- val selectedIndex by remember { mutableStateOf(0) }
-
- ScrollableTabRow(
- selectedTabIndex = selectedIndex,
- divider = {}, /* Disable the built-in divider */
- indicator = {},
- edgePadding = 0.dp,
- containerColor = Color.Transparent,
- modifier = Modifier
- .fillMaxWidth()
- .padding(start = 16.dp, end = 16.dp),
- ) {
- seasonsList.forEach { season ->
- Tab(
- modifier = Modifier
- .padding(end = 4.dp),
- selected = true,
- onClick = {
- onSeasonClicked(
- season.tvShowId,
- season.name,
- )
- },
- ) {
- TvManiacChip(
- text = season.name,
+ val selectedIndex by remember { mutableStateOf(0) }
+
+ ScrollableTabRow(
+ selectedTabIndex = selectedIndex,
+ divider = {}, /* Disable the built-in divider */
+ indicator = {},
+ edgePadding = 0.dp,
+ containerColor = Color.Transparent,
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(start = 16.dp, end = 16.dp),
+ ) {
+ seasonsList.forEach { season ->
+ Tab(
+ modifier = Modifier
+ .padding(end = 4.dp),
+ selected = true,
onClick = {
onSeasonClicked(
season.tvShowId,
season.name,
)
},
- )
+ ) {
+ TvManiacChip(
+ text = season.name,
+ onClick = {
+ onSeasonClicked(
+ season.tvShowId,
+ season.name,
+ )
+ },
+ )
+ }
}
}
}
diff --git a/android-features/shows-grid/build.gradle.kts b/android-features/shows-grid/build.gradle.kts
index 7cbbf5b83..0d3bae79c 100644
--- a/android-features/shows-grid/build.gradle.kts
+++ b/android-features/shows-grid/build.gradle.kts
@@ -12,5 +12,4 @@ dependencies {
implementation(libs.androidx.compose.paging)
implementation(libs.flowredux)
- implementation(libs.accompanist.insetsui)
}
diff --git a/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/ShowsGridScreen.kt b/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/ShowsGridScreen.kt
index 210a177ac..290c37479 100644
--- a/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/ShowsGridScreen.kt
+++ b/android-features/shows-grid/src/main/kotlin/com/thomaskioko/tvmaniac/showsgrid/ShowsGridScreen.kt
@@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
@@ -101,8 +100,7 @@ private fun GridScreen(
onBackClick = onBackClicked,
)
},
- modifier = Modifier
- .statusBarsPadding(),
+ modifier = Modifier,
) { contentPadding ->
when (state) {
LoadingContent -> LoadingIndicator(
diff --git a/android-features/trailers/build.gradle.kts b/android-features/trailers/build.gradle.kts
index ae892dd60..8a4d6e5b3 100644
--- a/android-features/trailers/build.gradle.kts
+++ b/android-features/trailers/build.gradle.kts
@@ -9,8 +9,6 @@ android {
dependencies {
api(projects.presentation.trailers)
- implementation(libs.accompanist.insetsui)
- implementation(libs.accompanist.navigation.material)
implementation(libs.androidx.compose.constraintlayout)
implementation(libs.flowredux)
implementation(libs.youtubePlayer)
diff --git a/android-features/trailers/src/main/kotlin/com/thomaskioko/tvmaniac/videoplayer/TrailersScreen.kt b/android-features/trailers/src/main/kotlin/com/thomaskioko/tvmaniac/videoplayer/TrailersScreen.kt
index a50e52038..3e4cf2284 100644
--- a/android-features/trailers/src/main/kotlin/com/thomaskioko/tvmaniac/videoplayer/TrailersScreen.kt
+++ b/android-features/trailers/src/main/kotlin/com/thomaskioko/tvmaniac/videoplayer/TrailersScreen.kt
@@ -11,7 +11,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyColumn
@@ -104,8 +103,7 @@ private fun TrailersScreen(
Scaffold(
modifier = modifier
- .background(color = MaterialTheme.colorScheme.background)
- .statusBarsPadding(),
+ .background(color = MaterialTheme.colorScheme.background),
content = { contentPadding ->
when (state) {
diff --git a/android-features/watchlist/build.gradle.kts b/android-features/watchlist/build.gradle.kts
index 528902504..9cb008946 100644
--- a/android-features/watchlist/build.gradle.kts
+++ b/android-features/watchlist/build.gradle.kts
@@ -10,6 +10,5 @@ dependencies {
implementation(projects.data.shows.api)
implementation(projects.presentation.watchlist)
- implementation(libs.accompanist.insetsui)
implementation(libs.flowredux)
}
diff --git a/android-features/watchlist/src/main/kotlin/com/thomaskioko/tvmaniac/watchlist/WatchlistScreen.kt b/android-features/watchlist/src/main/kotlin/com/thomaskioko/tvmaniac/watchlist/WatchlistScreen.kt
index 8f48243e2..448dcaba9 100644
--- a/android-features/watchlist/src/main/kotlin/com/thomaskioko/tvmaniac/watchlist/WatchlistScreen.kt
+++ b/android-features/watchlist/src/main/kotlin/com/thomaskioko/tvmaniac/watchlist/WatchlistScreen.kt
@@ -2,7 +2,6 @@ package com.thomaskioko.tvmaniac.watchlist
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.rememberLazyListState
@@ -75,8 +74,7 @@ private fun WatchlistScreen(
) {
Scaffold(
modifier = modifier
- .statusBarsPadding()
- .navigationBarsPadding(),
+ .statusBarsPadding(),
content = { contentPadding ->
when (state) {
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a3d4478a7..55798b445 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -90,8 +90,8 @@ dependencies {
implementation(projects.presentation.showDetails)
implementation(projects.presentation.trailers)
- implementation(libs.accompanist.systemuicontroller)
implementation(libs.androidx.compose.activity)
+ implementation(libs.androidx.core.splashscreen)
implementation(libs.appauth)
implementation(libs.kotlinInject.runtime)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7fe09aa03..6f0990f6b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,7 +12,7 @@
android:icon="@drawable/ic_app_launcher"
android:label="Tv Maniac"
android:supportsRtl="true"
- android:theme="@style/Theme.TvManiac">
+ android:theme="@style/Theme.TvManiac.Splash">
true
+ is DataLoaded -> false
+ }
+ }
- val systemUiController = rememberSystemUiController()
- val darkTheme = state.value.theme.shouldUseDarkColors()
+ enableEdgeToEdge()
- DisposableEffect(systemUiController, darkTheme) {
- systemUiController.systemBarsDarkContentEnabled = !darkTheme
+ setContent {
+ val darkTheme = shouldUseDarkTheme(uiState)
+
+ DisposableEffect(darkTheme) {
+ enableEdgeToEdge(
+ statusBarStyle = SystemBarStyle.auto(
+ Color.TRANSPARENT,
+ Color.TRANSPARENT,
+ ) { darkTheme },
+ navigationBarStyle = SystemBarStyle.auto(
+ lightScrim,
+ darkScrim,
+ ) { darkTheme },
+ )
onDispose {}
}
@@ -56,3 +99,31 @@ class MainActivity : ComponentActivity() {
}
}
}
+
+/**
+ * Returns `true` if dark theme should be used, as a function of the [uiState] and the
+ * current system context.
+ */
+@Composable
+private fun shouldUseDarkTheme(
+ uiState: MainActivityUiState,
+): Boolean = when (uiState) {
+ Loading -> isSystemInDarkTheme()
+ is DataLoaded -> when (uiState.theme) {
+ Theme.LIGHT -> false
+ Theme.DARK -> true
+ Theme.SYSTEM -> isSystemInDarkTheme()
+ }
+}
+
+/**
+ * The default light scrim, as defined by androidx and the platform:
+ * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=35-38;drc=27e7d52e8604a080133e8b842db10c89b4482598
+ */
+private val lightScrim = Color.argb(0xe6, 0xFF, 0xFF, 0xFF)
+
+/**
+ * The default dark scrim, as defined by androidx and the platform:
+ * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=40-44;drc=27e7d52e8604a080133e8b842db10c89b4482598
+ */
+private val darkScrim = Color.argb(0x80, 0x1b, 0x1b, 0x1b)
diff --git a/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivityViewModel.kt b/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivityViewModel.kt
index 648d80c4f..34145f654 100644
--- a/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivityViewModel.kt
+++ b/app/src/main/kotlin/com/thomaskioko/tvmaniac/MainActivityViewModel.kt
@@ -15,19 +15,20 @@ class MainActivityViewModel(
datastoreRepository: DatastoreRepository,
) : ViewModel() {
- val state: StateFlow = datastoreRepository.observeTheme()
+ val state: StateFlow = datastoreRepository.observeTheme()
.map { theme ->
- MainState(
- theme = theme,
- )
+ MainActivityUiState.DataLoaded(theme = theme)
}
.stateIn(
scope = viewModelScope,
- started = SharingStarted.WhileSubscribed(),
- initialValue = MainState(),
+ started = SharingStarted.WhileSubscribed(5_000),
+ initialValue = MainActivityUiState.Loading,
)
}
-data class MainState(
- val theme: Theme = Theme.SYSTEM,
-)
+sealed interface MainActivityUiState {
+ data object Loading : MainActivityUiState
+ data class DataLoaded(
+ val theme: Theme = Theme.SYSTEM,
+ ) : MainActivityUiState
+}
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index 2b2fe32c2..8b869c6d1 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -1,8 +1,10 @@
-
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 19a144cfc..1371d25fe 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,7 +1,7 @@
@@ -11,5 +11,14 @@
+
+
+
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index b071ffd50..75f718b49 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,62 +1,62 @@
[versions]
-accompanist = "0.30.1"
-agp = "8.0.2"
+accompanist = "0.33.2-alpha"
+agp = "8.1.2"
appauth = "0.8.1"
-atomicfu = "0.20.2"
+atomicfu = "0.21.0"
-androidx-activity = "1.7.1"
+androidx-activity = "1.8.0"
androidx-appCompat = "1.5.1"
-androidx-browser = "1.5.0"
-androidx-core = "1.10.1"
-androidx-datastore = "1.1.0-alpha04"
-androidx-lifecycle = "2.6.1"
-androidx-material3 = "1.1.0-rc01"
-androidx-navigation = "2.5.3"
-navigation-compose = "1.0.0"
+androidx-browser = "1.6.0"
+androidx-core = "1.12.0"
+androidx-core-splashscreen = "1.0.1"
+androidx-datastore = "1.1.0-alpha05"
+androidx-lifecycle = "2.6.2"
+androidx-material3 = "1.1.2"
+androidx-navigation = "2.7.4"
androidx-palette = "1.0.0"
-androidx-paging = "3.1.1"
+androidx-paging = "3.2.1"
androidx-work = "2.8.1"
-coil = "2.3.0"
-compileSdk = "33"
-compose-bom = "2023.06.01"
+coil = "2.4.0"
+compose-bom = "2023.10.01"
compose-constraintlayout= "1.0.1"
-compose-paging = "1.0.0-alpha19"
-compose-material = "1.4.3"
-composecompiler = "1.4.7"
-coroutines = "1.7.1"
+compose-paging = "3.2.1"
+compose-material = "1.5.4"
+composecompiler = "1.5.3"
+coroutines = "1.7.3"
datetime = "0.4.0"
detekt = "1.22.0"
dependency-analysis = "1.13.1"
dependency-check = "0.44.0"
desugar = "2.0.3"
-flowredux = "1.1.0"
+flowredux = "1.2.0"
junit = "4.13.2"
kenburns = "1.0.7"
kermit = "1.2.2"
kmmbridge = "0.3.7"
kotest = "5.5.4"
-kotlin = "1.8.20"
+kotlin = "1.9.10"
kotlinx-collections = "0.3.5"
kotlininject = "0.6.1"
ktor = "2.3.2"
-ksp = "1.8.21-1.0.11"
+ksp = "1.9.10-1.0.13"
lint = "1.2.0"
shared-module-version = "0.8.0"
snapper = "0.3.0"
sqldelight = "2.0.0-rc01"
store5 = "5.0.0-beta01"
-turbine = "0.13.0"
+turbine = "1.0.0"
yamlkt = "0.12.0"
youtubePlayer = "11.0.1"
+android-compileSdk = "34"
+android-minSdk = "21"
+
[libraries]
android-desugarJdkLibs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "desugar" }
android-gradle-tools = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" }
kotlin-gradle = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
-accompanist-insetsui = { module = "com.google.accompanist:accompanist-insets-ui", version.ref = "accompanist" }
-accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" }
accompanist-navigation-material = { module = "com.google.accompanist:accompanist-navigation-material", version.ref = "accompanist" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
@@ -71,11 +71,11 @@ androidx-browser = { module = "androidx.browser:browser", version.ref = "androi
androidx-compose-activity = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity" }
androidx-compose-constraintlayout = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "compose-constraintlayout" }
-androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "compose-material" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "androidx-material3" }
androidx-compose-material3-windowSizeClass = { group = "androidx.compose.material3", name = "material3-window-size-class", version.ref = "androidx-material3" }
androidx-compose-paging = { module = "androidx.paging:paging-compose", version.ref = "compose-paging" }
androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidx-core" }
+androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "androidx-core-splashscreen" }
androidx-datastore-preference = { module = "androidx.datastore:datastore-preferences-core", version.ref = "androidx-datastore" }
androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle" }
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" }
diff --git a/tooling/plugins/src/main/kotlin/AndroidLibraryPlugin.kt b/tooling/plugins/src/main/kotlin/AndroidLibraryPlugin.kt
index 021b4e415..5e29cb33d 100644
--- a/tooling/plugins/src/main/kotlin/AndroidLibraryPlugin.kt
+++ b/tooling/plugins/src/main/kotlin/AndroidLibraryPlugin.kt
@@ -3,8 +3,10 @@ import com.thomaskioko.tvmaniac.extensions.configureFlavors
import com.thomaskioko.tvmaniac.extensions.configureKotlinAndroid
import org.gradle.api.Plugin
import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
class AndroidLibraryPlugin : Plugin {
override fun apply(target: Project) {
@@ -15,9 +17,13 @@ class AndroidLibraryPlugin : Plugin {
}
extensions.configure {
+ val libs = extensions.getByType().named("libs")
+ val sdkVersion = libs.findVersion("android-compileSdk")
+ .get().toString().toInt()
+
configureKotlinAndroid(this)
configureFlavors(this)
- defaultConfig.targetSdk = 33
+ defaultConfig.targetSdk = sdkVersion
}
configurations.configureEach {
diff --git a/tooling/plugins/src/main/kotlin/ApplicationPlugin.kt b/tooling/plugins/src/main/kotlin/ApplicationPlugin.kt
index be6fb64c4..82ce5b492 100644
--- a/tooling/plugins/src/main/kotlin/ApplicationPlugin.kt
+++ b/tooling/plugins/src/main/kotlin/ApplicationPlugin.kt
@@ -6,7 +6,9 @@ import com.thomaskioko.tvmaniac.extensions.configureKotlinAndroid
import com.thomaskioko.tvmaniac.extensions.FlavorDimension
import org.gradle.api.Plugin
import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.configure
+import org.gradle.kotlin.dsl.getByType
@Suppress("UnstableApiUsage")
class ApplicationPlugin : Plugin {
@@ -19,9 +21,16 @@ class ApplicationPlugin : Plugin {
}
extensions.configure {
+ val libs = extensions.getByType().named("libs")
+ val sdkVersion = libs.findVersion("android-compileSdk")
+ .get().toString().toInt()
+
defaultConfig {
- targetSdk = 33
- missingDimensionStrategy(FlavorDimension.contentType.name, TvManiacFlavor.demo.name)
+ targetSdk = sdkVersion
+ missingDimensionStrategy(
+ FlavorDimension.contentType.name,
+ TvManiacFlavor.demo.name
+ )
}
buildFeatures {
diff --git a/tooling/plugins/src/main/kotlin/ComposeLibraryPlugin.kt b/tooling/plugins/src/main/kotlin/ComposeLibraryPlugin.kt
index 6f35284de..c54352a9f 100644
--- a/tooling/plugins/src/main/kotlin/ComposeLibraryPlugin.kt
+++ b/tooling/plugins/src/main/kotlin/ComposeLibraryPlugin.kt
@@ -3,7 +3,9 @@ import com.thomaskioko.tvmaniac.extensions.configureAndroidCompose
import com.thomaskioko.tvmaniac.extensions.configureFlavors
import org.gradle.api.Plugin
import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.configure
+import org.gradle.kotlin.dsl.getByType
class ComposeLibraryPlugin : Plugin {
override fun apply(target: Project) {
@@ -15,7 +17,12 @@ class ComposeLibraryPlugin : Plugin {
}
extensions.configure {
- compileSdk = 33
+ val libs = extensions.getByType().named("libs")
+ val sdkVersion = libs.findVersion("android-compileSdk")
+ .get().toString().toInt()
+
+ compileSdk = sdkVersion
+
configureAndroidCompose(this)
configureFlavors(this)
}
diff --git a/tooling/plugins/src/main/kotlin/KotlinMultiplatformDomainPlugin.kt b/tooling/plugins/src/main/kotlin/KotlinMultiplatformDomainPlugin.kt
index d1c31a96c..faa4d9084 100644
--- a/tooling/plugins/src/main/kotlin/KotlinMultiplatformDomainPlugin.kt
+++ b/tooling/plugins/src/main/kotlin/KotlinMultiplatformDomainPlugin.kt
@@ -18,8 +18,12 @@ class KotlinMultiplatformDomainPlugin : Plugin {
}
extensions.configure {
- defaultConfig.targetSdk = 33
- compileSdk = 33
+ val libs = extensions.getByType().named("libs")
+ val sdkVersion = libs.findVersion("android-compileSdk")
+ .get().toString().toInt()
+
+ defaultConfig.targetSdk = 34
+ compileSdk = sdkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
diff --git a/tooling/plugins/src/main/kotlin/KotlinMultiplatformLibraryPlugin.kt b/tooling/plugins/src/main/kotlin/KotlinMultiplatformLibraryPlugin.kt
index 9449973fb..7229f5b7b 100644
--- a/tooling/plugins/src/main/kotlin/KotlinMultiplatformLibraryPlugin.kt
+++ b/tooling/plugins/src/main/kotlin/KotlinMultiplatformLibraryPlugin.kt
@@ -3,7 +3,9 @@ import com.thomaskioko.tvmaniac.extensions.configureFlavors
import com.thomaskioko.tvmaniac.extensions.configureKotlinMultiplatform
import org.gradle.api.Plugin
import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.configure
+import org.gradle.kotlin.dsl.getByType
class KotlinMultiplatformLibraryPlugin : Plugin {
override fun apply(target: Project) {
@@ -14,8 +16,12 @@ class KotlinMultiplatformLibraryPlugin : Plugin {
}
extensions.configure {
+ val libs = extensions.getByType().named("libs")
+ val sdkVersion = libs.findVersion("android-compileSdk")
+ .get().toString().toInt()
+
configureKotlinMultiplatform(this)
- defaultConfig.targetSdk = 33
+ defaultConfig.targetSdk = sdkVersion
configureFlavors(this)
}
diff --git a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/ComposeExtensions.kt b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/ComposeExtensions.kt
index 151f6fbce..28f99e96d 100644
--- a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/ComposeExtensions.kt
+++ b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/ComposeExtensions.kt
@@ -9,14 +9,17 @@ import org.gradle.kotlin.dsl.getByType
internal fun Project.configureAndroidCompose(
- commonExtension: CommonExtension<*, *, *, *>,
+ commonExtension: CommonExtension<*, *, *, *, *>,
) {
val libs = extensions.getByType().named("libs")
commonExtension.apply {
defaultConfig {
- minSdk = 23
+ val libs = extensions.getByType().named("libs")
+ val minSdkSdkVersion = libs.findVersion("android-minSdk").get().toString().toInt()
+
+ minSdk = minSdkSdkVersion
}
compileOptions {
diff --git a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinAndroidExtensions.kt b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinAndroidExtensions.kt
index 91e113996..21ec49981 100644
--- a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinAndroidExtensions.kt
+++ b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinAndroidExtensions.kt
@@ -11,13 +11,18 @@ import org.gradle.kotlin.dsl.provideDelegate
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
internal fun Project.configureKotlinAndroid(
- commonExtension: CommonExtension<*, *, *, *>,
+ commonExtension: CommonExtension<*, *, *, *, *>,
) {
+
commonExtension.apply {
- compileSdk = 33
+ val libs = extensions.getByType().named("libs")
+ val sdkVersion = libs.findVersion("android-compileSdk").get().toString().toInt()
+ val minSdkVersion = libs.findVersion("android-minSdk").get().toString().toInt()
+
+ compileSdk = sdkVersion
defaultConfig {
- minSdk = 23
+ minSdk = minSdkVersion
manifestPlaceholders["appAuthRedirectScheme"] = "empty"
}
@@ -51,6 +56,6 @@ internal fun Project.configureKotlinAndroid(
}
}
-fun CommonExtension<*, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
+fun CommonExtension<*, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
(this as ExtensionAware).extensions.configure("kotlinOptions", block)
}
diff --git a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinMultiplatformExtensions.kt b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinMultiplatformExtensions.kt
index f47205c67..497241258 100644
--- a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinMultiplatformExtensions.kt
+++ b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/KotlinMultiplatformExtensions.kt
@@ -3,16 +3,22 @@ package com.thomaskioko.tvmaniac.extensions
import com.android.build.api.dsl.CommonExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.getByType
@Suppress("UnstableApiUsage")
internal fun Project.configureKotlinMultiplatform(
- commonExtension: CommonExtension<*, *, *, *>,
+ commonExtension: CommonExtension<*, *, *, *, *>,
) {
commonExtension.apply {
- compileSdk = 33
+ val libs = extensions.getByType().named("libs")
+ val minSdkSdkVersion = libs.findVersion("android-minSdk").get().toString().toInt()
+ val sdkVersion = libs.findVersion("android-compileSdk")
+ .get().toString().toInt()
defaultConfig {
- minSdk = 23
+ minSdk = minSdkSdkVersion
+ compileSdk = sdkVersion
manifestPlaceholders["appAuthRedirectScheme"] = "empty"
}
diff --git a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/TvManiacBuildFlavor.kt b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/TvManiacBuildFlavor.kt
index afc65156b..e5964a9d7 100644
--- a/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/TvManiacBuildFlavor.kt
+++ b/tooling/plugins/src/main/kotlin/com/thomaskioko/tvmaniac/extensions/TvManiacBuildFlavor.kt
@@ -17,7 +17,7 @@ enum class TvManiacFlavor(val dimension: FlavorDimension, val applicationIdSuffi
}
fun Project.configureFlavors(
- commonExtension: CommonExtension<*, *, *, *>,
+ commonExtension: CommonExtension<*, *, *, *, *>,
flavorConfigurationBlock: ProductFlavor.(flavor: TvManiacFlavor) -> Unit = {}
) {
commonExtension.apply {