diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..905f62d5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*.{kt,kts}] +ktlint_function_naming_ignore_when_annotated_with = Composable diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e822ea5c..6ffb2c84 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,6 +5,11 @@ plugins { alias(libs.plugins.compose.compiler) alias(libs.plugins.roborazzi) alias(libs.plugins.ksp) + alias(libs.plugins.ktlint) +} + +ktlint { + version.set(libs.versions.ktlint.get()) } android { @@ -35,11 +40,18 @@ android { } } - sourceSets.getByName("test").kotlin.directories.add("src/integrationTest/kotlin") + sourceSets + .getByName("test") + .kotlin.directories + .add("src/integrationTest/kotlin") buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true + isShrinkResources = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt")) + // Debug key so `installRelease` works locally; store and F-Droid builds re-sign. + signingConfig = signingConfigs.getByName("debug") } } } @@ -84,17 +96,27 @@ dependencies { implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.activity.compose) + implementation(libs.androidx.navigation.compose) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.ui.graphics) implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material.icons.core) + implementation(libs.androidx.compose.material.icons.extended) implementation(libs.kotlinx.coroutines.android) implementation(libs.androidx.sqlite.bundled) implementation(libs.androidx.room3.runtime) implementation(libs.androidx.room3.sqlite.wrapper) + implementation(libs.androidx.room3.paging) + implementation(libs.androidx.paging.compose) + implementation(libs.androidx.datastore.preferences) implementation(libs.okhttp) + implementation(libs.coil.compose) + implementation(libs.coil.network.okhttp) + implementation(libs.koin.androidx.compose) ksp(libs.androidx.room3.compiler) debugImplementation(libs.androidx.compose.ui.tooling) @@ -109,6 +131,7 @@ dependencies { testImplementation(libs.androidx.test.ext.junit) testImplementation(libs.androidx.test.core) testImplementation(libs.androidx.sqlite.bundled.jvm) + testImplementation(libs.coil.test) testImplementation(libs.okhttp.mockwebserver) testImplementation(libs.kotlinx.coroutines.test) } diff --git a/build.gradle.kts b/build.gradle.kts index dcceef40..c20a25f6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,4 +3,5 @@ plugins { alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.roborazzi) apply false alias(libs.plugins.ksp) apply false + alias(libs.plugins.ktlint) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e1f727b2..c5846800 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,14 @@ composeBom = "2026.09.00" coroutines = "1.11.0" room3 = "3.0.3" sqliteBundled = "2.7.1" +paging = "3.5.1" +navigationCompose = "2.10.1" +datastore = "1.2.1" +coil = "3.6.3" +koin = "4.2.2" okhttp = "5.5.0" +ktlint = "1.8.0" +ktlintGradle = "14.2.0" roborazzi = "1.74.0" robolectric = "4.17" junit = "4.13.2" @@ -20,6 +27,8 @@ androidxTestCore = "1.7.0" androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } +androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" } +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } @@ -27,6 +36,8 @@ androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graph androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-compose-material-icons-core = { group = "androidx.compose.material", name = "material-icons-core" } +androidx-compose-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended" } androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-sqlite-bundled = { group = "androidx.sqlite", name = "sqlite-bundled", version.ref = "sqliteBundled" } @@ -34,6 +45,13 @@ androidx-sqlite-bundled-jvm = { group = "androidx.sqlite", name = "sqlite-bundle androidx-room3-runtime = { group = "androidx.room3", name = "room3-runtime", version.ref = "room3" } androidx-room3-compiler = { group = "androidx.room3", name = "room3-compiler", version.ref = "room3" } androidx-room3-sqlite-wrapper = { group = "androidx.room3", name = "room3-sqlite-wrapper", version.ref = "room3" } +androidx-room3-paging = { group = "androidx.room3", name = "room3-paging", version.ref = "room3" } +androidx-paging-compose = { group = "androidx.paging", name = "paging-compose", version.ref = "paging" } +androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" } +coil-compose = { group = "io.coil-kt.coil3", name = "coil-compose", version.ref = "coil" } +coil-network-okhttp = { group = "io.coil-kt.coil3", name = "coil-network-okhttp", version.ref = "coil" } +coil-test = { group = "io.coil-kt.coil3", name = "coil-test", version.ref = "coil" } +koin-androidx-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koin" } kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutines" } okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } @@ -51,3 +69,4 @@ android-application = { id = "com.android.application", version.ref = "agp" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlintGradle" }