diff --git a/README.md b/README.md
index 0a4c1de3..edfc1c66 100644
--- a/README.md
+++ b/README.md
@@ -18,8 +18,8 @@
-
-
+
+
diff --git a/app/src/main/java/com/guru/composecookbook/ui/animation/AnimationScreen.kt b/app/src/main/java/com/guru/composecookbook/ui/animation/AnimationScreen.kt
index 97becc74..32c7d92d 100644
--- a/app/src/main/java/com/guru/composecookbook/ui/animation/AnimationScreen.kt
+++ b/app/src/main/java/com/guru/composecookbook/ui/animation/AnimationScreen.kt
@@ -10,8 +10,8 @@ import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -39,7 +39,7 @@ fun AnimationScreen() {
Scaffold(
modifier = Modifier.testTag(TestTags.ANIM_SCREEN_ROOT),
topBar = {
- SmallTopAppBar(
+ TopAppBar(
title = { Text(text = "Animations") },
navigationIcon = {
IconButton(onClick = { animateIcon = !animateIcon }) {
diff --git a/app/src/main/java/com/guru/composecookbook/ui/home/advancelists/AdvanceListsActivity.kt b/app/src/main/java/com/guru/composecookbook/ui/home/advancelists/AdvanceListsActivity.kt
index b89d5438..ffd0c8b7 100644
--- a/app/src/main/java/com/guru/composecookbook/ui/home/advancelists/AdvanceListsActivity.kt
+++ b/app/src/main/java/com/guru/composecookbook/ui/home/advancelists/AdvanceListsActivity.kt
@@ -16,8 +16,8 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -49,7 +49,7 @@ class AdvanceListsActivity : ComponentActivity() {
// A surface container using the 'background' color from the theme
Scaffold(
topBar = {
- SmallTopAppBar(
+ TopAppBar(
title = { Text(text = "Advance Lists(In Progress)") },
navigationIcon = {
IconButton(onClick = { onBackPressed() }) {
diff --git a/app/src/main/java/com/guru/composecookbook/ui/home/customfling/FlingListActivity.kt b/app/src/main/java/com/guru/composecookbook/ui/home/customfling/FlingListActivity.kt
index 88adf82e..cb7e5f7f 100644
--- a/app/src/main/java/com/guru/composecookbook/ui/home/customfling/FlingListActivity.kt
+++ b/app/src/main/java/com/guru/composecookbook/ui/home/customfling/FlingListActivity.kt
@@ -18,8 +18,8 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.livedata.observeAsState
@@ -139,7 +139,7 @@ fun ListViewContent(
*/
Scaffold(
topBar = {
- SmallTopAppBar(
+ TopAppBar(
title = {
Column(modifier = Modifier.padding(4.dp)) {
/*
diff --git a/app/src/main/java/com/guru/composecookbook/ui/home/dialogs/DialogsActivity.kt b/app/src/main/java/com/guru/composecookbook/ui/home/dialogs/DialogsActivity.kt
index e53afdc9..10eb1bd6 100644
--- a/app/src/main/java/com/guru/composecookbook/ui/home/dialogs/DialogsActivity.kt
+++ b/app/src/main/java/com/guru/composecookbook/ui/home/dialogs/DialogsActivity.kt
@@ -24,9 +24,9 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
+import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -77,7 +77,7 @@ class DialogsActivity : AppCompatActivity() {
fun DialogScreen(onBack: () -> Unit) {
Scaffold(
topBar = {
- SmallTopAppBar(
+ TopAppBar(
title = { Text(text = "Dialogs") },
navigationIcon = {
IconButton(onClick = onBack) {
diff --git a/app/src/main/java/com/guru/composecookbook/ui/home/dynamic/DynamicUIActivity.kt b/app/src/main/java/com/guru/composecookbook/ui/home/dynamic/DynamicUIActivity.kt
index fcc3f87b..44ef743f 100644
--- a/app/src/main/java/com/guru/composecookbook/ui/home/dynamic/DynamicUIActivity.kt
+++ b/app/src/main/java/com/guru/composecookbook/ui/home/dynamic/DynamicUIActivity.kt
@@ -13,8 +13,8 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
@@ -64,7 +64,7 @@ class DynamicUIActivity : ComponentActivity() {
fun DynamicUiWrapper(uiType: String, onback: () -> Unit) {
Scaffold(
topBar = {
- SmallTopAppBar(
+ TopAppBar(
title = { Text(text = uiType) },
navigationIcon = {
IconButton(onClick = onback) {
diff --git a/app/src/main/java/com/guru/composecookbook/ui/home/lists/ListViewActivity.kt b/app/src/main/java/com/guru/composecookbook/ui/home/lists/ListViewActivity.kt
index 45c1f9f2..59022f45 100644
--- a/app/src/main/java/com/guru/composecookbook/ui/home/lists/ListViewActivity.kt
+++ b/app/src/main/java/com/guru/composecookbook/ui/home/lists/ListViewActivity.kt
@@ -21,8 +21,8 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
@@ -73,7 +73,7 @@ fun BaseView(isDarkTheme: Boolean, content: @Composable () -> Unit) {
fun ListViewContent(listType: String, onBack: () -> Unit) {
Scaffold(
topBar = {
- SmallTopAppBar(
+ TopAppBar(
title = {
Column(modifier = Modifier.padding(4.dp)) {
Text(text = "ListView")
diff --git a/app/src/main/java/com/guru/composecookbook/ui/learnwidgets/AppBars.kt b/app/src/main/java/com/guru/composecookbook/ui/learnwidgets/AppBars.kt
index ef1e7752..cb496194 100644
--- a/app/src/main/java/com/guru/composecookbook/ui/learnwidgets/AppBars.kt
+++ b/app/src/main/java/com/guru/composecookbook/ui/learnwidgets/AppBars.kt
@@ -25,8 +25,8 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar as Material3TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -57,7 +57,7 @@ fun AppBars() {
fun TopAppBarsDemo() {
SubtitleText(subtitle = "Top App bar")
- SmallTopAppBar(
+ Material3TopAppBar(
title = { Text(text = "Home") },
navigationIcon = {
IconButton(onClick = {}) {
diff --git a/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Dependencies.kt
index c2c63dd6..8028a45b 100644
--- a/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Dependencies.kt
@@ -17,19 +17,19 @@ object Dependencies {
// Removed googleMaps = "com.google.android.libraries.maps:maps" as it's not publicly available
const val playServicesMaps =
"com.google.android.gms:play-services-maps:${Versions.playServicesMaps}"
- const val composeUi = "androidx.compose.ui:ui:${Versions.compose}"
- const val composeUiTooling = "androidx.compose.ui:ui-tooling:${Versions.compose}"
+ // Compose BOM keeps all androidx.compose artifacts below at compatible versions
+ const val composeBom = "androidx.compose:compose-bom:${Versions.composeBom}"
+ const val composeUi = "androidx.compose.ui:ui"
+ const val composeUiTooling = "androidx.compose.ui:ui-tooling"
// Material Design 1 and 3 dependencies
- const val composeMaterial = "androidx.compose.material:material:${Versions.compose}"
- const val composeMaterial3 = "androidx.compose.material3:material3:${Versions.material3}"
- const val composeMaterial3WindowSizeClass = "androidx.compose.material3:material3-window-size-class:${Versions.material3}"
- const val composeMaterialIconsExtended =
- "androidx.compose.material:material-icons-extended:${Versions.compose}"
-
+ const val composeMaterial = "androidx.compose.material:material"
+ const val composeMaterial3 = "androidx.compose.material3:material3"
+ const val composeMaterial3WindowSizeClass = "androidx.compose.material3:material3-window-size-class"
+ const val composeMaterialIconsExtended = "androidx.compose.material:material-icons-extended"
+
// Runtime and State Management
- const val composeRuntime = "androidx.compose.runtime:runtime:${Versions.compose}"
- const val composeRuntimeLivedata =
- "androidx.compose.runtime:runtime-livedata:${Versions.compose}"
+ const val composeRuntime = "androidx.compose.runtime:runtime"
+ const val composeRuntimeLivedata = "androidx.compose.runtime:runtime-livedata"
// Layout and Navigation
const val composeConstraintLayout =
@@ -41,8 +41,8 @@ object Dependencies {
const val composeLottie = "com.airbnb.android:lottie-compose:${Versions.lottie}"
const val composeNavigation = "androidx.navigation:navigation-compose:${Versions.navCompose}"
- const val composeUiTestJunit4 = "androidx.compose.ui:ui-test-junit4:${Versions.compose}"
- const val composeUiTestManifest = "androidx.compose.ui:ui-test-manifest:${Versions.compose}"
+ const val composeUiTestJunit4 = "androidx.compose.ui:ui-test-junit4"
+ const val composeUiTestManifest = "androidx.compose.ui:ui-test-manifest"
/**
* Custom fling behaviour
diff --git a/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/DependencyHandlerExtensions.kt b/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/DependencyHandlerExtensions.kt
index 54a15de4..d5f3ff9d 100644
--- a/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/DependencyHandlerExtensions.kt
+++ b/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/DependencyHandlerExtensions.kt
@@ -2,7 +2,13 @@ package com.guru.composecookbook.build.dependencies
import org.gradle.api.artifacts.dsl.DependencyHandler
+/** Imports the Compose BOM so the unversioned Compose artifacts resolve consistently. */
+private fun DependencyHandler.addComposeBom(configurationName: String) {
+ add(configurationName, platform(Dependencies.composeBom))
+}
+
fun DependencyHandler.addComposeOfficialDependencies() {
+ addComposeBom("implementation")
composeOfficialDependencies.forEach {
add("implementation", it)
}
@@ -15,6 +21,7 @@ fun DependencyHandler.addComposeThirdPartyDependencies() {
}
fun DependencyHandler.addComposeDebugDependencies() {
+ addComposeBom("debugImplementation")
composeDebugDependencies.forEach {
add("debugImplementation", it)
}
@@ -33,6 +40,7 @@ fun DependencyHandler.addKotlinTestDependencies() {
}
fun DependencyHandler.addDataDependencies() {
+ addComposeBom("implementation")
add("ksp", Dependencies.roomCompiler)
dataDependencies.forEach {
add("implementation", it)
@@ -76,6 +84,7 @@ fun DependencyHandler.addThirdPartyUnitTestsDependencies() {
}
fun DependencyHandler.addAndroidInstrumentationTestsDependencies() {
+ addComposeBom("androidTestImplementation")
androidInstrumentationTestsDependencies.forEach {
add("androidTestImplementation", it)
}
diff --git a/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Versions.kt b/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Versions.kt
index 270f8411..46711afc 100644
--- a/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Versions.kt
+++ b/buildSrc/src/main/kotlin/com/guru/composecookbook/build/dependencies/Versions.kt
@@ -1,7 +1,7 @@
package com.guru.composecookbook.build.dependencies
internal object Versions {
- const val compose = "1.6.1" // Latest stable Compose UI version
+ const val composeBom = "2024.12.01" // Compose BOM maps ui/material/runtime etc. versions
const val activityCompose = "1.8.2" // Latest stable
const val pagingCompose = "3.2.1" // Latest stable
const val navCompose = "2.7.7" // Latest stable navigation
@@ -10,7 +10,7 @@ internal object Versions {
const val coilCompose = "2.5.0" // Latest stable
const val kotlin = "2.1.20" // Kotlin 2.x with the K2 compiler
const val coroutines = "1.7.3" // Latest stable
- const val androidLifecycleGrouped = "2.7.0" // Latest stable
+ const val androidLifecycleGrouped = "2.8.7" // Latest stable 2.8.x
const val flinger = "1.0.5" // Keeping as is since it's a third-party lib
const val paging = "3.2.1" // Latest stable
const val lottie = "6.3.0" // Latest stable
@@ -19,7 +19,6 @@ internal object Versions {
const val appcompat = "1.6.1" // Latest stable
const val paletteKtx = "1.0.0" // Latest stable
const val material = "1.11.0" // Latest stable Material Design 1
- const val material3 = "1.2.1" // Latest stable Material 3
const val playServicesAds = "22.5.0" // Latest stable
const val googleMaps = "2.0.1" // Latest Google Maps version
const val playServicesMaps = "18.2.0" // Latest stable
diff --git a/data/build.gradle.kts b/data/build.gradle.kts
index 4e206914..98e33820 100644
--- a/data/build.gradle.kts
+++ b/data/build.gradle.kts
@@ -6,5 +6,6 @@ plugins {
android { namespace = "com.guru.composecookbook.data" }
dependencies {
+ implementation(platform(com.guru.composecookbook.build.dependencies.Dependencies.composeBom))
implementation(com.guru.composecookbook.build.dependencies.Dependencies.composeRuntime)
}
diff --git a/demos/datingapp/src/main/java/com/guru/composecookbook/datingapp/DatingHomeActivity.kt b/demos/datingapp/src/main/java/com/guru/composecookbook/datingapp/DatingHomeActivity.kt
index e37eb3d8..659b7501 100644
--- a/demos/datingapp/src/main/java/com/guru/composecookbook/datingapp/DatingHomeActivity.kt
+++ b/demos/datingapp/src/main/java/com/guru/composecookbook/datingapp/DatingHomeActivity.kt
@@ -21,8 +21,8 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
@@ -115,7 +115,7 @@ fun DatingHomeAppbar(navType: MutableState) {
DatingNavType.CHATS -> "Chats"
DatingNavType.PROFILE -> "My Profile"
}
- SmallTopAppBar(
+ TopAppBar(
title = { Text(title, style = typography.h6) },
actions = { IconButton(onClick = {}) { Icons.Default.MyLocation } },
)
diff --git a/demos/instagram/src/main/java/com/guru/composecookbook/instagram/components/stories/StoryItem.kt b/demos/instagram/src/main/java/com/guru/composecookbook/instagram/components/stories/StoryItem.kt
index 3ee365fa..01e0e3d3 100644
--- a/demos/instagram/src/main/java/com/guru/composecookbook/instagram/components/stories/StoryItem.kt
+++ b/demos/instagram/src/main/java/com/guru/composecookbook/instagram/components/stories/StoryItem.kt
@@ -8,8 +8,8 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme
-import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.Text
+import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
@@ -59,7 +59,7 @@ fun StoryItem(
)
.clickable(
interactionSource = interactionSource,
- indication = rememberRipple(bounded = false, radius = ProfileSizes.large / 2),
+ indication = ripple(bounded = false, radius = ProfileSizes.large / 2),
enabled = true,
onClickLabel = null,
onClick = onClick,