From e0f8fdafcb91893ef1d947c2f9e925167d1e6841 Mon Sep 17 00:00:00 2001 From: Francesco Guardiani Date: Tue, 15 Oct 2024 12:44:23 +0200 Subject: [PATCH] Add android app example with kotlin multiplatform (#196) --- README.md | 13 +- end-to-end-applications/kotlin/README.md | 3 + .../kotlin/kmp-android-todo-app/.gitignore | 19 ++ .../kotlin/kmp-android-todo-app/README.md | 15 ++ .../kmp-android-todo-app/build.gradle.kts | 11 + .../composeApp/build.gradle.kts | 82 ++++++ .../src/androidMain/AndroidManifest.xml | 27 ++ .../restate/examples/noteapp/MainActivity.kt | 39 +++ .../restate/examples/noteapp/MainViewModel.kt | 56 ++++ .../noteapp/composables/TodoInputBar.kt | 109 ++++++++ .../noteapp/composables/TodoItemUi.kt | 126 +++++++++ .../noteapp/composables/TodoItemsContainer.kt | 63 +++++ .../examples/noteapp/ui/constants/Colors.kt | 13 + .../examples/noteapp/ui/constants/DpValues.kt | 17 ++ .../noteapp/ui/constants/TextStyles.kt | 20 ++ .../examples/noteapp/ui/theme/Color.kt | 11 + .../examples/noteapp/ui/theme/Theme.kt | 70 +++++ .../restate/examples/noteapp/ui/theme/Type.kt | 34 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../src/androidMain/res/drawable/ic_add.xml | 9 + .../androidMain/res/drawable/ic_delete.xml | 9 + .../res/drawable/ic_empty_check_box.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++ .../res/drawable/ic_selected_check_box.xml | 9 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes .../src/androidMain/res/values/strings.xml | 4 + .../src/commonMain/kotlin/TodosClient.kt | 63 +++++ .../kmp-android-todo-app/gradle.properties | 8 + .../gradle/libs.versions.toml | 51 ++++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../kotlin/kmp-android-todo-app/gradlew | 249 ++++++++++++++++++ .../kotlin/kmp-android-todo-app/gradlew.bat | 92 +++++++ .../kmp-android-todo-app/screenshot.png | Bin 0 -> 62030 bytes .../server/build.gradle.kts | 32 +++ .../restate/examples/noteapp/Application.kt | 57 ++++ .../src/main/resources/log4j2.properties | 26 ++ .../kmp-android-todo-app/settings.gradle.kts | 33 +++ .../shared/build.gradle.kts | 40 +++ .../dev/restate/examples/noteapp/TodoItem.kt | 9 + 51 files changed, 1639 insertions(+), 6 deletions(-) create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/.gitignore create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/README.md create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/build.gradle.kts create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/build.gradle.kts create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/AndroidManifest.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainActivity.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainViewModel.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoInputBar.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemUi.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemsContainer.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/Colors.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/DpValues.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/TextStyles.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Color.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Theme.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Type.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_add.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_delete.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_empty_check_box.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_launcher_background.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_selected_check_box.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/values/strings.xml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/commonMain/kotlin/TodosClient.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/gradle.properties create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/gradle/libs.versions.toml create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/gradle/wrapper/gradle-wrapper.jar create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/gradle/wrapper/gradle-wrapper.properties create mode 100755 end-to-end-applications/kotlin/kmp-android-todo-app/gradlew create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/gradlew.bat create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/screenshot.png create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/server/build.gradle.kts create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/server/src/main/kotlin/dev/restate/examples/noteapp/Application.kt create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/server/src/main/resources/log4j2.properties create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/settings.gradle.kts create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/shared/build.gradle.kts create mode 100644 end-to-end-applications/kotlin/kmp-android-todo-app/shared/src/commonMain/kotlin/dev/restate/examples/noteapp/TodoItem.kt diff --git a/README.md b/README.md index ed2ad383..e60810c4 100644 --- a/README.md +++ b/README.md @@ -63,12 +63,13 @@ challenges. ### Kotlin -| Type | Name / Link | -|------------|-------------------------------------------------------------------------| -| Templates | [Template using Gradle](templates/kotlin-gradle) | -| Basics | [Durable Execution, Event-processing, Virtual Objects](basics/basics-kotlin) | -| Use Cases | [Sagas](patterns-use-cases/sagas/sagas-kotlin) | -| End-to-End | [Food Ordering App](end-to-end-applications/kotlin/food-ordering) | +| Type | Name / Link | +|------------|-------------------------------------------------------------------------------------------------| +| Templates | [Template using Gradle](templates/kotlin-gradle) | +| Basics | [Durable Execution, Event-processing, Virtual Objects](basics/basics-kotlin) | +| Use Cases | [Sagas](patterns-use-cases/sagas/sagas-kotlin) | +| End-to-End | [Food Ordering App](end-to-end-applications/kotlin/food-ordering) | +| End-to-End | [Todos Kotlin Multiplatform + Android app](end-to-end-applications/kotlin/kmp-android-todo-app) | ### Python diff --git a/end-to-end-applications/kotlin/README.md b/end-to-end-applications/kotlin/README.md index 52afc150..b9f29564 100644 --- a/end-to-end-applications/kotlin/README.md +++ b/end-to-end-applications/kotlin/README.md @@ -9,3 +9,6 @@ manages orders, restaurants, payments, and delivery drivers. The example mixes workflows (ordering) and stateful microservices (driver management), and uses Kafka as an event source for updates from delivery drivers. +### Todos Kotlin Multiplatform example with Android App + +The [Todos Kotlin multiplatform example](./kmp-android-todo-app) shows how to use Restate as the backend of your app, built using Kotlin Multiplatform. \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/.gitignore b/end-to-end-applications/kotlin/kmp-android-todo-app/.gitignore new file mode 100644 index 00000000..ce0aa46a --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/.gitignore @@ -0,0 +1,19 @@ +*.iml +.kotlin +.gradle +**/build/ +xcuserdata +!src/**/build/ +local.properties +.idea +.DS_Store +captures +.externalNativeBuild +.cxx +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcodeproj/project.xcworkspace/ +!*.xcworkspace/contents.xcworkspacedata +**/xcshareddata/WorkspaceSettings.xcsettings +restate-data \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/README.md b/end-to-end-applications/kotlin/kmp-android-todo-app/README.md new file mode 100644 index 00000000..1d7e7492 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/README.md @@ -0,0 +1,15 @@ +# Kotlin Multiplatform example Android app + Restate backend + +Kotlin multiplatform example for a Todo app using Restate as backend: + +![](screenshot.png) + +This project contains: + +* The [shared](./shared) code +* The [Todos Virtual Object](./server/src/main/kotlin/dev/restate/examples/noteapp/Application.kt), to store the todos, built using the Kotlin Restate SDK +* The [Android app](./composeApp) + +For more details on how to use it and run the Android app, check: https://www.jetbrains.com/help/kotlin-multiplatform-dev/get-started.html + +To run the Restate server, just follow the same instructions as https://docs.restate.dev/get_started/quickstart?sdk=kotlin \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/build.gradle.kts b/end-to-end-applications/kotlin/kmp-android-todo-app/build.gradle.kts new file mode 100644 index 00000000..5be49995 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + // this is necessary to avoid the plugins to be loaded multiple times + // in each subproject's classloader + alias(libs.plugins.androidApplication) apply false + alias(libs.plugins.androidLibrary) apply false + alias(libs.plugins.jetbrainsCompose) apply false + alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.kotlinJvm) apply false + alias(libs.plugins.kotlinMultiplatform) apply false + alias(libs.plugins.kotlinxSerialization) apply false +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/build.gradle.kts b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/build.gradle.kts new file mode 100644 index 00000000..94ca350b --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/build.gradle.kts @@ -0,0 +1,82 @@ +import org.jetbrains.compose.desktop.application.dsl.TargetFormat +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.androidApplication) + alias(libs.plugins.jetbrainsCompose) + alias(libs.plugins.compose.compiler) +} + +kotlin { + androidTarget { + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + jvmTarget.set(JvmTarget.JVM_11) + } + } + + sourceSets { + androidMain.dependencies { + implementation(compose.preview) + implementation(libs.androidx.activity.compose) + implementation(libs.ktor.client.okhttp) + implementation(libs.kotlinx.coroutines.android) + } + commonMain.dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material) + implementation(compose.ui) + implementation(compose.material3) + implementation(compose.components.resources) + implementation(compose.components.uiToolingPreview) + implementation(libs.androidx.lifecycle.viewmodel) + implementation(libs.androidx.lifecycle.runtime.compose) + implementation(projects.shared) + implementation(libs.ktor.client.core) + implementation(libs.ktor.serialization.json) + implementation(libs.ktor.client.content.negotiation) + implementation(libs.kotlinx.coroutines.core) + } + } +} + +android { + namespace = "dev.restate.examples.noteapp" + compileSdk = libs.versions.android.compileSdk.get().toInt() + + sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") + sourceSets["main"].res.srcDirs("src/androidMain/res") + sourceSets["main"].resources.srcDirs("src/commonMain/resources") + + defaultConfig { + applicationId = "dev.restate.examples.noteapp" + minSdk = libs.versions.android.minSdk.get().toInt() + targetSdk = libs.versions.android.targetSdk.get().toInt() + versionCode = 1 + versionName = "1.0" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + buildFeatures { + compose = true + } + dependencies { + debugImplementation(compose.uiTooling) + } +} + diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/AndroidManifest.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000..9c400336 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainActivity.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainActivity.kt new file mode 100644 index 00000000..ec852220 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainActivity.kt @@ -0,0 +1,39 @@ +package dev.restate.examples.noteapp + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import dev.restate.examples.noteapp.composables.TodoItemsContainer +import dev.restate.examples.noteapp.composables.TodoInputBar +import dev.restate.examples.noteapp.ui.constants.OverlappingHeight +import io.ktor.http.Url +import kotlinx.coroutines.Dispatchers + +// Thanks to https://medium.com/deuk/intermediate-android-compose-todo-app-ui-1d808ef7882d for the Compose UI related code. + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val mainViewModel = MainViewModel(TodosClient(Url("http://localhost:8080")), dispatcher = Dispatchers.IO) + setContent { + Box( + modifier = Modifier.fillMaxSize() + ) { + TodoItemsContainer( + todoItemsFlow = mainViewModel.todos, + onItemClick = mainViewModel::toggleTodo, + onItemDelete = mainViewModel::removeTodo, + overlappingElementsHeight = OverlappingHeight + ) + TodoInputBar( + modifier = Modifier.align(Alignment.BottomStart), + onAddButtonClick = mainViewModel::addTodo + ) + } + } + } +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainViewModel.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainViewModel.kt new file mode 100644 index 00000000..18cf6bf8 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/MainViewModel.kt @@ -0,0 +1,56 @@ +package dev.restate.examples.noteapp + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.async +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.launch + +class MainViewModel( + private val client: TodosClient, + private val dispatcher: CoroutineDispatcher +) : ViewModel() { + + private val updateSignal = Channel() + + val todos: Flow> = updateSignal.receiveAsFlow().map { + getTodos().await() + } + + init { + // Trigger first reload + viewModelScope.launch(dispatcher) { + triggerTodosReload() + } + } + + fun addTodo(todo: String) = + viewModelScope.launch(dispatcher) { + client.add(TodoItem(content = todo)) + triggerTodosReload() + } + + fun toggleTodo(todoItem: TodoItem) = + viewModelScope.launch(dispatcher) { + client.markCompleted(todoItem.id) + triggerTodosReload() + } + + fun removeTodo(todoItem: TodoItem) = + viewModelScope.launch(dispatcher) { + client.remove(todoItem.id) + triggerTodosReload() + } + + private fun getTodos() = + viewModelScope.async(dispatcher) { this@MainViewModel.client.readAll() } + + private suspend fun triggerTodosReload() { + updateSignal.send(Unit) + } + +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoInputBar.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoInputBar.kt new file mode 100644 index 00000000..c4819b28 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoInputBar.kt @@ -0,0 +1,109 @@ +package dev.restate.examples.noteapp.composables + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import dev.restate.examples.noteapp.ui.constants.LargeDp +import dev.restate.examples.noteapp.ui.constants.MediumDp +import dev.restate.examples.noteapp.ui.constants.TodoInputBarBackgroundColor +import dev.restate.examples.noteapp.ui.constants.TodoInputBarFabColor +import dev.restate.examples.noteapp.ui.constants.TodoInputBarFabSize +import dev.restate.examples.noteapp.ui.constants.TodoInputBarHeight +import dev.restate.examples.noteapp.ui.constants.TodoInputBarTextStyle +import dev.restate.examples.noteapp.R + +@Composable +fun TodoInputBar( + modifier: Modifier = Modifier, + onAddButtonClick: (String) -> Unit = {} +) { + // 1. State Management + val input = remember { mutableStateOf("") } + + Card( + // 2. Shape Customization + shape = RoundedCornerShape(size = MediumDp), + modifier = modifier + .padding(MediumDp) + .height(TodoInputBarHeight) + .fillMaxWidth(), + // 3. Elevation for Depth + elevation = CardDefaults.cardElevation(defaultElevation = LargeDp), + ) { + Row( + modifier = Modifier + .fillMaxSize() + .background(color = TodoInputBarBackgroundColor), + verticalAlignment = Alignment.CenterVertically + ) { + TextField( + modifier = Modifier.weight(1f), + textStyle = TodoInputBarTextStyle, + // 4. Data Binding + value = input.value, + // 5. Event Handling + onValueChange = { newText -> input.value = newText }, + placeholder = { + Text( + text = stringResource(id = R.string.todo_input_bar_hint), + // 6. Text Styling Depending on TodoItem Status + style = TodoInputBarTextStyle.copy(color = Color.White.copy(alpha = 0.5f)) + ) + }, + singleLine = true, + colors = TextFieldDefaults.colors( + // 7. Custom TextField Appearance + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + cursorColor = Color.White, + disabledTextColor = Color.White, + focusedTextColor = Color.White, + unfocusedTextColor = Color.White, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent + ) + ) + FloatingActionButton( + containerColor = TodoInputBarFabColor, + onClick = { + // 8. Task Submission Logic + if (input.value.isEmpty()) return@FloatingActionButton + onAddButtonClick(input.value) + input.value = "" + }, + // 9. FAB Customization + shape = CircleShape, + modifier = Modifier.size(TodoInputBarFabSize), + elevation = FloatingActionButtonDefaults.elevation( + defaultElevation = 0.dp, + pressedElevation = 0.dp + ) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_add), + contentDescription = null, + tint = TodoInputBarBackgroundColor + ) + } + Spacer(modifier = Modifier.width(LargeDp)) + } + } +} + +@Preview +@Composable +fun TodoInputBarPreview() { + TodoInputBar() +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemUi.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemUi.kt new file mode 100644 index 00000000..c27f18f6 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemUi.kt @@ -0,0 +1,126 @@ +package dev.restate.examples.noteapp.composables + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +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.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import dev.restate.examples.noteapp.TodoItem +import dev.restate.examples.noteapp.ui.constants.LargeDp +import dev.restate.examples.noteapp.ui.constants.MediumDp +import dev.restate.examples.noteapp.ui.constants.TodoItemActionButtonRippleRadius +import dev.restate.examples.noteapp.ui.constants.TodoItemBackgroundColor +import dev.restate.examples.noteapp.ui.constants.TodoItemHeight +import dev.restate.examples.noteapp.ui.constants.TodoItemIconColor +import dev.restate.examples.noteapp.ui.constants.TodoItemIconSize +import dev.restate.examples.noteapp.ui.constants.TodoItemTextColor +import dev.restate.examples.noteapp.ui.constants.TodoItemTitleTextStyle +import dev.restate.examples.noteapp.R + +@Composable +fun TodoItemUi( + todoItem: TodoItem = TodoItem(content = "Todo Item"), + // 1. Lambda Function Parameters for Flexibility + onItemClick: (TodoItem) -> Unit = {}, + onItemDelete: (TodoItem) -> Unit = {} +) { + // 2. Adaptive Color Scheme + val backgroundColor = if (todoItem.isCompleted) TodoItemBackgroundColor.copy(alpha = 0.5f) else TodoItemBackgroundColor + val textColor = if (todoItem.isCompleted) TodoItemTextColor.copy(alpha = 0.5f) else TodoItemTextColor + + // 3. Text Decoration + val textDecoration = if (todoItem.isCompleted) TextDecoration.LineThrough else null + + // 4. Dynamic Icons + val iconId = if (todoItem.isCompleted) R.drawable.ic_selected_check_box else R.drawable.ic_empty_check_box + val iconColorFilter = if (todoItem.isCompleted) ColorFilter.tint(TodoItemIconColor.copy(alpha = 0.5f)) else ColorFilter.tint( + TodoItemIconColor + ) + val iconTintColor = if (todoItem.isCompleted) TodoItemIconColor.copy(alpha = 0.5f) else TodoItemIconColor + + Card( + modifier = Modifier + .fillMaxWidth() + .height(TodoItemHeight), + elevation = CardDefaults.cardElevation(defaultElevation = LargeDp), + shape = RoundedCornerShape(size = MediumDp) + ) { + Row( + modifier = Modifier + .fillMaxSize() + .background(backgroundColor) + // 5. Clickable Modifier with Ripple Effect: + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = rememberRipple(bounded = true) + ) { onItemClick(todoItem) }, + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(id = iconId), + contentDescription = null, + modifier = Modifier + .padding(MediumDp) + .size(TodoItemIconSize), + colorFilter = iconColorFilter + ) + Text( + text = todoItem.content, + modifier = Modifier.weight(1f), + style = TodoItemTitleTextStyle.copy(color = textColor), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textDecoration = textDecoration + ) + // 6. IconButton for Deletion + IconButton( + onClick = { onItemDelete(todoItem) }, + modifier = Modifier.size(TodoItemActionButtonRippleRadius) + ) { + Icon( + modifier = Modifier.size(TodoItemIconSize), + painter = painterResource(id = R.drawable.ic_delete), + contentDescription = null, + tint = iconTintColor + ) + } + } + } +} + +@Preview +@Composable +fun TodoItemUiPreview() { + Column( + modifier = Modifier.padding(MediumDp), + verticalArrangement = Arrangement.spacedBy(MediumDp) + ) { + TodoItemUi(todoItem = TodoItem(content = "Wash dishes")) + TodoItemUi(todoItem = TodoItem(content = "Do laundry", isCompleted = true)) + TodoItemUi(todoItem = TodoItem(content = "Clean room")) + TodoItemUi(todoItem = TodoItem(content = "Buy groceries", isCompleted = true)) + } +} diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemsContainer.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemsContainer.kt new file mode 100644 index 00000000..028e08ad --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/composables/TodoItemsContainer.kt @@ -0,0 +1,63 @@ +package dev.restate.examples.noteapp.composables + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import dev.restate.examples.noteapp.TodoItem +import dev.restate.examples.noteapp.ui.constants.MediumDp +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +@Composable +fun TodoItemsContainer( + modifier: Modifier = Modifier, + todoItemsFlow: Flow> = flowOf(listOf()), + onItemClick: (TodoItem) -> Unit = {}, + onItemDelete: (TodoItem) -> Unit = {}, + overlappingElementsHeight: Dp = 0.dp +) { + // 1. Flow Data Collection + val todos = todoItemsFlow.collectAsState(initial = listOf()).value + // 2. LazyColumn Setup + LazyColumn( + modifier = modifier.fillMaxSize(), + contentPadding = PaddingValues(MediumDp), + verticalArrangement = Arrangement.spacedBy(MediumDp) + ) { + // 3. Items Rendering + items(todos, key = { it.id }) { item -> + TodoItemUi( + todoItem = item, + onItemClick = onItemClick, + onItemDelete = onItemDelete + ) + } + // 4. Layout Adjustment + item { Spacer(modifier = Modifier.height(overlappingElementsHeight)) } + } +} + +@Preview +@Composable +fun TodoItemsContainerPreview() { + TodoItemsContainer( + todoItemsFlow = flowOf( + listOf( + TodoItem(content = "Todo Item 1", isCompleted = true), + TodoItem(content = "Todo Item 2"), + TodoItem(content = "Todo Item 3"), + TodoItem(content = "Todo Item 4", isCompleted = true), + ) + ) + ) +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/Colors.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/Colors.kt new file mode 100644 index 00000000..655ea867 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/Colors.kt @@ -0,0 +1,13 @@ +package dev.restate.examples.noteapp.ui.constants + +import androidx.compose.ui.graphics.Color + +val PrimaryColor = Color(0xFF03034b) +val PrimaryLightColor = Color(0xFFdfddf6) + +val TodoItemBackgroundColor = PrimaryLightColor +val TodoItemIconColor = PrimaryColor +val TodoItemTextColor = PrimaryColor + +val TodoInputBarBackgroundColor = PrimaryColor +val TodoInputBarFabColor = PrimaryLightColor \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/DpValues.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/DpValues.kt new file mode 100644 index 00000000..0e214928 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/DpValues.kt @@ -0,0 +1,17 @@ +package dev.restate.examples.noteapp.ui.constants + +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +val SmallDp: Dp = 4.dp +val MediumDp: Dp = 8.dp +val LargeDp: Dp = 16.dp + +val TodoItemHeight: Dp = 48.dp +val TodoItemIconSize: Dp = 24.dp +val TodoItemActionButtonRippleRadius: Dp = 32.dp + +val TodoInputBarHeight: Dp = 64.dp +val TodoInputBarFabSize: Dp = 40.dp + +val OverlappingHeight = TodoInputBarHeight \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/TextStyles.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/TextStyles.kt new file mode 100644 index 00000000..1dbc5876 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/constants/TextStyles.kt @@ -0,0 +1,20 @@ +package dev.restate.examples.noteapp.ui.constants + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +val TodoItemTitleTextStyle = TextStyle( + fontWeight = FontWeight.Medium, + fontSize = 18.sp, + letterSpacing = 0.5.sp, + color = TodoItemTextColor +) + +val TodoInputBarTextStyle = TextStyle( + fontWeight = FontWeight.Medium, + fontSize = 18.sp, + letterSpacing = 0.5.sp, + color = Color.White +) \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Color.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Color.kt new file mode 100644 index 00000000..666d038d --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package dev.restate.examples.noteapp.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Theme.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Theme.kt new file mode 100644 index 00000000..08993305 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Theme.kt @@ -0,0 +1,70 @@ +package dev.restate.examples.noteapp.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun TodoDemoAppTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = colorScheme.primary.toArgb() + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Type.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Type.kt new file mode 100644 index 00000000..9b3f33d7 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/kotlin/dev/restate/examples/noteapp/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package dev.restate.examples.noteapp.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_add.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_add.xml new file mode 100644 index 00000000..c2cc748d --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_add.xml @@ -0,0 +1,9 @@ + + + diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_delete.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_delete.xml new file mode 100644 index 00000000..c161636d --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_empty_check_box.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_empty_check_box.xml new file mode 100644 index 00000000..f705ba4e --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_empty_check_box.xml @@ -0,0 +1,9 @@ + + + diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_launcher_background.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..e93e11ad --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_selected_check_box.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_selected_check_box.xml new file mode 100644 index 00000000..0db63174 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/drawable/ic_selected_check_box.xml @@ -0,0 +1,9 @@ + + + diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher.png b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a571e60098c92c2baca8a5df62f2929cbff01b52 GIT binary patch literal 3593 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 P00000NkvXXu0mjfP=x?Y literal 0 HcmV?d00001 diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..61da551c5594a1f9d26193983d2cd69189014603 GIT binary patch literal 5339 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 literal 0 HcmV?d00001 diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b216f2d313cc673d8b8c4da591c174ebed52795c GIT binary patch literal 11873 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 literal 0 HcmV?d00001 diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/values/strings.xml b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/values/strings.xml new file mode 100644 index 00000000..68602ff1 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/androidMain/res/values/strings.xml @@ -0,0 +1,4 @@ + + RestateTodoDemo + Write your todo + \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/commonMain/kotlin/TodosClient.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/commonMain/kotlin/TodosClient.kt new file mode 100644 index 00000000..692dc07e --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/composeApp/src/commonMain/kotlin/TodosClient.kt @@ -0,0 +1,63 @@ +package dev.restate.examples.noteapp + +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.statement.bodyAsText +import io.ktor.client.plugins.contentnegotiation.* +import io.ktor.client.plugins.defaultRequest +import io.ktor.client.request.get +import io.ktor.client.request.post +import io.ktor.client.request.setBody +import io.ktor.client.statement.bodyAsChannel +import io.ktor.client.statement.discardRemaining +import io.ktor.http.ContentType +import io.ktor.http.URLProtocol +import io.ktor.http.Url +import io.ktor.http.contentType +import io.ktor.http.path +import io.ktor.serialization.kotlinx.json.* + +class TodosClient(baseUrl: Url) { + private val client = HttpClient { + install(ContentNegotiation) { + json() + + // Strings should be serialized as json + removeIgnoredType() + } + defaultRequest { + url { + protocol = baseUrl.protocol + host = baseUrl.host + port = baseUrl.port + path("Todos/my-todo/") + } + } + expectSuccess = true + } + + suspend fun readAll(): List = client + .get("readAll") + .body() + + suspend fun add(item: TodoItem): Unit = client + .post("add") { + contentType(ContentType.Application.Json) + setBody(item) + } + .discardRemaining() + + suspend fun markCompleted(id: String): Unit = client + .post("markCompleted") { + contentType(ContentType.Application.Json) + setBody(id) + } + .discardRemaining() + + suspend fun remove(id: String): Unit = client + .post("remove") { + contentType(ContentType.Application.Json) + setBody(id) + } + .discardRemaining() +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/gradle.properties b/end-to-end-applications/kotlin/kmp-android-todo-app/gradle.properties new file mode 100644 index 00000000..33e29c6c --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/gradle.properties @@ -0,0 +1,8 @@ +kotlin.code.style=official + +#Gradle +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M" + +#Android +android.nonTransitiveRClass=true +android.useAndroidX=true \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/libs.versions.toml b/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/libs.versions.toml new file mode 100644 index 00000000..f128e3f2 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/libs.versions.toml @@ -0,0 +1,51 @@ +[versions] +agp = "8.2.2" +android-compileSdk = "34" +android-minSdk = "24" +android-targetSdk = "34" +androidx-activityCompose = "1.9.2" +androidx-appcompat = "1.7.0" +androidx-constraintlayout = "2.1.4" +androidx-core-ktx = "1.13.1" +androidx-espresso-core = "3.6.1" +androidx-lifecycle = "2.8.0" +androidx-material = "1.12.0" +androidx-test-junit = "1.2.1" +compose-plugin = "1.6.11" +junit = "4.13.2" +kotlin = "2.0.20" +logback = "1.5.7" +kotlinx-serialization = "1.7.2" +ktor = "2.3.12" +kotlinx-coroutines = "1.9.0-RC.2" + +[libraries] +kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } +kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } +kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core-ktx" } +androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-junit" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidx-espresso-core" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidx-appcompat" } +androidx-material = { group = "com.google.android.material", name = "material", version.ref = "androidx-material" } +androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "androidx-constraintlayout" } +androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" } +androidx-lifecycle-viewmodel = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "androidx-lifecycle" } +androidx-lifecycle-runtime-compose = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } +ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } +ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } +ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } +ktor-serialization-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } + +[plugins] +androidApplication = { id = "com.android.application", version.ref = "agp" } +androidLibrary = { id = "com.android.library", version.ref = "agp" } +jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +kotlinxSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/wrapper/gradle-wrapper.jar b/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/wrapper/gradle-wrapper.properties b/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..b82aa23a --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/gradlew b/end-to-end-applications/kotlin/kmp-android-todo-app/gradlew new file mode 100755 index 00000000..1aa94a42 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/gradlew.bat b/end-to-end-applications/kotlin/kmp-android-todo-app/gradlew.bat new file mode 100644 index 00000000..6689b85b --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/screenshot.png b/end-to-end-applications/kotlin/kmp-android-todo-app/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3db51a66ba083572198ace5dc2d52c002a94e5e5 GIT binary patch literal 62030 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

Xp>`_&>lelG^)sFI7KJBXjA@Z&E z0?G49jh4aZhsh*YDgSDvE7vPq#rBiHy-9^fYWu?G-AjG^`*&M5zf9YDiiT ztfM}Zk4qu4w9D@B)S>C6qe=aORhbF+q|CUe)U^`+Km(L@W;yLvbB1`Z9ZT$U(mp_* zRCYE$;QjP8oyCr(Swk~xF2@gtC#A$n_}hR=I63n3hi*M97Mp^2B%sIc!SZ=M5CDgC zZ8pYp1DWpqEp-1^1`m~{sB++{?RtL!4 zC&VG)*OgU$T2MZeoKg@)i#dA8_PsPBFqtOdghr$L$91v+uxJxJnuI zw;P?2!@Cvt9Aie=zTazsm)F zb7w+LF(OQ-p9wc2^f$#Wm*X7D`qEXI4iWUtuYsiD>aB&Rb>-RgTZ6R6@WMz|KNE%aU1iT}ElNQmHykm6Om%Hw+>3 z#Nvy6WHP(sH>@DHiF0<7+jhAz z#MUmZ|NEQdV#rL|1SWyHT}!-*Gc;aOw5PsvTpUAO0h<+2Ur^WHp>7G)r`kX(!=#F< z>PIid%PMJph15l~Y3AR*Iv)+~t~FMTbL2rl)!}Slq57n5k)ZBJL>t917Ocv5TAW%+ zWt71Csx&NTJ^_PuO{+=-U874#dlNB*DCLF_1L2p^0vad ztKdtB#EV`@{}kAh+-pol$Cy2;)xk%qFGQO-v3eD_{G|3KgQWWYMvUE>c#oD#;s-g0 zQh|Rk9lqYl_OG>MMK{)tt=x4*m5^AN>#oWXWvX4RjnorRbr$otAHTIE&$UTuI&Z1}I&19e!O|;}Y)e23Gz`!2p1Mp})Ui9Fr ztA-s9P9wFmW1^hoW?ucqAz-h10ny?63AT9d4e$1kl9Ar``6jtd`fbDJSVfNrA@O$S zE+8-U{!A`bu;T>@&ZoK`gzen5%-OkD%w}1^{XDsN9H(E3cuN zzmaS!49?x&c?XPMwI?gcoL##`pupDV*b&{r2Oa=8JUH!a@O9p{+f1q7hX>fX% z4F1zj*qI9EXE;f*DRklLxxIF6VwNR@W0OJfEY!4UTeb5g&_`vUX#Ut*;FE&6!`18E zO{Na-N|9iDA58Cn=avL0o;%dMu3GjvD0x^k3fNOm&jiVg+T7oW#(m1!KwKL0is(Lh zh~Mj;bB6*R>07=LzPJvl1L=Ja0>wEeX6icG#t0)CGeudZe;jaLv8?qB1+w|v`RSP3 zkdxT?M_Uqzftzo2N+sbh=`2HszJe@BsvXAR}*S=4$Rp`s4jL>I=$c zd+fm;?s)WGb2r%7H`f^|eA}rf)ZRH(VOs zn##QiX14j67f+wIW$W$`LeZ_RJ4yKRkYZiCbKr03y}oWM=f>KPwP6`Oj*6S2D`zQC8ZMgMOB@9<&SB=N7bN9E(X`EWwb`#dh96Ntj+CXwFB; z%_f};0clEc6oI7@Tmf=Qp&NGm0!m4$6Kyo(?`6QZw}Vaq`0vc&&Y#Kq+$N;F_KsEC3i46&Gn61FN5?b#k7Gx)9umfez@Q;1 z?qCGi7gNt;Xl(Nm*h5O+hpjTWIo59_{^|L0VILuJaOq%cIP!@GdA9F2^9^~~=QVzn zmxxn(g_@5g=qZfS&x;_qp|jyvsZHh?-Rv11D5B}Jl7S0KZI$?tuc_OGrex=Buf4e^ zcF1qUR+sD{e#OgySV3v%#Z=VeAArxj5xX<-jp4zFH*`3PZydFEW$_{FEBxk(mjn<> zw;v1FjhJb{;+fTTnLeeDWk&{h4zrX&-O*nvVi&Ac>L22ZwL0BZBU;}atnUJxH5^?o zaURl5+vFh7q_BI?Z6%|qgE-HoPS1@qXwAx5+TH8{t!i* zB;l0LSDBS==@m}3+|lN zI={vXg~#WY-SBI71~6A%53Se5?6_s{Zls_aC3<@<%p#0o^&Y=d-^I>@qFK?e z_nq7<;|h=Gz?}o5tC$-(;uyPNF(|&Y35u~-wi?aU!AbnPM}FS3+zo=~#AU+~59FHJ zLyvB=Q~_KU(UvGE955!D?8=@_+c+BCIa?_csW~w#W-m4SD1_hk0F>SG?m{sSkCg!U zSnTQfT^U7-_GaQjSEZS%F`v5ZIC_KR*S@d!ze4%ovNTm=%_8Wa9BcN}Z+-g(gT$2S zUCGX+3&X}e+7A>CrsT}u2=zZ6wS@gWxb6eUg&HO}D7E-aF5S=>s4OA>`tI>+_gk(7 zP}V-7`X!RoHK0TK0P*^d2LNzUoWA{d1(`aodSS0}R+dXA^-5P-lRg##rk?npK3D|kDKA=cP}~& z&~o*~_OFLnY>kLacR%;D?r5PrQ;KCPP`I?CP%=vw*>?KZkAl#YD!F0s<9Cs9j`$@9t*_iZ*@lxsHs~(-R^F)=pt<$uH{doICBGEJX z@`W9hqjMd5(q`AGb>G61E&t*f>BU)j*?MN04Sk$N@i}@i2g8T=n(4xn0A@L9%=SVN z9I33zJy?#+g`Rcepz_C|=BkZC#Q533$>&%6a&B#sl%)-~4Fu?%)R=tFY#*I(8PLl4 zRx40))dTnf=iA-yCi-ckkYBt>k`CZiWfTE22SWxF;c{eHZL87Fm7ts9Wa$7qMR`e( zt=FJdo$5mmFO@uESy(7-mSxxIpJR|TUpw}iJ2`&KX?sq_%a*Ux=!WTQ#NI`W9Y~j; zEh=G~W|)AM43UD=-Wumb1`%P%WE`jEisKiEsB+jnPyPKT9DSt_J2+}SZ0$L z$bB1WoVnU1;DcJ@WFn-Q%{5ML?S4Z|bAFy7Bz$&c+M)iLr3mEzx}0qu?VIK2PW@v7 z6`ha!93RS9E*KhdGC!lI_^(l#5ouTPUn``aXDB!g(VQkUgw#@e+84gHo1AG5xw?Fi zHk%*$JY!+FGvMo`g~qw;6cK?NQ<}BC*?|)k1E1S{Xykv$)uWrRE%#CO1f}|h=@;ti zcE#6H$m0M=SdzYGc>8~3zt5bv^>kVUpbq9yFfG#`20qgQN}r}Vl!_-m2yn(aO3gbFmfv@2!HMP>5(kC~aKTSPF~V=@l@jUKcv|CM`|5R(&h&+p*3xONsd} zcOB9kq^Ap1jhp9YGPTnv&Xx9c)E7SfSNRBXJ860l#d-gh*mG+!T;=Sg3`ve>k&`4t zy!H5uRPxMS(d2U$t+I99x1NUoJ~r;xZitsODXDj#?+$L%3@y`~5nMuw-R$2y!kUdm zVQOnj(1{2UM&KB57O+pZMarVG{uuzxg%P{Kalh3n@zyqz|yp_Dl?78>|%W`F`B zaQ7dxhw?=+s&I{?^kfCeY-uQ?>|`FfrnOA~n!93X`=@kz~tE$6tpdVoKWds;7xQ zmtkOISDXDJXFC_}H+pK!1?>3e#{04!8)8gYg(-5BWDwtQ1=7ZDTvgYndI{@{x+6$9 zBasCu)5km`7iO%i&RFDs7&Y1Ok6pG1#`j>A<~~P4Q&rm6hXbE=*CtMm)p_b@U$#4%ZsUEGEwGH)Rl{Kv?)3nk^spoWzz;yo3d&+SMto?NSyc z_2E_%*#n=C2K1UForVJ3J)LI%(>VB$-71W?DZ{nF-h#nxrOmy+a-5Ht56&F<4cnh% zVlrjndCb%4IA?qo_w9{RT86~F++mi}G6TI&U;k5Z_>gpy=R+mGH~1IIlAa%dCagp& zq#V=$^2@;MFN0RI1kYis5>7Nw6yDMnP6B_)gxW3A=%5p^)v8Ehw3&abepf_`Q#6Rx zcAq-i82>h5zAvZo^(TaX`Lr|f+OH{!WvS+)e*K|mo3#P^Ps^y?7T-3W6q#u`YfhVd z|3B?RJ{Em3k-_Z@w3mjPGbH2>2o@r5ez7g_`HyCmuJQ9V`hh-mU?w;eHqMFosoc2#L09oHezShUe7metTE(VqZpHJS_GGm8 z@CgFW65+AJO4?s~Qj0n!4I3wgafmR`IH!@VxqalmmFWD$Y8T1OonPxl3wW<27>B+9 z>||sivF)(q5G~y&vfb}L)Z*f+rU~=qIfDy^aoa9U=#t)7xoGE8TsAken(g=~eR6ET z*SL8PkE(L*XCv+QPdop0!2S)Q=Zy43;48Fxt7J`j63$|(?~kgnfG6fLIb+s7+rfyW z{#E!TeZRjKXYOD7dFH~Anms-Jk5d%BfeLUc*0PdCHyt?GJRECjh7$4<9XTo?JdTn! zaUwfXJ-rE~88YmTv_1p;Exf3b>DKkF1y7?GTTZ?I@IpC+hcJp3b6`gP z6N$BKrZXqQihXRK0P%>S4w%S-m_ikw=UMW2G%BO$vISUh1Ef+d*S3BwgUtC~6mAjz z&QShSmYV)RY2=BRfmF}FVg0U4HsShLn>FhH<0&`LQw#%-8uyBJxHSWTs~@1^E*^Pm z;Q;B8{XgDrl)ji)e)aF#yNIzx>~V$*j}kX2*2Jg?#WrxD%%S}`AC~Dd8x`rDlehS#g{BOz!%0P5BLkV zq!!s90FQo$HTfXt-&iVcv02AwfG}%M@c)PhZwB2~0&RYE|NbyQnUu=KYoWs9Ra|3E zT)5IzFhUs=oJ*axJKrXXB1wzbXf%`}QhzHS1b+Ee2IsTaV4GK?Q}E?pt$pC)L%jB7>zOBdNX4*7BQV6mY zPXl;@xz6u2tEFvWj_G~S`8huo_76$r{7AL=Ty!;^X~h8Pd5~?#Sxm2SY)YjtMaVpa z>~PT8LkmsPf$k|a9_eh$D!XM6to1iH0>D#Q4C@SmbSMXz-VO157`yJaMSzen)bi~M z`@yp2$iaFDgjZO_Kg~p6F>>pB1bnz?ui$y@q(w|nX}>dsTq7hP`~uu(CqOD&>iB&X z+U=m;c@J2qMd84Uw3Qab-dNPjLk^D;)8D(bzH>J3Px&nnB#6)R={d!31+d6EkJBu+ z)K&oRPg=3%OuT>R9z$S2o>G0$yR%!&L{-$=aWub;L#I&O6(G)c1EdbRvePC84x+j& zx#Wxu(pTj?0K?*~5UL9N1)6sCb8tStCB^llq+4;->Zgw(N>8OLZv=b>LDGGva_Ufy}T))=1{`SW>E2UH@$Lb$>JyFHErbxxE4}>_a+6!H9*(-Y2 z#4Cmqr3JP^a><8Y?&KYu)#w_DoHEiY z$r=e*EV+b=L}$v^CkonPVHohXPqX5^RT#M~$_9U-Ca_KnSzVIZTfM?7fNa9%4e5pw zak|muM)3MjSOvRdNJXgR){F3;EN&M@|vT82e-xyAR{<#nIrY zB?x~6?qz_6jjcGrcCYKpZEiIp>V4~^;5Yg}FL4%@?GwsGmX~pp-vBc$$V8gX>mp-)A!uXS`gfr$;(W19Dr62zDepqKa`+K4QHSy8-^=V}nZ&5y zpmK4YMC)ydvt1wx{wXpvF05H@i($2u9CU-=JFV^Y<2h}sL-^H#;ksXEm@tL>w$pR2 zavm&I@t-A$4QaO^2nf2RYMd)SeeE);bqnY*O67&`4c8-|y+M`_j6#nL^m4fei1Q!{ z$}R}Bgng@%A|vG1)RLXpg)D|4Dvnm~CXJRf5P`)=UCZzP{$>1mHb}}Bs*?QWouo}i z7GR(*U8cq?Q!joJc#}!esC}WRJXGRZ#xMw+`7jV#B&@E^U4y0q2bXCP!jl@W9$%234wjz|HG^W6bmd(htOUjV9v&Qi zjnbDi98LPJ@1c9XrMXaz7#NTt+Zc~hWLQF~;XG7A4J56;*&eXy7BqaWo6AkF(Z zu74q#m2sz6ktuo*c9gCTzA`vTcm6c|c5O1Ye=?_X?hk{J_0exDjw5wo>Iu~b=C9jF zjiS#94aO}b>QWi6dQZaD+9C4OVM8b3u4MDcQY~(UnN-VmZZMkQ(8#u*c2@asedqtk zAeThwVzbuFuv7=41vJ8WcJTX>L8bap`zVdW$!#(-F((imM#b$0uR@0tYI>8`domg& zT`UQW#t9|uqy=n(a>93KOYgMpe?eDvVXq?Yjb;h0f(I}GZbI?fy+e+=(c-s2VG8xb zQY?8+9C|^nO#Qfhl<(UEg(klnEyK%pUfoRmEA1|=?+74+q@haEX7j&>B*hJe ze_P^%Ki3+oQ6@h!VX!b^ka{OjIUIK_@eZwcxEk)Q2fN}> z(t@)Ib@XIqyUk{cX5e^jUM-o3+Y3Ej+giA%MrJw!^t24fDl)*YmF)2j9)>!tSGr6u zvgLXgtu2^9(=%{U`A528wQA>T?wWJ4JSrOJbsWtC{!;@gA{_1e8S|L;1dTMjdd|kU zRS;t)wI2SWA1G9EY)+i#CNC7ueA&nP32jPNK-OC3K_K(QD4omWy@7wZR%$Tv)4O|U zro480IO6AD)B%g^47(P45hUR7~3(HGWM~QE?aT~;0agkyYX&f z?`(RG#@ss^@7=TLK*V9n%BX$<^?MeTmHIn0E9=p*bItRPhHmoxrTBZDNWiSk+(P5a z^WaYbG?=|&=S<(eF;pfAximKG5a|Y2?H6NL|w@gOm!OZfWz){?-IM) zDTe;EEL5#=_(E4cu{fG(mSvVBI31{6+D=#WfBze9)_)z*|JpnI(F|On@8sYAr?vet zlm9PV{~yBjL%4oyoF5zKe|>cRkdpsVN*1&=ypHpYm1lv2y<%5Q-)g=A!(_?OYCdJj zfNvN0Ugx`zBFI*tCw0O9E}2@+cTZ*caoHbDU`Bq-7)*lo4}pPM__1GL5?X$!iyzwZ z$6*0G;m27ClaTepRDgKT4@(I|;fJLJlkme*f=T#cDgAJ)ei({B-0B}ug)XEGe;A4| z2|o-)n1mmO;*TKY4?Fos2>SmAH{r@?U9erzz~RWJ)rWWOUAv)t>&CDRzxLRz|NY>z z8;91ecYAYWmC?$*%YOf5wassDjgDIG{rUFYPy^u`p`1Tr-q?$eAC5hHPcGPK3Dbct zen1erd@?g&Qlr?@Vmg0nODP5h)-ubU$|!IN$hg6-!=G+J|Cs= z#<`^te!O&V;alVaYM>s)n9N}T8L9}nI22JOi?Bqtfz)VZ)tt52Jt-`QEL0_nEPxhF z;j*<=nl?}GZNYNtE^@CqEXo0bAGrJ zwO5H^41c(QANi?Jl$DhAp)xz29@XiWR1hU}AbHgx^8B$wWhW8ClOL59-n*PsEd2IV)_}-y*eQe^ zsj1Q&32=4$znc5buqLx^Z4?z9n&?Q80Hdg&B8aq51Qn4PQBbiVRWcN%gOpH3P*BGC^Zxn2uKNvQVbtJ<&Pmecy9k-}m$TesP7T?Y;KiYpuQ3 z+V}lLKTDHSq!xn6z0gs8S27Ws_yLnIkC~IMOkSJpWP^QU20N7YTrgp6DOYB#6eB; zq$pJ6%B{s^)g}4a1snSvfveZU>n}$10PjYex*y{S>^LYZwqu^W;uM%VqIOzCkPR}gj3hs!Z=dYtzN<4Jn%(e^dp za$650laFhmdE=w-aU*~=0Pc2E6)l7d1L!IXRDhYjNNg>>GXy2tbr1WQrFtBRJ$I*L?$`Wg5 znrpt}TMr{20vtpDF|OQ%MkWg$nRIX>sojL;J&z#wIh+X7xoazq;xw^=c5o?42o>mz zAjlyHh*)~4gf%!~BXMu!55ke!+c`Inb!mI|elu6nLe?jO1cQgUk5sci9Nq5CV;imb z6%Qd-OkPF3{sqOE+%N708Pmsga75FF*Je zvoe6}q*xbt6vv+Z#y9ANC#V}xuY1*T>ruwV+I&;*&=ar~eaqPob+-WXgIuHURZH#Z zAGnjpK}p4C3EMBcmCBSuTB-a~w&!Gw`Hm+44wJNdMAI(>@)A%+PT~0zPzX zvwcQyz$mWC#fv-Gxq@3Ul20a(1BhV;YS{_}n+wthq9*YF*)!&3H-=!O8#Mi;N$Wy{ zgKtMcSnysO6>E|wDV$_MvhNofDb1=q-7J?2WJsNSq19ICEid>fN!d-$H3|;Ycs2A$;dg;S`3T zY4>^BQx{LZw8!sVq_G=xBA&*rKN!1&TcVKbyy2qn_*I(nmYw#QKcwgm>S??Q-ydYT zSv2@pvIIFb*~bVEL%c49TUR1zTCHM&42y$~Eh|1yJH=shozF0)uK>_JjWu+A$xxX+ z_U*@HsGO+VT#(W0%g)&);(iBRjcyAa=e7pG`q1+wyTamlP5d1heZ;JEk0X^RC;UF& zo$_$3-IXxZ%5X43=Hc5%2*ndhPYf_gn$I``)|grP0YCoCaFFmRP4TZBX8v90Gu2i3 z;!|X9%iwyDjh-*+oDtfB)~KPwpMoVrv^Q=_rE(RyG7D2mK0F_JR(a1gOk{3$6C9aS z1{|%&kA6t#(@iN-mCX2*i;p2o_sgHK&bH6Tc?jV`t={L?&WNu}i?u=XOX$p{Z8j;${IR+KGxa{*_SotGTm(ZK_1<&Bo3M1 z8&6)&Mn)2WMk1f;1sD>ikz@CPfEYxuzctBg`IN@PCtDc136&>PLEui~fMO@9`$Gbt zhpIJyjDVzuj%4vS4dmn_oC6{#M=ILC^gX*o1MrW$IDUUr-e$^Di<{iw91A+WR|(Gl zI0GKrWCH+-=q~^Y%RIj~g+}Gp@7vtR`p!Y)8r6XS5f-`}<|^%JLEwE!^jI0cVW&_A zK^__oEY#xx&1P*H6 zUD^9n3g!|G6s#$@7FGb=)tH_KxI5g5QXOR0*DkZ(%ny7K`P5U*e?aBS8(?fg3=^LL z35ZDjRba$UY?cv5ownzTwy?(5e>eocN>5*kp+#WYndmFaT~_h_wcG+`f|#7?u#g|E zkqHJZx7sfrDT=R+Q?mOY(qfg3uHihGe=3HWl{7C#8ZIf~AETgDwgroE=Fp^|8slSpZ z!#a-uD&NJ-^u>CnnI)V^hNJ#eXEOA=+a@_^!K78-L7x=kV1#5-`<=;8q)XMNYz;tKHT%E2f^nSy>MTb_JZUJu07y*Ino7f{W+iniSrKCS1zlB> z5n9XlCC!oDbb-pyof@}|KVl85-9Un99_ za_rXauCGr8P5+l9VT5@Mqk-{-3VrT46My*a-3!$i->%B+UU&VGx55J-NexX(E8fL@ z8A^sT=UUnCa^?Lm7f&1r1!Qy0^6{cl?J23`dJ1coUOK~|~lEp9L4`$$zhw|{uUHvD& z5}-Gka`u6Mzp&d{eY^Ot=0;1R&>VC9iOi95ll<0{Qi`JwC1*aOpFI+?G7&sxX-_3F zEVEge&Xp?b5;$132+oRYNmNxKp_;%!N5R6$e@i4A*2p-_|G8NZguYXuqaq%JZi)a4 z{+xjsS|N&`((}@4C1!Vimqx#BwhO>$oGKfAMDQ$;-K4RP<(FV-&Pj3Rj@L%|WioC~ zak4LHQ&p*@5nS<;)hpbBUSHmfnn$?dpGKm;eWQdghK~%1fWKDwi;%b-Rpezz(X&WJ z!}QP-%spQYe_Ida%2hd@8`*7xXjr$_A-UOA#JI>IT?#f#wjXoan3%-+JgHVd?u)3t0vfi^CSr#n%=(QOs=EEBqr$(23jCv@Z$4)cPbk6kB_G z<>4CK;@TtF8DhOjZgsSsAi4WQV%arCFY5&V11!IyDPEg!CgbxhRUch;i;gz6mD!E4 zARr6YTz;;Q9XO0ruGGDrXw44q(5af9UN)kwaxt%7d~V@ULOn}da6?7d=>5tpH5fhY zVo|-!Bv9SED*Jc9r~mq1Y`^J?jl;s$Qaut7K^J?}rkr4NbdZ$LdaFcf%bAE>{W z=Iqdi2U%@1B!t>9m5~v_?gJixXubhY8G6cd0F^Y>BfCva^^)qzZ@S*mW~!X~&V|#1 zQY%M``|=ro3W+bfvPpw>^TFoDVL@Lyz7%eXdV5i7N5ZNH@i;Sala6}>~!k3?v}t0h7L1SjeGZ? zry_z{Fshy@sa;+7xvB?n;RzOoFa6JgJJ#GCO#F~zcJ9cebPnhUCLHXZJGKD3aHcak zL_+W}Pn_GV8sb)LD-nThqmo+^41SM2{71N_gkUvq>o!UGR%-Z=PRW#%W8orQNxWc4 zBE69g;t0D1`XGD z8J({=AD-n{AZW_tX%%2Y*d%P|z`X4TQonhfJ<*=?9!$b!;vUZ-d?|&JG<}C4TX13d zqahtQL}Zi|i5;n~{`K`?EIM`BZz*&Uu{jts`QAbxv)4u(%r=1l)f|KR2(yl}f z6)cYxWXesM@OFl~9(%(#v>uHSGd15o68eHemD3VM1BNzbkS4k_<)|_S4IMA1ErZQ?g_;Xt&HUH13CE_m(RgRS9KxiUZAS6GOA zUb_8Izcy*q#HgPX{sMq^CiL}^og$1ba5&N6Tw_gCa9fMt4&He^9j#=eU14YnK7an= z0=Tg3?7#@pe+(KJW_vz)G2c-{mlV3j$zmcE$IJj9I6B9THdOE&Tj{ktBBet;IA7i+ zzl^Q^^YW;wn0k9-frR5&P``G|R)dCGC1=^R!x3xn#Adg*APCt@8ko_A2E=i4%T{na zcB0p0rF2ajTuZX%9xN~e`d><07bvbvz@)!Bs@Z(_ zMMlXeqXNK6YI3Q>jw!|-Bf@@3uKB^)%nwt2ff4i55#pE6{~TP#J-oP9)L6eepjuLt z6uR`{k-a4_b5`WO?^eNiA4Tj>r`j32P}ij--z)ETt-+NsO_qg1c_wJDz`?kQU^$=p zC>Fa+@%LqHcAH%BW|sC>x0*R2{Je0-x?~Aa)?D$p39XFVXCcF5`s6EZ1dv&3m$^}u zTt<+8svU{h6$ViN8Yux?4#>|(W96Jw(+r_%xF5TC; z+uNO?Um>T@34giBj*A9 zXE^jQYts*6W3?$#vM*%o+Es8Bmk|hZPjC;%%1*B~{gmDwLW`AI=Ro@GEZ^jkoL6IuwjQR6bt#4HybCM$MvZOjoQ@N zzhei~w>#d!6da^)6W1-phD+-Uf$k{b%Jt!LD1Y`(G5$6pm{hwNv;2VTjyQ%WyAF?- zN!N9sL$*zI*;%I}hN{2RA2j&2XuvgmyvHAQvaoM#$*fZM@cB@*+>o~hw_kI*V5qMB z#EqPrhcR-ug7IY{xyzjP$6JZD&Y+~-rx)l-HF-S&^2X$Hh`A9`H|8jL>5TOHMf{Bo z&p&s&lp1&OPxTtp*qc(!37qbT&^pXT-d%$l=U6i_$HT3pu&RJ&m6@%^!iEj@o$Qj! zwyVhj$U^Dkx4-PwRadGM$zhp$kHNSFSeX27T#!FCb(drx;sHQZjocF4SncV~uZ@uy zcj5=470UFpIBYrXcBDyBB6DrB&kQ!$^Xl!vS;OaC8IlluPr(%4i!ju5NQ^Y@e`(Wj zKzn1N{t+;%4cVKSk#r9R5hA~W6+F^*J3sk?aDUmGk}@0H6b*B8yi>Y9OILD1Ti>zQ zsQa=9OWjzyrHyLNE=qq*u+HzfT`K&~08E4%U0CAuGVLf=N`w>g&w-6<_&IHCoV`Ur z_8*!>aIQi-eMM~Z&LCvPiEEM7{ZvZog}sC8+%e_SYrEaN+>g_O#xZK1%c~TG*?q&R zl-@Gb6j`2Kj1{T zCoIC}hK2$TepXRH__+pW*GW^3%+0Sqy?CS#b<5c&tq~^p!R_8@3bz*HV23{Nw54B} z>E(Wg7OO8xkEo3S2QA(GDS9F32x~br_^&HLTGZJ`E z1XpD_(9u2MSg$-fT%Nc$Lj3J3GxdfWZ!q%g$D>*WIcq)1ou_{`vwLQ;ld)O&!^p&u z-qqS(`n!yDKz8R86a)&(JBL;G_?UG~R1ChJy7E)YlqbA*{4qg_fmt24E1yI$lMo*$ z1H9T9M#M6s6*uqd`XW~PuX;TZ&J0mY>WB*3%FBBBql{&R6gI1H{LRqc;CwGneezs` z15wjx!E1*#7I9P3VnW~;Q#|aROJAzoc|v%d@h#`{#J(_7+QJ(=)MlGJg*vzEr}zA3I|6|A0o?xI)Ko6f%hXHwt1pMTtwGK_d+ybo zb^=*p<>LsazCBnT+0@9Q3@8;^^dh0;=VB=P*>msQ#7N&C>$uBt1NO1CiLY~}4p}Aa zl+0>1O3*(G^P--SP1r11zGIunzE@k5hbL~-&g^7^hq1&-v@P0FgJG3mKv4i&E#l4M znFptqgP@_UyTEx1W%<0wbrr%e5z6P%xQ~0sn$I4mXYBQ+-!x%XK7sw7e#sw^Lva?N z=h(>$8DS{}M#&~>Lq&Iayup-Y(nD<4#iRR;B$+{|uwO+@%A4(W zT(hcX>r*MJD2PL(nyD@IjLcZ2OV&BDWa0{acfP2nYzg`_8g%df8e9epms&^U016@7^> z-u3)NrC}TJtuphlzn8YIcO4@&*-Z`!3g)P2W&$@sBP0?w>5f%C`!z<;lykY!2bfeA zCwGHCcM_<$%{p>Sb`)dRc^XH>tAGNaG=n&M6KZE#T$W2m%D;jW{In-PuI^DG);{Ke zPs8{2a|TQ+qh14@x*Mrj>b55jScN^b%o^um zLWI@u_p_3x_Zz7}@bpKMvjWEaTOU^Fz&(TPCh}|CBe_J|ygO>=o=xSQfi(q`*mgVU zAX%Re5YZxQ@Ai%k)qQ`P+c#y>$}S=v4)e%fwG7i0=>CY#$HMzbrE#cAzoRxR3AbzX zi5P?FNEZ)L$01cMj!Uz)cEYv<>hcIfjC0Qm>%;Ed&lJ^^btN<^fBb>QXf=HG5r zD_rgqB%A+OXR6!cXTw<~R=q@}e`)f;!LL&P=1uL1%vI68w0J}emE*Y?u%$_J4c(B9 zLt{lf zPZ=!A=J8nl#A(O=>bY1`5^vf`QQb8wpzDs4OhvBwzI9=2`4H&}VUwW64*M>5Ys4PN z@JMg-d!&6foC-G&wd)w{oe!THZuN`z7e@iK>q{0mQqn#NpLq}Vdz?&Pm~t3BQwmsr z(dXnrzuiYNNB=PfX}D9J5O*WzTcM28pSiEaRfIxFO6txg^q9_`^e5m*W^CD&&Fyu= zGepXnwifboiP0BGj@8yGsv*;8O^5qR-XeX6cN{H?l@TYdXDm%cG|&y_b*r$R3nO0P zGc@}f#&rqE)+QB+jajE}sGpNKC_npDSm@pFz1gh(dBYdjWT#9mL8Zx(I|PlBEsio= z!#bKlbzop6H9dTHJ&`Qnt5Q_wBJFmQKL0c;d{GucKkF5g9(aH2oZr(KA4l2gys5s= zfmQPQrwqWE^h+gNs5^n{W&{yp9}0;*D4q>bDqvbde&>f%S@EsQuumlaedLQ`IFChq--?kjam{~^^XxAXGqp>|t;QdREVv3} z$;OjzyLd$#gyi-fe7pwNO`N_@3C-)7$rd%a?wH+tJpReSiT5KM6C1JHr3yu$l-h}a zpE4Lwg6SA@>sWXDYe+TYuBG5d6~+U0s$T(>Xo(SQ&+yq)I?zI;U^;i6>Zs$&NAS$> zU8v0(t5|L=n~E_k46<~JVCnEe9UDHjKR((~7a}6ZFo;ylXCeD5ziHa*R$7G;ek*#= zuZjHXC6W$01>rFKaiGru8wwununANcI&i@hq;)`>pI_M3PNb>n-{}hj)#WEG^bTsoF+{>#Le`@$ zTMbaog&BV3$A9Y$W1O9%%l!R&FKJ6IB~A>@pXzr``DX%gXk0Ikb=_6nb>OU<8fN=T zPCTqW@%a1AD@<>G7+NzD(}{E^ZB_?#uDbVrYnvDaL4x%DTMIRqH}6S(29C73_L%Ha ztyo-Fe56nQv+0LISqB5xe-ZUDz_v@J|Edx~7_@1~l=tD7qaq%}#2g&w-49H+I@_}K zZ^{ft-ft#5I``Z~hzgz~ScDb~Zn|AGAR(ZbSAU}(5(bw(Bi_Q-x5EAXB1It(epNI~ z4mDurufY{{yV}KI&eNnX#UQCD#E2DDd^<%en<$}X%Ek0&`Mytv#($_u6BMZ3r3)Eo z{NVsK=s_JLCD|p*L?0Z`4o@lT?POQl(S}@7 z@Q+NVJvEDa37H0qAJR4X8HwOZgPo9@QPI3Kpc;_!Lm4P)uOI#c@>Vw42Yy96#>dsZ z$&0J(rI$&#ouf}cp14Mr*&>U7qy1cpV7%FZ~&Re1P#X6bo6zr%!Hy zmkO)k*gWD`ZY5O#upY{Ce%1UAjx(bu>Yo~8_?_fz4ftm@ zq;E+&T7upI77wO)GT;AH@lNxHj6OhXJuR@k4>)#`(n(oya>6lUa#sUT!SpjwZ;~+} zh|{l>i7pNq3}sLrDj_um839Unu}F&{iQ9b$awh@~`l{G^eMnfTR=L1R$lrShs3I*r<>&&A&HUAD$h{~0 zC<%CMxUg&uDPgJ!9jxtP79;V<%3wK zs&}2^Z$u3uhF`-{|0b$SJIY^DilI)R_TR0Qc(gn1=CKQ)NyI=SODM)b^ zpp>EQIVjINNE+QUbeT<%LK3_eD`W?FInKXX>}|6&48%J>iB$Yzf)RxVkjVTXJeNa9I9O-!tez(GgCB$o7eTVQypN>Y!*M*ap8JHt95Q_sL zzB0+iZ&oNXwh-rNG|%iiJ+hN8%>p^UmS?GuzV(^#+$YQ3%-zCGpTB<(`I5lOzzmt7 zj||n6)i}ZgoV?V?ZMeqoi3obGn_+>-gUPy$51;5bnRxM5P+!ne5Fx0BB;LZWU%sx} zJ27fmBDr8N@rk)B-FES1lW5m~0hUr}WLQ2tVw{>BM)ym#2xAE&#SX+Rs)G^a6@_Fn z1yk8=m@P#~?uzSbo_aI)f2e!zf4K%n^{QE#Uf~asK&6LOWbXGwSJ{)a^+X>W3dYvO zkS&9VMW%UqS*Gh4~$9uku_?&YHY-rkD+n zLVZ}p2Go2R_st0M3t`^cjK)>2+;2q$g;bqc(PFtxs^FAVzuxI>@GY+3DpH7qQ0f9{ z?eTzC|g%@%lZWvzsx(vk7A zR<4=>b3zuC6}lVYqQgr3dGLBPqg^*V-ka7|__0<3idZhH(5qIs_eKuE9oLtD2rWzq zh}TY6yn_PK?mwW`&hJs>Gq@&TKlkdzv5hYrlt5VVu!LsyP(;6N0oo)+-%6?OZ*Ygh zO5Cwi!H2&IVV9B)LV`#*X{2`Mn?*#h?}&_1KZ?(T8*x-N_82T)u<%f_`d$wOX-Vb4 zGfnBw>Q))hYjs=sKstD}%tNmtbDAw5?M!?5^KPh#(SH_A1Y?o6DSSAp=4%NNzF9~) zDjd7()Z(FUYr#5PyR}JY4%F<;W5!~r(^vcFI#)ExJF?8Lib=w~-3A{79<7Dl5jasx z4{frG?$kDfDc(EnnZAqU^OI@T~^iYjsz5-@hnwu^L?sHn@6R@_6tTcFhcsF3M zAL&UcY9H-(%yp79Mg19vnp(bz-v#vrtdVGVSYRoZ7?wC=)(a6W@CRO%xmr2Ax^@#b z+3@Jw{Mys@d1oLO3u$&mQ`C2OEN)-T!b|)vVB>f_i;z`4+^l{pnHZY*t$Cq3yXv&w zq5D;*Ax(gR3&{8S&m3Js{1x81C0yAu&tGC_eK> z7-n=i_ZN8Mc#?D~x!a&&RQ-IidPrg)M#R2>4Pmve{>JntpCISF_Lv_{xmf2s==TZ7 zW-+mS+Lt^xq;?HLyj)IinI^vMz~a`daIM3q=EJ?3rnCpRqE zOvES$wfv$0FD}Hf$^w*KKb_7MlbyX7oLzW&u%WvJ%3j`=!O%l?yLol4n+$r)AF1`3 z-G?D}4)X1ULpau^G979=Cz3*u2{qPi*?GX5UWx4T#PX}pKCaF^p0Ne(d=qDt{vvU0 zvej2a|8$;~?-E;^q<2-s7I$EuI}FGy@~ts5OPCq6gO7$MciTc`m(E>Mw`&z`^nltq zKnT_i5c!Yii9K6kyH6}szjoz#RpDs&;G@~`B+u2RcJ8mLo!p@@_fdQe)}of|b^-Y* zYaD3a#2=~vAbLeAeUuSa?5sBWQ%nrsrsOpbeKA>Wdhni|rn`u3<{4FsXI=eJ4X391 z#RKsdKNX|zVW0h|01LlEejOr#9=mA*z?zqAu2BR{Nz*Vf2mWw!mBW!FP36${)Kf9z zMRymYP`}7`JVMqVpaWO89?r#WHBQfU*KwztS+a(AKNh6V!l*&X84wPpAe7_Ep5RQ6 zHA302?+=6Q5W-prD1ZX9FGyiCPL{n6Ds+900#g251AKGpV%W3yz+IQ!L`;t~ro)FG z>cGfAOqJ3Ld;w7LL2o2NO{po)Runa>g2S#Ro4fdaBIZ`#d%FBv%nfq>G@`$m%E@jq zH;&0^jTN3wek>&_Yn+}3!6gvuOF>gR*RwRZ=Xw^%$X^(Rjr@>=cwiUFwcC)g`St{Z zY+FdlsGaN?1$W-`qCagTvJOYBQPCKacS)zHS|XLe>y#51pgHX?leIDwBtt*FaemfZtVlf$PuA(O;vRUX=Fhl`qXvSKZqaURpPm!3z-*7-@$- z4Jn6ea+XO0i{`X^PGN{@;8E;nAYJ*5?mEF7ro;!$&36$i3WRI06 z{8C8mHCcPzivpfR_!D2S<#N)kSX>("todos") + } + + @Handler + suspend fun add(ctx: ObjectContext, item: TodoItem) = ctx.update(TODOS) { + (it ?: emptyMap()) + (item.id to item) + } + + @Handler + suspend fun markCompleted(ctx: ObjectContext, id: String) = ctx.update(TODOS) { + val newNote = (it ?: emptyMap()) + .getOrElse(id) { throw TerminalException(404, "Note not found for given index $id") } + .copy(isCompleted = true) + + it!! + (newNote.id to newNote) + } + + @Handler + suspend fun remove(ctx: ObjectContext, id: String) = ctx.update(TODOS) { + val map = it?.toMutableMap() ?: mutableMapOf() + if (map.remove(id) == null) { + throw TerminalException(404, "Note not found for given index $id") + } + map + } + + @Shared + suspend fun readAll(ctx: SharedObjectContext): Collection = + ctx.get(TODOS)?.values ?: emptyList() +} + +// Helper function to update state values +private suspend fun ObjectContext.update(stateKey: StateKey, fn: (T?) -> T) = + this.set(stateKey, fn(this.get(stateKey))) + +fun main() { + RestateHttpEndpointBuilder + .builder() + .bind(Todos()) + .buildAndListen() +} \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/server/src/main/resources/log4j2.properties b/end-to-end-applications/kotlin/kmp-android-todo-app/server/src/main/resources/log4j2.properties new file mode 100644 index 00000000..6c9aacbb --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/server/src/main/resources/log4j2.properties @@ -0,0 +1,26 @@ +# Set to debug or trace if log4j initialization is failing +status = warn + +# Console appender configuration +appender.console.type = Console +appender.console.name = consoleLogger +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %notEmpty{[%X{restateInvocationTarget}]}%notEmpty{[%X{restateInvocationId}]} %c - %m%n + +# Filter out logging during replay +appender.console.filter.replay.type = ContextMapFilter +appender.console.filter.replay.onMatch = DENY +appender.console.filter.replay.onMismatch = NEUTRAL +appender.console.filter.replay.0.type = KeyValuePair +appender.console.filter.replay.0.key = restateInvocationStatus +appender.console.filter.replay.0.value = REPLAYING + +# Restate logs to debug level +logger.app.name = dev.restate +logger.app.level = trace +logger.app.additivity = false +logger.app.appenderRef.console.ref = consoleLogger + +# Root logger +rootLogger.level = info +rootLogger.appenderRef.stdout.ref = consoleLogger \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/settings.gradle.kts b/end-to-end-applications/kotlin/kmp-android-todo-app/settings.gradle.kts new file mode 100644 index 00000000..85c5c1e7 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/settings.gradle.kts @@ -0,0 +1,33 @@ +rootProject.name = "RestateNoteApp" +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +pluginManagement { + repositories { + google { + mavenContent { + includeGroupAndSubgroups("androidx") + includeGroupAndSubgroups("com.android") + includeGroupAndSubgroups("com.google") + } + } + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositories { + google { + mavenContent { + includeGroupAndSubgroups("androidx") + includeGroupAndSubgroups("com.android") + includeGroupAndSubgroups("com.google") + } + } + mavenCentral() + } +} + +include(":composeApp") +include(":server") +include(":shared") \ No newline at end of file diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/shared/build.gradle.kts b/end-to-end-applications/kotlin/kmp-android-todo-app/shared/build.gradle.kts new file mode 100644 index 00000000..48fb0fa6 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/shared/build.gradle.kts @@ -0,0 +1,40 @@ +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.androidLibrary) + alias(libs.plugins.kotlinxSerialization) +} + +kotlin { + androidTarget { + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + jvmTarget.set(JvmTarget.JVM_11) + } + } + + jvm() + + jvmToolchain(11) + + sourceSets { + commonMain.dependencies { + implementation(libs.kotlinx.serialization.core) + implementation(libs.kotlinx.serialization.json) + } + } +} + +android { + namespace = "dev.restate.examples.noteapp.shared" + compileSdk = libs.versions.android.compileSdk.get().toInt() + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + defaultConfig { + minSdk = libs.versions.android.minSdk.get().toInt() + } +} diff --git a/end-to-end-applications/kotlin/kmp-android-todo-app/shared/src/commonMain/kotlin/dev/restate/examples/noteapp/TodoItem.kt b/end-to-end-applications/kotlin/kmp-android-todo-app/shared/src/commonMain/kotlin/dev/restate/examples/noteapp/TodoItem.kt new file mode 100644 index 00000000..907c5794 --- /dev/null +++ b/end-to-end-applications/kotlin/kmp-android-todo-app/shared/src/commonMain/kotlin/dev/restate/examples/noteapp/TodoItem.kt @@ -0,0 +1,9 @@ +package dev.restate.examples.noteapp; + +import kotlinx.serialization.Serializable +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid + +@Serializable +@OptIn(ExperimentalUuidApi::class) +data class TodoItem(val id: String = Uuid.random().toString(), val content: String, val isCompleted: Boolean = false) \ No newline at end of file