From 470a14cc8b8e56b7ee69cb44c4c788bb3a5b4f2f Mon Sep 17 00:00:00 2001 From: Zach Klippenstein Date: Tue, 18 May 2021 21:20:10 -0700 Subject: [PATCH] Upgrade AGP, Compose, Dokka, and Kotlin. --- build.gradle.kts | 5 ----- buildSrc/build.gradle.kts | 6 +++--- .../main/java/DefaultAndroidConfigPlugin.kt | 4 ++-- buildSrc/src/main/java/Dependencies.kt | 6 +++--- .../backstack/SaveableScreenStateHolder.kt | 19 ++++++++++++++++++- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5928315..2bc7bd2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,11 +38,6 @@ subprojects { allWarningsAsErrors = true } - // Required while Compose is built on a compiler that is somewhere in between Kotlin - // 1.3 and 1.4. Otherwise you'll see errors like "Runtime JAR file has version 1.3 which - // is older than required for API version 1.4" - apiVersion = "1.3" - freeCompilerArgs = listOf( "-Xopt-in=kotlin.RequiresOptIn" ) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index e5ce932..5faeab0 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -9,7 +9,7 @@ repositories { } dependencies { - implementation("com.android.tools.build:gradle:7.0.0-alpha14") - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31") - implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.4.0") + implementation("com.android.tools.build:gradle:7.1.0-alpha01") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32") + implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.4.32") } diff --git a/buildSrc/src/main/java/DefaultAndroidConfigPlugin.kt b/buildSrc/src/main/java/DefaultAndroidConfigPlugin.kt index c729c21..68470e7 100644 --- a/buildSrc/src/main/java/DefaultAndroidConfigPlugin.kt +++ b/buildSrc/src/main/java/DefaultAndroidConfigPlugin.kt @@ -22,8 +22,8 @@ class DefaultAndroidConfigPlugin : Plugin { } defaultConfig { - minSdkVersion(21) - targetSdkVersion(Versions.targetSdk) + minSdk = 21 + targetSdk = Versions.targetSdk versionCode = 1 versionName = "1.0" diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 2c5cffb..f98c51e 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -1,11 +1,11 @@ object Versions { const val targetSdk = 29 - const val compose = "1.0.0-beta05" + const val compose = "1.0.0-beta07" } object Dependencies { object AndroidX { - const val appcompat = "androidx.appcompat:appcompat:1.3.0-beta01" + const val appcompat = "androidx.appcompat:appcompat:1.3.0" // Note that we're not using the actual androidx material dep yet, it's still alpha. const val material = "com.google.android.material:material:1.1.0" @@ -14,7 +14,7 @@ object Dependencies { } object Compose { - const val activity = "androidx.activity:activity-compose:1.3.0-alpha02" + const val activity = "androidx.activity:activity-compose:1.3.0-alpha08" const val foundation = "androidx.compose.foundation:foundation:${Versions.compose}" const val icons = "androidx.compose.material:material-icons-extended:${Versions.compose}" const val material = "androidx.compose.material:material:${Versions.compose}" diff --git a/compose-backstack/src/main/java/com/zachklipp/compose/backstack/SaveableScreenStateHolder.kt b/compose-backstack/src/main/java/com/zachklipp/compose/backstack/SaveableScreenStateHolder.kt index 331d897..9a8c368 100644 --- a/compose-backstack/src/main/java/com/zachklipp/compose/backstack/SaveableScreenStateHolder.kt +++ b/compose-backstack/src/main/java/com/zachklipp/compose/backstack/SaveableScreenStateHolder.kt @@ -7,6 +7,7 @@ import androidx.compose.runtime.key import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.SaveableStateHolder import androidx.compose.runtime.saveable.rememberSaveableStateHolder +import androidx.compose.ui.layout.SubcomposeLayout @Composable internal fun rememberSaveableScreenStateHolder(): SaveableScreenStateHolder { val stateHolder = rememberSaveableStateHolder() @@ -62,7 +63,9 @@ internal class SaveableScreenStateHolder(private val holder: SaveableStateHol // composed again. We have to use the compose-generated int stateKey, even though this function // accepts Any, because it doesn't _actually_ accept Any – it only accepts values that are // saveable, and the backstack item may not be saveable. - holder.SaveableStateProvider(stateKey, content) + holder.SaveableStateProvider(stateKey) { + WorkaroundComposeStateBug(content) + } } /** @@ -82,4 +85,18 @@ internal class SaveableScreenStateHolder(private val holder: SaveableStateHol } } } + + /** + * TODO Remove this when the bug is fixed. + * See https://issuetracker.google.com/issues/188567661#comment2. + */ + @Composable private fun WorkaroundComposeStateBug(content: @Composable () -> Unit) { + SubcomposeLayout { constraints -> + val measurable = subcompose(Unit, content).single() + val placeable = measurable.measure(constraints) + layout(placeable.width, placeable.height) { + placeable.placeRelative(0, 0) + } + } + } }