Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,16 @@ Click to "Use This Template" button to create a new repository with this templat
Go to the [Documentation page](https://docs.multiplatformkickstarter.com) for all the information. (**WIP**)
<br><br>

PRO Template
Need a different template?
-----------------

Do you need more? Adoptme is a good start but the **Pro template** have all you need to create professional apps without a hassle.
It includes more features, screens and components. Like:
Do you need a different use case? Adoptme Template is a good start but the are more **complete templates** that have all you need to create professional apps without a hassle.
Including more features, screens and components. Like:

- Advanced CI (deployment)
- A/B Component
- Deeplinks
- More Translations
- Social Login
- RSS Component
- Read and Download PDFs
- Built-in video-game
- 3rd party integrations
- **and more!**

Expand Down Expand Up @@ -171,7 +170,7 @@ Check out our social media to be up-to-date about new products, features and rel
License
-------

Copyright 2023-2024 Multiplatform Kickstarter
Copyright 2023-2025 Multiplatform Kickstarter

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
6 changes: 3 additions & 3 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ kotlin {
androidTarget {
@OptIn(ExperimentalKotlinGradlePluginApi::class)
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
jvmTarget.set(JvmTarget.JVM_21)
}
}
jvm("desktop")
Expand Down Expand Up @@ -151,8 +151,8 @@ android {
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
buildFeatures {
compose = true
Expand Down
6 changes: 4 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# Gradle
org.gradle.jvmargs=-Xms8g -Xmx8g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC
org.gradle.jvmargs=-Xms8g -Xmx8g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -XX:-UseGCOverheadLimit
kotlin.daemon.jvmargs=-Xms4g -Xmx4g -XX:+UseParallelGC
org.gradle.caching=true
kotlin.mpp.androidGradlePluginCompatibility.nowarn=true
org.gradle.parallel=true

org.gradle.configuration-cache=true

Expand Down Expand Up @@ -32,5 +34,5 @@ kotlin.native.cachekind=none

# Multiplatform Kickstarter config
multiplatformkickstarter.version.major = 2
multiplatformkickstarter.version.minor = 0
multiplatformkickstarter.version.minor = 1
multiplatformkickstarter.version.patch = 0
44 changes: 22 additions & 22 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
[versions]
android-compileSdk = "34"
android-compileSdk = "35"
android-minSdk = "26"
android-targetSdk = "34"
kotlin = "2.0.0"
android-targetSdk = "35"
kotlin = "2.1.10"
ktor-client = "2.3.12"
ktor-server = "2.3.12"
multiplatform-settings = "1.0.0"
voyager = "1.0.0"
koin = "3.5.6"
koin-compose = "1.1.3"
voyager = "1.1.0-beta03"
koin = "4.0.1"
koin-compose = "4.0.1"
junit = "4.13.2"
androidGradlePlugin = "8.5.1"
composeMultiplatform = "1.6.11"
androidGradlePlugin = "8.8.2"
composeMultiplatform = "1.7.3"
exposed = "0.37.3"
skiko = "0.8.4"
skiko = "0.8.18"
ktlint = "11.5.1"
detekt = "1.23.1"
kotlinx-coroutines = "1.8.1"
detekt = "1.23.7"
kotlinx-coroutines = "1.10.2"
androidx-junit = "1.2.1"
espressoCore = "3.6.1"
accompanistSystemuicontroller = "0.32.0"
activityCompose = "1.9.0"
firebase = "33.1.2"
accompanistSystemuicontroller = "0.36.0"
activityCompose = "1.10.1"
firebase = "33.13.0"
touchlab = "2.0.5"
navigationCommonKtx = "2.7.7"
navigationCommonKtx = "2.8.9"

[libraries]
# Common
Expand All @@ -41,8 +41,8 @@ ktor-client = { module = "io.ktor:ktor-client-core", version.ref = "ktor-client"
kamel = "media.kamel:kamel-image:0.7.1"
kermit = "co.touchlab:kermit:2.0.0-RC5"

kotlinx-serialization-json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1"
kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.5.0"
kotlinx-serialization-json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1"
kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.6.0"
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" }

Expand All @@ -56,12 +56,12 @@ koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" }

# Android
compose-bom = "androidx.compose:compose-bom:2024.06.00"
compose-bom = "androidx.compose:compose-bom:2025.01.00"
koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" }

androidx-core-ktx = "androidx.core:core-ktx:1.13.1"
androidx-core-ktx = "androidx.core:core-ktx:1.16.0"
androidx-core-splashscreen = "androidx.core:core-splashscreen:1.0.1"
androidx-tracing-ktx = "androidx.tracing:tracing-ktx:1.2.0"
androidx-tracing-ktx = "androidx.tracing:tracing-ktx:1.3.0"
accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanistSystemuicontroller" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }
firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebase" }
Expand All @@ -83,9 +83,9 @@ stately-common = { module = "co.touchlab:stately-common", version.ref = "touchla

# Desktop
koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin-compose" }
kotlinx-coroutines-swingui = "org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.8.1"
kotlinx-coroutines-swingui = "org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.10.2"
ktor-client-java = { module = "io.ktor:ktor-client-java", version.ref = "ktor-client" }
androidx-compose-ui-util = "androidx.compose.ui:ui-util:1.6.8"
androidx-compose-ui-util = "androidx.compose.ui:ui-util:1.7.5"

# Backend
ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor-server" }
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
2 changes: 2 additions & 0 deletions iosApp/iosApp/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
Expand Down
9 changes: 6 additions & 3 deletions shared/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ kotlin {
androidTarget {
@OptIn(ExperimentalKotlinGradlePluginApi::class)
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
jvmTarget.set(JvmTarget.JVM_21)
}
}

Expand Down Expand Up @@ -123,8 +123,11 @@ android {
minSdk = libs.versions.android.minSdk.get().toInt()
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
kotlin {
jvmToolchain(21)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CheckboxColors
Expand Down Expand Up @@ -45,7 +43,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.getScreenModel
import cafe.adriel.voyager.koin.koinScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.multiplatformkickstarter.app.feature.debugmenu.viewmodel.DebugMenuSideEffects
Expand Down Expand Up @@ -74,7 +72,7 @@ class DebugMenuScreen : Screen {
val snackbarHostState = remember { SnackbarHostState() }
showingModal = remember { mutableStateOf(false) }

val viewModel = getScreenModel<DebugMenuViewModel>()
val viewModel = koinScreenModel<DebugMenuViewModel>()

SetupSideEffects(viewModel)
DebugMenuView(viewModel, snackbarHostState) {
Expand Down Expand Up @@ -139,7 +137,7 @@ class DebugMenuScreen : Screen {
),
navigationIcon = {
IconButton(onClick = { onClose.invoke() }) {
Icon(imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Go back")
Icon(imageVector = MultiplatformKickstarterIcons.ArrowBack, contentDescription = "Go back")
}
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
Expand All @@ -38,7 +36,7 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.getScreenModel
import cafe.adriel.voyager.koin.koinScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.multiplatformkickstarter.app.feature.loginsignup.viewmodels.EmailLoginSideEffects
Expand All @@ -60,7 +58,7 @@ class EmailLoginScreen : Screen {
MultiplatformKickstarterTheme {
val localization = getCurrentLocalization()
val snackbarHostState = remember { SnackbarHostState() }
val viewModel = getScreenModel<EmailLoginViewModel>()
val viewModel = koinScreenModel<EmailLoginViewModel>()

SetupSideEffects(viewModel, snackbarHostState, localization)
EmailLoginView(viewModel, snackbarHostState, localization)
Expand Down Expand Up @@ -123,7 +121,7 @@ fun EmailLoginView(viewModel: EmailLoginViewModel, snackbarHostState: SnackbarHo
navigationIcon = {
IconButton(onClick = { currentNavigator.pop() }) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
imageVector = MultiplatformKickstarterIcons.ArrowBack,
contentDescription = localization.backLabel
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
Expand All @@ -38,7 +36,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.getScreenModel
import cafe.adriel.voyager.koin.koinScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.multiplatformkickstarter.app.feature.loginsignup.viewmodels.EmailSignUpSideEffects
Expand All @@ -60,7 +58,7 @@ class EmailSignUpScreen : Screen {
MultiplatformKickstarterTheme {
val localization = getCurrentLocalization()
val snackbarHostState = remember { SnackbarHostState() }
val viewModel = getScreenModel<EmailSignUpViewModel>()
val viewModel = koinScreenModel<EmailSignUpViewModel>()

SetupSideEffects(viewModel, snackbarHostState)
EmailSignUpView(viewModel, snackbarHostState, localization)
Expand Down Expand Up @@ -111,7 +109,7 @@ fun EmailSignUpView(viewModel: EmailSignUpViewModel, snackbarHostState: Snackbar
navigationIcon = {
IconButton(onClick = { currentNavigator.pop() }) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
imageVector = MultiplatformKickstarterIcons.ArrowBack,
contentDescription = localization.backLabel
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ 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.icons.Icons
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
Expand All @@ -36,6 +34,7 @@ import cafe.adriel.voyager.navigator.currentOrThrow
import com.multiplatformkickstarter.app.localization.getCurrentLocalization
import com.multiplatformkickstarter.app.resources.Res
import com.multiplatformkickstarter.app.resources.cat_dog
import com.multiplatformkickstarter.app.ui.icon.MultiplatformKickstarterIcons
import com.multiplatformkickstarter.app.ui.theme.MultiplatformKickstarterTheme
import com.multiplatformkickstarter.app.ui.theme.Typography
import org.jetbrains.compose.resources.vectorResource
Expand All @@ -61,7 +60,7 @@ fun LoginSignUpView() {
navigationIcon = {
IconButton(onClick = { currentNavigator.pop() }) {
Icon(
imageVector = Icons.Filled.Close,
imageVector = MultiplatformKickstarterIcons.Close,
contentDescription = localization.backLabel
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.getScreenModel
import cafe.adriel.voyager.koin.koinScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.multiplatformkickstarter.app.feature.pets.viewmodels.MyPetsViewModel
Expand All @@ -46,7 +46,7 @@ class MyPetsScreen : Screen {
val localization = getCurrentLocalization()
val navigator = LocalNavigator.currentOrThrow

val viewModel = getScreenModel<MyPetsViewModel>(
val viewModel = koinScreenModel<MyPetsViewModel>(
parameters = { ParametersHolder(listOf(navigator).toMutableList(), false) }
)
MyPetsScreenView(viewModel, localization) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.getScreenModel
import cafe.adriel.voyager.koin.koinScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.multiplatformkickstarter.app.common.model.GeoLocation
Expand Down Expand Up @@ -87,7 +87,7 @@ class PetUploadScreen : Screen {
val snackbarHostState = remember { SnackbarHostState() }
showingModal = remember { mutableStateOf(false) }

val viewModel = getScreenModel<PetUploadViewModel>()
val viewModel = koinScreenModel<PetUploadViewModel>()

SetupSideEffects(viewModel, snackbarHostState, localization)
PetUploadView(viewModel, snackbarHostState) {
Expand Down
Loading