diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 0bdee4b..a0de2a1 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -7,14 +7,13 @@
-
+
-
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index a5f05cd..e34606c 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -21,5 +21,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index e45f03d..b9c871a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -4,13 +4,12 @@ plugins {
}
android {
- compileSdkVersion 30
- buildToolsVersion "30.0.2"
+ compileSdkVersion 33
defaultConfig {
applicationId "com.bruno.aybar.composechallenges"
minSdkVersion 21
- targetSdkVersion 30
+ targetSdkVersion 33
versionCode 1
versionName "1.0"
@@ -29,33 +28,30 @@ android {
}
kotlinOptions {
jvmTarget = '1.8'
- useIR = true
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion compose_version
- kotlinCompilerVersion '1.4.30'
}
}
dependencies {
-
- implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation 'androidx.core:core-ktx:1.3.1'
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.0'
- implementation "androidx.compose.ui:ui:$compose_version"
- implementation "androidx.compose.material:material:$compose_version"
- implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
- implementation "androidx.compose.ui:ui-tooling:$compose_version"
- implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha03"
- implementation "androidx.activity:activity-compose:1.3.0-alpha03"
- implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0'
- implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0'
- implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'
+ implementation platform('androidx.compose:compose-bom:2022.10.00')
+ implementation 'androidx.core:core-ktx:1.9.0'
+ implementation 'androidx.appcompat:appcompat:1.5.1'
+ implementation 'com.google.android.material:material:1.6.0'
+ implementation "androidx.compose.ui:ui"
+ implementation "androidx.compose.material:material"
+ implementation "androidx.compose.runtime:runtime-livedata"
+ implementation "androidx.compose.ui:ui-tooling"
+ implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1"
+ implementation "androidx.activity:activity-compose"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
testImplementation 'junit:junit:4.13.2'
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.4'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2179040..bf3f899 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,6 +12,7 @@
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupActionButtons.kt b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupActionButtons.kt
index 007e76c..ab63583 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupActionButtons.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupActionButtons.kt
@@ -1,5 +1,6 @@
package com.bruno.aybar.composechallenges.backup
+import android.annotation.SuppressLint
import androidx.compose.animation.core.*
import androidx.compose.animation.core.AnimationConstants.DefaultDurationMillis
import androidx.compose.foundation.layout.*
@@ -120,9 +121,10 @@ private fun buildUiProperties(state: ButtonsState): ButtonsUiProperties {
tween(easing = LinearEasing)
}
},
- targetValueByState = { if(it == ButtonsState.CreateBackup) 1f else 0f }
+ targetValueByState = { if(it == ButtonsState.CreateBackup) 1f else 0f }, label = ""
)
+ @SuppressLint("UnusedTransitionTargetStateParameter")
val backupButtonSizeMultiplier = transition.animateFloat(
transitionSpec = {
if(ButtonsState.CreateBackup isTransitioningTo ButtonsState.Cancel) {
@@ -131,7 +133,7 @@ private fun buildUiProperties(state: ButtonsState): ButtonsUiProperties {
keyframes { 1.05f at animationDuration / 2 }
}
},
- targetValueByState = { 1f }
+ targetValueByState = { 1f }, label = "backupButtonSizeMultiplier"
)
val cancelButtonAlpha = transition.animateFloat(
@@ -142,7 +144,7 @@ private fun buildUiProperties(state: ButtonsState): ButtonsUiProperties {
tween(easing = LinearEasing)
}
},
- targetValueByState = { if(it == ButtonsState.CreateBackup) 0f else 0.6f }
+ targetValueByState = { if(it == ButtonsState.CreateBackup) 0f else 0.6f }, label = "cancelButtonAlpha"
)
val cancelButtonWidth = transition.animateInt(
@@ -153,7 +155,7 @@ private fun buildUiProperties(state: ButtonsState): ButtonsUiProperties {
tween()
}
},
- targetValueByState = { if(it == ButtonsState.CreateBackup) 180 else 150 }
+ targetValueByState = { if(it == ButtonsState.CreateBackup) 180 else 150 }, label = "cancelButtonWidth"
)
return ButtonsUiProperties(
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupBody.kt b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupBody.kt
index e5e40b6..59f97c9 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupBody.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupBody.kt
@@ -117,7 +117,7 @@ private fun buildUiProperties(state: BodyState): BackupBodyUiProperties {
BodyState.LAST_BACKUP -> 1f
BodyState.UPLOADING -> 0f
}
- }
+ }, label = "lastBackupAlpha"
)
val lastBackupHintOffset: Int by transition.animateInt(
transitionSpec = {
@@ -131,7 +131,7 @@ private fun buildUiProperties(state: BodyState): BackupBodyUiProperties {
BodyState.LAST_BACKUP -> 0
BodyState.UPLOADING -> 15
}
- }
+ }, label = "lastBackupHintOffset"
)
val lastBackupDateOffset: Int by transition.animateInt(
transitionSpec = {
@@ -145,7 +145,7 @@ private fun buildUiProperties(state: BodyState): BackupBodyUiProperties {
BodyState.LAST_BACKUP -> 0
BodyState.UPLOADING -> 40
}
- }
+ }, label = "lastBackupDateOffset"
)
val uploadingAlpha: Float by transition.animateFloat(
transitionSpec = {
@@ -159,7 +159,7 @@ private fun buildUiProperties(state: BodyState): BackupBodyUiProperties {
BodyState.LAST_BACKUP -> 0f
BodyState.UPLOADING -> 1f
}
- }
+ }, label = "uploadingAlpha"
)
val uploadingOffset: Int by transition.animateInt(
transitionSpec = {
@@ -173,7 +173,7 @@ private fun buildUiProperties(state: BodyState): BackupBodyUiProperties {
BodyState.LAST_BACKUP -> 30
BodyState.UPLOADING -> 0
}
- }
+ }, label = "uploadingOffset"
)
return BackupBodyUiProperties(
lastBackupAlpha = lastBackupAlpha,
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCloud.kt b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCloud.kt
index ead763b..33d5127 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCloud.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCloud.kt
@@ -230,7 +230,7 @@ data class Bubble(
@Composable
private fun buildUiProperties(stateHolder: AnimatedCloudState): CloudUiProperties {
- val transition: Transition = updateTransition(stateHolder.state)
+ val transition: Transition = updateTransition(stateHolder.state, label = "cloudTransition")
val defaultDuration = 1000
val circleSize = transition.animateFloat(
transitionSpec = {
@@ -246,7 +246,7 @@ private fun buildUiProperties(stateHolder: AnimatedCloudState): CloudUiPropertie
CloudState.MERGED -> 1.5f
CloudState.COVERING -> 10F
}
- }
+ }, label = "circleSize"
)
val sideCloudsOffset = transition.animateFloat(
@@ -263,7 +263,7 @@ private fun buildUiProperties(stateHolder: AnimatedCloudState): CloudUiPropertie
CloudState.MERGED -> 1f
else -> 1f
}
- }
+ }, label = "sideCloudsOffset"
)
val exitBubblesProgress = transition.animateFloat(
@@ -279,7 +279,7 @@ private fun buildUiProperties(stateHolder: AnimatedCloudState): CloudUiPropertie
CloudState.COVERING -> 0.8f
else -> 0f
}
- }
+ }, label = "exitBubblesProgress"
)
return CloudUiProperties(
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCompleted.kt b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCompleted.kt
index 518302c..5e8835f 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCompleted.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/backup/BackupCompleted.kt
@@ -130,6 +130,7 @@ private fun AnimatedCheck(progress: Float, modifier: Modifier) {
}
}
+@Suppress("UnnecessaryVariable")
private fun DrawScope.drawAnimatedCheck(progress: Float, stroke: Stroke, color: Color) {
val w1 = 20f
val w2 = 55f
@@ -160,26 +161,33 @@ private fun DrawScope.drawAnimatedCheck(progress: Float, stroke: Stroke, color:
@Composable
private fun buildUiProperties(state: BackupCompletedState): BackupCompletedUiProperties{
- val transition: Transition = updateTransition(targetState = state)
+ val transition: Transition = updateTransition(
+ targetState = state,
+ label = "backupTransition"
+ )
val floatSpec = AnimationSpecBuilder()
val intSpec = AnimationSpecBuilder()
val completedProgress: Float by transition.animateFloat(
transitionSpec = { with(floatSpec) { buildAnimationSpec() } },
- targetValueByState = { if(it == BackupCompletedState.HIDDEN) 0f else 1f }
+ targetValueByState = { if(it == BackupCompletedState.HIDDEN) 0f else 1f },
+ label = "completedProgress"
)
val topSpacing: Int by transition.animateInt(
transitionSpec = { with(intSpec) { buildAnimationSpec() } },
- targetValueByState = { if(it == BackupCompletedState.HIDDEN) 36 else 20 }
+ targetValueByState = { if(it == BackupCompletedState.HIDDEN) 36 else 20 },
+ label = "topSpacing"
)
val textSeparation: Int by transition.animateInt(
transitionSpec = { with(intSpec) { buildAnimationSpec() } },
- targetValueByState = { if(it == BackupCompletedState.HIDDEN) 16 else 4 }
+ targetValueByState = { if(it == BackupCompletedState.HIDDEN) 16 else 4 },
+ label = "textSeparation"
)
val buttonBottom: Int by transition.animateInt(
transitionSpec = { with(intSpec) { buildAnimationSpec() } },
- targetValueByState = { if(it == BackupCompletedState.HIDDEN) 8 else 24 }
+ targetValueByState = { if(it == BackupCompletedState.HIDDEN) 8 else 24 },
+ label = "buttonBottom"
)
return BackupCompletedUiProperties(
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/batman/BatmanPage.kt b/app/src/main/java/com/bruno/aybar/composechallenges/batman/BatmanPage.kt
index 679eaa5..5d5748d 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/batman/BatmanPage.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/batman/BatmanPage.kt
@@ -107,38 +107,54 @@ private data class BatmanUiProperties(
@Composable
private fun buildUiProperties(transitionState: MutableTransitionState, maxHeight: Float): BatmanUiProperties {
- val transition = updateTransition(transitionState)
+ val transition = updateTransition(transitionState, label = "batmanTransition")
val tweenWithSimpleDelay = tween(durationMillis = 1000, delayMillis = 500)
- val batmanLogoHeight: Float by transition.animateFloat( { tweenWithSimpleDelay }) {
- when(transition.currentState) {
+ val batmanLogoHeight: Float by transition.animateFloat( { tweenWithSimpleDelay }, label = "batmanLogoHeight") {
+ when(it) {
BatmanPageState.LogoCovering -> maxHeight
else -> 40f
}
}
- val batmanLogoVerticalBias: Float by transition.animateFloat( { tweenWithSimpleDelay }) {
- when(transition.currentState) {
- BatmanPageState.LogoCovering, BatmanPageState.LogoCentered -> 0f
- BatmanPageState.LogoAndHint, BatmanPageState.Completed -> -0.3f
+ val batmanLogoVerticalBias: Float by transition.animateFloat(
+ transitionSpec = { tweenWithSimpleDelay },
+ label = "batmanLogoVerticalBias",
+ targetValueByState = { targetState ->
+ when(targetState) {
+ BatmanPageState.LogoCovering, BatmanPageState.LogoCentered -> 0f
+ BatmanPageState.LogoAndHint, BatmanPageState.Completed -> -0.3f
+ }
}
- }
- val welcomeAlpha: Float by transition.animateFloat( { tween(durationMillis = 800, delayMillis = 700) }) {
- when(transition.currentState) {
- BatmanPageState.LogoCovering, BatmanPageState.LogoCentered -> 0f
- BatmanPageState.LogoAndHint, BatmanPageState.Completed -> 1f
+ )
+ val welcomeAlpha: Float by transition.animateFloat(
+ transitionSpec = { tween(durationMillis = 800, delayMillis = 700) },
+ label = "welcomeAlpha",
+ targetValueByState = { targetState ->
+ when(targetState) {
+ BatmanPageState.LogoCovering, BatmanPageState.LogoCentered -> 0f
+ BatmanPageState.LogoAndHint, BatmanPageState.Completed -> 1f
+ }
}
- }
- val batmanSizeProgress: Float by transition.animateFloat( { tweenWithSimpleDelay }) {
- when(transition.currentState) {
- BatmanPageState.Completed -> 1f
- else -> 3f
+ )
+ val batmanSizeProgress: Float by transition.animateFloat(
+ transitionSpec = { tweenWithSimpleDelay },
+ label = "batmanSizeProgress",
+ targetValueByState = { targetState ->
+ when(targetState) {
+ BatmanPageState.Completed -> 1f
+ else -> 3f
+ }
}
- }
- val batmanButtonsAlpha: Float by transition.animateFloat( { tweenWithSimpleDelay }) {
- when(transition.currentState) {
- BatmanPageState.Completed -> 1f
- else -> 0f
+ )
+ val batmanButtonsAlpha: Float by transition.animateFloat(
+ transitionSpec = { tweenWithSimpleDelay },
+ label = "batmanButtonsAlpha",
+ targetValueByState = { targetState ->
+ when(targetState) {
+ BatmanPageState.Completed -> 1f
+ else -> 0f
+ }
}
- }
+ )
return BatmanUiProperties(
batmanLogoHeight = batmanLogoHeight,
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyBirdViewModel.kt b/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyBirdViewModel.kt
index c083876..eb00efa 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyBirdViewModel.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyBirdViewModel.kt
@@ -41,6 +41,7 @@ class FlappyBirdViewModel: ViewModel() {
when(it) {
is FlappyGameUi.Playing -> updateScore(it)
is FlappyGameUi.Finished -> hasStarted = false
+ is FlappyGameUi.NotStarted -> Unit // do nothing
}
}
}
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyTheme.kt b/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyTheme.kt
index edeeaee..1bece36 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyTheme.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/flappy/FlappyTheme.kt
@@ -19,6 +19,7 @@ fun FlappyBirdTheme(content: @Composable() () -> Unit) {
surface = skyColor,
background = brown,
onPrimary = Color.White,
+ onSecondary = Color.White,
onBackground = Color.White,
onSurface = Color.White
)
diff --git a/app/src/main/java/com/bruno/aybar/composechallenges/reveal_menu/BottomRevealMenu.kt b/app/src/main/java/com/bruno/aybar/composechallenges/reveal_menu/BottomRevealMenu.kt
index 111b9c5..a3c8f5f 100644
--- a/app/src/main/java/com/bruno/aybar/composechallenges/reveal_menu/BottomRevealMenu.kt
+++ b/app/src/main/java/com/bruno/aybar/composechallenges/reveal_menu/BottomRevealMenu.kt
@@ -18,10 +18,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Search
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
+import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@@ -36,7 +33,7 @@ private val DATA = (1..100).map { "Item $it" }
@Composable
fun BottomRevealMenu() {
- var isMenuOpened by mutableStateOf(false)
+ var isMenuOpened by remember { mutableStateOf(false) }
Scaffold(
topBar = { CustomTopBar() },
floatingActionButton = {
@@ -45,8 +42,8 @@ fun BottomRevealMenu() {
onClick = { isMenuOpened = !isMenuOpened },
)
}
- ) {
- Box(Modifier.background(DarkPurple)) {
+ ) { scaffoldPaddings ->
+ Box(Modifier.background(DarkPurple).padding(scaffoldPaddings)) {
if(isMenuOpened) {
SideMenuOptions(
Modifier
@@ -191,7 +188,7 @@ private val LightColorPalette = lightColors(
@Composable
fun BottomRevealChallengeTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
- content: @Composable() () -> Unit
+ content: @Composable () -> Unit
) {
val colors = if (darkTheme) {
DarkColorPalette
diff --git a/build.gradle b/build.gradle
index fcc9b37..73696fc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,15 +1,15 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
- compose_version = '1.0.0-beta01'
+ compose_version = '1.3.1'
}
- ext.kotlin_version = "1.4.30"
+ ext.kotlin_version = "1.7.10"
repositories {
google()
- jcenter()
+ mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.0.0-alpha08'
+ classpath 'com.android.tools.build:gradle:7.0.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
@@ -20,7 +20,7 @@ buildscript {
allprojects {
repositories {
google()
- jcenter()
+ mavenCentral()
}
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f13e77f..3220d57 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Sat Nov 07 23:28:09 PET 2020
distributionBase=GRADLE_USER_HOME
-distributionUrl=https://services.gradle.org/distributions/gradle-6.8.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME